File:  [RetroPC.NET] / np2 / wince / ini.cpp
Revision 1.1: download - view: text, annotated - select for diffs
Tue Oct 21 23:57:41 2003 JST (22 years ago) by yui
Branches: MAIN
CVS tags: VER_0_70, HEAD
add wince (win9x debug only) (T.Yui)

#include	"compiler.h"
#include	"strres.h"
#include	"profile.h"
#include	"np2.h"
#include	"dosio.h"
#include	"ini.h"
#include	"pccore.h"


typedef struct {
const char		*title;
const INITBL	*tbl;
const INITBL	*tblterm;
	UINT		count;
} _INIARG, *INIARG;

static void inirdarg8(BYTE *dst, int dsize, const char *src) {

	int		i;
	BYTE	val;
	BOOL	set;
	char	c;

	for (i=0; i<dsize; i++) {
		val = 0;
		set = FALSE;
		while(*src == ' ') {
			src++;
		}
		while(1) {
			c = *src;
			if ((c == '\0') || (c == ' ')) {
				break;
			}
			else if ((c >= '0') && (c <= '9')) {
				val <<= 4;
				val += c - '0';
				set = TRUE;
			}
			else {
				c |= 0x20;
				if ((c >= 'a') && (c <= 'f')) {
					val <<= 4;
					val += c - 'a' + 10;
					set = TRUE;
				}
			}
			src++;
		}
		if (set == FALSE) {
			break;
		}
		dst[i] = val;
	}
}

static BOOL inireadcb(void *arg, const char *para,
										const char *key, const char *data) {

const INITBL	*p;

	if (arg == NULL) {
		return(FAILURE);
	}
	if (milstr_cmp(para, ((INIARG)arg)->title)) {
		return(SUCCESS);
	}
	p = ((INIARG)arg)->tbl;
	while(p < ((INIARG)arg)->tblterm) {
		if (!milstr_cmp(key, p->item)) {
			switch(p->itemtype) {
				case INITYPE_STR:
					milstr_ncpy((char *)p->value, data, p->size);
					break;

				case INITYPE_BOOL:
					*((BYTE *)p->value) = (!milstr_cmp(data, str_true))?1:0;
					break;

				case INITYPE_BYTEARG:
					inirdarg8((BYTE *)p->value, p->size, data);
					break;

				case INITYPE_SINT8:
				case INITYPE_UINT8:
					*((BYTE *)p->value) = (BYTE)milstr_solveINT(data);
					break;

				case INITYPE_SINT16:
				case INITYPE_UINT16:
					*((UINT16 *)p->value) = (UINT16)milstr_solveINT(data);
					break;

				case INITYPE_SINT32:
				case INITYPE_UINT32:
					*((UINT32 *)p->value) = (UINT32)milstr_solveINT(data);
					break;

				case INITYPE_HEX8:
					*((BYTE *)p->value) = (BYTE)milstr_solveHEX(data);
					break;

				case INITYPE_HEX16:
					*((UINT16 *)p->value) = (UINT16)milstr_solveHEX(data);
					break;

				case INITYPE_HEX32:
					*((UINT32 *)p->value) = (UINT32)milstr_solveHEX(data);
					break;
			}
		}
		p++;
	}
	return(SUCCESS);
}

void ini_read(const char *path, const char *title,
											const INITBL *tbl, UINT count) {

	_INIARG	iniarg;

	if (path == NULL) {
		return;
	}
	iniarg.title = title;
	iniarg.tbl = tbl;
	iniarg.tblterm = tbl + count;
	profile_enum(path, &iniarg, inireadcb);
}


// ----

static void iniwrsetstr(char *work, int size, const char *ptr) {

	int		i;
	char	c;

	if (ptr[0] == ' ') {
		goto iwss_extend;
		
	}
	i = strlen(ptr);
	if ((i) && (ptr[i-1] == ' ')) {
		goto iwss_extend;
	}
	while(i > 0) {
		i--;
		if (ptr[i] == '\"') {
			goto iwss_extend;
		}
	}
	milstr_ncpy(work, ptr, size);
	return;

iwss_extend:
	if (size > 3) {
		size -= 3;
		*work++ = '\"';
		while(size > 0) {
			size--;
			c = *ptr++;
			if (c == '\"') {
				if (size > 0) {
					size--;
					work[0] = c;
					work[1] = c;
					work += 2;
				}
			}
			else {
				*work++ = c;
			}
		}
		work[0] = '\"';
		work[1] = '\0';
	}
}

