| version 1.28, 2004/05/21 14:30:33 | version 1.36, 2005/03/18 09:23:11 | 
| Line 5 | Line 5 | 
 | #include        "profile.h" | #include        "profile.h" | 
 | #include        "np2.h" | #include        "np2.h" | 
 | #include        "np2arg.h" | #include        "np2arg.h" | 
 |  | #if defined(OSLANG_UCS2) | 
 |  | #include        "oemtext.h" | 
 |  | #endif | 
 | #include        "dosio.h" | #include        "dosio.h" | 
 | #include        "ini.h" | #include        "ini.h" | 
 | #include        "winkbd.h" | #include        "winkbd.h" | 
| Line 12 | Line 15 | 
 |  |  | 
 |  |  | 
 |  |  | 
| static BOOL inigetbmp(const BYTE *ptr, UINT pos) { | static BOOL inigetbmp(const UINT8 *ptr, UINT pos) { | 
 |  |  | 
 | return((ptr[pos >> 3] >> (pos & 7)) & 1); | return((ptr[pos >> 3] >> (pos & 7)) & 1); | 
 | } | } | 
 |  |  | 
| static void inisetbmp(BYTE *ptr, UINT pos, BOOL set) { | static void inisetbmp(UINT8 *ptr, UINT pos, BOOL set) { | 
 |  |  | 
 | UINT8   bit; | UINT8   bit; | 
 |  |  | 
| Line 31  static void inisetbmp(BYTE *ptr, UINT po | Line 34  static void inisetbmp(BYTE *ptr, UINT po | 
 | } | } | 
 | } | } | 
 |  |  | 
| static void inirdargs16(const char *src, const INITBL *ini) { | static void inirdargs16(const OEMCHAR *src, const INITBL *ini) { | 
 |  |  | 
 | SINT16  *dst; | SINT16  *dst; | 
 | int             dsize; | int             dsize; | 
 | int             i; | int             i; | 
| char    c; | OEMCHAR c; | 
 |  |  | 
 | dst = (SINT16 *)ini->value; | dst = (SINT16 *)ini->value; | 
 | dsize = ini->arg; | dsize = ini->arg; | 
| Line 58  static void inirdargs16(const char *src, | Line 61  static void inirdargs16(const char *src, | 
 | } | } | 
 | } | } | 
 |  |  | 
| static void inirdargh8(const char *src, const INITBL *ini) { | static void inirdargh8(const OEMCHAR *src, const INITBL *ini) { | 
 |  |  | 
| BYTE    *dst; | UINT8   *dst; | 
 | int             dsize; | int             dsize; | 
 | int             i; | int             i; | 
| BYTE    val; | UINT8   val; | 
 | BOOL    set; | BOOL    set; | 
| char    c; | OEMCHAR c; | 
 |  |  | 
| dst = (BYTE *)ini->value; | dst = (UINT8 *)ini->value; | 
 | dsize = ini->arg; | dsize = ini->arg; | 
 |  |  | 
 | for (i=0; i<dsize; i++) { | for (i=0; i<dsize; i++) { | 
| Line 103  static void inirdargh8(const char *src, | Line 106  static void inirdargh8(const char *src, | 
 | } | } | 
 | } | } | 
 |  |  | 
| static void iniwrsetargh8(char *work, int size, const INITBL *ini) { | static void iniwrsetargh8(OEMCHAR *work, int size, const INITBL *ini) { | 
 |  |  | 
 | UINT    i; | UINT    i; | 
| const BYTE      *ptr; | const UINT8     *ptr; | 
 | UINT    arg; | UINT    arg; | 
| char    tmp[8]; | OEMCHAR tmp[8]; | 
 |  |  | 
| ptr = (BYTE *)ini->value; | ptr = (UINT8 *)ini->value; | 
 | arg = ini->arg; | arg = ini->arg; | 
 | if (arg > 0) { | if (arg > 0) { | 
| SPRINTF(tmp, "%.2x", ptr[0]); | OEMSPRINTF(tmp, OEMTEXT("%.2x"), ptr[0]); | 
 | milstr_ncpy(work, tmp, size); | milstr_ncpy(work, tmp, size); | 
 | } | } | 
 | for (i=1; i<arg; i++) { | for (i=1; i<arg; i++) { | 
| SPRINTF(tmp, " %.2x", ptr[i]); | OEMSPRINTF(tmp, OEMTEXT(" %.2x"), ptr[i]); | 
 | milstr_ncat(work, tmp, size); | milstr_ncat(work, tmp, size); | 
 | } | } | 
 | } | } | 
| Line 125  const BYTE *ptr; | Line 128  const BYTE *ptr; | 
 |  |  | 
 | // ---- user | // ---- user | 
 |  |  | 
| static void inirdbyte3(const char *src, const INITBL *ini) { | static void inirdbyte3(const OEMCHAR *src, const INITBL *ini) { | 
 |  |  | 
 | UINT    i; | UINT    i; | 
 |  |  | 
| Line 135  static void inirdbyte3(const char *src, | Line 138  static void inirdbyte3(const char *src, | 
 | } | } | 
 | if ((((src[i] - '0') & 0xff) < 9) || | if ((((src[i] - '0') & 0xff) < 9) || | 
 | (((src[i] - 'A') & 0xdf) < 26)) { | (((src[i] - 'A') & 0xdf) < 26)) { | 
| ((BYTE *)ini->value)[i] = src[i]; | ((UINT8 *)ini->value)[i] = (UINT8)src[i]; | 
 | } | } | 
 | } | } | 
 | } | } | 
 |  |  | 
