- struct uci_parse_context *pctx = ctx->pctx;
- char *p;
- int ofs;
-
- if (pctx->buf == NULL) {
- pctx->buf = uci_malloc(ctx, LINEBUF);
- pctx->bufsz = LINEBUF;
- }
-
- ofs = 0;
- do {
- p = &pctx->buf[ofs];
- p[ofs] = 0;
-
- p = fgets(p, pctx->bufsz - ofs, pctx->file);
- if (!p || !p[ofs])
- return;
-
- ofs += strlen(p);
- if (pctx->buf[ofs - 1] == '\n') {
- pctx->line++;
- pctx->buf[ofs - 1] = 0;
- return;
- }
-
- if (pctx->bufsz > LINEBUF_MAX/2) {
- pctx->reason = "line too long";
- pctx->byte = LINEBUF_MAX;
- UCI_THROW(ctx, UCI_ERR_PARSE);
- }
-
- pctx->bufsz *= 2;
- pctx->buf = uci_realloc(ctx, pctx->buf, pctx->bufsz);
- } while (1);
-}
-
-/*
- * Clean up all extra memory used by the parser
- */
-static void uci_parse_cleanup(struct uci_context *ctx)
-{
- struct uci_parse_context *pctx;
-
- pctx = ctx->pctx;
- if (!pctx)
- return;
-
- if (pctx->cfg) {
- uci_list_del(&pctx->cfg->list);
- uci_drop_file(pctx->cfg);
- }
- if (pctx->buf)
- free(pctx->buf);
- if (pctx->file)
- fclose(pctx->file);
-
- free(pctx);
-}