|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 2052 (0x804) Types: TextFile Names: »scanheaders.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/news/misc/search/lib/scanheaders.c«
/* Scan the headers of a mail/news article, calling a given function for each header line. The function has three string parameters: keyword, value, filename, and a boolean which is FALSE for continuation lines. When this function returns TRUE, abandon the scan and return 1. Otherwise, return 0 if the headers have the correct format, or a negative error code if not. */ #include "defs.h" #include "scanheaders.h" int scanheaders(fp, name, match) FILE *fp; char *name; funcptr match; { char linebuf[BUFSIZ]; char *p; int c; int count= 0; while (safegets(linebuf, BUFSIZ, fp) != NULL) { p= linebuf; if (*p == '\n') break; /* End of headers */ /* Check for header line: */ while (iskwchar(*p)) ++p; /* Skip keyword */ if (p[0] != ':' || !isspace(p[1])) { if (count == 0) return BAD_HEADER; else return BAD_LINE; } *p++ = EOS; /* Turn keyword into a separate string */ if ((*match)(linebuf, p, name, TRUE)) return FOUND_MATCH; for (;;) { ++count; /* Check for continuation line. */ c= getc(fp); (void) ungetc(c, fp); if (c == '\n' || !isspace(c)) break; (void) safegets(p, BUFSIZ-(p-linebuf), fp); if ((*match)(linebuf, p, name, FALSE)) return FOUND_MATCH; } ++count; } if (count == 0) { if (ftell(fp) == 0) return EMPTY_FILE; else return NO_HEADERS; } else return NO_MATCH; } /* A header line consists of a keyword immediately followed by a colon and whitespace; keywords can contain letters, digits, '-' and '.'. (These rules are stricter than those for ARPANET-mail headers, where keywords can contain any printable characters except colon and space, and no whitespace is required after the colon; however, they conform to observed practice in USENET mail.) A header line can be followed by any number of continuation lines; a continuation line starts with a space or tab. A file is considered to have an error if there are no header lines or if the last header line is not followed by a blank line. */