1 /* fswebcam - FireStorm.cx's webcam generator */
2 /*===========================================================*/
3 /* Copyright (C)2005-2006 Philip Heron <phil@firestorm.cx> */
5 /* This program is distributed under the terms of the GNU */
6 /* General Public License, version 2. You may use, modify, */
7 /* and redistribute it under the terms of this license. A */
8 /* copy should be included with this source. */
20 #define ARG_EOS (-1) /* End of string */
21 #define ARG_EOA (-2) /* End of argument */
33 int arggetc(arg_t
*arg
)
35 if(*arg
->s
== '\0') return(ARG_EOS
);
37 if((!(arg
->opts
& ARG_NO_ESCAPE
) && *arg
->s
== '\\') &&
38 !(arg
->quote
&& *(arg
->s
+ 1) != '"'))
40 if(*(++arg
->s
) == '\0') return(ARG_EOS
);
41 return((int) *(arg
->s
++));
44 if(!(arg
->opts
& ARG_NO_QUOTE
) && *arg
->s
== '"')
47 arg
->quote
= !arg
->quote
;
52 if(arg
->quote
) return((int) *(arg
->s
++));
54 if(strchr(arg
->sep
, *arg
->s
))
60 return((int) *(arg
->s
++));
63 int argopts(arg_t
*arg
, char *src
, char *sep
, int opts
)
65 memset(arg
, 0, sizeof(arg_t
));
72 int argncpy(char *dst
, size_t n
, char *src
, char *sep
, int arg
, int opt
)
79 argopts(&s
, src
, sep
, opt
);
85 while((r
= arggetc(&s
)) != ARG_EOS
)
89 if(!(opt
& ARG_NO_TRIM
) && !l
) continue;
107 if(!arg
&& !(!(opt
& ARG_NO_TRIM
) && !l
)) return(0);
112 int arglen(char *src
, char *sep
, int arg
, int opt
)
118 argopts(&s
, src
, sep
, opt
);
122 while((r
= arggetc(&s
)) != ARG_EOS
)
126 if(!(opt
& ARG_NO_TRIM
) && !l
) continue;
127 if(!arg
--) return(l
);
137 if(!arg
&& !(!(opt
& ARG_NO_TRIM
) && !l
)) return(l
);
142 char *argdup(char *src
, char *sep
, int arg
, int opt
)
147 l
= arglen(src
, sep
, arg
, opt
);
148 if(l
< 0) return(NULL
);
151 if(!dst
) return(NULL
);
153 argncpy(dst
, l
, src
, sep
, arg
, opt
);
158 int argcount(char *src
, char *sep
, int opt
)
162 while(arglen(src
, sep
, count
, opt
) >= 0)
168 long argtol(char *src
, char *sep
, int arg
, int opt
, int base
)
173 str
= argdup(src
, sep
, arg
, opt
);
176 /* Catch any errors. */
179 val
= strtol(str
, NULL
, base
);
186 int parse_font(char *src
, char **font
, int *fontsize
)
191 if(!src
|| !font
|| !fontsize
) return(-1);
193 p
= strchr(src
, ':');
196 else l
= strlen(src
);
200 *font
= (char *) calloc(l
+ 1, 1);
201 if(!*font
) return(-1);
202 strncpy(*font
, src
, l
);
208 if(*p
) *fontsize
= atoi(p
);
214 char *strtrim(char *str
, char *ws
)
218 str
+= strspn(str
, ws
);
220 while(*str
!= '\0' && strspn(str
, ws
) != strlen(str
))