summaryrefslogtreecommitdiffstats
path: root/edify
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--edify/Android.mk28
-rw-r--r--edify/expr.cpp (renamed from edify/expr.c)67
-rw-r--r--edify/expr.h30
-rw-r--r--edify/lexer.ll (renamed from edify/lexer.l)24
-rw-r--r--edify/main.cpp (renamed from edify/main.c)5
-rw-r--r--edify/parser.yy (renamed from edify/parser.y)8
6 files changed, 99 insertions, 63 deletions
diff --git a/edify/Android.mk b/edify/Android.mk
index 03c04e432..71cf7652a 100644
--- a/edify/Android.mk
+++ b/edify/Android.mk
@@ -3,14 +3,9 @@
LOCAL_PATH := $(call my-dir)
edify_src_files := \
- lexer.l \
- parser.y \
- expr.c
-
-# "-x c" forces the lex/yacc files to be compiled as c the build system
-# otherwise forces them to be c++. Need to also add an explicit -std because the
-# build system will soon default C++ to -std=c++11.
-edify_cflags := -x c -std=gnu89
+ lexer.ll \
+ parser.yy \
+ expr.cpp
#
# Build the host-side command line tool
@@ -19,12 +14,16 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
$(edify_src_files) \
- main.c
+ main.cpp
-LOCAL_CFLAGS := $(edify_cflags) -g -O0
+LOCAL_CPPFLAGS := -g -O0
LOCAL_MODULE := edify
LOCAL_YACCFLAGS := -v
-LOCAL_CFLAGS += -Wno-unused-parameter
+LOCAL_CPPFLAGS += -Wno-unused-parameter
+LOCAL_CPPFLAGS += -Wno-deprecated-register
+LOCAL_CLANG := true
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+LOCAL_STATIC_LIBRARIES += libbase
include $(BUILD_HOST_EXECUTABLE)
@@ -35,8 +34,11 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(edify_src_files)
-LOCAL_CFLAGS := $(edify_cflags)
-LOCAL_CFLAGS += -Wno-unused-parameter
+LOCAL_CPPFLAGS := -Wno-unused-parameter
+LOCAL_CPPFLAGS += -Wno-deprecated-register
LOCAL_MODULE := libedify
+LOCAL_CLANG := true
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
+LOCAL_STATIC_LIBRARIES += libbase
include $(BUILD_STATIC_LIBRARY)
diff --git a/edify/expr.c b/edify/expr.cpp
index 79f6282d8..cc14fbe93 100644
--- a/edify/expr.c
+++ b/edify/expr.cpp
@@ -21,6 +21,11 @@
#include <stdarg.h>
#include <unistd.h>
+#include <string>
+
+#include <android-base/stringprintf.h>
+#include <android-base/strings.h>
+
#include "expr.h"
// Functions should:
@@ -36,7 +41,7 @@ char* Evaluate(State* state, Expr* expr) {
Value* v = expr->fn(expr->name, state, expr->argc, expr->argv);
if (v == NULL) return NULL;
if (v->type != VAL_STRING) {
- ErrorAbort(state, "expecting string, got value type %d", v->type);
+ ErrorAbort(state, kArgsParsingFailure, "expecting string, got value type %d", v->type);
FreeValue(v);
return NULL;
}
@@ -51,7 +56,7 @@ Value* EvaluateValue(State* state, Expr* expr) {
Value* StringValue(char* str) {
if (str == NULL) return NULL;
- Value* v = malloc(sizeof(Value));
+ Value* v = reinterpret_cast<Value*>(malloc(sizeof(Value)));
v->type = VAL_STRING;
v->size = strlen(str);
v->data = str;
@@ -68,7 +73,7 @@ Value* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) {
if (argc == 0) {
return StringValue(strdup(""));
}
- char** strings = malloc(argc * sizeof(char*));
+ char** strings = reinterpret_cast<char**>(malloc(argc * sizeof(char*)));
int i;
for (i = 0; i < argc; ++i) {
strings[i] = NULL;
@@ -83,8 +88,9 @@ Value* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) {
length += strlen(strings[i]);
}
- result = malloc(length+1);
- int p = 0;
+ result = reinterpret_cast<char*>(malloc(length+1));
+ int p;
+ p = 0;
for (i = 0; i < argc; ++i) {
strcpy(result+p, strings[i]);
p += strlen(strings[i]);
@@ -149,7 +155,7 @@ Value* AssertFn(const char* name, State* state, int argc, Expr* argv[]) {
if (!b) {
int prefix_len;
int len = argv[i]->end - argv[i]->start;
- char* err_src = malloc(len + 20);
+ char* err_src = reinterpret_cast<char*>(malloc(len + 20));
strcpy(err_src, "assert failed: ");
prefix_len = strlen(err_src);
memcpy(err_src + prefix_len, state->script + argv[i]->start, len);
@@ -290,7 +296,8 @@ Value* LessThanIntFn(const char* name, State* state, int argc, Expr* argv[]) {
goto done;
}
- long r_int = strtol(right, &end, 10);
+ long r_int;
+ r_int = strtol(right, &end, 10);
if (right[0] == '\0' || *end != '\0') {
goto done;
}
@@ -325,11 +332,11 @@ Value* Literal(const char* name, State* state, int argc, Expr* argv[]) {
Expr* Build(Function fn, YYLTYPE loc, int count, ...) {
va_list v;
va_start(v, count);
- Expr* e = malloc(sizeof(Expr));
+ Expr* e = reinterpret_cast<Expr*>(malloc(sizeof(Expr)));
e->fn = fn;
e->name = "(operator)";
e->argc = count;
- e->argv = malloc(count * sizeof(Expr*));
+ e->argv = reinterpret_cast<Expr**>(malloc(count * sizeof(Expr*)));
int i;
for (i = 0; i < count; ++i) {
e->argv[i] = va_arg(v, Expr*);
@@ -351,7 +358,7 @@ NamedFunction* fn_table = NULL;
void RegisterFunction(const char* name, Function fn) {
if (fn_entries >= fn_size) {
fn_size = fn_size*2 + 1;
- fn_table = realloc(fn_table, fn_size * sizeof(NamedFunction));
+ fn_table = reinterpret_cast<NamedFunction*>(realloc(fn_table, fn_size * sizeof(NamedFunction)));
}
fn_table[fn_entries].name = name;
fn_table[fn_entries].fn = fn;
@@ -371,8 +378,8 @@ void FinishRegistration() {
Function FindFunction(const char* name) {
NamedFunction key;
key.name = name;
- NamedFunction* nf = bsearch(&key, fn_table, fn_entries,
- sizeof(NamedFunction), fn_entry_compare);
+ NamedFunction* nf = reinterpret_cast<NamedFunction*>(bsearch(&key, fn_table, fn_entries,
+ sizeof(NamedFunction), fn_entry_compare));
if (nf == NULL) {
return NULL;
}
@@ -401,7 +408,7 @@ void RegisterBuiltins() {
// zero or more char** to put them in). If any expression evaluates
// to NULL, free the rest and return -1. Return 0 on success.
int ReadArgs(State* state, Expr* argv[], int count, ...) {
- char** args = malloc(count * sizeof(char*));
+ char** args = reinterpret_cast<char**>(malloc(count * sizeof(char*)));
va_list v;
va_start(v, count);
int i;
@@ -427,7 +434,7 @@ int ReadArgs(State* state, Expr* argv[], int count, ...) {
// zero or more Value** to put them in). If any expression evaluates
// to NULL, free the rest and return -1. Return 0 on success.
int ReadValueArgs(State* state, Expr* argv[], int count, ...) {
- Value** args = malloc(count * sizeof(Value*));
+ Value** args = reinterpret_cast<Value**>(malloc(count * sizeof(Value*)));
va_list v;
va_start(v, count);
int i;
@@ -491,15 +498,29 @@ Value** ReadValueVarArgs(State* state, int argc, Expr* argv[]) {
return args;
}
+static void ErrorAbortV(State* state, const char* format, va_list ap) {
+ std::string buffer;
+ android::base::StringAppendV(&buffer, format, ap);
+ free(state->errmsg);
+ state->errmsg = strdup(buffer.c_str());
+ return;
+}
+
// Use printf-style arguments to compose an error message to put into
-// *state. Returns NULL.
+// *state. Returns nullptr.
Value* ErrorAbort(State* state, const char* format, ...) {
- char* buffer = malloc(4096);
- va_list v;
- va_start(v, format);
- vsnprintf(buffer, 4096, format, v);
- va_end(v);
- free(state->errmsg);
- state->errmsg = buffer;
- return NULL;
+ va_list ap;
+ va_start(ap, format);
+ ErrorAbortV(state, format, ap);
+ va_end(ap);
+ return nullptr;
+}
+
+Value* ErrorAbort(State* state, CauseCode cause_code, const char* format, ...) {
+ va_list ap;
+ va_start(ap, format);
+ ErrorAbortV(state, format, ap);
+ va_end(ap);
+ state->cause_code = cause_code;
+ return nullptr;
}
diff --git a/edify/expr.h b/edify/expr.h
index a9ed2f9c5..886347991 100644
--- a/edify/expr.h
+++ b/edify/expr.h
@@ -19,12 +19,9 @@
#include <unistd.h>
+#include "error_code.h"
#include "yydefs.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
#define MAX_STRING_LEN 1024
typedef struct Expr Expr;
@@ -43,6 +40,17 @@ typedef struct {
// Should be NULL initially, will be either NULL or a malloc'd
// pointer after Evaluate() returns.
char* errmsg;
+
+ // error code indicates the type of failure (e.g. failure to update system image)
+ // during the OTA process.
+ ErrorCode error_code = kNoError;
+
+ // cause code provides more detailed reason of an OTA failure (e.g. fsync error)
+ // in addition to the error code.
+ CauseCode cause_code = kNoCause;
+
+ bool is_retry = false;
+
} State;
#define VAL_STRING 1 // data will be NULL-terminated; size doesn't count null
@@ -59,7 +67,7 @@ typedef Value* (*Function)(const char* name, State* state,
struct Expr {
Function fn;
- char* name;
+ const char* name;
int argc;
Expr** argv;
int start, end;
@@ -156,7 +164,13 @@ Value** ReadValueVarArgs(State* state, int argc, Expr* argv[]);
// Use printf-style arguments to compose an error message to put into
// *state. Returns NULL.
-Value* ErrorAbort(State* state, const char* format, ...) __attribute__((format(printf, 2, 3)));
+Value* ErrorAbort(State* state, const char* format, ...)
+ __attribute__((format(printf, 2, 3), deprecated));
+
+// ErrorAbort has an optional (but recommended) argument 'cause_code'. If the cause code
+// is set, it will be logged into last_install and provides reason of OTA failures.
+Value* ErrorAbort(State* state, CauseCode cause_code, const char* format, ...)
+ __attribute__((format(printf, 3, 4)));
// Wrap a string into a Value, taking ownership of the string.
Value* StringValue(char* str);
@@ -166,8 +180,4 @@ void FreeValue(Value* v);
int parse_string(const char* str, Expr** root, int* error_count);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
#endif // _EXPRESSION_H
diff --git a/edify/lexer.l b/edify/lexer.ll
index fb2933bee..b764d1699 100644
--- a/edify/lexer.l
+++ b/edify/lexer.ll
@@ -16,6 +16,7 @@
*/
#include <string.h>
+#include <string>
#include "expr.h"
#include "yydefs.h"
@@ -25,9 +26,7 @@ int gLine = 1;
int gColumn = 1;
int gPos = 0;
-// TODO: enforce MAX_STRING_LEN during lexing
-char string_buffer[MAX_STRING_LEN];
-char* string_pos;
+std::string string_buffer;
#define ADVANCE do {yylloc.start=gPos; yylloc.end=gPos+yyleng; \
gColumn+=yyleng; gPos+=yyleng;} while(0)
@@ -43,7 +42,7 @@ char* string_pos;
\" {
BEGIN(STR);
- string_pos = string_buffer;
+ string_buffer.clear();
yylloc.start = gPos;
++gColumn;
++gPos;
@@ -54,36 +53,35 @@ char* string_pos;
++gColumn;
++gPos;
BEGIN(INITIAL);
- *string_pos = '\0';
- yylval.str = strdup(string_buffer);
+ yylval.str = strdup(string_buffer.c_str());
yylloc.end = gPos;
return STRING;
}
- \\n { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\n'; }
- \\t { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\t'; }
- \\\" { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\"'; }
- \\\\ { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\\'; }
+ \\n { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\n'); }
+ \\t { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\t'); }
+ \\\" { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\"'); }
+ \\\\ { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\\'); }
\\x[0-9a-fA-F]{2} {
gColumn += yyleng;
gPos += yyleng;
int val;
sscanf(yytext+2, "%x", &val);
- *string_pos++ = val;
+ string_buffer.push_back(static_cast<char>(val));
}
\n {
++gLine;
++gPos;
gColumn = 1;
- *string_pos++ = yytext[0];
+ string_buffer.push_back(yytext[0]);
}
. {
++gColumn;
++gPos;
- *string_pos++ = yytext[0];
+ string_buffer.push_back(yytext[0]);
}
}
diff --git a/edify/main.c b/edify/main.cpp
index b1baa0b13..6007a3d58 100644
--- a/edify/main.c
+++ b/edify/main.cpp
@@ -18,6 +18,8 @@
#include <stdlib.h>
#include <string.h>
+#include <string>
+
#include "expr.h"
#include "parser.h"
@@ -151,6 +153,9 @@ int test() {
expect("greater_than_int(x, 3)", "", &errors);
expect("greater_than_int(3, x)", "", &errors);
+ // big string
+ expect(std::string(8192, 's').c_str(), std::string(8192, 's').c_str(), &errors);
+
printf("\n");
return errors;
diff --git a/edify/parser.y b/edify/parser.yy
index f8fb2d12f..098a6370a 100644
--- a/edify/parser.y
+++ b/edify/parser.yy
@@ -70,7 +70,7 @@ input: expr { *root = $1; }
;
expr: STRING {
- $$ = malloc(sizeof(Expr));
+ $$ = reinterpret_cast<Expr*>(malloc(sizeof(Expr)));
$$->fn = Literal;
$$->name = $1;
$$->argc = 0;
@@ -91,7 +91,7 @@ expr: STRING {
| IF expr THEN expr ENDIF { $$ = Build(IfElseFn, @$, 2, $2, $4); }
| IF expr THEN expr ELSE expr ENDIF { $$ = Build(IfElseFn, @$, 3, $2, $4, $6); }
| STRING '(' arglist ')' {
- $$ = malloc(sizeof(Expr));
+ $$ = reinterpret_cast<Expr*>(malloc(sizeof(Expr)));
$$->fn = FindFunction($1);
if ($$->fn == NULL) {
char buffer[256];
@@ -113,12 +113,12 @@ arglist: /* empty */ {
}
| expr {
$$.argc = 1;
- $$.argv = malloc(sizeof(Expr*));
+ $$.argv = reinterpret_cast<Expr**>(malloc(sizeof(Expr*)));
$$.argv[0] = $1;
}
| arglist ',' expr {
$$.argc = $1.argc + 1;
- $$.argv = realloc($$.argv, $$.argc * sizeof(Expr*));
+ $$.argv = reinterpret_cast<Expr**>(realloc($$.argv, $$.argc * sizeof(Expr*)));
$$.argv[$$.argc-1] = $3;
}
;