aboutsummaryrefslogtreecommitdiff
path: root/project/dclib
diff options
context:
space:
mode:
Diffstat (limited to 'project/dclib')
-rw-r--r--project/dclib/dclib-basics.c18
-rw-r--r--project/dclib/dclib-basics.h25
-rw-r--r--project/dclib/dclib-debug.c1
-rw-r--r--project/dclib/dclib-file.c243
-rw-r--r--project/dclib/dclib-numeric.c35
-rw-r--r--[-rwxr-xr-x]project/dclib/lib-bmg.c63
-rw-r--r--[-rwxr-xr-x]project/dclib/lib-bmg.h2
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(&param,&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