close(fd);
}
+#define isoctal(x) (isdigit(x) && ((x)<'8'))
int
xgettok(XFILE *xfp, char sepa, char *tok, int len)
{
int i = 0;
- char c = 0;
-
- while (i < len && (c = xgetc(xfp)) != EOF && c != sepa && !isspace(c))
+ int c = 0;
+ int quoted=0;
+
+ while (i < len && (c = xgetc(xfp)) != EOF &&
+ (quoted || (c != sepa && !isspace(c)))) {
+ if (c == '"') {
+ quoted = !quoted;
+ continue;
+ }
tok[i++] = c;
+ if (i >= 4 &&
+ tok[i-4] == '\\' &&
+ isoctal(tok[i-3]) &&
+ isoctal(tok[i-2]) &&
+ isoctal(tok[i-1]) &&
+ ((tok[i]=0),
+ (c = strtol(tok+i-3,NULL, 8)) < 256)) {
+ i -= 4;
+ tok[i++] = c;
+ }
+ }
if (c == '\n')
xungetc(c, xfp);
if (!i)
return 1;
}
-char
+int
xgetc(XFILE *xfp)
{
- char c = getc(xfp->x_fp);
+ int c = getc(xfp->x_fp);
if (c == EOF)
return c;
void
xskip(XFILE *xfp, char *str)
{
- char c;
+ int c;
while ((c = xgetc(xfp)) != EOF && strchr(str, c));
- ungetc(c, xfp->x_fp);
+ xungetc(c, xfp);
}
char
xskipcomment(XFILE *xfp)
{
- char c;
+ int c;
while ((c = getc(xfp->x_fp)) != EOF && c != '\n');
return c;