#include #include #include #include #define BUFFER_SIZE 4096 #define STDIN 0 #define STDOUT 1 #define STDERR 2 void die_nomem () { write(STDERR, "no memory!\n", 11); exit(1); } char *ignorespace (char *buf, const ssize_t len) { static char *start, *end; start = buf; end = buf + len; for (;;) { if (start >= end) return NULL; if (!((*start == ' ') || (*start == '\t') || (*start == '\n') || (*start == '\r'))) break; ++start; } return start; } ssize_t lennonspace (char *buf, const ssize_t len) { static char *start, *end; start = buf; end = buf + len; for (;;) { if (start >= end) return 0; if ((*start == ' ') || (*start == '\t') || (*start == '\n') || (*start == '\r')) break; ++start; } return (start - buf); } char *nextline (char *line) { line = strchr(line, '\n'); if (!line) return NULL; return ++line; } ssize_t validproto (char *proto, ssize_t maxprotolen) { static ssize_t protolen, i; if (!proto) return 0; protolen = lennonspace(proto, maxprotolen); for (i = 0; i < protolen; ++i) if ((*(proto + i) < '0') || (*(proto + i) > '9')) return 0; return protolen; } char *lower (char *proto, ssize_t protolen) { static char *ret = NULL; ret = realloc(ret, protolen); if (!ret) die_nomem(); memmove(ret, proto, protolen); for (proto = ret; protolen; --protolen, ++proto) *proto = tolower(*proto); return ret; } int main () { ssize_t tmplen, buflen = 0, protolen, namelen, desclen; char tmp[BUFFER_SIZE], *tmpp = &tmp[0], *buf = NULL, *c, *proto, *name, *desc; while ((tmplen = read(STDIN, tmpp, BUFFER_SIZE))) { for (c = tmpp; (c = strchr(c, '\r'));) memmove(c, c + 1, --tmplen - (c - tmpp)); buf = realloc(buf, buflen + tmplen); if (!buf) die_nomem(); memmove(buf + buflen, tmpp, tmplen); buflen += tmplen; } c = buf; for (;;) { proto = ignorespace(c, buflen - (c - buf)); if (!(protolen = validproto(proto, buflen - (proto - buf)))) { c = nextline(c); if (!c || (c >= buf + buflen)) break; continue; } name = ignorespace(proto + protolen, buflen - (proto - buf + protolen)); if (!name) { c = nextline(c); if (!c || (c >= buf + buflen)) break; continue; } namelen = lennonspace(name, buflen - (name - buf)); desc = ignorespace(name + namelen, buflen - (name - buf + namelen)); if (!desc) { c = nextline(c); if (!c || (c >= buf + buflen)) break; continue; } c = nextline(desc); if (c) desclen = c - desc - 1; else desclen = buflen - (desc - buf); write(STDOUT, lower(name, namelen), namelen); write(STDOUT, "\t", 1); write(STDOUT, proto, protolen); write(STDOUT, "\t", 1); write(STDOUT, name, namelen); write(STDOUT, "\t# ", 3); write(STDOUT, desc, desclen); write(STDOUT, "\n", 1); if (!c || (c >= buf + buflen)) break; } return 0; }