diff options
Diffstat (limited to '')
| -rw-r--r-- | project/dclib/dclib-basics.c | 18 | ||||
| -rw-r--r-- | project/dclib/dclib-basics.h | 25 | ||||
| -rw-r--r-- | project/dclib/dclib-debug.c | 1 | ||||
| -rw-r--r-- | project/dclib/dclib-file.c | 243 | ||||
| -rw-r--r-- | project/dclib/dclib-numeric.c | 35 | ||||
| -rw-r--r--[-rwxr-xr-x] | project/dclib/lib-bmg.c | 63 | ||||
| -rw-r--r--[-rwxr-xr-x] | project/dclib/lib-bmg.h | 2 |
7 files changed, 278 insertions, 109 deletions
diff --git a/project/dclib/dclib-basics.c b/project/dclib/dclib-basics.c index 74676d0..c46f5e2 100644 --- a/project/dclib/dclib-basics.c +++ b/project/dclib/dclib-basics.c @@ -1800,7 +1800,7 @@ void AppendInt64FastBuf ( FastBuf_t *fb, u64 val, IntMode_t mode ) /////////////////////////////////////////////////////////////////////////////// -char * WriteFastBuf ( FastBuf_t *fb, uint offset, cvp source, int size ) +char * WriteFastBuf ( FastBuf_t *fb, uint offset, cvp source, int size ) { DASSERT(fb); @@ -1847,6 +1847,22 @@ uint AssignFastBuf ( FastBuf_t *fb, cvp source, int size ) /////////////////////////////////////////////////////////////////////////////// +uint AlignFastBuf ( FastBuf_t *fb, uint align, u8 fill ) +{ + DASSERT(fb); + const uint len = fb->ptr - fb->buf; + const uint append = ALIGN32(len,align) - len; + if ( append > 0 ) + { + char *dest = GetSpaceFastBuf(fb,append); + memset(dest,fill,append); + } + + return fb->ptr - fb->buf; +} + +/////////////////////////////////////////////////////////////////////////////// + uint DropFastBuf ( FastBuf_t *fb, int index, int size ) { DASSERT(fb); diff --git a/project/dclib/dclib-basics.h b/project/dclib/dclib-basics.h index 7c6e7a2..eb4c40a 100644 --- a/project/dclib/dclib-basics.h +++ b/project/dclib/dclib-basics.h @@ -1531,6 +1531,7 @@ uint InsertFastBuf ( FastBuf_t *fb, int index, cvp source, int size ); char * AppendFastBuf ( FastBuf_t *fb, cvp source, int size ); char * WriteFastBuf ( FastBuf_t *fb, uint offset, cvp source, int size ); uint AssignFastBuf ( FastBuf_t *fb, cvp source, int size ); +uint AlignFastBuf ( FastBuf_t *fb, uint align, u8 fill ); uint DropFastBuf ( FastBuf_t *fb, int index, int size ); void CopyFastBuf ( FastBuf_t *dest, const FastBuf_t *src ); @@ -2134,6 +2135,10 @@ typedef enum EncodeMode_t // select encodig/decoding method } EncodeMode_t; +// [[doxygen]] +static inline bool NeedsQuotesByEncoding ( EncodeMode_t em ) + { return em < ENCODE_BASE64 || em > ENCODE_BASE64XML; } + /////////////////////////////////////////////////////////////////////////////// // [[DecodeType_t]] @@ -3355,6 +3360,7 @@ extern int timezone_adjust_isdst; /////////////////////////////////////////////////////////////////////////////// void SetupTimezone ( bool force ); +int GetTimezoneAdjust ( time_t tim ); struct timeval GetTimeOfDay ( bool localtime ); DayTime_t GetDayTime ( bool localtime ); @@ -4891,9 +4897,12 @@ __attribute__ ((packed)) SaveRestoreTab_t; #define DEF_SRT_STR_SIZE(v,n,e) DEF_SRT_VAR(v,1,n,SRT_STRING_SIZE,e) #define DEF_SRT_STR_ALLOC(v,n,e) DEF_SRT_VAR(v,1,n,SRT_STRING_ALLOC,e) #define DEF_SRT_MEM(v,n,e) DEF_SRT_VAR(v,1,n,SRT_MEM,e) + #define DEF_SRT_STRING_FIELD(v,n,e) DEF_SRT_VAR(v,1,n,SRT_STRING_FIELD,e) #define DEF_SRT_PARAM_FIELD(v,n,e) DEF_SRT_VAR(v,1,n,SRT_PARAM_FIELD,e) +//--- n elements + #define DEF_SRT_BOOL_N(v,ne,n) DEF_SRT_VAR(v,ne,n,SRT_BOOL,0) #define DEF_SRT_UINT_N(v,ne,n) DEF_SRT_VAR(v,ne,n,SRT_UINT,0) #define DEF_SRT_HEX_N(v,ne,n) DEF_SRT_VAR(v,ne,n,SRT_HEX,0) @@ -4901,6 +4910,14 @@ __attribute__ ((packed)) SaveRestoreTab_t; #define DEF_SRT_FLOAT_N(v,ne,n) DEF_SRT_VAR(v,ne,n,SRT_FLOAT,0) #define DEF_SRT_XFLOAT_N(v,ne,n) DEF_SRT_VAR(v,ne,n,SRT_XFLOAT,0) +#if defined(TEST) || defined(DEBUG) +#define DEF_SRT_STR_SIZE_N(v,ne,n,e) DEF_SRT_VAR(v,ne,n,SRT_STRING_SIZE,e) +#define DEF_SRT_STR_ALLOC_N(v,ne,n,e) DEF_SRT_VAR(v,ne,n,SRT_STRING_ALLOC,e) +#define DEF_SRT_MEM_N(v,ne,n,e) DEF_SRT_VAR(v,ne,n,SRT_MEM,e) +#endif + +//--- auto array + #define DEF_SRT_ARRAY(v,n,t,e) \ {offsetof(SRT_NAME,v), sizeof(((SRT_NAME*)0)->v[0]), n, \ sizeof(((SRT_NAME*)0)->v)/sizeof(*((SRT_NAME*)0)->v), t, e } @@ -4912,6 +4929,14 @@ __attribute__ ((packed)) SaveRestoreTab_t; #define DEF_SRT_FLOAT_A(v,n) DEF_SRT_ARRAY(v,n,SRT_FLOAT,0) #define DEF_SRT_XFLOAT_A(v,n) DEF_SRT_ARRAY(v,n,SRT_XFLOAT,0) +#if defined(TEST) || defined(DEBUG) +#define DEF_SRT_STR_SIZE_A(v,n,e) DEF_SRT_ARRAY(v,n,SRT_STRING_SIZE,e) +#define DEF_SRT_STR_ALLOC_A(v,n,e) DEF_SRT_ARRAY(v,n,SRT_STRING_ALLOC,e) +#define DEF_SRT_MEM_A(v,n,e) DEF_SRT_ARRAY(v,n,SRT_MEM,e) +#endif + +//--- special + #define DEF_SRT_SEPARATOR() {0,0,0,0,SRT__IS_LIST,0} #define DEF_SRT_COMMENT(c) {0,0,c,0,SRT__IS_LIST,0} #define DEF_SRT_TERM() {0,0,0,0,SRT__TERM,0} diff --git a/project/dclib/dclib-debug.c b/project/dclib/dclib-debug.c index 506be18..fd51f17 100644 --- a/project/dclib/dclib-debug.c +++ b/project/dclib/dclib-debug.c @@ -579,6 +579,7 @@ bool mark_used ( ccp name, ... ) #if HAVE_PRINT + #undef PRINT_TIME void PRINT_TIME ( time_t time, ccp title ) { struct tm utc, loc; diff --git a/project/dclib/dclib-file.c b/project/dclib/dclib-file.c index 8a69370..b7f1702 100644 --- a/project/dclib/dclib-file.c +++ b/project/dclib/dclib-file.c @@ -4502,6 +4502,53 @@ static void print_scs_name ( FILE *f, int fw, int use_tab, ccp format, ... ) //----------------------------------------------------------------------------- +static u64 SCS_get_uint ( const u8* data, int idx, const SaveRestoreTab_t *srt ) +{ + DASSERT(srt); + DASSERT(srt->var); + + switch(srt->size) + { + case 1: return ((u8*) (data+srt->offset))[idx]; + case 2: return ((u16*)(data+srt->offset))[idx]; + case 4: return ((u32*)(data+srt->offset))[idx]; + case 8: return ((u64*)(data+srt->offset))[idx]; + } + return 0; +} + +//----------------------------------------------------------------------------- + +static s64 SCS_get_int ( const u8* data, int idx, const SaveRestoreTab_t *srt ) +{ + DASSERT(srt); + DASSERT(srt->var); + + switch(srt->size) + { + case 1: return ((s8*) (data+srt->offset))[idx]; + case 2: return ((s16*)(data+srt->offset))[idx]; + case 4: return ((s32*)(data+srt->offset))[idx]; + case 8: return ((s64*)(data+srt->offset))[idx]; + } + return 0; +} + +//----------------------------------------------------------------------------- + +static void SCS_save_string ( FILE *f, ccp src, int slen, EncodeMode_t emode ) +{ + char buf[4000]; + mem_t res = EncodeByModeMem(buf,sizeof(buf),src,slen,emode); + + fwrite(res.ptr,1,res.len,f); + fputc('\n',f); + if ( res.ptr != buf ) + FreeMem(&res); +} + +//----------------------------------------------------------------------------- + void SaveCurrentStateByTable ( FILE *f, // valid output file @@ -4548,53 +4595,6 @@ void SaveCurrentStateByTable //------------------------------------------------------------------------- - u64 get_uint ( const u8* data, int idx, const SaveRestoreTab_t *srt ) - { - DASSERT(srt); - DASSERT(srt->var); - - switch(srt->size) - { - case 1: return ((u8*) (data+srt->offset))[idx]; - case 2: return ((u16*)(data+srt->offset))[idx]; - case 4: return ((u32*)(data+srt->offset))[idx]; - case 8: return ((u64*)(data+srt->offset))[idx]; - } - return 0; - } - - //------------------------------------------------------------------------- - - s64 get_int ( const u8* data, int idx, const SaveRestoreTab_t *srt ) - { - DASSERT(srt); - DASSERT(srt->var); - - switch(srt->size) - { - case 1: return ((s8*) (data+srt->offset))[idx]; - case 2: return ((s16*)(data+srt->offset))[idx]; - case 4: return ((s32*)(data+srt->offset))[idx]; - case 8: return ((s64*)(data+srt->offset))[idx]; - } - return 0; - } - - //------------------------------------------------------------------------- - - void save_string ( FILE *f, ccp src, int slen, EncodeMode_t emode ) - { - char buf[4000]; - mem_t res = EncodeByModeMem(buf,sizeof(buf),src,slen,emode); - - fwrite(res.ptr,1,res.len,f); - fputc('\n',f); - if ( res.ptr != buf ) - FreeMem(&res); - } - - //------------------------------------------------------------------------- - const u8 *data = data0; for ( ; srt->type != SRT__TERM; srt++ ) @@ -4614,54 +4614,51 @@ void SaveCurrentStateByTable if ( srt->type < SRT__IS_LIST ) print_scs_name(f,fw_name,use_tab,"%s%s",prefix,srt->name); + uint i, offset; switch(srt->type) { case SRT_BOOL: if ( srt->n_elem > 1 ) { - uint i; for ( i = 0; i < srt->n_elem; i++ ) - fprintf(f,"%s%u", i ? "," : "", get_uint(data,i,srt)!=0 ); + fprintf(f,"%s%u", i ? "," : "", SCS_get_uint(data,i,srt)!=0 ); fputc('\n',f); } else - fprintf(f,"%u\n",get_uint(data,0,srt)!=0); + fprintf(f,"%u\n",SCS_get_uint(data,0,srt)!=0); break; case SRT_UINT: if ( srt->n_elem > 1 ) { - uint i; for ( i = 0; i < srt->n_elem; i++ ) - fprintf(f,"%s%llu", i ? "," : "", get_uint(data,i,srt) ); + fprintf(f,"%s%llu", i ? "," : "", SCS_get_uint(data,i,srt) ); fputc('\n',f); } else - fprintf(f,"%llu\n",get_uint(data,0,srt)); + fprintf(f,"%llu\n",SCS_get_uint(data,0,srt)); break; case SRT_HEX: if ( srt->n_elem > 1 ) { - uint i; for ( i = 0; i < srt->n_elem; i++ ) - fprintf(f,"%s%#llx", i ? "," : "", get_uint(data,i,srt) ); + fprintf(f,"%s%#llx", i ? "," : "", SCS_get_uint(data,i,srt) ); fputc('\n',f); } else - fprintf(f,"%#llx\n",get_uint(data,0,srt)); + fprintf(f,"%#llx\n",SCS_get_uint(data,0,srt)); break; case SRT_INT: if ( srt->n_elem > 1 ) { - uint i; for ( i = 0; i < srt->n_elem; i++ ) - fprintf(f,"%s%lld", i ? "," : "", get_int(data,i,srt) ); + fprintf(f,"%s%lld", i ? "," : "", SCS_get_int(data,i,srt) ); fputc('\n',f); } else - fprintf(f,"%lld\n",get_int(data,0,srt)); + fprintf(f,"%lld\n",SCS_get_int(data,0,srt)); break; case SRT_FLOAT: @@ -4669,7 +4666,6 @@ void SaveCurrentStateByTable { case sizeof(float): { - uint i; for ( i = 0; i < srt->n_elem; i++ ) fprintf(f,"%s%.8g", i ? "," : "", ((float*)(data+srt->offset))[i] ); @@ -4678,7 +4674,6 @@ void SaveCurrentStateByTable case sizeof(double): { - uint i; for ( i = 0; i < srt->n_elem; i++ ) fprintf(f,"%s%.16g", i ? "," : "", ((double*)(data+srt->offset))[i] ); @@ -4687,7 +4682,6 @@ void SaveCurrentStateByTable case sizeof(long double): { - uint i; for ( i = 0; i < srt->n_elem; i++ ) fprintf(f,"%s%.20Lg", i ? "," : "", ((long double*)(data+srt->offset))[i] ); @@ -4705,7 +4699,6 @@ void SaveCurrentStateByTable { case sizeof(float): { - uint i; for ( i = 0; i < srt->n_elem; i++ ) fprintf(f,"%s%a", i ? "," : "", ((float*)(data+srt->offset))[i] ); @@ -4714,7 +4707,6 @@ void SaveCurrentStateByTable case sizeof(double): { - uint i; for ( i = 0; i < srt->n_elem; i++ ) fprintf(f,"%s%a", i ? "," : "", ((double*)(data+srt->offset))[i] ); @@ -4723,7 +4715,6 @@ void SaveCurrentStateByTable case sizeof(long double): { - uint i; for ( i = 0; i < srt->n_elem; i++ ) fprintf(f,"%s%La", i ? "," : "", ((long double*)(data+srt->offset))[i] ); @@ -4739,17 +4730,38 @@ void SaveCurrentStateByTable //----- case SRT_STRING_SIZE: - save_string(f,(char*)(data+srt->offset),-1,srt->emode); + for ( i = 0, offset = srt->offset;; offset += srt->size ) + { + SCS_save_string(f,(char*)(data+offset),-1,srt->emode); + if ( ++i == srt->n_elem ) + break; + fputc(',',f); + } + fputc('\n',f); break; case SRT_STRING_ALLOC: - save_string(f,*(ccp*)(data+srt->offset),-1,srt->emode); + for ( i = 0, offset = srt->offset;; offset += srt->size ) + { + SCS_save_string(f,*(ccp*)(data+offset),-1,srt->emode); + if ( ++i == srt->n_elem ) + break; + fputc(',',f); + } + fputc('\n',f); break; case SRT_MEM: { - mem_t *mem = (mem_t*)(data+srt->offset); - save_string(f,mem->ptr,mem->len,srt->emode); + for ( i = 0, offset = srt->offset;; offset += srt->size ) + { + mem_t *mem = (mem_t*)(data+offset); + SCS_save_string(f,mem->ptr,mem->len,srt->emode); + if ( ++i == srt->n_elem ) + break; + fputc(',',f); + } + fputc('\n',f); break; } @@ -4766,7 +4778,7 @@ void SaveCurrentStateByTable for ( i = 0; i < sf->used; i++, ptr++ ) { print_scs_name(f,fw_name,use_tab,"%s%s@%u",prefix,srt->name,i); - save_string(f,*ptr,-1,srt->emode); + SCS_save_string(f,*ptr,-1,srt->emode); } break; } @@ -4783,7 +4795,7 @@ void SaveCurrentStateByTable { print_scs_name(f,fw_name,use_tab,"%s%s@%u",prefix,srt->name,i); fprintf(f,"%d ",ptr->num); - save_string(f,ptr->key,-1,srt->emode); + SCS_save_string(f,ptr->key,-1,srt->emode); } break; } @@ -4794,6 +4806,13 @@ void SaveCurrentStateByTable /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// +#if defined(TEST) && 1 + #define X_DEVELOP 1 +#else + #define X_DEVELOP 0 +#endif + + void RestoreStateByTable ( RestoreState_t *rs, // info data, can be modified (cleaned after call) @@ -4805,6 +4824,71 @@ void RestoreStateByTable DASSERT(rs); DASSERT(srt); + //------------------------------------------------------------------------- + +#if X_DEVELOP + + mem_t get_string + ( mem_t *param, ccp *p_ptr, char *buf, uint bufsize, EncodeMode_t emode ) + { + DASSERT(param); + DASSERT(p_ptr); + + ccp ptr; + if (!*p_ptr) + ptr = param->ptr; + else + { + ptr = *p_ptr; + if ( *ptr != ',' ) + return NullMem; + ptr++; + } + + if ( *ptr == '%' ) + { + *p_ptr = ptr; + return NullMem; + } + + uint len; + ccp start, end = param->ptr + param->len; + if ( *ptr == '"' ) + { + start = ++ptr; + for (;;) + { + if ( ptr == end ) + { + len = ptr - start; + break; + } + + const char ch = *ptr++; + if ( ch == '\\' && ptr < end ) + ptr++; + else if ( ch == '"' ) + { + len = ptr-start-1; + break; + } + } + } + else + { + start = ptr; + while ( ptr < end && *ptr != ',' ) + ptr++; + len = ptr - start; + } + + *p_ptr = ptr; + return MemByStringS(start,len); + } +#endif + + //------------------------------------------------------------------------- + char buf[4000]; if (!prefix) prefix = EmptyString; @@ -4909,6 +4993,22 @@ void RestoreStateByTable //----- case SRT_STRING_SIZE: +#if X_DEVELOP + { + ParamFieldItem_t *it = GetParamField(rs,buf); + mem_t param = it ? MemByString((ccp)it->data) : EmptyMem; + PRINT1("param: [%u] |%.*s|\n",param.len,param.len,param.ptr); + ccp ptr = 0; + uint i; + for ( i = 0; i < srt->n_elem; i++ ) + { + mem_t str = get_string(¶m,&ptr,buf,sizeof(buf),srt->emode); + PRINT1("str: [%d,%u] |%.*s|\n",str.ptr!=0,str.len,str.len,str.ptr); + //if ( str.ptr != buf ) FreeMem(&str); + } + break; + } +#else { char *val = (char*)(data+srt->offset); mem_t res = GetParamFieldMEM(buf,sizeof(buf),rs,buf, @@ -4918,6 +5018,7 @@ void RestoreStateByTable FreeString(res.ptr); break; } +#endif case SRT_STRING_ALLOC: { diff --git a/project/dclib/dclib-numeric.c b/project/dclib/dclib-numeric.c index 572211a..9ffa16c 100644 --- a/project/dclib/dclib-numeric.c +++ b/project/dclib/dclib-numeric.c @@ -1799,15 +1799,7 @@ void SetupTimezone ( bool force ) { if ( force || timezone_adjust_sec == -1 ) { - tzset(); - timezone_adjust_sec = timezone; - - time_t tim = GetTimeSec(false); - struct tm *tm = localtime(&tim); - timezone_adjust_isdst = tm->tm_isdst; - if (tm->tm_isdst) - timezone_adjust_sec -= 3600; - + timezone_adjust_sec = GetTimezoneAdjust(GetTimeSec(false)); timezone_adjust_usec = 1000000ll * timezone_adjust_sec; TRACE("TZ: %s,%s, %ld, %d => %lld %lld\n", tzname[0], tzname[1], timezone, daylight, @@ -1817,6 +1809,31 @@ void SetupTimezone ( bool force ) /////////////////////////////////////////////////////////////////////////////// +int GetTimezoneAdjust ( time_t tim ) +{ + struct tm gmt, loc; + gmtime_r(&tim,&gmt); + localtime_r(&tim,&loc); + int delta = ( gmt.tm_hour - loc.tm_hour ) * 3600 + + ( gmt.tm_min - loc.tm_min ) * 60 + + ( gmt.tm_sec - loc.tm_sec ); + if ( gmt.tm_yday != loc.tm_yday ) + { + if ( gmt.tm_year < loc.tm_year + || gmt.tm_year == loc.tm_year && gmt.tm_yday < loc.tm_yday ) + { + delta -= 24*3600; + } + else + { + delta += 24*3600; + } + } + return delta; +} + +/////////////////////////////////////////////////////////////////////////////// + struct timeval GetTimeOfDay ( bool localtime ) { static uint last_hour = 0; diff --git a/project/dclib/lib-bmg.c b/project/dclib/lib-bmg.c index 4e42c9c..639d940 100755..100644 --- a/project/dclib/lib-bmg.c +++ b/project/dclib/lib-bmg.c @@ -2173,6 +2173,14 @@ enumError ScanRawBMG ( bmg_t * bmg ) DASSERT(!memcmp(bh->magic,BMG_MAGIC,sizeof(bh->magic))); u32 data_size = ntohl(bh->size); + bmg->encoding = bh->encoding; + if ( !bmg->encoding && data_size*BMG_LEGACY_BLOCK_SIZE <= bmg->data_size ) + { + bmg->legacy = true; + bmg->encoding = BMG_ENC_CP1252; + data_size *= BMG_LEGACY_BLOCK_SIZE; + } + if ( data_size > bmg->data_size ) { ERROR0(ERR_WARNING, @@ -2188,7 +2196,6 @@ enumError ScanRawBMG ( bmg_t * bmg ) //--- check encoding - bmg->encoding = bh->encoding; switch (bmg->encoding) { case BMG_ENC_CP1252: @@ -2670,7 +2677,9 @@ enumError ScanTextBMG ( bmg_t * bmg ) continue; noPRINT("PARAM: %s = |%.*s|\n",namebuf,(int)(ptr-start),start); - if (!strcmp(namebuf,"ENCODING")) + if (!strcmp(namebuf,"LEGACY")) + bmg->legacy = str2l(start,0,10) > 0; + else if (!strcmp(namebuf,"ENCODING")) AssignEncodingBMG(bmg,str2l(start,0,10)); else if (!strcmp(namebuf,"BMG-MID")) bmg->have_mid = str2ul(start,0,10) > 0; @@ -3371,7 +3380,9 @@ enumError CreateRawBMG //--- check encoding - const int encoding = CheckEncodingBMG(opt_bmg_encoding,bmg->encoding); + const int encoding = bmg->legacy + ? BMG_ENC_CP1252 + : CheckEncodingBMG(opt_bmg_encoding,bmg->encoding); switch (encoding) { case BMG_ENC_CP1252: @@ -3398,19 +3409,6 @@ enumError CreateRawBMG } - //--- count messages - -#if 0 - bmg_item_t *bi, *bi_end = bmg->item + bmg->item_used; - u32 n_msg = 0; - - for ( bi = bmg->item; bi < bi_end; bi++ ) - { - if (bi->text) - n_msg++; - } -#endif - //--- count size of raw sections uint total_raw_size = 0, raw_count = 0; @@ -3430,14 +3428,15 @@ enumError CreateRawBMG //--- calculate sizes - const mem_t inf = GetFastBufMem(&bc.inf); - const mem_t mid = GetFastBufMem(&bc.mid); - const mem_t dat = GetFastBufMem(&bc.dat); + const mem_t inf = GetFastBufMem(&bc.inf); + const mem_t mid = GetFastBufMem(&bc.mid); + const mem_t dat = GetFastBufMem(&bc.dat); - const u32 inf_size = ALIGN32( sizeof(bmg_inf_t) + inf.len, opt_bmg_align ); - const u32 dat_size = ALIGN32( sizeof(bmg_dat_t) + dat.len, opt_bmg_align ); + const int align = bmg->legacy ? BMG_LEGACY_BLOCK_SIZE : opt_bmg_align; + const u32 inf_size = ALIGN32( sizeof(bmg_inf_t) + inf.len, align ); + const u32 dat_size = ALIGN32( sizeof(bmg_dat_t) + dat.len, align ); const u32 mid_size = bc.have_mid - ? ALIGN32( sizeof(bmg_mid_t) + mid.len, opt_bmg_align ) : 0; + ? ALIGN32( sizeof(bmg_mid_t) + mid.len, align ) : 0; const u32 total_size = sizeof(bmg_header_t) + inf_size + dat_size + mid_size @@ -3458,9 +3457,9 @@ enumError CreateRawBMG //---- setup bmg header bmg_header_t *bh = (bmg_header_t*)bmg->raw_data; - bh->size = htonl(total_size); + bh->size = htonl( bmg->legacy ? total_size/BMG_LEGACY_BLOCK_SIZE: total_size ); bh->n_sections = htonl( ( bc.have_mid ? 3 : 2 ) + raw_count ); - bh->encoding = encoding; + bh->encoding = bmg->legacy ? 0 : encoding; memcpy(bh->magic,BMG_MAGIC,sizeof(bh->magic)); u8 *dest = (u8*)(bh+1); @@ -3841,6 +3840,10 @@ enumError SaveTextBMG { "%s" "\r\n" + "# If 1, then enable legacy (GameCube) mode for old binary BMG files.\r\n" + "# If enabled, ENCODING is always CP1252.\r\n" + "@LEGACY = %u\r\n" + "\r\n" "# Define encoding of BMG: 1=CP1252, 2=UTF-16/be, 3=Shift-JIS, 4=UTF-8\r\n" "@ENCODING = %u\r\n" "\r\n" @@ -3893,7 +3896,10 @@ enumError SaveTextBMG fprintf(F.f,"%s\r\n\r\n",BMG_TEXT_MAGIC); HavePredifinedSlots(bmg); - const int encoding = CheckEncodingBMG(opt_bmg_encoding,bmg->encoding); + bmg->legacy = bmg->legacy != 0; + const int encoding = bmg->legacy + ? BMG_ENC_CP1252 + : CheckEncodingBMG(opt_bmg_encoding,bmg->encoding); const bool print_settings // print only, if unusual = encoding != BMG_ENC__DEFAULT @@ -3911,19 +3917,20 @@ enumError SaveTextBMG { fprintf(F.f,text_param, param_announce, - encoding, bmg->have_mid, bmg->inf_size, abuf, + bmg->legacy, encoding, bmg->have_mid, bmg->inf_size, abuf, bmg->use_color_names, bmg->use_mkw_messages ); param_announce = ""; } else if ( brief_count < BRIEF_NO_MAGIC ) - fprintf(F.f,"@ENCODING = %u\r\n" + fprintf(F.f,"@LEGACY = %u\r\n" + "@ENCODING = %u\r\n" "@BMG-MID = %u\r\n" "@INF-SIZE = 0x%02x\r\n" "@DEFAULT-ATTRIBS = %s\r\n" "@COLOR-NAMES = %u\r\n" "@MKW-MESSAGES = %u\r\n" "\r\n", - encoding, bmg->have_mid, bmg->inf_size, abuf, + bmg->legacy, encoding, bmg->have_mid, bmg->inf_size, abuf, bmg->use_color_names, bmg->use_mkw_messages ); } diff --git a/project/dclib/lib-bmg.h b/project/dclib/lib-bmg.h index 9ab5967..590d93b 100755..100644 --- a/project/dclib/lib-bmg.h +++ b/project/dclib/lib-bmg.h @@ -48,6 +48,7 @@ #define BMG_ATTRIB_BUF_SIZE (10+4*BMG_ATTRIB_SIZE) // good buf size for attrib string #define BMG_INF_MAX_SIZE (4+BMG_ATTRIB_SIZE) // max supported inf size #define BMG_INF_LIMIT 1000 // max allowed inf size +#define BMG_LEGACY_BLOCK_SIZE 32 // block size for legacy files // [[xbuf]] #define BMG_MSG_BUF_SIZE 20050 // good buf size for messages @@ -772,6 +773,7 @@ typedef struct bmg_t bmg_encoding_t encoding; // type of encoding uint inf_size; // size of each 'inf' element bool have_mid; // TRUE: enable MID1 creation + bool legacy; // TRUE: legacy (GameCube) mode enabled u8 attrib[BMG_ATTRIB_SIZE];// attribute buffer for defaults u16 attrib_used; // used size of 'attrib', ALIGN(4) u8 use_color_names; // 0:off, 1:auto, 2:on |
