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)); }
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)); }
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; }