static void iniwrsetarg8(char *work, int size, const BYTE *ptr, int arg) {

	int		i;
	char	tmp[8];

	if (arg > 0) {
		SPRINTF(tmp, "%.2x", ptr[0]);
		milstr_ncpy(work, tmp, size);
	}
	for (i=1; i<arg; i++) {
		SPRINTF(tmp, " %.2x", ptr[i]);
		milstr_ncat(work, tmp, size);
	}
}

void ini_write(const char *path, const char *title,
											const INITBL *tbl, UINT count) {

	FILEH		fh;
const INITBL	*p;
const INITBL	*pterm;
	BOOL		set;
	char		work[512];

	fh = file_create(path);
	if (fh == FILEH_INVALID) {
		return;
	}
	milstr_ncpy(work, "[", sizeof(work));
	milstr_ncat(work, title, sizeof(work));
	milstr_ncat(work, "]\r\n", sizeof(work));
	file_write(fh, work, strlen(work));

	p = tbl;
	pterm = tbl + count;
	while(p < pterm) {
		work[0] = '\0';
		set = SUCCESS;
		switch(p->itemtype) {
			case INITYPE_STR:
				iniwrsetstr(work, sizeof(work), (char *)p->value);
				break;

			case INITYPE_BOOL:
				milstr_ncpy(work, (*((BYTE *)p->value))?str_true:str_false,
																sizeof(work));
				break;

			case INITYPE_BYTEARG:
				iniwrsetarg8(work, sizeof(work), (BYTE *)p->value, p->size);
				break;

			case INITYPE_SINT8:
				SPRINTF(work, "%d", *((char *)p->value));
				break;

			case INITYPE_SINT16:
				SPRINTF(work, "%d", *((SINT16 *)p->value));
				break;

			case INITYPE_SINT32:
				SPRINTF(work, "%d", *((SINT32 *)p->value));
				break;

			case INITYPE_UINT8:
				SPRINTF(work, "%u", *((BYTE *)p->value));
				break;

			case INITYPE_UINT16:
				SPRINTF(work, "%u", *((UINT16 *)p->value));
				break;

			case INITYPE_UINT32:
				SPRINTF(work, "%u", *((UINT32 *)p->value));
				break;

			case INITYPE_HEX8:
				SPRINTF(work, "%x", *((BYTE *)p->value));
				break;

			case INITYPE_HEX16:
				SPRINTF(work, "%x", *((UINT16 *)p->value));
				break;

			case INITYPE_HEX32:
				SPRINTF(work, "%x", *((UINT32 *)p->value));
				break;

			default:
				set = FAILURE;
				break;
		}
		if (set == SUCCESS) {
			file_write(fh, p->item, strlen(p->item));
			file_write(fh, "=", 1);
			file_write(fh, work, strlen(work));
			file_write(fh, "\r\n", 2);
		}
		p++;
	}
	file_close(fh);
}


// ----

static const char ini_title[] = "NekoProjectII";
static const char inifile[] = "np2.cfg";