| static void inirdkb(const char *src, const INITBL *ini) { | static void inirdkb(const OEMCHAR *src, const INITBL *ini) { | 
 |  |  | 
| if ((!milstr_extendcmp(src, "PC98")) || | if ((!milstr_extendcmp(src, OEMTEXT("PC98"))) || | 
| (!milstr_cmp(src, "98"))) { | (!milstr_cmp(src, OEMTEXT("98")))) { | 
| *(BYTE *)ini->value = KEY_PC98; | *(UINT8 *)ini->value = KEY_PC98; | 
 | } | } | 
| else if ((!milstr_extendcmp(src, "DOS")) || | else if ((!milstr_extendcmp(src, OEMTEXT("DOS"))) || | 
| (!milstr_cmp(src, "PCAT")) || | (!milstr_cmp(src, OEMTEXT("PCAT"))) || | 
| (!milstr_cmp(src, "AT"))) { | (!milstr_cmp(src, OEMTEXT("AT")))) { | 
| *(BYTE *)ini->value = KEY_KEY106; | *(UINT8 *)ini->value = KEY_KEY106; | 
 | } | } | 
| else if ((!milstr_extendcmp(src, "KEY101")) || | else if ((!milstr_extendcmp(src, OEMTEXT("KEY101"))) || | 
| (!milstr_cmp(src, "101"))) { | (!milstr_cmp(src, OEMTEXT("101")))) { | 
| *(BYTE *)ini->value = KEY_KEY101; | *(UINT8 *)ini->value = KEY_KEY101; | 
 | } | } | 
 | } | } | 
 |  |  | 
 |  |  | 
 | // ---- | // ---- | 
 |  |  | 
