- while (1) {
-//TODO: speed up xmalloc_fgetline by internally using fgets, not fgetc
- line = xmalloc_fgetline(parser->fp);
- if (!line)
- return 0;
-
- parser->lineno++;
- // handle continuations. Tito's code stolen :)
- while (1) {
- ii = strlen(line);
- if (!ii)
- goto next_line;
- if (line[ii - 1] != '\\')
- break;
- // multi-line object
- line[--ii] = '\0';
-//TODO: add xmalloc_fgetline-like iface but with appending to existing str
- q = xmalloc_fgetline(parser->fp);
- if (q) {
- parser->lineno++;
- line = xasprintf("%s%s", line, q);
- free(q);
- }
- }
- // comments mean EOLs
- if (comment) {
- q = strchrnul(line, comment);
- *q = '\0';
- ii = q - line;
- }
- // skip leading and trailing delimiters
- if (!(flags & PARSE_DONT_TRIM)) {
- // skip leading
- int n = strspn(line, delims);
- if (n) {
- ii -= n;
- overlapping_strcpy(line, line + n);
- }
- // cut trailing
- if (ii) {
- while (strchr(delims, line[--ii]))
- continue;
- line[++ii] = '\0';
- }
- }
- // if something still remains -> return it
- if (ii)
- break;
+ /* Read one line (handling continuations with backslash) */
+ line = bb_get_chunk_with_continuation(parser->fp, &len, &parser->lineno);
+ if (line == NULL)
+ return 0;
+ parser->line = line;