static const INITBL iniitem[] = {
	{"clk_base", INITYPE_SINT32,	&np2cfg.baseclock,		0},
	{"clk_mult", INITYPE_SINT32,	&np2cfg.multiple,		0},

	{"DIPswtch", INITYPE_BYTEARG,	np2cfg.dipsw,			3},
	{"MEMswtch", INITYPE_BYTEARG,	np2cfg.memsw,			8},
	{"ExMemory", INITYPE_UINT8,		&np2cfg.EXTMEM,			0},
	{"ITF_WORK", INITYPE_BOOL,		&np2cfg.ITF_WORK,		0},

	{"HDD1FILE", INITYPE_STR,		np2cfg.hddfile[0],		MAX_PATH},
	{"HDD2FILE", INITYPE_STR,		np2cfg.hddfile[1],		MAX_PATH},

	{"SampleHz", INITYPE_UINT16,	&np2cfg.samplingrate,	0},
	{"Latencys", INITYPE_UINT16,	&np2cfg.delayms,		0},
	{"SNDboard", INITYPE_HEX8,		&np2cfg.SOUND_SW,		0},
	{"BEEP_vol", INITYPE_UINT8,		&np2cfg.BEEP_VOL,		0},
	{"xspeaker", INITYPE_BOOL,		&np2cfg.snd_x,			0},

	{"SND14vol", INITYPE_BYTEARG,	np2cfg.vol14,			6},
//	{"opt14BRD", INITYPE_BYTEARG,	np2cfg.snd14opt,		3},
	{"opt26BRD", INITYPE_HEX8,		&np2cfg.snd26opt,		0},
	{"opt86BRD", INITYPE_HEX8,		&np2cfg.snd86opt,		0},
	{"optSPBRD", INITYPE_HEX8,		&np2cfg.spbopt,			0},
	{"optSPBVR", INITYPE_HEX8,		&np2cfg.spb_vrc,		0},
	{"optSPBVL", INITYPE_UINT8,		&np2cfg.spb_vrl,		0},
	{"optSPB_X", INITYPE_BOOL,		&np2cfg.spb_x,			0},
	{"optMPU98", INITYPE_HEX8,		&np2cfg.mpuopt,			0},

	{"volume_F", INITYPE_UINT8,		&np2cfg.vol_fm,			0},
	{"volume_S", INITYPE_UINT8,		&np2cfg.vol_ssg,		0},
	{"volume_A", INITYPE_UINT8,		&np2cfg.vol_adpcm,		0},
	{"volume_P", INITYPE_UINT8,		&np2cfg.vol_pcm,		0},
	{"volume_R", INITYPE_UINT8,		&np2cfg.vol_rhythm,		0},

	{"Seek_Snd", INITYPE_BOOL,		&np2cfg.MOTOR,			0},
	{"Seek_Vol", INITYPE_UINT8,		&np2cfg.MOTORVOL,		0},

	{"btnRAPID", INITYPE_BOOL,		&np2cfg.BTN_RAPID,		0},
	{"btn_MODE", INITYPE_BOOL,		&np2cfg.BTN_MODE,		0},
	{"MS_RAPID", INITYPE_BOOL,		&np2cfg.MOUSERAPID,		0},

	{"VRAMwait", INITYPE_BYTEARG,	np2cfg.wait,			6},
	{"DispSync", INITYPE_BOOL,		&np2cfg.DISPSYNC,		0},
	{"Real_Pal", INITYPE_BOOL,		&np2cfg.RASTER,			0},
	{"RPal_tim", INITYPE_UINT8,		&np2cfg.realpal,		0},
	{"s_NOWAIT", INITYPE_BOOL,		&np2oscfg.NOWAIT,		0},
	{"SkpFrame", INITYPE_UINT8,		&np2oscfg.DRAW_SKIP,	0},
	{"uPD72020", INITYPE_BOOL,		&np2cfg.uPD72020,		0},
	{"GRCG_EGC", INITYPE_UINT8,		&np2cfg.grcg,			0},
	{"color16b", INITYPE_BOOL,		&np2cfg.color16,		0},
	{"skipline", INITYPE_BOOL,		&np2cfg.skipline,		0},
	{"skplight", INITYPE_SINT16,	&np2cfg.skiplight,		0},
	{"LCD_MODE", INITYPE_UINT8,		&np2cfg.LCD_MODE,		0},
	{"BG_COLOR", INITYPE_HEX32,		&np2cfg.BG_COLOR,		0},
	{"FG_COLOR", INITYPE_HEX32,		&np2cfg.FG_COLOR,		0},
	{"pc9861_e", INITYPE_BOOL,		&np2cfg.pc9861enable,	0},
	{"pc9861_s", INITYPE_BYTEARG,	np2cfg.pc9861sw,		3},
	{"pc9861_j", INITYPE_BYTEARG,	np2cfg.pc9861jmp,		6},
	{"calendar", INITYPE_BOOL,		&np2cfg.calendar,		0},
	{"USE144FD", INITYPE_BOOL,		&np2cfg.usefd144,		0}};

#define	INIITEMS	(sizeof(iniitem) / sizeof(INITBL))


void initload(void) {

	char	path[MAX_PATH];

	milstr_ncpy(path, file_getcd(inifile), sizeof(path));
	ini_read(path, ini_title, iniitem, INIITEMS);
}

void initsave(void) {

	char	path[MAX_PATH];

	milstr_ncpy(path, file_getcd(inifile), sizeof(path));
	ini_write(path, ini_title, iniitem, INIITEMS);
}


RetroPC.NET-CVS <cvs@retropc.net>