| void ini_read(const char *path, const char *title, | void ini_read(const OEMCHAR *path, const OEMCHAR *title, | 
 | const INITBL *tbl, UINT count) { | const INITBL *tbl, UINT count) { | 
 |  |  | 
 | const INITBL    *p; | const INITBL    *p; | 
 | const INITBL    *pterm; | const INITBL    *pterm; | 
| char            work[512]; | #if defined(OSLANG_UCS2) | 
|  | OEMCHAR         item[10]; | 
|  | #else | 
|  | const OEMCHAR   *item; | 
|  | #endif | 
|  | OEMCHAR         work[512]; | 
 | UINT32          val; | UINT32          val; | 
 |  |  | 
 | p = tbl; | p = tbl; | 
 | pterm = tbl + count; | pterm = tbl + count; | 
 | while(p < pterm) { | while(p < pterm) { | 
 |  | #if defined(OSLANG_UCS2) | 
 |  | oemtext_sjistooem(item, NELEMENTS(item), p->item, (UINT)-1); | 
 |  | #else | 
 |  | item = p->item; | 
 |  | #endif | 
 | switch(p->itemtype & INITYPE_MASK) { | switch(p->itemtype & INITYPE_MASK) { | 
 | case INITYPE_STR: | case INITYPE_STR: | 
| GetPrivateProfileString(title, p->item, (char *)p->value, | GetPrivateProfileString(title, item, (OEMCHAR *)p->value, | 
| (char *)p->value, p->arg, path); | (OEMCHAR *)p->value, p->arg, path); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_BOOL: | case INITYPE_BOOL: | 
| GetPrivateProfileString(title, p->item, | GetPrivateProfileString(title, item, | 
| (*((BYTE *)p->value))?str_true:str_false, | (*((UINT8 *)p->value))?str_true:str_false, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
| *((BYTE *)p->value) = (!milstr_cmp(work, str_true))?1:0; | *((UINT8 *)p->value) = (!milstr_cmp(work, str_true))?1:0; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_BITMAP: | case INITYPE_BITMAP: | 
| GetPrivateProfileString(title, p->item, | GetPrivateProfileString(title, item, | 
| (inigetbmp((BYTE *)p->value, p->arg))?str_true:str_false, | (inigetbmp((UINT8 *)p->value, p->arg))?str_true:str_false, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
| inisetbmp((BYTE *)p->value, p->arg, | inisetbmp((UINT8 *)p->value, p->arg, | 
 | (milstr_cmp(work, str_true) == 0)); | (milstr_cmp(work, str_true) == 0)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_ARGS16: | case INITYPE_ARGS16: | 
| GetPrivateProfileString(title, p->item, str_null, | GetPrivateProfileString(title, item, str_null, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
 | inirdargs16(work, p); | inirdargs16(work, p); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_ARGH8: | case INITYPE_ARGH8: | 
| GetPrivateProfileString(title, p->item, str_null, | GetPrivateProfileString(title, item, str_null, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
 | inirdargh8(work, p); | inirdargh8(work, p); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_SINT8: | case INITYPE_SINT8: | 
 | case INITYPE_UINT8: | case INITYPE_UINT8: | 
| val = (BYTE)GetPrivateProfileInt(title, p->item, | val = (UINT8)GetPrivateProfileInt(title, item, | 
| *(BYTE *)p->value, path); | *(UINT8 *)p->value, path); | 
 | *(UINT8 *)p->value = (UINT8)val; | *(UINT8 *)p->value = (UINT8)val; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_SINT16: | case INITYPE_SINT16: | 
 | case INITYPE_UINT16: | case INITYPE_UINT16: | 
| val = (UINT16)GetPrivateProfileInt(title, p->item, | val = (UINT16)GetPrivateProfileInt(title, item, | 
 | *(UINT16 *)p->value, path); | *(UINT16 *)p->value, path); | 
 | *(UINT16 *)p->value = (UINT16)val; | *(UINT16 *)p->value = (UINT16)val; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_SINT32: | case INITYPE_SINT32: | 
 | case INITYPE_UINT32: | case INITYPE_UINT32: | 
| val = (UINT32)GetPrivateProfileInt(title, p->item, | val = (UINT32)GetPrivateProfileInt(title, item, | 
 | *(UINT32 *)p->value, path); | *(UINT32 *)p->value, path); | 
 | *(UINT32 *)p->value = (UINT32)val; | *(UINT32 *)p->value = (UINT32)val; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_HEX8: | case INITYPE_HEX8: | 
| SPRINTF(work, str_x, *(BYTE *)p->value), | OEMSPRINTF(work, str_x, *(UINT8 *)p->value), | 
| GetPrivateProfileString(title, p->item, work, | GetPrivateProfileString(title, item, work, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
| val = (BYTE)milstr_solveHEX(work); | val = (UINT8)milstr_solveHEX(work); | 
 | *(UINT8 *)p->value = (UINT8)val; | *(UINT8 *)p->value = (UINT8)val; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_HEX16: | case INITYPE_HEX16: | 
| SPRINTF(work, str_x, *(UINT16 *)p->value), | OEMSPRINTF(work, str_x, *(UINT16 *)p->value), | 
| GetPrivateProfileString(title, p->item, work, | GetPrivateProfileString(title, item, work, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
 | val = (UINT16)milstr_solveHEX(work); | val = (UINT16)milstr_solveHEX(work); | 
 | *(UINT16 *)p->value = (UINT16)val; | *(UINT16 *)p->value = (UINT16)val; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_HEX32: | case INITYPE_HEX32: | 
| SPRINTF(work, str_x, *(UINT32 *)p->value), | OEMSPRINTF(work, str_x, *(UINT32 *)p->value), | 
| GetPrivateProfileString(title, p->item, work, | GetPrivateProfileString(title, item, work, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
 | val = (UINT32)milstr_solveHEX(work); | val = (UINT32)milstr_solveHEX(work); | 
 | *(UINT32 *)p->value = (UINT32)val; | *(UINT32 *)p->value = (UINT32)val; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_BYTE3: | case INITYPE_BYTE3: | 
| GetPrivateProfileString(title, p->item, str_null, | GetPrivateProfileString(title, item, str_null, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
 | inirdbyte3(work, p); | inirdbyte3(work, p); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_KB: | case INITYPE_KB: | 
| GetPrivateProfileString(title, p->item, str_null, | GetPrivateProfileString(title, item, str_null, | 
| work, sizeof(work), path); | work, NELEMENTS(work), path); | 
 | inirdkb(work, p); | inirdkb(work, p); | 
 | break; | break; | 
 | } | } | 
| Line 265  const INITBL *pterm; | Line 278  const INITBL *pterm; | 
 | } | } | 
 | } | } | 
 |  |  | 
| void ini_write(const char *path, const char *title, | void ini_write(const OEMCHAR *path, const OEMCHAR *title, | 
 | const INITBL *tbl, UINT count) { | const INITBL *tbl, UINT count) { | 
 |  |  | 
 | const INITBL    *p; | const INITBL    *p; | 
 | const INITBL    *pterm; | const INITBL    *pterm; | 
| const char              *set; | const OEMCHAR   *set; | 
| char            work[512]; | OEMCHAR         work[512]; | 
 |  |  | 
 | p = tbl; | p = tbl; | 
 | pterm = tbl + count; | pterm = tbl + count; | 
| Line 281  const char  *set; | Line 294  const char  *set; | 
 | set = work; | set = work; | 
 | switch(p->itemtype & INITYPE_MASK) { | switch(p->itemtype & INITYPE_MASK) { | 
 | case INITYPE_STR: | case INITYPE_STR: | 
| set = (char *)p->value; | set = (OEMCHAR *)p->value; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_BOOL: | case INITYPE_BOOL: | 
| set = (*((BYTE *)p->value))?str_true:str_false; | set = (*((UINT8 *)p->value))?str_true:str_false; | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_ARGH8: | case INITYPE_ARGH8: | 
| iniwrsetargh8(work, sizeof(work), p); | iniwrsetargh8(work, NELEMENTS(work), p); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_SINT8: | case INITYPE_SINT8: | 
| SPRINTF(work, str_d, *((SINT8 *)p->value)); | OEMSPRINTF(work, str_d, *((SINT8 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_SINT16: | case INITYPE_SINT16: | 
| SPRINTF(work, str_d, *((SINT16 *)p->value)); | OEMSPRINTF(work, str_d, *((SINT16 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_SINT32: | case INITYPE_SINT32: | 
| SPRINTF(work, str_d, *((SINT32 *)p->value)); | OEMSPRINTF(work, str_d, *((SINT32 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_UINT8: | case INITYPE_UINT8: | 
| SPRINTF(work, str_u, *((UINT8 *)p->value)); | OEMSPRINTF(work, str_u, *((UINT8 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_UINT16: | case INITYPE_UINT16: | 
| SPRINTF(work, str_u, *((UINT16 *)p->value)); | OEMSPRINTF(work, str_u, *((UINT16 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_UINT32: | case INITYPE_UINT32: | 
| SPRINTF(work, str_u, *((UINT32 *)p->value)); | OEMSPRINTF(work, str_u, *((UINT32 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_HEX8: | case INITYPE_HEX8: | 
| SPRINTF(work, str_x, *((UINT8 *)p->value)); | OEMSPRINTF(work, str_x, *((UINT8 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_HEX16: | case INITYPE_HEX16: | 
| SPRINTF(work, str_x, *((UINT16 *)p->value)); | OEMSPRINTF(work, str_x, *((UINT16 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | case INITYPE_HEX32: | case INITYPE_HEX32: | 
| SPRINTF(work, str_x, *((UINT32 *)p->value)); | OEMSPRINTF(work, str_x, *((UINT32 *)p->value)); | 
 | break; | break; | 
 |  |  | 
 | default: | default: | 
| Line 333  const char  *set; | Line 346  const char  *set; | 
 | break; | break; | 
 | } | } | 
 | if (set) { | if (set) { | 
 |  | #if defined(OSLANG_UCS2) | 
 |  | OEMCHAR item[10]; | 
 |  | oemtext_sjistooem(item, NELEMENTS(item), p->item, (UINT)-1); | 
 |  | WritePrivateProfileString(title, item, set, path); | 
 |  | #else | 
 | WritePrivateProfileString(title, p->item, set, path); | WritePrivateProfileString(title, p->item, set, path); | 
 |  | #endif | 
 | } | } | 
 | } | } | 
 | p++; | p++; | 
| Line 344  const char  *set; | Line 363  const char  *set; | 
 | // ---- | // ---- | 
 |  |  | 
 | #if !defined(SUPPORT_PC9821) | #if !defined(SUPPORT_PC9821) | 
| static const char ini_title[] = "NekoProjectII"; | static const OEMCHAR ini_title[] = OEMTEXT("NekoProjectII"); | 
 | #else | #else | 
| static const char ini_title[] = "NekoProject21"; | static const OEMCHAR ini_title[] = OEMTEXT("NekoProject21"); | 
 | #endif | #endif | 
 |  |  | 
 | enum { | enum { | 
| Line 365  enum { | Line 384  enum { | 
 |  |  | 
 | static const INITBL iniitem[] = { | static const INITBL iniitem[] = { | 
 | {"np2title", INIRO_STR,                 np2oscfg.titles, | {"np2title", INIRO_STR,                 np2oscfg.titles, | 
| sizeof(np2oscfg.titles)}, | NELEMENTS(np2oscfg.titles)}, | 
 | {"np2winid", INIRO_BYTE3,               np2oscfg.winid,                 0}, | {"np2winid", INIRO_BYTE3,               np2oscfg.winid,                 0}, | 
 | {"WindposX", INITYPE_SINT32,    &np2oscfg.winx,                 0}, | {"WindposX", INITYPE_SINT32,    &np2oscfg.winx,                 0}, | 
 | {"WindposY", INITYPE_SINT32,    &np2oscfg.winy,                 0}, | {"WindposY", INITYPE_SINT32,    &np2oscfg.winy,                 0}, | 
| Line 382  static const INITBL iniitem[] = { | Line 401  static const INITBL iniitem[] = { | 
 | {"hdrv_acc", INIRO_UINT8,               &np2cfg.hdrvacc,                0}, | {"hdrv_acc", INIRO_UINT8,               &np2cfg.hdrvacc,                0}, | 
 |  |  | 
 | {"pc_model", INITYPE_STR,               &np2cfg.model, | {"pc_model", INITYPE_STR,               &np2cfg.model, | 
| sizeof(np2cfg.model)}, | NELEMENTS(np2cfg.model)}, | 
 | {"clk_base", INITYPE_UINT32,    &np2cfg.baseclock,              0}, | {"clk_base", INITYPE_UINT32,    &np2cfg.baseclock,              0}, | 
 | {"clk_mult", INITYPE_UINT32,    &np2cfg.multiple,               0}, | {"clk_mult", INITYPE_UINT32,    &np2cfg.multiple,               0}, | 
 |  |  | 
 | {"DIPswtch", INITYPE_ARGH8,             np2cfg.dipsw,                   3}, | {"DIPswtch", INITYPE_ARGH8,             np2cfg.dipsw,                   3}, | 
 | {"MEMswtch", INITYPE_ARGH8,             np2cfg.memsw,                   8}, | {"MEMswtch", INITYPE_ARGH8,             np2cfg.memsw,                   8}, | 
| {"ExMemory", INIMAX_UINT8,              &np2cfg.EXTMEM,                 13}, | {"ExMemory", INIMAX_UINT8,              &np2cfg.EXTMEM,                 63}, | 
 | {"ITF_WORK", INIRO_BOOL,                &np2cfg.ITF_WORK,               0}, | {"ITF_WORK", INIRO_BOOL,                &np2cfg.ITF_WORK,               0}, | 
 |  |  | 
 | {"HDD1FILE", INITYPE_STR,               np2cfg.sasihdd[0],              MAX_PATH}, | {"HDD1FILE", INITYPE_STR,               np2cfg.sasihdd[0],              MAX_PATH}, | 
| Line 510  static const INITBL iniitem[] = { | Line 529  static const INITBL iniitem[] = { | 
 | {"keydispl", INITYPE_BOOL,              &np2oscfg.keydisp,              0}, | {"keydispl", INITYPE_BOOL,              &np2oscfg.keydisp,              0}, | 
 | {"jast_snd", INITYPE_BOOL,              &np2oscfg.jastsnd,              0},             // ver0.73 | {"jast_snd", INITYPE_BOOL,              &np2oscfg.jastsnd,              0},             // ver0.73 | 
 | {"useromeo", INITYPE_BOOL,              &np2oscfg.useromeo,             0},             // ver0.74 | {"useromeo", INITYPE_BOOL,              &np2oscfg.useromeo,             0},             // ver0.74 | 
 |  | {"thickfrm", INITYPE_BOOL,              &np2oscfg.thickframe,   0},             // ver0.77 | 
 |  | {"xrollkey", INIRO_BOOL,                &np2oscfg.xrollkey,             0},             // ver0.78 | 
 |  | {"fscrnbpp", INIRO_UINT8,               &np2oscfg.fscrnbpp,             0}, | 
 | {"I286SAVE", INIRO_BOOL,                &np2oscfg.I286SAVE,             0}}; | {"I286SAVE", INIRO_BOOL,                &np2oscfg.I286SAVE,             0}}; | 
 |  |  | 
 |  |  | 
| void initgetfile(char *path, UINT size) { | void initgetfile(OEMCHAR *path, UINT size) { | 
 |  |  | 
| char    *p; | const OEMCHAR   *ext; | 
 |  |  | 
 | file_cpyname(path, modulefile, size); | file_cpyname(path, modulefile, size); | 
 | if (np2arg.ini) { | if (np2arg.ini) { | 
| Line 526  void initgetfile(char *path, UINT size) | Line 548  void initgetfile(char *path, UINT size) | 
 | else { | else { | 
 | file_cpyname(path, np2arg.ini, size); | file_cpyname(path, np2arg.ini, size); | 
 | } | } | 
| p = file_getext(path); | ext = file_getext(path); | 
| if (!(*p)) { | if (ext[0] != '\0') { | 
| file_catname(path, ".ini", size); | file_catname(path, OEMTEXT(".ini"), size); | 
 | } | } | 
 | } | } | 
 | else { | else { | 
 | file_cutext(path); | file_cutext(path); | 
| file_catname(path, ".ini", size); | file_catname(path, OEMTEXT(".ini"), size); | 
 | } | } | 
 | } | } | 
 |  |  | 
 | void initload(void) { | void initload(void) { | 
 |  |  | 
| char    path[MAX_PATH]; | OEMCHAR path[MAX_PATH]; | 
 |  |  | 
| initgetfile(path, sizeof(path)); | initgetfile(path, NELEMENTS(path)); | 
| ini_read(path, ini_title, iniitem, sizeof(iniitem)/sizeof(INITBL)); | ini_read(path, ini_title, iniitem, NELEMENTS(iniitem)); | 
 | } | } | 
 |  |  | 
 | void initsave(void) { | void initsave(void) { | 
 |  |  | 
| char    path[MAX_PATH]; | OEMCHAR path[MAX_PATH]; | 
 |  |  | 
| initgetfile(path, sizeof(path)); | initgetfile(path, NELEMENTS(path)); | 
| ini_write(path, ini_title, iniitem, sizeof(iniitem)/sizeof(INITBL)); | ini_write(path, ini_title, iniitem, NELEMENTS(iniitem)); | 
 | } | } | 
 |  |  |