#define LINEBUF 32
#define LINEBUF_MAX 4096
+static void uci_parse_error(struct uci_context *ctx, char *pos, char *reason)
+{
+ struct uci_parse_context *pctx = ctx->pctx;
+
+ pctx->reason = reason;
+ pctx->byte = pos - pctx->buf;
+ UCI_THROW(ctx, UCI_ERR_PARSE);
+}
+
/*
* Fetch a new line from the input stream and resize buffer if necessary
*/
return;
}
- if (pctx->bufsz > LINEBUF_MAX/2) {
- pctx->reason = "line too long";
- pctx->byte = LINEBUF_MAX;
- UCI_THROW(ctx, UCI_ERR_PARSE);
- }
+ if (pctx->bufsz > LINEBUF_MAX/2)
+ uci_parse_error(ctx, p, "line too long");
pctx->bufsz *= 2;
pctx->buf = uci_realloc(ctx, pctx->buf, pctx->bufsz);
break;
}
}
- ctx->pctx->reason = "unterminated \"";
- ctx->pctx->byte = *str - ctx->pctx->buf;
- UCI_THROW(ctx, UCI_ERR_PARSE);
+ uci_parse_error(ctx, *str, "unterminated \"");
}
/*
addc(target, str);
}
}
- ctx->pctx->reason = "unterminated '";
- ctx->pctx->byte = *str - ctx->pctx->buf;
- UCI_THROW(ctx, UCI_ERR_PARSE);
+ uci_parse_error(ctx, *str, "unterminated '");
}
/*
val = ptr = *str;
skip_whitespace(ctx, str);
parse_str(ctx, str, &ptr);
- if (required && !*val) {
- ctx->pctx->reason = "insufficient arguments";
- ctx->pctx->byte = *str - ctx->pctx->buf;
- UCI_THROW(ctx, UCI_ERR_PARSE);
- }
+ if (required && !*val)
+ uci_parse_error(ctx, *str, "insufficient arguments");
return val;
}
char *tmp;
tmp = next_arg(ctx, str, false);
- if (tmp && *tmp) {
- ctx->pctx->reason = "too many arguments";
- ctx->pctx->byte = tmp - ctx->pctx->buf;
- UCI_THROW(ctx, UCI_ERR_PARSE);
- }
+ if (tmp && *tmp)
+ uci_parse_error(ctx, *str, "too many arguments");
}
/*
char *type = NULL;
if (!ctx->pctx->package) {
- if (!ctx->pctx->name) {
- ctx->pctx->byte = *str - ctx->pctx->buf;
- ctx->pctx->reason = "attempting to import a file without a package name";
- UCI_THROW(ctx, UCI_ERR_PARSE);
- }
+ if (!ctx->pctx->name)
+ uci_parse_error(ctx, *str, "attempting to import a file without a package name");
+
uci_switch_config(ctx);
}
char *name = NULL;
char *value = NULL;
- if (!ctx->pctx->section) {
- ctx->pctx->byte = *str - ctx->pctx->buf;
- ctx->pctx->reason = "option command found before the first section";
- UCI_THROW(ctx, UCI_ERR_PARSE);
- }
+ if (!ctx->pctx->section)
+ uci_parse_error(ctx, *str, "option command found before the first section");
+
/* command string null-terminated by strtok */
*str += strlen(*str) + 1;
uci_parse_option(ctx, &word);
break;
default:
- pctx->reason = "unterminated command";
- pctx->byte = word - pctx->buf;
- UCI_THROW(ctx, UCI_ERR_PARSE);
+ uci_parse_error(ctx, word, "unterminated command");
break;
}
}