/*
 * 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);
}