|
|
| version 1.6, 2004/03/31 14:02:50 | version 1.16, 2005/04/01 15:35:49 |
|---|---|
| Line 1 | Line 1 |
| #include "compiler.h" | #include "compiler.h" |
| #include "strres.h" | #include "strres.h" |
| #include "dosio.h" | |
| #include "textfile.h" | #include "textfile.h" |
| #include "profile.h" | #include "profile.h" |
| #if defined(SUPPORT_TEXTCNV) | |
| #include "textcnv.h" | |
| #endif | |
| #include "dosio.h" | |
| static void strdelspace(char **buf, int *size) { | static void strdelspace(OEMCHAR **buf, int *size) { |
| char *p; | OEMCHAR *p; |
| int len; | int len; |
| p = *buf; | p = *buf; |
| Line 23 static void strdelspace(char **buf, int | Line 26 static void strdelspace(char **buf, int |
| *size = len; | *size = len; |
| } | } |
| static char *profana(char *buf, char **data) { | static OEMCHAR *profana(OEMCHAR *buf, OEMCHAR **data) { |
| int len; | int len; |
| char *buf2; | OEMCHAR *buf2; |
| int l; | int l; |
| len = strlen(buf); | len = OEMSTRLEN(buf); |
| strdelspace(&buf, &len); | strdelspace(&buf, &len); |
| if ((len >= 2) && (buf[0] == '[') && (buf[len - 1] == ']')) { | if ((len >= 2) && (buf[0] == '[') && (buf[len - 1] == ']')) { |
| buf++; | buf++; |
| Line 62 static char *profana(char *buf, char **d | Line 65 static char *profana(char *buf, char **d |
| return(NULL); | return(NULL); |
| } | } |
| BOOL profile_enum(const char *filename, void *arg, | BOOL profile_enum(const OEMCHAR *filename, void *arg, |
| BOOL (*proc)(void *arg, const char *para, | BOOL (*proc)(void *arg, const OEMCHAR *para, |
| const char *key, const char *data)) { | const OEMCHAR *key, const OEMCHAR *data)) { |
| TEXTFILEH fh; | TEXTFILEH fh; |
| BOOL r; | BOOL r; |
| char buf[0x200]; | OEMCHAR buf[0x200]; |
| char para[0x100]; | OEMCHAR para[0x100]; |
| char *key; | OEMCHAR *key; |
| char *data; | OEMCHAR *data; |
| r = FALSE; | r = FALSE; |
| if (proc == NULL) { | if (proc == NULL) { |
| Line 82 BOOL profile_enum(const char *filename, | Line 85 BOOL profile_enum(const char *filename, |
| } | } |
| para[0] = '\0'; | para[0] = '\0'; |
| while(1) { | while(1) { |
| if (textfile_read(fh, buf, sizeof(buf)) != SUCCESS) { | if (textfile_read(fh, buf, NELEMENTS(buf)) != SUCCESS) { |
| break; | break; |
| } | } |
| key = profana(buf, &data); | key = profana(buf, &data); |
| if (key) { | if (key) { |
| if (data == NULL) { | if (data == NULL) { |
| milstr_ncpy(para, key, sizeof(para)); | milstr_ncpy(para, key, NELEMENTS(para)); |
| } | } |
| else { | else { |
| r = proc(arg, para, key, data); | r = proc(arg, para, key, data); |
| Line 107 gden_err0: | Line 110 gden_err0: |
| // ---- | // ---- |
| const char *profile_getarg(const char *str, char *buf, UINT leng) { | const OEMCHAR *profile_getarg(const OEMCHAR *str, OEMCHAR *buf, UINT leng) { |
| UINT8 c; | OEMCHAR c; |
| if (leng) { | if (leng) { |
| leng--; | leng--; |
| Line 118 const char *profile_getarg(const char *s | Line 121 const char *profile_getarg(const char *s |
| buf = NULL; | buf = NULL; |
| } | } |
| if (str) { | if (str) { |
| c = (UINT8)*str; | c = *str; |
| while(((c - 1) & 0xff) < 0x20) { | while((c > 0) && (c <= 0x20)) { |
| str++; | str++; |
| c = (UINT8)*str; | c = *str; |
| } | } |
| if (c == 0) { | if (c == 0) { |
| str = NULL; | str = NULL; |
| } | } |
| } | } |
| if (str) { | if (str) { |
| c = (UINT8)*str; | c = *str; |
| while(c > 0x20) { | while((c < 0) || (c > 0x20)) { |
| if (leng) { | if (leng) { |
| *buf++ = c; | *buf++ = c; |
| leng--; | leng--; |
| } | } |
| str++; | str++; |
| c = (UINT8)*str; | c = *str; |
| } | } |
| } | } |
| if (buf) { | if (buf) { |
| Line 149 const char *profile_getarg(const char *s | Line 152 const char *profile_getarg(const char *s |
| // ---- まだテスト | // ---- まだテスト |
| typedef struct { | typedef struct { |
| UINT applen; | UINT applen; |
| UINT keylen; | UINT keylen; |
| UINT pos; | UINT pos; |
| UINT size; | UINT size; |
| UINT apphit; | UINT apphit; |
| const char *data; | const OEMCHAR *data; |
| UINT datasize; | UINT datasize; |
| } PFPOS; | } PFPOS; |
| static char *delspace(const char *buf, UINT *len) { | #define PFBUFSIZE (1 << 8) |
| static OEMCHAR *delspace(const OEMCHAR *buf, UINT *len) { | |
| UINT l; | UINT l; |
| Line 173 static char *delspace(const char *buf, U | Line 178 static char *delspace(const char *buf, U |
| } | } |
| *len = l; | *len = l; |
| } | } |
| return((char *)buf); | return((OEMCHAR *)buf); |
| } | } |
| static BOOL seakey(PFILEH hdl, PFPOS *pfp, const char *app, const char *key) { | static BRESULT seakey(PFILEH hdl, PFPOS *pfp, const OEMCHAR *app, |
| const OEMCHAR *key) { | |
| PFPOS ret; | PFPOS ret; |
| UINT pos; | UINT pos; |
| UINT size; | UINT size; |
| char *buf; | OEMCHAR *buf; |
| UINT len; | UINT len; |
| UINT cnt; | UINT cnt; |
| Line 189 static BOOL seakey(PFILEH hdl, PFPOS *pf | Line 195 static BOOL seakey(PFILEH hdl, PFPOS *pf |
| return(FAILURE); | return(FAILURE); |
| } | } |
| ZeroMemory(&ret, sizeof(ret)); | ZeroMemory(&ret, sizeof(ret)); |
| ret.applen = strlen(app); | ret.applen = OEMSTRLEN(app); |
| ret.keylen = strlen(key); | ret.keylen = OEMSTRLEN(key); |
| if ((ret.applen == 0) || (ret.keylen == 0)) { | if ((ret.applen == 0) || (ret.keylen == 0)) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| Line 259 static BOOL seakey(PFILEH hdl, PFPOS *pf | Line 265 static BOOL seakey(PFILEH hdl, PFPOS *pf |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| static BOOL replace(PFILEH hdl, UINT pos, UINT size1, UINT size2) { | static BRESULT replace(PFILEH hdl, UINT pos, UINT size1, UINT size2) { |
| UINT cnt; | UINT cnt; |
| UINT size; | UINT size; |
| char *p; | UINT newsize; |
| char *q; | OEMCHAR *p; |
| OEMCHAR *q; | |
| size1 += pos; | size1 += pos; |
| size2 += pos; | size2 += pos; |
| Line 273 static BOOL replace(PFILEH hdl, UINT pos | Line 280 static BOOL replace(PFILEH hdl, UINT pos |
| } | } |
| cnt = hdl->size - size1; | cnt = hdl->size - size1; |
| if (size1 < size2) { | if (size1 < size2) { |
| size = size2 - size1; | size = hdl->size + size2 - size1; |
| if ((hdl->size + size) > hdl->buffers) { | if (size > hdl->buffers) { |
| return(FAILURE); | newsize = (size & (~(PFBUFSIZE - 1))) + PFBUFSIZE; |
| p = (OEMCHAR *)_MALLOC(newsize * sizeof(OEMCHAR), "profile"); | |
| if (p == NULL) { | |
| return(FAILURE); | |
| } | |
| if (hdl->buffer) { | |
| CopyMemory(p, hdl->buffer, hdl->buffers * sizeof(OEMCHAR)); | |
| _MFREE(hdl->buffer); | |
| } | |
| hdl->buffer = p; | |
| hdl->buffers = newsize; | |
| } | } |
| hdl->size += size; | hdl->size = size; |
| if (cnt) { | if (cnt) { |
| p = hdl->buffer + size1; | p = hdl->buffer + size1; |
| q = hdl->buffer + size2; | q = hdl->buffer + size2; |
| Line 301 static BOOL replace(PFILEH hdl, UINT pos | Line 318 static BOOL replace(PFILEH hdl, UINT pos |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| PFILEH profile_open(const char *filename, UINT flag) { | static PFILEH registfile(FILEH fh) { |
| FILEH fh; | UINT rsize; |
| UINT filesize; | #if defined(SUPPORT_TEXTCNV) |
| TCINF inf; | |
| #endif | |
| UINT hdrsize; | |
| UINT width; | |
| UINT8 hdr[4]; | |
| UINT size; | UINT size; |
| UINT newsize; | |
| void *buf; | |
| #if defined(SUPPORT_TEXTCNV) | |
| void *buf2; | |
| #endif | |
| PFILEH ret; | PFILEH ret; |
| if (filename == NULL) { | rsize = file_read(fh, hdr, sizeof(hdr)); |
| goto pfore_err1; | #if defined(SUPPORT_TEXTCNV) |
| } | if (textcnv_getinfo(&inf, hdr, rsize) == 0) { |
| fh = file_open(filename); | goto rf_err1; |
| filesize = 0; | } |
| if (fh != FILEH_INVALID) { | if (!(inf.caps & TEXTCNV_READ)) { |
| filesize = file_getsize(fh); | goto rf_err1; |
| } | |
| if ((inf.width != 1) && (inf.width != 2)) { | |
| goto rf_err1; | |
| } | |
| hdrsize = inf.hdrsize; | |
| width = inf.width; | |
| #else | |
| hdrsize = 0; | |
| width = 1; | |
| if ((rsize >= 3) && | |
| (hdr[0] == 0xef) && (hdr[1] == 0xbb) && (hdr[2] == 0xbf)) { | |
| // UTF-8 | |
| hdrsize = 3; | |
| } | |
| else if ((rsize >= 2) && (hdr[0] == 0xff) && (hdr[1] == 0xfe)) { | |
| // UCSLE | |
| hdrsize = 2; | |
| width = 2; | |
| #if defined(BYTESEX_BIG) | |
| goto rf_err1; | |
| #endif | |
| } | |
| else if ((rsize >= 2) && (hdr[0] == 0xfe) && (hdr[1] == 0xff)) { | |
| // UCS2BE | |
| hdrsize = 2; | |
| width = 2; | |
| #if defined(BYTESEX_LITTLE) | |
| goto rf_err1; | |
| #endif | |
| } | |
| if (width != sizeof(OEMCHAR)) { | |
| goto rf_err1; | |
| } | |
| #endif | |
| size = file_getsize(fh); | |
| if (size < hdrsize) { | |
| goto rf_err1; | |
| } | |
| if (file_seek(fh, (long)hdrsize, FSEEK_SET) != (long)hdrsize) { | |
| goto rf_err1; | |
| } | |
| size = (size - hdrsize) / width; | |
| newsize = (size & (~(PFBUFSIZE - 1))) + PFBUFSIZE; | |
| buf = _MALLOC(newsize * width, "profile"); | |
| if (buf == NULL) { | |
| goto rf_err1; | |
| } | |
| rsize = file_read(fh, buf, newsize * width) / width; | |
| #if defined(SUPPORT_TEXTCNV) | |
| if (inf.xendian) { | |
| textcnv_swapendian16(buf, rsize); | |
| } | |
| if (inf.tooem) { | |
| size = (inf.tooem)(NULL, 0, buf, rsize); | |
| newsize = (size & (~(PFBUFSIZE - 1))) + PFBUFSIZE; | |
| buf2 = _MALLOC(newsize * sizeof(OEMCHAR), "profile tmp"); | |
| if (buf2 == NULL) { | |
| goto rf_err2; | |
| } | |
| (inf.tooem)(buf2, size, buf, rsize); | |
| _MFREE(buf); | |
| buf = buf2; | |
| rsize = size; | |
| } | } |
| else if (flag & PFILEH_READONLY) { | #endif // defined(SUPPORT_TEXTCNV) |
| goto pfore_err1; | |
| ret = (PFILEH)_MALLOC(sizeof(_PFILEH), "profile"); | |
| if (ret == NULL) { | |
| goto rf_err2; | |
| } | } |
| else { | ZeroMemory(ret, sizeof(_PFILEH)); |
| fh = file_create(filename); | ret->buffer = buf; |
| if (fh == FILEH_INVALID) { | ret->buffers = newsize; |
| goto pfore_err1; | ret->size = rsize; |
| } | if (hdrsize) { |
| CopyMemory(ret->hdr, hdr, hdrsize); | |
| } | } |
| size = filesize + 0x2000; | ret->hdrsize = hdrsize; |
| ret = (PFILEH)_MALLOC(sizeof(_PFILEH) + size, filename); | return(ret); |
| rf_err2: | |
| _MFREE(buf); | |
| rf_err1: | |
| return(NULL); | |
| } | |
| static PFILEH registnew(void) { | |
| const UINT8 *hdr; | |
| UINT hdrsize; | |
| PFILEH ret; | |
| #if defined(OSLANG_UTF8) | |
| hdr = str_utf8; | |
| hdrsize = sizeof(str_utf8); | |
| #elif defined(OSLANG_UCS2) | |
| hdr = (UINT8 *)str_ucs2; | |
| hdrsize = sizeof(str_ucs2); | |
| #else | |
| hdr = NULL; | |
| hdrsize = 0; | |
| #endif | |
| ret = (PFILEH)_MALLOC(sizeof(_PFILEH), "profile"); | |
| if (ret == NULL) { | if (ret == NULL) { |
| goto pfore_err2; | goto rn_err; |
| } | } |
| if (filesize) { | ZeroMemory(ret, sizeof(_PFILEH)); |
| if (file_read(fh, ret + 1, filesize) != filesize) { | // ret->buffer = NULL; |
| goto pfore_err3; | // ret->buffers = 0; |
| } | // ret->size = 0; |
| if (hdrsize) { | |
| CopyMemory(ret->hdr, hdr, hdrsize); | |
| } | } |
| file_close(fh); | ret->hdrsize = hdrsize; |
| ret->buffer = (BYTE *)(ret + 1); | |
| ret->buffers = size; | |
| ret->size = filesize; | |
| ret->flag = flag; | |
| file_cpyname(ret->path, filename, sizeof(ret->path)); | |
| return(ret); | return(ret); |
| pfore_err3: | rn_err: |
| _MFREE(ret); | return(NULL); |
| } | |
| pfore_err2: | PFILEH profile_open(const OEMCHAR *filename, UINT flag) { |
| file_close(fh); | |
| pfore_err1: | PFILEH ret; |
| return(NULL); | FILEH fh; |
| ret = NULL; | |
| if (filename != NULL) { | |
| fh = file_open_rb(filename); | |
| if (fh != FILEH_INVALID) { | |
| ret = registfile(fh); | |
| file_close(fh); | |
| } | |
| else if (flag & PFILEH_READONLY) { | |
| } | |
| else { | |
| ret = registnew(); | |
| } | |
| } | |
| if (ret) { | |
| ret->flag = flag; | |
| file_cpyname(ret->path, filename, NELEMENTS(ret->path)); | |
| } | |
| return(ret); | |
| } | } |
| void profile_close(PFILEH hdl) { | void profile_close(PFILEH hdl) { |
| void *buf; | |
| UINT bufsize; | |
| #if defined(SUPPORT_TEXTCNV) | |
| TCINF inf; | |
| void *buf2; | |
| UINT buf2size; | |
| #endif | |
| UINT hdrsize; | |
| UINT width; | |
| FILEH fh; | FILEH fh; |
| if (hdl) { | if (hdl == NULL) { |
| if (hdl->flag & PFILEH_MODIFY) { | return; |
| fh = file_create(hdl->path); | } |
| if (fh != FILEH_INVALID) { | buf = hdl->buffer; |
| file_write(fh, hdl->buffer, hdl->size); | bufsize = hdl->size; |
| file_close(fh); | if (hdl->flag & PFILEH_MODIFY) { |
| } | #if defined(SUPPORT_TEXTCNV) |
| if (textcnv_getinfo(&inf, hdl->hdr, hdl->hdrsize) == 0) { | |
| goto wf_err1; | |
| } | |
| if (!(inf.caps & TEXTCNV_WRITE)) { | |
| goto wf_err1; | |
| } | |
| if ((inf.width != 1) && (inf.width != 2)) { | |
| goto wf_err1; | |
| } | |
| if (inf.fromoem) { | |
| buf2size = (inf.fromoem)(NULL, 0, buf, bufsize); | |
| buf2 = _MALLOC(buf2size * inf.width, "profile tmp"); | |
| if (buf2 == NULL) { | |
| goto wf_err1; | |
| } | |
| (inf.fromoem)(buf2, buf2size, buf, bufsize); | |
| _MFREE(buf); | |
| buf = buf2; | |
| bufsize = buf2size; | |
| } | |
| if (inf.xendian) { | |
| textcnv_swapendian16(buf, bufsize); | |
| } | |
| hdrsize = inf.hdrsize; | |
| width = inf.width; | |
| #else // defined(SUPPORT_TEXTCNV) | |
| hdrsize = hdl->hdrsize; | |
| width = sizeof(OEMCHAR); | |
| #endif // defined(SUPPORT_TEXTCNV) | |
| fh = file_create(hdl->path); | |
| if (fh == FILEH_INVALID) { | |
| goto wf_err1; | |
| } | |
| if (hdrsize) { | |
| file_write(fh, hdl->hdr, hdrsize); | |
| } | } |
| _MFREE(hdl); | file_write(fh, buf, bufsize * width); |
| file_close(fh); | |
| } | |
| wf_err1: | |
| if (buf) { | |
| _MFREE(buf); | |
| } | } |
| _MFREE(hdl); | |
| } | } |
| BOOL profile_read(const char *app, const char *key, const char *def, | BRESULT profile_read(const OEMCHAR *app, const OEMCHAR *key, |
| char *ret, UINT size, PFILEH hdl) { | const OEMCHAR *def, OEMCHAR *ret, UINT size, PFILEH hdl) { |
| PFPOS pfp; | PFPOS pfp; |
| Line 388 BOOL profile_read(const char *app, const | Line 576 BOOL profile_read(const char *app, const |
| } | } |
| } | } |
| BOOL profile_write(const char *app, const char *key, | BRESULT profile_write(const OEMCHAR *app, const OEMCHAR *key, |
| const char *data, PFILEH hdl) { | const OEMCHAR *data, PFILEH hdl) { |
| PFPOS pfp; | PFPOS pfp; |
| UINT newsize; | UINT newsize; |
| UINT datalen; | UINT datalen; |
| char *buf; | OEMCHAR *buf; |
| if ((hdl == NULL) || (hdl->flag & PFILEH_READONLY) || | if ((hdl == NULL) || (hdl->flag & PFILEH_READONLY) || |
| (data == NULL) || (seakey(hdl, &pfp, app, key) != SUCCESS)) { | (data == NULL) || (seakey(hdl, &pfp, app, key) != SUCCESS)) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| if (!pfp.apphit) { | if (!pfp.apphit) { |
| newsize = pfp.applen + 2 + 2; | newsize = pfp.applen + 2; |
| #if defined(OSLINEBREAK_CR) || defined(OSLINEBREAK_CRLF) | |
| newsize++; | |
| #endif | |
| #if defined(OSLINEBREAK_LF) || defined(OSLINEBREAK_CRLF) | |
| newsize++; | |
| #endif | |
| if (replace(hdl, pfp.pos, 0, newsize) != SUCCESS) { | if (replace(hdl, pfp.pos, 0, newsize) != SUCCESS) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| buf = hdl->buffer + pfp.pos; | buf = hdl->buffer + pfp.pos; |
| *buf++ = '['; | *buf++ = '['; |
| CopyMemory(buf, app, pfp.applen); | CopyMemory(buf, app, pfp.applen * sizeof(OEMCHAR)); |
| buf += pfp.applen; | buf += pfp.applen; |
| buf[0] = ']'; | *buf++ = ']'; |
| buf[1] = '\r'; | #if defined(OSLINEBREAK_CR) || defined(OSLINEBREAK_CRLF) |
| buf[2] = '\n'; | *buf++ = '\r'; |
| #endif | |
| #if defined(OSLINEBREAK_LF) || defined(OSLINEBREAK_CRLF) | |
| *buf++ = '\n'; | |
| #endif | |
| pfp.pos += newsize; | pfp.pos += newsize; |
| } | } |
| datalen = strlen(data); | datalen = OEMSTRLEN(data); |
| newsize = pfp.keylen + 1 + datalen + 2; | newsize = pfp.keylen + 1 + datalen; |
| #if defined(OSLINEBREAK_CR) || defined(OSLINEBREAK_CRLF) | |
| newsize++; | |
| #endif | |
| #if defined(OSLINEBREAK_LF) || defined(OSLINEBREAK_CRLF) | |
| newsize++; | |
| #endif | |
| if (replace(hdl, pfp.pos, pfp.size, newsize) != SUCCESS) { | if (replace(hdl, pfp.pos, pfp.size, newsize) != SUCCESS) { |
| return(FAILURE); | return(FAILURE); |
| } | } |
| buf = hdl->buffer + pfp.pos; | buf = hdl->buffer + pfp.pos; |
| CopyMemory(buf, key, pfp.keylen); | CopyMemory(buf, key, pfp.keylen * sizeof(OEMCHAR)); |
| buf += pfp.keylen; | buf += pfp.keylen; |
| *buf++ = '='; | *buf++ = '='; |
| CopyMemory(buf, data, datalen); | CopyMemory(buf, data, datalen * sizeof(OEMCHAR)); |
| buf += datalen; | buf += datalen; |
| buf[0] = '\r'; | #if defined(OSLINEBREAK_CR) || defined(OSLINEBREAK_CRLF) |
| buf[1] = '\n'; | *buf++ = '\r'; |
| #endif | |
| #if defined(OSLINEBREAK_LF) || defined(OSLINEBREAK_CRLF) | |
| *buf++ = '\n'; | |
| #endif | |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| // ---- | // ---- |
| void profile_iniread(const char *path, const char *app, | static void bitmapset(UINT8 *ptr, UINT pos, BOOL set) { |
| const PFTBL *tbl, UINT count) { | |
| UINT8 bit; | |
| ptr += (pos >> 3); | |
| bit = 1 << (pos & 7); | |
| if (set) { | |
| *ptr |= bit; | |
| } | |
| else { | |
| *ptr &= ~bit; | |
| } | |
| } | |
| static BOOL bitmapget(const UINT8 *ptr, UINT pos) { | |
| return((ptr[pos >> 3] >> (pos & 7)) & 1); | |
| } | |
| 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); | |
| } | |
| } | |
| void profile_iniread(const OEMCHAR *path, const OEMCHAR *app, | |
| const PFTBL *tbl, UINT count, PFREAD cb) { | |
| PFILEH pfh; | PFILEH pfh; |
| const PFTBL *p; | const PFTBL *p; |
| const PFTBL *pterm; | const PFTBL *pterm; |
| char work[512]; | OEMCHAR work[512]; |
| pfh = profile_open(path, 0); | pfh = profile_open(path, 0); |
| if (pfh == NULL) { | if (pfh == NULL) { |
| Line 450 const PFTBL *pterm; | Line 732 const PFTBL *pterm; |
| while(p < pterm) { | while(p < pterm) { |
| if (profile_read(app, p->item, NULL, work, sizeof(work), pfh) | if (profile_read(app, p->item, NULL, work, sizeof(work), pfh) |
| == SUCCESS) { | == SUCCESS) { |
| switch(p->itemtype & PFITYPE_MASK) { | switch(p->itemtype & PFTYPE_MASK) { |
| case PFTYPE_STR: | case PFTYPE_STR: |
| milstr_ncpy(p->value, work, p->arg); | milstr_ncpy((OEMCHAR *)p->value, work, p->arg); |
| break; | break; |
| case PFTYPE_BOOL: | case PFTYPE_BOOL: |
| *((UINT8 *)p->value) = (!milstr_cmp(work, str_true))?1:0; | *((UINT8 *)p->value) = (!milstr_cmp(work, str_true))?1:0; |
| break; | break; |
| case PFTYPE_BITMAP: // Todo | case PFTYPE_BITMAP: |
| bitmapset((UINT8 *)p->value, p->arg, | |
| (!milstr_cmp(work, str_true))?TRUE:FALSE); | |
| break; | |
| case PFTYPE_BIN: | case PFTYPE_BIN: |
| binset((UINT8 *)p->value, p->arg, work); | |
| break; | break; |
| case PFTYPE_SINT8: | case PFTYPE_SINT8: |
| Line 489 const PFTBL *pterm; | Line 776 const PFTBL *pterm; |
| case PFTYPE_HEX32: | case PFTYPE_HEX32: |
| *(UINT32 *)p->value = (UINT32)milstr_solveHEX(work); | *(UINT32 *)p->value = (UINT32)milstr_solveHEX(work); |
| break; | break; |
| default: | |
| if (cb != NULL) { | |
| (*cb)(p, work); | |
| } | |
| break; | |
| } | } |
| } | } |
| p++; | p++; |
| Line 496 const PFTBL *pterm; | Line 789 const PFTBL *pterm; |
| profile_close(pfh); | profile_close(pfh); |
| } | } |
| void profile_iniwrite(const char *path, const char *app, | void profile_iniwrite(const OEMCHAR *path, const OEMCHAR *app, |
| const PFTBL *tbl, UINT count) { | const PFTBL *tbl, UINT count, PFWRITE cb) { |
| PFILEH pfh; | PFILEH pfh; |
| const PFTBL *p; | const PFTBL *p; |
| const PFTBL *pterm; | const PFTBL *pterm; |
| const char *set; | const OEMCHAR *set; |
| char work[512]; | OEMCHAR work[512]; |
| pfh = profile_open(path, 0); | pfh = profile_open(path, 0); |
| if (pfh == NULL) { | if (pfh == NULL) { |
| Line 515 const char *set; | Line 808 const char *set; |
| if (!(p->itemtype & PFFLAG_RO)) { | if (!(p->itemtype & PFFLAG_RO)) { |
| work[0] = '\0'; | work[0] = '\0'; |
| set = work; | set = work; |
| switch(p->itemtype & PFITYPE_MASK) { | switch(p->itemtype & PFTYPE_MASK) { |
| case PFTYPE_STR: | case PFTYPE_STR: |
| set = (char *)p->value; | set = (OEMCHAR *)p->value; |
| break; | break; |
| case PFTYPE_BOOL: | case PFTYPE_BOOL: |
| set = (*((UINT8 *)p->value))?str_true:str_false; | set = (*((UINT8 *)p->value))?str_true:str_false; |
| break; | break; |
| case PFTYPE_BITMAP: // Todo | case PFTYPE_BITMAP: |
| set = (bitmapget((UINT8 *)p->value, p->arg))? | |
| str_true:str_false; | |
| break; | |
| case PFTYPE_BIN: | case PFTYPE_BIN: |
| set = NULL; | binget(work, NELEMENTS(work), (UINT8 *)p->value, p->arg); |
| break; | break; |
| case PFTYPE_SINT8: | case PFTYPE_SINT8: |
| SPRINTF(work, str_d, *((SINT8 *)p->value)); | OEMSPRINTF(work, str_d, *((SINT8 *)p->value)); |
| break; | break; |
| case PFTYPE_SINT16: | case PFTYPE_SINT16: |
| SPRINTF(work, str_d, *((SINT16 *)p->value)); | OEMSPRINTF(work, str_d, *((SINT16 *)p->value)); |
| break; | break; |
| case PFTYPE_SINT32: | case PFTYPE_SINT32: |
| SPRINTF(work, str_d, *((SINT32 *)p->value)); | OEMSPRINTF(work, str_d, *((SINT32 *)p->value)); |
| break; | break; |
| case PFTYPE_UINT8: | case PFTYPE_UINT8: |
| SPRINTF(work, str_u, *((UINT8 *)p->value)); | OEMSPRINTF(work, str_u, *((UINT8 *)p->value)); |
| break; | break; |
| case PFTYPE_UINT16: | case PFTYPE_UINT16: |
| SPRINTF(work, str_u, *((UINT16 *)p->value)); | OEMSPRINTF(work, str_u, *((UINT16 *)p->value)); |
| break; | break; |
| case PFTYPE_UINT32: | case PFTYPE_UINT32: |
| SPRINTF(work, str_u, *((UINT32 *)p->value)); | OEMSPRINTF(work, str_u, *((UINT32 *)p->value)); |
| break; | break; |
| case PFTYPE_HEX8: | case PFTYPE_HEX8: |
| SPRINTF(work, str_x, *((UINT8 *)p->value)); | OEMSPRINTF(work, str_x, *((UINT8 *)p->value)); |
| break; | break; |
| case PFTYPE_HEX16: | case PFTYPE_HEX16: |
| SPRINTF(work, str_x, *((UINT16 *)p->value)); | OEMSPRINTF(work, str_x, *((UINT16 *)p->value)); |
| break; | break; |
| case PFTYPE_HEX32: | case PFTYPE_HEX32: |
| SPRINTF(work, str_x, *((UINT32 *)p->value)); | OEMSPRINTF(work, str_x, *((UINT32 *)p->value)); |
| break; | break; |
| default: | default: |
| set = NULL; | if (cb != NULL) { |
| set = (*cb)(p, work, NELEMENTS(work)); | |
| } | |
| else { | |
| set = NULL; | |
| } | |
| break; | break; |
| } | } |
| if (set) { | if (set) { |