/*=========================== * lowyylex -- Lexer function *=========================*/ static int lowyylex (PACTX pactx, YYSTYPE * lvalp) { INT c=0, t=0; /* skip over whitespace or comments up to start of token */ while (TRUE) { while ((t = chartype(c = inchar(pactx))) == WHITE) ; if (c != '/') break; if ((c = inchar(pactx)) != '*') { unreadchar(pactx, c); return '/'; } /* inside a comment -- advance til end */ while (TRUE) { while ((c = inchar(pactx)) != '*' && c != EOF) ; if (c == EOF) return 0; while ((c = inchar(pactx)) == '*') ; if (c == '/') break; if (c == EOF) return 0; } } /* now read token */ c = lextok(pactx, lvalp, c, t); return c; }
static int textread(register Dssfile_t* file, Dssrecord_t* record, Dssdisc_t* disc) { register Cxvalue_t* data = (Cxvalue_t*)file->data; register Text_t* text = (Text_t*)file->dss->meth->data; register char* s; register char* f; register int c; char* t; int num; int q; Ipaddr_t a; if (!(s = sfgetr(file->io, '\n', 1))) return 0; num = 0; f = text->format; for (;;) { switch (c = *f++) { case 0: break; case ' ': while (*s == ' ' || *s == '\t') s++; break; case '%': switch (c = *f++) { case 'h': case 'l': q = c; c = *f++; break; default: q = 0; break; } switch (c) { case 0: f--; continue; case '%': if (*s++ != c) s = null; continue; case 'c': if (data[num].number = *s) s++; num++; break; case 'd': c = 10; goto number; case 'i': if (!*s) data[num].number = 0; else { strtoip4(s, &t, &a, NiL); data[num].number = a; s = t; } num++; break; case 'n': case 'u': c = 0; goto number; case 'o': c = 8; goto number; case 'x': c = 16; number: if (!*s) data[num].number = 0; else { data[num].number = strtol(s, &t, c); s = t; } num++; break; case 'f': case 'g': if (!*s) data[num].number = 0; else { data[num].number = strtod(s, &t); s = t; } num++; break; case 's': if (q = *f) f++; if (!*s) { data[num].string.data = null; data[num].string.size = 0; } else s = lextok(s, q, &data[num].string); num++; break; case 't': if (!*s) data[num].number = 0; else { data[num].number = tmdate(s, &t, NiL); if (*t && *t != *f && *t != '\n') data[num].number = strtol(s, &t, 0); s = t; } num++; break; } continue; case '\n': break; default: if (*s++ != c) s = null; continue; } break; } record->data = data; return 1; }