edify extensions for OTA package installation, part 2
Adds more edify functions for OTAs:
is_mounted getprop apply_patch apply_patch_check apply_patch_space
write_raw_image write_firmware_image package_extract_file
This allows us to install radios, hboots, boot images, and install
incremental OTA packages.
Fixes a couple of dumb bugs in edify itself:
- we were doubling the size of the function table each time it was
*not* full, rather than each time it was full
- "no such function" errors weren't visible to the parser, so they
didn't prevent execution of the script.
diff --git a/edify/expr.c b/edify/expr.c
index 129fbd9..5470a2b 100644
--- a/edify/expr.c
+++ b/edify/expr.c
@@ -283,7 +283,7 @@
NamedFunction* fn_table = NULL;
void RegisterFunction(const char* name, Function fn) {
- if (fn_entries <= fn_size) {
+ if (fn_entries >= fn_size) {
fn_size = fn_size*2 + 1;
fn_table = realloc(fn_table, fn_size * sizeof(NamedFunction));
}
diff --git a/edify/main.c b/edify/main.c
index c959683..7da89e2 100644
--- a/edify/main.c
+++ b/edify/main.c
@@ -153,10 +153,11 @@
buffer[size] = '\0';
Expr* root;
+ int error_count = 0;
yy_scan_bytes(buffer, size);
- int error = yyparse(&root);
- printf("parse returned %d\n", error);
- if (error == 0) {
+ int error = yyparse(&root, &error_count);
+ printf("parse returned %d; %d errors encountered\n", error, error_count);
+ if (error == 0 || error_count > 0) {
char* result = Evaluate(NULL, root);
if (result == NULL) {
char* errmsg = GetError();
diff --git a/edify/parser.y b/edify/parser.y
index 67a210f..cf163c0 100644
--- a/edify/parser.y
+++ b/edify/parser.y
@@ -25,8 +25,8 @@
extern int gLine;
extern int gColumn;
-void yyerror(Expr** root, const char* s);
-int yyparse(Expr** root);
+void yyerror(Expr** root, int* error_count, const char* s);
+int yyparse(Expr** root, int* error_count);
%}
@@ -45,6 +45,7 @@
%type <args> arglist
%parse-param {Expr** root}
+%parse-param {int* error_count}
%error-verbose
/* declarations in increasing order of precedence */
@@ -86,7 +87,7 @@
if ($$->fn == NULL) {
char buffer[256];
snprintf(buffer, sizeof(buffer), "unknown function \"%s\"", $1);
- yyerror(root, buffer);
+ yyerror(root, error_count, buffer);
YYERROR;
}
$$->name = $1;
@@ -113,9 +114,10 @@
%%
-void yyerror(Expr** root, const char* s) {
+void yyerror(Expr** root, int* error_count, const char* s) {
if (strlen(s) == 0) {
s = "syntax error";
}
printf("line %d col %d: %s\n", gLine, gColumn, s);
+ ++*error_count;
}