#ident "$URL: svn://elmer/devel/SVN/SDDAS/trunk/libant/ParseFields.c $ %D% SwRI" /* ParseFields.c -- save,fetch,merge layout files */ #include /* for FILE,etc. */ #include /* for atof,etc. */ #include /* for strcpy,etc. */ #include "ParseFields.h" /* for ParseSpec,etc. */ #include "ant.h" /* for untok,etc. */ /* static variables */ static char separators[] = " \t\n\r:"; /* separate tokens in parse */ /* BooleRestore -- restore boolean field */ void BooleRestore(FILE *fp,char *line,void *parent,int offset) { boole *field = (boole *)FieldAddress(parent, offset); *field = (line) ? (boole) atoi (line) : 0; } /* DoubleRestore -- restore double field */ void DoubleRestore(FILE *fp,char *line,void *parent,int offset) { double *field = (double *)FieldAddress(parent,offset); *field = (line) ? atof(line) : 0; } /* FloatRestore -- restore float field */ void FloatRestore(FILE *fp,char *line,void *parent,int offset) { float *field = (float *)FieldAddress(parent,offset); *field = (line) ? atof(line) : 0; } /* IntRestore -- restore int field */ void IntRestore(FILE *fp,char *line,void *parent,int offset) { int *field = (int *)FieldAddress(parent,offset); *field = (line) ? atoi(line) : 0; } ParseSpec * NilTok(void) { static ParseSpec NilTokens[] = { {"END",0,NULL}, {NULL,0,NULL} }; return NilTokens; } /* ParseFieldsInBlock -- read and parse fields until EndStr */ void ParseFieldsInBlock(FILE *fp,void *parent,ParseSpec *tok,char *EndStr) { #define LINESIZE 1024 char line[LINESIZE]; memset (line, 0, LINESIZE); while (fgets(line,LINESIZE,fp)) { #define COMMENT_MARKER '#' int i; /* loop variable */ char *token; /* first token (substring) on line */ /* ignore empty lines and comments */ if (!(token=strtok(line,separators)) || *token == COMMENT_MARKER) continue; /* END token ends this parse level */ if (!strcmp(token,EndStr)) return; /* try to match one of tokens (NULL tag marks end of tokens) */ for (i=0; tok[i].tag; i++) if (!strcmp(tok[i].tag,token)) { if (tok[i].create != 0) (*tok[i].create)(fp,strtok(NULL,separators),parent,tok[i].offset); break; } } } /* ParseFields -- read and parse fields of data structure */ void ParseFields(FILE *fp,void *parent,ParseSpec *tok) { ParseFieldsInBlock(fp,parent,tok,"END"); } /* ShortRestore -- restore short field */ void ShortRestore(FILE *fp,char *line,void *parent,int offset) { short *field = (short *)FieldAddress(parent,offset); *field = (line) ? atoi(line) : 0; } /* StrDupRestore -- restore strings */ void StrDupRestore(FILE *fp,char *line,void *parent,int offset) { char **field = (char **)FieldAddress(parent,offset); if (*field != NULL) free (*field); *field = strdup((line) ? untok(line) : ""); } /* StringRestore -- restore strings */ void StringRestore(FILE *fp,char *line,void *parent,int offset) { char *field = (char *)FieldAddress(parent,offset); strcpy(field,(line) ? untok(line) : ""); }