diff options
| author | katalx | 2026-02-02 04:00:32 -0500 |
|---|---|---|
| committer | katalx | 2026-02-02 04:00:32 -0500 |
| commit | 4849ea60928f118cc4747b79c227f53c86f70ac9 (patch) | |
| tree | 8096a19d4ffd1f86884ecf5a132c7e6bca566a47 /main.c | |
| parent | b2c27d7b23208f3d51927406198edd6a2e897391 (diff) | |
basic parsing
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 59 |
1 files changed, 55 insertions, 4 deletions
@@ -213,24 +213,70 @@ parse_request(Str url, Request *req) /* documents */ typedef enum { - DOC_ERROR, DOC_TEXT, DOC_GOPHERMAP, + DOC_ERROR, DOC_UNKNOWN } DocType; +typedef struct DocLine { + struct DocLine *next, *prev; + Str s; +} DocLine; + typedef struct { Arena arena; DocType type; Str src; + DocLine *head, *tail; } Doc; +/* document parsing */ + +DocLine * +doc_push_line(Doc *d, Str s) +{ + DocLine *n = new(&d->arena, DocLine); + n->s = s; + n->prev = d->tail; + if (d->tail) d->tail->next = n; + if (!d->head) d->head = n; + d->tail = n; + return n; +} + +int +parse_text(Doc *d) +{ + Str s = d->src; + while (s.n > 0) { + Cut c = str_cut(s, '\n'); + doc_push_line(d, c.head); + s = c.tail; + } + return 0; +} + int -doc_parse(Doc *d, Str src, DocType t) +parse_doc(Doc *d) { + switch (d->type) { + case DOC_TEXT: + return parse_text(d); + case DOC_GOPHERMAP: + doc_push_line(d, S("Gophermaps are unimplemented")); + return -1; + case DOC_ERROR: + doc_push_line(d, S("Error")); + return -1; + default: + break; + } + doc_push_line(d, S("Unknown document type")); + return -1; } -/* fetching documents */ +/* document fetching */ ssize_t write_str(int fd, Str s) @@ -319,7 +365,12 @@ main(void) Str buf = { 0 }; printf("fetch() -> %d\n", fetch(&buf, req, &scratch, &scratch)); - printf("%.*s\n", (int)buf.n, buf.s); + Doc doc = { .arena = scratch, .src = buf }; + printf("parse() -> %d\n", parse_doc(&doc)); + int i = 0; + for (DocLine *l = doc.head; l && i < 10; (l = l->next), i++) { + printf("%d %.*s\n", i, (int)l->s.n, l->s.s); + } addr_fini(); return 0; |
