aboutsummaryrefslogtreecommitdiff
path: root/project/dclib/dclib-file.c
diff options
context:
space:
mode:
authorWiimm <none>2020-07-27 08:47:13 +0200
committerWiimm <none>2020-07-27 08:47:13 +0200
commitff8c6fcdb1661b2243ec11f5d54378492e86a5d5 (patch)
tree51a5687dc70c5bcc4ce0e6205f9c5cd92691bba0 /project/dclib/dclib-file.c
parentbcebc22fa66ccdaf1c8c4e4e3d47a644f87cb342 (diff)
r8226: test mac build
Diffstat (limited to '')
-rw-r--r--project/dclib/dclib-file.c243
1 files changed, 172 insertions, 71 deletions
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:
{