Exemple #1
0
/*===========================
 * 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;
}
Exemple #2
0
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;
}