File:  [RetroPC.NET] / np2 / wince / ini.cpp
Revision 1.17: download - view: text, annotated - select for diffs
Mon May 16 15:08:23 2005 JST (20 years, 5 months ago) by yui
Branches: MAIN
CVS tags: VER_0_82_x64, VER_0_82, VER_0_81A, VER_0_81, HEAD
fix ini np2cfg.model pointer (T.Yui)

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


static void binset(UINT8 *bin, UINT binlen, const OEMCHAR *src) {

	UINT	i;
	UINT8	val;
	BOOL	set;
	OEMCHAR	c;

	for (i=0; i<binlen; 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;
		}
		bin[i] = val;
	}
}

static void binget(OEMCHAR *work, int size, const UINT8 *bin, UINT binlen) {

	UINT	i;
	OEMCHAR	tmp[8];

	if (binlen) {
		OEMSPRINTF(tmp, OEMTEXT("%.2x"), bin[0]);
		milstr_ncpy(work, tmp, size);
	}
	for (i=1; i<binlen; i++) {
		OEMSPRINTF(tmp, OEMTEXT(" %.2x"), bin[i]);
		milstr_ncat(work, tmp, size);
	}
}


// ----

typedef struct {
const OEMCHAR	*title;
const PFTBL		*tbl;
const PFTBL		*tblterm;
	UINT		count;
} _PFARG, *PFARG;

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

