--- np2/common/profile.c 2004/03/31 11:59:17 1.5 +++ np2/common/profile.c 2004/04/09 10:52:20 1.8 @@ -401,7 +401,13 @@ BOOL profile_write(const char *app, cons return(FAILURE); } 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) { return(FAILURE); } @@ -409,13 +415,23 @@ BOOL profile_write(const char *app, cons *buf++ = '['; CopyMemory(buf, app, pfp.applen); buf += pfp.applen; - buf[0] = ']'; - buf[1] = '\r'; - buf[2] = '\n'; + *buf++ = ']'; +#if defined(OSLINEBREAK_CR) || defined(OSLINEBREAK_CRLF) + *buf++ = '\r'; +#endif +#if defined(OSLINEBREAK_LF) || defined(OSLINEBREAK_CRLF) + *buf++ = '\n'; +#endif pfp.pos += newsize; } datalen = strlen(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) { return(FAILURE); } @@ -425,16 +441,95 @@ BOOL profile_write(const char *app, cons *buf++ = '='; CopyMemory(buf, data, datalen); buf += datalen; - buf[0] = '\r'; - buf[1] = '\n'; +#if defined(OSLINEBREAK_CR) || defined(OSLINEBREAK_CRLF) + *buf++ = '\r'; +#endif +#if defined(OSLINEBREAK_LF) || defined(OSLINEBREAK_CRLF) + *buf++ = '\n'; +#endif return(SUCCESS); } // ---- +static void bitmapset(BYTE *ptr, UINT pos, BOOL set) { + + UINT8 bit; + + ptr += (pos >> 3); + bit = 1 << (pos & 7); + if (set) { + *ptr |= bit; + } + else { + *ptr &= ~bit; + } +} + +static BOOL bitmapget(const BYTE *ptr, UINT pos) { + + return((ptr[pos >> 3] >> (pos & 7)) & 1); +} + +static void binset(BYTE *bin, UINT binlen, const char *src) { + + UINT i; + BYTE val; + BOOL set; + char c; + + for (i=0; i= '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(char *work, int size, const BYTE *bin, UINT binlen) { + + UINT i; + char tmp[8]; + + if (binlen) { + SPRINTF(tmp, "%.2x", bin[0]); + milstr_ncpy(work, tmp, size); + } + for (i=1; iitem, NULL, work, sizeof(work), pfh) == SUCCESS) { - switch(p->itemtype) { + switch(p->itemtype & PFITYPE_MASK) { + case PFTYPE_STR: + milstr_ncpy(p->value, work, p->arg); + break; + + case PFTYPE_BOOL: + *((UINT8 *)p->value) = (!milstr_cmp(work, str_true))?1:0; + break; + + case PFTYPE_BITMAP: + bitmapset((BYTE *)p->value, p->arg, + (!milstr_cmp(work, str_true))?TRUE:FALSE); + break; + + case PFTYPE_BIN: + binset((BYTE *)p->value, p->arg, work); + break; + + case PFTYPE_SINT8: + case PFTYPE_UINT8: + *(UINT8 *)p->value = (UINT32)milstr_solveINT(work); + break; + + case PFTYPE_SINT16: + case PFTYPE_UINT16: + *(UINT16 *)p->value = (UINT32)milstr_solveINT(work); + break; + case PFTYPE_SINT32: case PFTYPE_UINT32: - *(UINT32 *)p->value = (UINT32)milstr_solveINT(work); - break; + *(UINT32 *)p->value = (UINT32)milstr_solveINT(work); + break; + + case PFTYPE_HEX8: + *(UINT8 *)p->value = (UINT8)milstr_solveHEX(work); + break; + + case PFTYPE_HEX16: + *(UINT16 *)p->value = (UINT16)milstr_solveHEX(work); + break; + + case PFTYPE_HEX32: + *(UINT32 *)p->value = (UINT32)milstr_solveHEX(work); + break; + + default: + if (cb != NULL) { + (*cb)(p, work); + } + break; } } p++; @@ -463,7 +603,7 @@ const PFTBL *pterm; } void profile_iniwrite(const char *path, const char *app, - const PFTBL *tbl, UINT count) { + const PFTBL *tbl, UINT count, PFWRITE cb) { PFILEH pfh; const PFTBL *p; @@ -478,19 +618,75 @@ const char *set; p = tbl; pterm = tbl + count; while(p < pterm) { - work[0] = '\0'; - set = work; - switch(p->itemtype) { - case PFTYPE_SINT32: - SPRINTF(work, str_d, *((SINT32 *)p->value)); - break; + if (!(p->itemtype & PFFLAG_RO)) { + work[0] = '\0'; + set = work; + switch(p->itemtype & PFITYPE_MASK) { + case PFTYPE_STR: + set = (char *)p->value; + break; - default: - set = NULL; - break; - } - if (set) { - profile_write(app, p->item, set, pfh); + case PFTYPE_BOOL: + set = (*((UINT8 *)p->value))?str_true:str_false; + break; + + case PFTYPE_BITMAP: + set = (bitmapget((BYTE *)p->value, p->arg))? + str_true:str_false; + break; + + case PFTYPE_BIN: + binget(work, sizeof(work), (BYTE *)p->value, p->arg); + break; + + case PFTYPE_SINT8: + SPRINTF(work, str_d, *((SINT8 *)p->value)); + break; + + case PFTYPE_SINT16: + SPRINTF(work, str_d, *((SINT16 *)p->value)); + break; + + case PFTYPE_SINT32: + SPRINTF(work, str_d, *((SINT32 *)p->value)); + break; + + case PFTYPE_UINT8: + SPRINTF(work, str_u, *((UINT8 *)p->value)); + break; + + case PFTYPE_UINT16: + SPRINTF(work, str_u, *((UINT16 *)p->value)); + break; + + case PFTYPE_UINT32: + SPRINTF(work, str_u, *((UINT32 *)p->value)); + break; + + case PFTYPE_HEX8: + SPRINTF(work, str_x, *((UINT8 *)p->value)); + break; + + case PFTYPE_HEX16: + SPRINTF(work, str_x, *((UINT16 *)p->value)); + break; + + case PFTYPE_HEX32: + SPRINTF(work, str_x, *((UINT32 *)p->value)); + break; + + default: + if (cb != NULL) { + set = (*cb)(p, work, sizeof(work)); + } + else { + set = NULL; + } + break; + } + if (set) { + profile_write(app, p->item, set, pfh); + } } p++; }