Exemplo n.º 1
0
static off_t
yankstr(char **cpp)
{
	char *cp = *cpp;
	int c, ch;
	char dbuf[BUFSIZ];
	char *dp = dbuf;
	char *tp;
	static char tmp[] = "b\bt\tr\rn\nf\f\\\\\"\"";

	while ((c = *cp++)) {
		if (dp == dbuf + sizeof(dbuf) - 3)
			errx(1, "message too long");
		switch (c) {

		case '"':
			cp++;
			goto out;

		case '\\':
			c = *cp++;
			if (c == 0)
				break;
			if (c == '\n') {
				if (fgets(linebuf, sizeof linebuf, stdin)
				    == NULL) {
					if (ferror(stdin))
						err(3, "x.c");
					return(-1);
				}
				cp = linebuf;
				continue;
			}
			for (tp = tmp; (ch = *tp++); tp++)
				if (c == ch) {
					c = *tp;
					goto gotc;
				}
			if (!octdigit(c)) {
				*dp++ = '\\';
				break;
			}
			c -= '0';
			if (!octdigit(*cp))
				break;
			c <<= 3, c += *cp++ - '0';
			if (!octdigit(*cp))
				break;
			c <<= 3, c += *cp++ - '0';
			break;
		}
gotc:
		*dp++ = c;
	}
out:
	*cpp = --cp;
	*dp = 0;
	return (hashit(dbuf, 1));
}
Exemplo n.º 2
0
void
copystr(void)
{
	int c, ch;
	char buf[512];
	char *cp = buf;

	for (;;) {
		if (cp == buf + sizeof(buf) - 2)
			errx(1, "message too long");
		c = getchar();
		if (c == EOF)
			break;
		switch (c) {

		case '"':
			*cp++ = 0;
			goto out;
		case '\\':
			c = getchar();
			switch (c) {

			case 'b':
				c = '\b';
				break;
			case 't':
				c = '\t';
				break;
			case 'r':
				c = '\r';
				break;
			case 'n':
				c = '\n';
				break;
			case '\n':
				continue;
			case 'f':
				c = '\f';
				break;
			case '0':
				c = 0;
				break;
			case '\\':
				break;
			default:
				if (!octdigit(c))
					break;
				c -= '0';
				ch = getchar();
				if (!octdigit(ch))
					break;
				c <<= 7, c += ch - '0';
				ch = getchar();
				if (!octdigit(ch))
					break;
				c <<= 3, c+= ch - '0', ch = -1;
				break;
			}
		}
		*cp++ = c;
	}
out:
	*cp = 0;
	printf("%d", hashit(buf, 1, 0));
}
Exemplo n.º 3
0
static off_t
yankstr(char **cpp)
{
	char *cp = *cpp;
	int c, ch;
	char *dbuf, *dp, *edp;
	const char *tp;
	off_t hash;
	size_t bsiz = BUFSIZ;

	if ((dp = dbuf = malloc(bsiz)) == NULL)
		err(1, "malloc");
	edp = dbuf + bsiz;

	while ((c = *cp++) != '\0') {
		switch (c) {

		case '"':
			/* Look for a concatenated string */
			for (;;) {
				while (isspace((unsigned char)*cp))
					cp++;
				if (*cp == '\0') {
					if (fgets(linebuf,
					    sizeof linebuf, stdin) == NULL) {
						if (ferror(stdin))
							err(1,
							"Error reading `x.c'");
						goto out;
					}
					cp = linebuf;
				} else {
					if (*cp == '"') {
						cp++;
						if (*cp == '"') {
							cp++;
							continue;
						} else {
							c = *cp++;
							goto gotc;
						}
					} else {
						cp++;
						goto out;
					}
				}
			}
			/*NOTREACHED*/
		case '\\':
			c = *cp++;
			if (c == 0)
				break;
			if (c == '\n') {
				if (fgets(linebuf, sizeof linebuf, stdin)
				    == NULL) {
					if (ferror(stdin))
						err(1, "Error reading `x.c'");
					return(-1);
				}
				cp = linebuf;
				continue;
			}
			for (tp = "b\bt\tr\rn\nf\f\\\\\"\""; (ch = *tp++); tp++)
				if (c == ch) {
					c = *tp;
					goto gotc;
				}
			if (!octdigit(c)) {
				*dp++ = '\\';
				break;
			}
			c -= '0';
			if (!octdigit(*cp))
				break;
			c <<= 3, c += *cp++ - '0';
			if (!octdigit(*cp))
				break;
			c <<= 3, c += *cp++ - '0';
			break;
		}
gotc:
		if (dp >= edp - 1) {
			char *nbuf;
			bsiz += BUFSIZ;
			if ((nbuf = realloc(dbuf, bsiz)) == NULL) {
				free(dbuf);
				err(1, "realloc");
			}
			dp = nbuf + (dp - dbuf);
			edp = nbuf + bsiz;
			dbuf = nbuf;
		}
		*dp++ = c;
	}
out:
	*cpp = --cp;
	*dp = '\0';
	hash = hashit(dbuf, 1);
	free(dbuf);
	return hash;
}