const PFTBL	*p;

	if (arg == NULL) {
		return(FAILURE);
	}
	if (milstr_cmp(para, ((PFARG)arg)->title)) {
		return(SUCCESS);
	}
	p = ((PFARG)arg)->tbl;
	while(p < ((PFARG)arg)->tblterm) {
		if (!milstr_cmp(key, p->item)) {
			switch(p->itemtype & PFTYPE_MASK) {
				case PFTYPE_STR:
					milstr_ncpy((OEMCHAR *)p->value, data, p->arg);
					break;

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

				case PFTYPE_BIN:
					binset((UINT8 *)p->value, p->arg, data);
					break;

				case PFTYPE_SINT8:
				case PFTYPE_UINT8:
					*((UINT8 *)p->value) = (UINT8)milstr_solveINT(data);
					break;

				case PFTYPE_SINT16:
				case PFTYPE_UINT16:
					*((UINT16 *)p->value) = (UINT16)milstr_solveINT(data);
					break;

				case PFTYPE_SINT32:
				case PFTYPE_UINT32:
					*((UINT32 *)p->value) = (UINT32)milstr_solveINT(data);
					break;

				case PFTYPE_HEX8:
					*((UINT8 *)p->value) = (UINT8)milstr_solveHEX(data);
					break;

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

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

void ini_read(const OEMCHAR *path, const OEMCHAR *title,
											const PFTBL *tbl, UINT count) {

	_PFARG	iniarg;

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


// ----

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

	int		i;
	OEMCHAR	c;

	if (ptr[0] == ' ') {
		goto iwss_extend;
	}
	i = OEMSTRLEN(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';
	}
}

void ini_write(const OEMCHAR *path, const OEMCHAR *title,
											const PFTBL *tbl, UINT count) {

	TEXTFILEH	tfh;
const PFTBL		*p;
const PFTBL		*pterm;
	BOOL		set;
	OEMCHAR		work[512];

	tfh = textfile_create(path, 0x800);
	if (tfh == NULL) {
		return;
	}
	milstr_ncpy(work, OEMTEXT("["), NELEMENTS(work));
	milstr_ncat(work, title, NELEMENTS(work));
	milstr_ncat(work, OEMTEXT("]\r\n"), NELEMENTS(work));
	textfile_write(tfh, work);

	p = tbl;
	pterm = tbl + count;
	while(p < pterm) {
		work[0] = '\0';
		set = SUCCESS;
		switch(p->itemtype & PFTYPE_MASK) {
			case PFTYPE_STR:
				iniwrsetstr(work, NELEMENTS(work), (OEMCHAR *)p->value);
				break;

			case PFTYPE_BOOL:
				milstr_ncpy(work, (*((UINT8 *)p->value))?str_true:str_false,
															NELEMENTS(work));
				break;

			case PFTYPE_BIN:
				binget(work, NELEMENTS(work), (UINT8 *)p->value, p->arg);
				break;

			case PFTYPE_SINT8:
				OEMSPRINTF(work, str_d, *((SINT8 *)p->value));
				break;

			case PFTYPE_SINT16:
				OEMSPRINTF(work, str_d, *((SINT16 *)p->value));
				break;

			case PFTYPE_SINT32:
				OEMSPRINTF(work, str_d, *((SINT32 *)p->value));
				break;

			case PFTYPE_UINT8:
				OEMSPRINTF(work, str_u, *((UINT8 *)p->value));
				break;

			case PFTYPE_UINT16:
				OEMSPRINTF(work, str_u, *((UINT16 *)p->value));
				break;

			case PFTYPE_UINT32:
				OEMSPRINTF(work, str_u, *((UINT32 *)p->value));
				break;

			case PFTYPE_HEX8:
				OEMSPRINTF(work, str_x, *((UINT8 *)p->value));
				break;

			case PFTYPE_HEX16:
				OEMSPRINTF(work, str_x, *((UINT16 *)p->value));
				break;

			case PFTYPE_HEX32:
				OEMSPRINTF(work, str_x, *((UINT32 *)p->value));
				break;

			default:
				set = FAILURE;
				break;
		}
		if (set == SUCCESS) {
			textfile_write(tfh, p->item);
			textfile_write(tfh, OEMTEXT("="));
			textfile_write(tfh, work);
			textfile_write(tfh, OEMTEXT("\r\n"));
		}
		p++;
	}
	textfile_close(tfh);
}


// ----

#if defined(OSLANG_UTF8)
static const OEMCHAR ini_title[] = OEMTEXT("NekoProjectIICE");
static const OEMCHAR inifile[] = OEMTEXT("np2ce.cfg");
#else
static const OEMCHAR ini_title[] = OEMTEXT("NekoProjectII");
static const OEMCHAR inifile[] = OEMTEXT("np2.cfg");
#endif

enum {
	PFRO_STR		= PFFLAG_RO + PFTYPE_STR,
	PFRO_BOOL		= PFFLAG_RO + PFTYPE_BOOL,
	PFRO_HEX32		= PFFLAG_RO + PFTYPE_HEX32
};

static const PFTBL iniitem[] = {
	PFSTR("pc_model", PFTYPE_STR,		np2cfg.model),
	PFVAL("clk_base", PFTYPE_UINT32,	&np2cfg.baseclock),
	PFVAL("clk_mult", PFTYPE_UINT32,	&np2cfg.multiple),

	PFEXT("DIPswtch", PFTYPE_BIN,		np2cfg.dipsw,			3),
	PFEXT("MEMswtch", PFTYPE_BIN,		np2cfg.memsw,			8),
	PFMAX("ExMemory", PFTYPE_UINT8,		&np2cfg.EXTMEM,			63),
	PFVAL("ITF_WORK", PFRO_BOOL,		&np2cfg.ITF_WORK),

	PFSTR("HDD1FILE", PFTYPE_STR,		np2cfg.sasihdd[0]),
	PFSTR("HDD2FILE", PFTYPE_STR,		np2cfg.sasihdd[1]),
#if defined(SUPPORT_SCSI)
	PFSTR("SCSIHDD0", PFTYPE_STR,		np2cfg.scsihdd[0]),
	PFSTR("SCSIHDD1", PFTYPE_STR,		np2cfg.scsihdd[1]),
	PFSTR("SCSIHDD2", PFTYPE_STR,		np2cfg.scsihdd[2]),
	PFSTR("SCSIHDD3", PFTYPE_STR,		np2cfg.scsihdd[3]),
#endif
	PFSTR("fontfile", PFTYPE_STR,		np2cfg.fontfile),
	PFSTR("biospath", PFRO_STR,			np2cfg.biospath),

	PFVAL("SampleHz", PFTYPE_UINT16,	&np2cfg.samplingrate),
	PFVAL("Latencys", PFTYPE_UINT16,	&np2cfg.delayms),
	PFVAL("SNDboard", PFTYPE_HEX8,		&np2cfg.SOUND_SW),
	PFAND("BEEP_vol", PFTYPE_UINT8,		&np2cfg.BEEP_VOL,		3),
	PFVAL("xspeaker", PFRO_BOOL,		&np2cfg.snd_x),

	PFEXT("SND14vol", PFTYPE_BIN,		np2cfg.vol14,			6),
//	PFEXT("opt14BRD", PFTYPE_BIN,		np2cfg.snd14opt,		3),
	PFVAL("opt26BRD", PFTYPE_HEX8,		&np2cfg.snd26opt),
	PFVAL("opt86BRD", PFTYPE_HEX8,		&np2cfg.snd86opt),
	PFVAL("optSPBRD", PFTYPE_HEX8,		&np2cfg.spbopt),
	PFVAL("optSPBVR", PFTYPE_HEX8,		&np2cfg.spb_vrc),
	PFMAX("optSPBVL", PFTYPE_UINT8,		&np2cfg.spb_vrl,		24),
	PFVAL("optSPB_X", PFTYPE_BOOL,		&np2cfg.spb_x),
	PFVAL("optMPU98", PFTYPE_HEX8,		&np2cfg.mpuopt),

	PFMAX("volume_F", PFTYPE_UINT8,		&np2cfg.vol_fm,			128),
	PFMAX("volume_S", PFTYPE_UINT8,		&np2cfg.vol_ssg,		128),
	PFMAX("volume_A", PFTYPE_UINT8,		&np2cfg.vol_adpcm,		128),
	PFMAX("volume_P", PFTYPE_UINT8,		&np2cfg.vol_pcm,		128),
	PFMAX("volume_R", PFTYPE_UINT8,		&np2cfg.vol_rhythm,		128),

	PFVAL("Seek_Snd", PFTYPE_BOOL,		&np2cfg.MOTOR),
	PFMAX("Seek_Vol", PFTYPE_UINT8,		&np2cfg.MOTORVOL,		100),

	PFVAL("btnRAPID", PFTYPE_BOOL,		&np2cfg.BTN_RAPID),
	PFVAL("btn_MODE", PFTYPE_BOOL,		&np2cfg.BTN_MODE),
	PFVAL("MS_RAPID", PFTYPE_BOOL,		&np2cfg.MOUSERAPID),

	PFEXT("VRAMwait", PFTYPE_BIN,		np2cfg.wait,			6),
	PFVAL("DispSync", PFTYPE_BOOL,		&np2cfg.DISPSYNC),
	PFVAL("Real_Pal", PFTYPE_BOOL,		&np2cfg.RASTER),
	PFMAX("RPal_tim", PFTYPE_UINT8,		&np2cfg.realpal,		64),
	PFVAL("uPD72020", PFTYPE_BOOL,		&np2cfg.uPD72020),
	PFAND("GRCG_EGC", PFTYPE_UINT8,		&np2cfg.grcg,			3),
	PFVAL("color16b", PFTYPE_BOOL,		&np2cfg.color16),
	PFVAL("skipline", PFTYPE_BOOL,		&np2cfg.skipline),
	PFVAL("skplight", PFTYPE_UINT16,	&np2cfg.skiplight),
	PFAND("LCD_MODE", PFTYPE_UINT8,		&np2cfg.LCD_MODE,		0x03),
	PFAND("BG_COLOR", PFRO_HEX32,		&np2cfg.BG_COLOR,		0xffffff),
	PFAND("FG_COLOR", PFRO_HEX32,		&np2cfg.FG_COLOR,		0xffffff),

	PFVAL("pc9861_e", PFTYPE_BOOL,		&np2cfg.pc9861enable),
	PFEXT("pc9861_s", PFTYPE_BIN,		np2cfg.pc9861sw,		3),
	PFEXT("pc9861_j", PFTYPE_BIN,		np2cfg.pc9861jmp,		6),

	PFVAL("calendar", PFTYPE_BOOL,		&np2cfg.calendar),
	PFVAL("USE144FD", PFTYPE_BOOL,		&np2cfg.usefd144),

	// OSˑ`
	PFVAL("s_NOWAIT", PFTYPE_BOOL,		&np2oscfg.NOWAIT),
	PFVAL("SkpFrame", PFTYPE_UINT8,		&np2oscfg.DRAW_SKIP),
	PFVAL("F12_bind", PFTYPE_UINT8,		&np2oscfg.F12KEY),
	PFVAL("e_resume", PFTYPE_BOOL,		&np2oscfg.resume),

#if !defined(GX_DLL)
	PFVAL("WindposX", PFTYPE_SINT32,	&np2oscfg.winx),
	PFVAL("WindposY", PFTYPE_SINT32,	&np2oscfg.winy),
#endif
#if defined(WIN32_PLATFORM_PSPC)
	PFVAL("pbindcur", PFTYPE_UINT8,		&np2oscfg.bindcur),
	PFVAL("pbindbtn", PFTYPE_UINT8,		&np2oscfg.bindbtn),
#endif
	PFVAL("jast_snd", PFTYPE_BOOL,		&np2oscfg.jastsnd),
};


void initload(void) {

	OEMCHAR	path[MAX_PATH];

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

void initsave(void) {

	OEMCHAR	path[MAX_PATH];

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


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