Doxygen Source Code Documentation
thd_serialate.c File Reference
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
Go to the source code of this file.
Data Structures | |
struct | complex |
struct | rgb |
struct | SER_vector |
Defines | |
#define | SERTYPE_NUM 8 |
#define | SER_MAXNAME 256 |
#define | QUOTE '"' |
Typedefs | |
typedef unsigned char | byte |
Enumerations | |
enum | SERTYPE { SERTYPE_byte, SERTYPE_short, SERTYPE_int, SERTYPE_float, SERTYPE_double, SERTYPE_complex, SERTYPE_rgb, SERTYPE_string } |
Functions | |
void | SER_setup_stuff (void) |
SER_vector * | SER_new_vector (char *fname, char *typelist) |
void | SER_destroy_vector (SER_vector *sv) |
void | SER_free_vector (SER_vector *sv) |
int | SER_addto_vector_textmode (SER_vector *sv, int nstr, char *str) |
Variables | |
int | SERTYPE_code [SERTYPE_NUM] |
int | SERTYPE_initialized = 0 |
int | SERTYPE_sizeof [SERTYPE_NUM] |
const char * | SERTYPE_name [SERTYPE_NUM] |
const char * | SERTYPE_initial [SERTYPE_NUM] |
Define Documentation
|
|
|
Definition at line 38 of file thd_serialate.c. Referenced by SER_new_vector(). |
|
Definition at line 11 of file thd_serialate.c. Referenced by SER_new_vector(). |
Typedef Documentation
|
Definition at line 7 of file thd_serialate.c. Referenced by SER_addto_vector_textmode(). |
Enumeration Type Documentation
|
Definition at line 12 of file thd_serialate.c.
00012 { 00013 SERTYPE_byte , SERTYPE_short , SERTYPE_int , 00014 SERTYPE_float , SERTYPE_double , SERTYPE_complex , 00015 SERTYPE_rgb , SERTYPE_string 00016 } SERTYPE ; |
Function Documentation
|
Definition at line 170 of file thd_serialate.c. References rgb::b, byte, calloc, ccp, free, rgb::g, complex::i, malloc, SER_vector::numvec, rgb::r, complex::r, SERTYPE_byte, SERTYPE_complex, SERTYPE_double, SERTYPE_float, SERTYPE_int, SERTYPE_rgb, SERTYPE_short, SERTYPE_string, and SER_vector::vtype.
00171 { 00172 int jj , err=0 , spos=0 , snum , ss ; 00173 void **val ; 00174 byte *bbp ; 00175 short *ssp ; 00176 int ii , *iip ; 00177 float ff , *ffp ; 00178 double dd , *ddp ; 00179 complex cc , *ccp ; 00180 rgb *rrp ; int rr,gg,bb ; 00181 char *SS ,**SSp ; 00182 00183 if( sv == NULL || 00184 str == NULL || str[0] == '\0' || nstr < sv->numvec ) return 0 ; 00185 00186 /*-- loop over sub-vectors --*/ 00187 00188 val = (void **) calloc( sizeof(void *) , sv->numvec ) ; 00189 00190 for( jj=0 ; jj < sv->numvec && spos < nstr ; jj++ ){ 00191 00192 switch( sv->vtype[jj] ){ 00193 00194 case SERTYPE_byte: 00195 ss = sscanf(str+spos,"%d%n",&ii,&snum) ; 00196 if( ss < 1 ){ err++ ; break ; } 00197 spos += snum ; 00198 bbp = (byte *) malloc( sizeof(byte) ) ; *bbp = (byte) ii ; 00199 val[jj] = (void *) bbp ; 00200 break ; 00201 00202 case SERTYPE_short: 00203 ss = sscanf(str+spos,"%d%n",&ii,&snum) ; 00204 if( ss < 1 ){ err++ ; break ; } 00205 spos += snum ; 00206 ssp = (short *) malloc( sizeof(short) ) ; *ssp = (short) ii ; 00207 val[jj] = (void *) ssp ; 00208 break ; 00209 00210 case SERTYPE_int: 00211 ss = sscanf(str+spos,"%d%n",&ii,&snum) ; 00212 if( ss < 1 ){ err++ ; break ; } 00213 spos += snum ; 00214 iip = (int *) malloc( sizeof(int) ) ; *iip = ii ; 00215 val[jj] = (void *) iip ; 00216 break ; 00217 00218 case SERTYPE_float: 00219 ss = sscanf(str+spos,"%f%n",&ff,&snum) ; 00220 if( ss < 1 ){ err++ ; break ; } 00221 spos += snum ; 00222 ffp = (float *) malloc( sizeof(float) ) ; *ffp = ff ; 00223 val[jj] = (void *) ffp ; 00224 break ; 00225 00226 case SERTYPE_double: 00227 ss = sscanf(str+spos,"%lf%n",&dd,&snum) ; 00228 if( ss < 1 ){ err++ ; break ; } 00229 spos += snum ; 00230 ddp = (double *) malloc( sizeof(double) ) ; *ddp = dd ; 00231 val[jj] = (void *) ddp ; 00232 break ; 00233 00234 case SERTYPE_complex: 00235 ss = sscanf(str+spos,"%f%f%n",&(cc.r),&(cc.i),&snum) ; 00236 if( ss < 2 ){ err++ ; break ; } 00237 spos += snum ; 00238 ccp = (complex *) malloc( sizeof(complex) ) ; *ccp = cc ; 00239 val[jj] = (void *) ccp ; 00240 break ; 00241 00242 case SERTYPE_rgb: 00243 ss = sscanf(str+spos,"%d%d%d%n",&rr,&gg,&bb,&snum) ; 00244 if( ss < 2 ){ err++ ; break ; } 00245 spos += snum ; 00246 rrp = (rgb *) malloc( sizeof(rgb) ) ; 00247 rrp->r = (byte)rr ; rrp->g = (byte)gg ; rrp->b = (byte)bb ; 00248 val[jj] = (void *) rrp ; 00249 break ; 00250 00251 #define QUOTE '"' /* string quoting character */ 00252 00253 case SERTYPE_string:{ 00254 int quote=0 , kk,mm , ll ; 00255 for( kk=spos ; kk < nstr && iswhite(str[kk]) ; kk++ ) ; /* nada */ 00256 if( kk == nstr ){ err++ ; break ; } 00257 if( str[kk] == QUOTE ){ quote=1; kk++; if(kk==nstr){err++;break;} } 00258 if( quote ){ 00259 mm = kk ; 00260 while( mm < nstr ){ 00261 if( str[mm] == QUOTE && str[mm-1] != '\\' ) break ; 00262 mm++ ; 00263 } 00264 } else { 00265 for( mm=kk ; mm < nstr && !iswhite(str[kk]) ; mm++ ) ; /* nada */ 00266 } 00267 /* string runs from str[kk] to str[mm-1] */ 00268 spos = mm+1 ; 00269 ll = mm-kk ; 00270 } 00271 break ; 00272 00273 } 00274 } 00275 00276 if( jj < sv->numvec || err > 0 ){ 00277 for( jj=0 ; jj < sv->numvec ; jj++ ) 00278 if( val[jj] != NULL ) free(val[jj]) ; 00279 free(val) ; return 0 ; 00280 } 00281 } |
|
Definition at line 133 of file thd_serialate.c. References free, SER_vector::numvec, SERTYPE_string, SER_vector::vec, and SER_vector::vtype.
00134 { 00135 int ii , jj ; 00136 00137 if( sv == NULL ) return ; 00138 00139 if( sv->vec != NULL ){ /* destroy each sub-vector */ 00140 for( ii=0 ; ii < sv->numvec ; ii++ ){ 00141 if( sv->vec[ii] != NULL ){ 00142 if( sv->vtype[ii] == SERTYPE_string ){ /* if strings, */ 00143 char **SSp = (char **) sv->vec[ii] ; /* must destroy */ 00144 for( jj=0 ; jj < sv->numvec ; jj++ ) /* each string */ 00145 if( SSp[jj] != NULL ) free(SSp[jj]) ; 00146 } 00147 free(sv->vec[ii]) ; 00148 } 00149 } 00150 free(sv->vec) ; 00151 } 00152 00153 if( sv->vtype != NULL ) free(sv->vtype) ; 00154 free(sv) ; 00155 } |
|
Definition at line 159 of file thd_serialate.c. References free, SER_vector::vec, and SER_vector::vtype.
|
|
Definition at line 64 of file thd_serialate.c. References AFMALL, SER_vector::fieldname, free, malloc, SER_vector::numvec, realloc, SER_MAXNAME, SER_setup_stuff(), SERTYPE_code, SERTYPE_initialized, SERTYPE_name, SERTYPE_NUM, SER_vector::vec, SER_vector::vecall, SER_vector::veclen, and SER_vector::vtype.
00065 { 00066 SER_vector *sv ; 00067 int ntyp , ii , ntl , tpos , jj , *vtyp=NULL ; 00068 char *tlist , tname[SER_MAXNAME] ; 00069 00070 if( typelist == NULL ) return NULL ; /* bad */ 00071 00072 if( !SERTYPE_initialized ) SER_setup_stuff() ; 00073 00074 sv = AFMALL( SER_vector, sizeof(SER_vector)) ; 00075 00076 /*-- set fieldname --*/ 00077 00078 if( fname == NULL ){ /* not good, but OK */ 00079 sv->fieldname[0] = '\0' ; 00080 } else { 00081 strncpy(sv->fieldname,fname,SER_MAXNAME) ; 00082 sv->fieldname[SER_MAXNAME-1] = '\0' ; 00083 } 00084 00085 /*-- copy and mangle type list --*/ 00086 00087 tlist = strdup(typelist) ; 00088 ntl = strlen(tlist) ; /* replace separators */ 00089 for( ii=0 ; ii < ntl ; ii++ ) /* with blanks */ 00090 if( tlist[ii] == ',' || tlist[ii] == ':' || 00091 tlist[ii] == ';' || tlist[ii] == '+' || 00092 tlist[ii] == '-' || tlist[ii] == '/' ) tlist[ii] = ' ' ; 00093 00094 /*-- scan mangled type list and get type codes --*/ 00095 00096 tpos = ntyp = 0 ; 00097 vtyp = (int *) malloc(sizeof(int)) ; 00098 00099 do{ 00100 ii = sscanf( tlist+tpos , "%s%n" , tname , &jj ) ; /* next name */ 00101 if( ii < 1 ) break ; /* end of work */ 00102 tpos += jj ; /* char after last scanned */ 00103 00104 ii = strlen(tname) ; /* find name in type list */ 00105 for( jj=0 ; jj < SERTYPE_NUM ; jj++ ) 00106 if( strncmp(SERTYPE_name[jj],tname,ii) == 0 ) break ; 00107 00108 if( jj == SERTYPE_NUM ){ free(tlist); free(vtyp); return NULL; } 00109 00110 ntyp++ ; /* add new type */ 00111 vtyp = (int *) realloc( vtyp , sizeof(int)*ntyp ) ; 00112 vtyp[ntyp-1] = SERTYPE_code[jj] ; 00113 } while( tpos < ntl ) ; 00114 00115 free(tlist) ; /* don't need copy no more */ 00116 00117 if( ntyp < 1 ){ free(vtyp); return NULL; } /* got no types */ 00118 00119 /*-- now can setup rest of vector --*/ 00120 00121 sv->numvec = ntyp ; 00122 sv->veclen = 0 ; 00123 sv->vecall = 0 ; 00124 sv->vtype = vtyp ; 00125 sv->vec = (void **) malloc( sizeof(void *)*ntyp ) ; 00126 for( ii=0 ; ii < ntyp ; ii++ ) sv->vec[ii] = NULL ; 00127 00128 return sv ; 00129 } |
|
Definition at line 48 of file thd_serialate.c. References SERTYPE_initialized, and SERTYPE_sizeof. Referenced by SER_new_vector().
00049 { 00050 SERTYPE_sizeof[0] = sizeof(byte) ; 00051 SERTYPE_sizeof[1] = sizeof(short) ; 00052 SERTYPE_sizeof[2] = sizeof(int) ; 00053 SERTYPE_sizeof[3] = sizeof(float) ; 00054 SERTYPE_sizeof[4] = sizeof(double) ; 00055 SERTYPE_sizeof[5] = sizeof(complex) ; 00056 SERTYPE_sizeof[6] = sizeof(rgb) ; 00057 SERTYPE_sizeof[7] = sizeof(char *) ; 00058 00059 SERTYPE_initialized = 1 ; 00060 } |
Variable Documentation
|
Initial value: { SERTYPE_byte , SERTYPE_short , SERTYPE_int , SERTYPE_float , SERTYPE_double , SERTYPE_complex , SERTYPE_rgb , SERTYPE_string } Definition at line 18 of file thd_serialate.c. Referenced by SER_new_vector(). |
|
Initial value: { "b" , "s" , "i" , "f" , "d" , "c" , "r" , "S" } Definition at line 34 of file thd_serialate.c. |
|
Definition at line 24 of file thd_serialate.c. Referenced by SER_new_vector(), and SER_setup_stuff(). |
|
Initial value: { "byte" , "short" , "int" , "float" , "double" , "complex" , "rgb" , "String" } Definition at line 28 of file thd_serialate.c. Referenced by SER_new_vector(). |
|
Definition at line 26 of file thd_serialate.c. Referenced by SER_setup_stuff(). |