00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _KAPI_SAVER_UTILS_H
00025 #define _KAPI_SAVER_UTILS_H
00026
00027 #include <string.h>
00028 #include "kapi_bv.h"
00029
00030 static int _kapi_radix=10;
00031 static int kapi_saver_bv_counter=0;
00032
00033
00034 #define ADD_COMMA fwrite(",",sizeof(char),1,fpTmp)
00035 #define ADD_NEWLINE fwrite("\n",sizeof(char),strlen("\n"),fpTmp)
00036 #define ADD_NULL fwrite("NULL",sizeof(char),strlen("NULL"),fpTmp)
00037 #define START_ARRAY fwrite("{",sizeof(char),1,fpTmp)
00038 #define START_STRUCT START_ARRAY
00039 #define CLOSE_ARRAY fwrite("}\n",sizeof(char),strlen("}\n"),fpTmp)
00040 #define CLOSE_STRUCT fwrite("}",sizeof(char),1,fpTmp)
00041 #define ADD_SEMICOLON fwrite(";",sizeof(char),1,fpTmp)
00042 #define END_STRUCT fwrite("};",sizeof(char),2,fpTmp)
00043 #define END_ARRAY fwrite("};\n",sizeof(char),strlen("};\n"),fpTmp)
00044
00045 #define ADD_COMMENT(_comment) \
00046 { \
00047 char *str=malloc(sizeof(char)*(20+strlen(_comment)));\
00048 sprintf(str,"",_comment); \
00049 fwrite(str,sizeof(char),strlen(str),fpTmp); \
00050 free(str); \
00051 }
00052
00053 #define ADD_STRUCT_HEADER(_stype,_sname) \
00054 { \
00055 char *str=malloc(sizeof(char)*(20+strlen(_stype)+strlen(_sname))); \
00056 sprintf(str,"static %s %s = {",_stype,_sname); \
00057 fwrite(str,sizeof(char),strlen(str),fpTmp); \
00058 free(str); \
00059 }
00060
00061 #define ADD_EXTERN_STRUCT_HEADER(_stype,_sname) \
00062 { \
00063 char *str=malloc(sizeof(char)*(20+strlen(_stype)+strlen(_sname))); \
00064 sprintf(str,"%s %s = {",_stype,_sname); \
00065 fwrite(str,sizeof(char),strlen(str),fpTmp); \
00066 free(str); \
00067 }
00068
00069 #define ADD_STRUCT_ARRAY_HEADER(_type_name,_array_name) \
00070 { \
00071 char *str; \
00072 str=(char *)malloc(sizeof(char)*(20+strlen(_type_name)+strlen(_array_name))); \
00073 sprintf(str,"static %s %s[] = {\n",_type_name,_array_name); \
00074 fwrite(str,sizeof(char),strlen(str),fpTmp); \
00075 free(str); \
00076 }
00077 #define ADD_NULL_PTR(_type_name,_var_name) \
00078 { \
00079 char *str; \
00080 str=(char *)malloc(sizeof(char)*(20+strlen(_type_name)+strlen(_var_name))); \
00081 sprintf(str,"#define %s NULL\n",_var_name); \
00082 fwrite(str,sizeof(char),strlen(str),fpTmp); \
00083 free(str); \
00084 }
00085
00086
00087
00088 #define SAVE_STRUCT_ARRAY(_nsItems,_assptr,_ssaver_func,_ssave_name) \
00089 SAVE_PTR_STRUCT_ARRAY(_nsItems,&_assptr,_ssaver_func,_ssave_name)
00090
00091
00092 #define SAVE_PTR_STRUCT_ARRAY(_nItems,_asptr,_saver_func,_save_name) \
00093 { \
00094 int _counter; \
00095 char _pchIdx[20]; \
00096 if (_nItems>0) \
00097 { \
00098 for (_counter=0;_counter<(_nItems-1);_counter++) \
00099 { \
00100 sprintf(_pchIdx,"[%d]",_counter); \
00101 ADD_COMMENT(_pchIdx); \
00102 START_STRUCT; \
00103 (_saver_func)(fpTmp,pknobs,_asptr[_counter],_save_name,fpTables);\
00104 CLOSE_STRUCT; \
00105 ADD_COMMA; \
00106 *_pchIdx='\0'; \
00107 } \
00108 sprintf(_pchIdx,"[%d]",_counter); \
00109 ADD_COMMENT(_pchIdx); \
00110 START_STRUCT; \
00111 (_saver_func)(fpTmp,pknobs,_asptr[_counter],_save_name,fpTables); \
00112 CLOSE_STRUCT; \
00113 } \
00114 }
00115
00116 #define ADD_STRUCT_ARRAY(_array_type_str,_array_name,_nElements,_array_ptr,_saver_function) \
00117 { \
00118 ADD_STRUCT_ARRAY_HEADER(_array_type_str,_array_name); \
00119 SAVE_STRUCT_ARRAY(_nElements,_array_ptr,_saver_function,_array_name); \
00120 END_STRUCT; \
00121 ADD_NEWLINE; \
00122 }
00123 #define ADD_STRUCT_ARRAY_ON_FLAG(_flag,_array_type_str,_array_name,_nElements,_array_ptr,_saver_function) \
00124 { \
00125 if ((_flag!=0) && (_nElements>0)) \
00126 { \
00127 ADD_STRUCT_ARRAY_HEADER(_array_type_str,_array_name); \
00128 SAVE_STRUCT_ARRAY(_nElements,_array_ptr,_saver_function,_array_name); \
00129 END_STRUCT; \
00130 } else \
00131 ADD_NULL_PTR(_array_type_str,_array_name); \
00132 ADD_NEWLINE; \
00133 }
00134
00135 #define ADD_PTR_STRUCT_ARRAY(_array_type_str,_array_name,_nElements,_array_ptr,_saver_function) \
00136 { \
00137 ADD_STRUCT_ARRAY_HEADER(_array_type_str,_array_name); \
00138 SAVE_PTR_STRUCT_ARRAY(_nElements,_array_ptr,_saver_function,_array_name); \
00139 END_STRUCT; \
00140 ADD_NEWLINE; \
00141 }
00142 #define ADD_PTR_STRUCT_ARRAY_ON_FLAG(_flag,_array_type_str,_array_name,_nElements,_array_ptr,_saver_function) \
00143 { \
00144 if ((_flag!=0) && (_nElements>0)) \
00145 { \
00146 ADD_STRUCT_ARRAY_HEADER(_array_type_str,_array_name); \
00147 SAVE_PTR_STRUCT_ARRAY(_nElements,_array_ptr,_saver_function,_array_name); \
00148 END_STRUCT; \
00149 } else \
00150 ADD_NULL_PTR(_array_type_str,_array_name); \
00151 ADD_NEWLINE; \
00152 }
00153
00154 #define SAVE_STRUCT(_struct_function) \
00155 { START_STRUCT; \
00156 (_struct_function); \
00157 CLOSE_STRUCT; \
00158 ADD_NEWLINE; \
00159 }
00160
00161 #define SAVE_STRUCT_LIST(_struct_function) \
00162 { SAVE_STRUCT(_struct_function); \
00163 ADD_COMMA; \
00164 }
00165
00166
00167
00168
00169 static char *make_string_attach(char *pchBase,char *pchExt)
00170 {
00171 char *str=(char *)malloc(sizeof(char)*(20+strlen(pchBase)+strlen(pchExt)));
00172 sprintf(str,"%s_%s",pchBase ,pchExt);
00173 return str;
00174 }
00175
00176 static void append_tmp(FILE *fpTarget, FILE *fpTmp)
00177 {
00178 char ch;
00179 fputc(EOF,fpTmp);
00180 fflush(fpTmp);
00181 rewind(fpTmp);
00182 while ((ch=fgetc(fpTmp))!=EOF)
00183 {
00184 fputc(ch,fpTarget);
00185 }
00186 fclose(fpTmp);
00187 }
00188
00189 static void KAPI_save_as_header_int(FILE *fp, int i)
00190 {
00191 char buffer[20];
00192 FILE *fpTmp=fp;
00193 if (_kapi_radix==16)
00194 sprintf(buffer,"%#x",i);
00195 else
00196 sprintf(buffer,"%d",i);
00197 fwrite(buffer,sizeof(char),strlen(buffer),fp);
00198 }
00199
00200 static void KAPI_save_as_header_uint(FILE *fp, unsigned int i)
00201 {
00202 char buffer[20];
00203 FILE *fpTmp=fp;
00204 if (_kapi_radix==16)
00205 sprintf(buffer,"%#x",i);
00206 else
00207 sprintf(buffer,"%d",i);
00208 fwrite(buffer,sizeof(char),strlen(buffer),fp);
00209 }
00210
00211 static void KAPI_save_as_header_int_list(FILE *fp, int i)
00212 {
00213 FILE *fpTmp=fp;
00214 KAPI_save_as_header_int(fp,i);
00215 ADD_COMMA;
00216 }
00217 static void KAPI_save_as_header_uint_list(FILE *fp, int i)
00218 {
00219 FILE *fpTmp=fp;
00220 KAPI_save_as_header_uint(fp,i);
00221 ADD_COMMA;
00222 }
00223
00224 static void KAPI_save_as_header_int_array(FILE *fp,int *pint,int number_of_elements)
00225 {
00226 int i;
00227 FILE *fpTmp=fp;
00228 START_ARRAY;
00229 for (i=0;i<number_of_elements-1;i++)
00230 KAPI_save_as_header_int_list(fp,pint[i]);
00231 KAPI_save_as_header_int(fp,pint[i]);
00232 CLOSE_ARRAY;
00233 }
00234 static void KAPI_save_as_header_uint_array(FILE *fp,unsigned long *pint,int number_of_elements)
00235 {
00236 int i;
00237 FILE *fpTmp=fp;
00238 START_ARRAY;
00239 for (i=0;i<number_of_elements-1;i++)
00240 KAPI_save_as_header_uint_list(fp,pint[i]);
00241 KAPI_save_as_header_uint(fp,pint[i]);
00242 CLOSE_ARRAY;
00243 }
00244
00245 static void KAPI_save_as_header_int_array_list(FILE *fp,int *pint,int number_of_elements)
00246 {
00247 FILE *fpTmp=fp;
00248 KAPI_save_as_header_int_array(fp,pint,number_of_elements);
00249 ADD_COMMA;
00250 }
00251 static void KAPI_save_as_header_String(FILE *fp,char *pch)
00252 {
00253 FILE *fpTmp=fp;
00254 #if 0
00255 fwrite("\"",sizeof(char),strlen("\""),fp);
00256 fwrite(pch,sizeof(char),strlen(pch),fp);
00257 fwrite("\"",sizeof(char),strlen("\""),fp);
00258 #endif
00259 #if 1
00260 fwrite("NULL/*",sizeof(char),strlen("NULL/*"),fp);
00261 fwrite(pch,sizeof(char),strlen(pch),fp);
00262 fwrite("*/",sizeof(char),strlen("*/"),fp);
00263 #endif
00264 }
00265 static void KAPI_save_as_header_String_list(FILE *fp,char *pch)
00266 {
00267 FILE *fpTmp=fp;
00268 KAPI_save_as_header_String(fp,pch);
00269 ADD_COMMA;
00270 }
00271 static void KAPI_save_as_header_String_always(FILE *fp,char *pch)
00272 {
00273 FILE *fpTmp=fp;
00274 fwrite("\"",sizeof(char),strlen("\""),fp);
00275 fwrite(pch,sizeof(char),strlen(pch),fp);
00276 fwrite("\"",sizeof(char),strlen("\""),fp);
00277 }
00278 static void KAPI_save_as_header_String_list_always(FILE *fp,char *pch)
00279 {
00280 FILE *fpTmp=fp;
00281 KAPI_save_as_header_String_always(fp,pch);
00282 ADD_COMMA;
00283 }
00284 static void KAPI_save_as_header_Enum(FILE *fp,char *pch)
00285 {
00286 FILE *fpTmp=fp;
00287 fwrite(pch,sizeof(char),strlen(pch),fp);
00288 }
00289 static void KAPI_save_as_header_name(FILE *fp,char *pch)
00290 {
00291 FILE *fpTmp=fp;
00292 fwrite(pch,sizeof(char),strlen(pch),fp);
00293 }
00294 static void KAPI_save_as_header_Enum_list(FILE *fp,char *pch)
00295 {
00296 FILE *fpTmp=fp;
00297 KAPI_save_as_header_Enum(fp,pch);
00298 ADD_COMMA;
00299 }
00300 static void KAPI_save_as_header_name_list(FILE *fp,char *pch)
00301 {
00302 FILE *fpTmp=fp;
00303 KAPI_save_as_header_name(fp,pch);
00304 ADD_COMMA;
00305 }
00306
00307 static void KAPI_save_as_header_String_array(FILE *fp,char **ppch,int number_of_elements)
00308 {
00309 int i;
00310 FILE *fpTmp=fp;
00311 START_ARRAY;
00312 for (i=0;i<number_of_elements-1;i++)
00313 KAPI_save_as_header_String_list(fp,ppch[i]);
00314 KAPI_save_as_header_String(fp,ppch[i]);
00315 CLOSE_ARRAY;
00316 }
00317
00318 static void KAPI_save_as_header_String_array_list(FILE *fp,char **ppch,int number_of_elements)
00319 {
00320 FILE *fpTmp=fp;
00321 KAPI_save_as_header_String_array(fp,ppch,number_of_elements);
00322 ADD_COMMA;
00323 }
00324
00325 static void KAPI_save_as_header_String_array_always(FILE *fp,char **ppch,int number_of_elements)
00326 {
00327 int i;
00328 FILE *fpTmp=fp;
00329 START_ARRAY;
00330 for (i=0;i<number_of_elements-1;i++)
00331 KAPI_save_as_header_String_list_always(fp,ppch[i]);
00332 KAPI_save_as_header_String_always(fp,ppch[i]);
00333 CLOSE_ARRAY;
00334 }
00335
00336 static void KAPI_save_as_header_String_array_list_always(FILE *fp,char **ppch,int number_of_elements)
00337 {
00338 FILE *fpTmp=fp;
00339 KAPI_save_as_header_String_array_always(fp,ppch,number_of_elements);
00340 ADD_COMMA;
00341 }
00342
00343 static void KAPI_save_as_header_bv128(FILE *fp,bv128_t *pbv)
00344 {
00345 fprintf(fp,"{%#x,%#x,%#x,%#x}",pbv->i1,pbv->i2,pbv->i3,pbv->i4);
00346 }
00347
00348 static void KAPI_save_as_header_BitVector_struct(FILE *fp,bv_t *pbv, char *pchName, FILE *fpTables)
00349 {
00350 FILE *fpTmp=fpTables;
00351 char *myName=NULL;
00352 char *vectorName=NULL;
00353 int tmp_radix=_kapi_radix;
00354 char pchNum[20];
00355
00356 kapi_saver_bv_counter++;
00357 sprintf(pchNum,"%d",kapi_saver_bv_counter);
00358 myName=make_string_attach("_saver_bv",pchNum);
00359 vectorName=(char *)malloc(sizeof(char)*(20+strlen("unsigned long [] =")+strlen(myName)));
00360 *vectorName='\0';
00361 sprintf(vectorName,"unsigned long %s[] = ",myName);
00362
00363
00364 fwrite(vectorName,sizeof(char),strlen(vectorName),fpTmp);
00365 _kapi_radix=16;
00366 KAPI_save_as_header_uint_array(fpTmp,pbv->pint32Data,pbv->n32Chunks);
00367 _kapi_radix=tmp_radix;
00368 ADD_SEMICOLON;
00369 ADD_NEWLINE;
00370
00371
00372 fpTmp=fp;
00373
00374 KAPI_save_as_header_int_list(fpTmp,pbv->n32Chunks);
00375 KAPI_save_as_header_name(fpTmp,myName);
00376 free(myName);
00377 free(vectorName);
00378 }
00379
00380
00381 static void KAPI_save_as_header_bv32(FILE *fp,bv32_t bv)
00382 {
00383 int tmp_radix=_kapi_radix;
00384 _kapi_radix=16;
00385 KAPI_save_as_header_uint(fp,bv);
00386 _kapi_radix=tmp_radix;
00387 }
00388 static void KAPI_save_as_header_bv32_list(FILE *fp,bv32_t bv)
00389 {
00390 FILE *fpTmp=fp;
00391 KAPI_save_as_header_bv32(fp,bv);
00392 ADD_COMMA;
00393 }
00394 static void KAPI_save_as_header_bv32_array(FILE *fp,int *pint,int number_of_elements)
00395 {
00396 int i;
00397 FILE *fpTmp=fp;
00398 for (i=0;i<number_of_elements-1;i++)
00399 KAPI_save_as_header_bv32_list(fp,pint[i]);
00400 KAPI_save_as_header_bv32(fp,pint[i]);
00401 }
00402
00403
00404 #endif