commit a5845bb51f3d8897129c98344197970f402ec5be from: Omar Polo date: Sat Mar 20 21:18:14 2021 UTC refactor parsers: add parser_foreach_line to rule 'em all commit - 6cd6a9e148ca4bc65bebc03b562c9310dfc073e8 commit + a5845bb51f3d8897129c98344197970f402ec5be blob - bc1cc431b22f066b13292a7cfc924a67f756826a blob + 7b62291030830c86c81005aa062efe21bc7ddf73 --- gemtext.c +++ gemtext.c @@ -29,6 +29,7 @@ #include static int gemtext_parse(struct parser*, const char*, size_t); +static int gemtext_foreach_line(struct parser*, const char*, size_t); static int gemtext_free(struct parser*); static int parse_text(struct parser*, enum line_type, const char*, size_t); @@ -337,43 +338,20 @@ detect_line_type(const char *buf, size_t len, int in_p static int gemtext_parse(struct parser *p, const char *buf, size_t size) { - const char *b, *e; - enum line_type t; - size_t len, l; + return parser_foreach_line(p, buf, size, gemtext_foreach_line); +} - if (p->len == 0) { - b = buf; - len = size; - } else { - if (!parser_append(p, buf, size)) - return 0; - b = p->buf; - len = p->len; - } +static int +gemtext_foreach_line(struct parser *p, const char *line, size_t linelen) +{ + enum line_type t; - while (len > 0) { - if ((e = memmem((char*)b, len, "\n", 1)) == NULL) - break; - l = e - b; - t = detect_line_type(b, l, p->flags); - if (t == LINE_PRE_START) - p->flags = 1; - if (t == LINE_PRE_END) - p->flags = 0; - if (!parsers[t](p, t, b, l)) - return 0; - - len -= l; - b += l; - - if (len > 0) { - /* skip \n */ - len--; - b++; - } - } - - return parser_set_buf(p, b, len); + t = detect_line_type(line, linelen, p->flags); + if (t == LINE_PRE_START) + p->flags = 1; + if (t == LINE_PRE_END) + p->flags = 0; + return parsers[t](p, t, line, linelen); } static int blob - ade9c602f3c464de381fafd846a050bb67e1e8b7 blob + e000a06edf698c34c0f6e2d5139a551c9af038b8 --- parser.c +++ parser.c @@ -59,3 +59,41 @@ parser_set_buf(struct parser *p, const char *buf, size p->len = len; return 1; } + +int +parser_foreach_line(struct parser *p, const char *buf, size_t size, + parsechunkfn fn) +{ + const char *b, *e; + size_t l, len; + + if (p->len == 0) { + b = buf; + len = size; + } else { + if (!parser_append(p, buf, size)) + return 0; + b = p->buf; + len = p->len; + } + + while (len > 0) { + if ((e = memmem((char*)b, len, "\n", 1)) == NULL) + break; + l = e - b; + + if (!fn(p, b, l)) + return 0; + + len -= l; + b += l; + + if (len > 0) { + /* skip \n */ + len--; + b++; + } + } + + return parser_set_buf(p, b, len); +} blob - 35a320a2ef7ff31b886ac7b7a4d9b1a163367be3 blob + 2fca8a23aff5a367b4058ead948eed9814202332 --- telescope.h +++ telescope.h @@ -227,6 +227,7 @@ extern const char *err_pages[70]; /* parser.c */ int parser_append(struct parser*, const char*, size_t); int parser_set_buf(struct parser*, const char*, size_t); +int parser_foreach_line(struct parser*, const char*, size_t, parsechunkfn); /* sandbox.c */ void sandbox_network_process(void); blob - f1f9fe48240cb6fdb0269f94d6f97223aa7d9af4 blob + dd41f6e9abcb5c556e9c67aa3f9139967df4ace8 --- textplain.c +++ textplain.c @@ -24,6 +24,7 @@ #include static int textplain_parse(struct parser*, const char*, size_t); +static int textplain_foreach_line(struct parser*, const char*, size_t); static int textplain_free(struct parser*); static inline int @@ -66,40 +67,13 @@ textplain_initparser(struct parser *p) static int textplain_parse(struct parser *p, const char *buf, size_t size) { - const char *b, *e; - size_t len, l; - int r; + return parser_foreach_line(p, buf, size, textplain_foreach_line); +} - if (p->len == 0) { - b = buf; - len = size; - } else { - if (!parser_append(p, buf, size)) - return 0; - b = p->buf; - len = p->len; - } - - while (len > 0) { - if ((e = memmem((char*)b, len, "\n", 1)) == NULL) - break; - l = e - b; - - r = emit_line(p, LINE_PRE_CONTENT, b, l); - if (!r) - return 0; - - len -= l; - b += l; - - if (len > 0) { - /* skip \n */ - len--; - b++; - } - } - - return parser_set_buf(p, b, len); +static int +textplain_foreach_line(struct parser *p, const char *line, size_t linelen) +{ + return emit_line(p, LINE_PRE_CONTENT, line, linelen); } static int