/* * parselib.c * * Convenience functions for parsing config-file lines. * * History: * 14/03/2014 Creation * * Author: Dario Rodriguez dario@softhome.net * This file is licensed under the terms of the GNU LGPL v2+ */ #include <string.h> #include "parselib.h" char * field_int(char *ptr, int *value) { *value=0; while(strchr(" \t",*ptr)!=NULL) ptr++; for(;*ptr>='0' && *ptr<='9';ptr++) *value=(*value)*10+(*ptr-'0'); return(ptr); } char * field_long(char *ptr, long *value) { *value=0; while(strchr(" \t",*ptr)!=NULL) ptr++; for(;*ptr>='0' && *ptr<='9';ptr++) *value=(*value)*10+(*ptr-'0'); return(ptr); } char * field_quotedstr(char *ptr, char *str, long strsize) { char *dest; int flaglit; while(strchr(" \t",*ptr)!=NULL) ptr++; if(*ptr!='\"') { if(str!=NULL && strsize>0) *str='\0'; return(ptr); } /* skip initial '\"' */ ptr++; /* read the string unescaping as we go */ for(dest=str,flaglit=0;*ptr!='\0' && !(!flaglit && *ptr=='\"');ptr++) { if(flaglit==0 && *ptr=='\\') { flaglit=1; continue; } flaglit=0; if(str!=NULL && (dest-str)<strsize) *(dest++)=*ptr; } if((dest-str)<strsize) *(dest++)='\0'; else if(str!=NULL && strsize>0) str[strsize-1]='\0'; /* skip the final '\"' */ if(*ptr=='\"') ptr++; return(ptr); } char * field_unquotedstr(char *ptr, char *str, long strsize, char *separators) { char *dest; while(strchr(" \t",*ptr)!=NULL) ptr++; /* read the string */ for(dest=str;*ptr!='\0' && strchr(separators,*ptr)==NULL;ptr++) { if(str!=NULL && (dest-str)<strsize) *(dest++)=*ptr; } if((dest-str)<strsize) *(dest++)='\0'; else if(str!=NULL && strsize>0) str[strsize-1]='\0'; return(ptr); } char * field_hexint(char *ptr, int *value) { *value=0; while(strchr(" \t",*ptr)!=NULL) ptr++; for(;(*ptr>='0' && *ptr<='9')||(*ptr>='a' && *ptr<='f')||(*ptr>='A' && *ptr<='F');ptr++) { *value=((*value)*16)+ (*ptr>='a' && *ptr<='f')?*ptr-'a'+10: (*ptr>='A' && *ptr<='F')?*ptr-'A'+10: *ptr-'0'; } return(ptr); }