edify: Switch to C++.
Change-Id: I71aede6e29af1dc4bb858a62016c8035db5d3452
This commit is contained in:
@@ -5,12 +5,7 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
edify_src_files := \
|
edify_src_files := \
|
||||||
lexer.l \
|
lexer.l \
|
||||||
parser.y \
|
parser.y \
|
||||||
expr.c
|
expr.cpp
|
||||||
|
|
||||||
# "-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
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Build the host-side command line tool
|
# Build the host-side command line tool
|
||||||
@@ -19,12 +14,13 @@ include $(CLEAR_VARS)
|
|||||||
|
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
$(edify_src_files) \
|
$(edify_src_files) \
|
||||||
main.c
|
main.cpp
|
||||||
|
|
||||||
LOCAL_CPPFLAGS := $(edify_cflags) -g -O0
|
LOCAL_CPPFLAGS := -g -O0
|
||||||
LOCAL_MODULE := edify
|
LOCAL_MODULE := edify
|
||||||
LOCAL_YACCFLAGS := -v
|
LOCAL_YACCFLAGS := -v
|
||||||
LOCAL_CPPFLAGS += -Wno-unused-parameter
|
LOCAL_CPPFLAGS += -Wno-unused-parameter
|
||||||
|
LOCAL_CPPFLAGS += -Wno-deprecated-register
|
||||||
LOCAL_CLANG := true
|
LOCAL_CLANG := true
|
||||||
|
|
||||||
include $(BUILD_HOST_EXECUTABLE)
|
include $(BUILD_HOST_EXECUTABLE)
|
||||||
@@ -36,8 +32,8 @@ include $(CLEAR_VARS)
|
|||||||
|
|
||||||
LOCAL_SRC_FILES := $(edify_src_files)
|
LOCAL_SRC_FILES := $(edify_src_files)
|
||||||
|
|
||||||
LOCAL_CPPFLAGS := $(edify_cflags)
|
LOCAL_CPPFLAGS := -Wno-unused-parameter
|
||||||
LOCAL_CPPFLAGS += -Wno-unused-parameter
|
LOCAL_CPPFLAGS += -Wno-deprecated-register
|
||||||
LOCAL_MODULE := libedify
|
LOCAL_MODULE := libedify
|
||||||
LOCAL_CLANG := true
|
LOCAL_CLANG := true
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ Value* EvaluateValue(State* state, Expr* expr) {
|
|||||||
|
|
||||||
Value* StringValue(char* str) {
|
Value* StringValue(char* str) {
|
||||||
if (str == NULL) return NULL;
|
if (str == NULL) return NULL;
|
||||||
Value* v = malloc(sizeof(Value));
|
Value* v = reinterpret_cast<Value*>(malloc(sizeof(Value)));
|
||||||
v->type = VAL_STRING;
|
v->type = VAL_STRING;
|
||||||
v->size = strlen(str);
|
v->size = strlen(str);
|
||||||
v->data = str;
|
v->data = str;
|
||||||
@@ -68,7 +68,7 @@ Value* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||||||
if (argc == 0) {
|
if (argc == 0) {
|
||||||
return StringValue(strdup(""));
|
return StringValue(strdup(""));
|
||||||
}
|
}
|
||||||
char** strings = malloc(argc * sizeof(char*));
|
char** strings = reinterpret_cast<char**>(malloc(argc * sizeof(char*)));
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < argc; ++i) {
|
for (i = 0; i < argc; ++i) {
|
||||||
strings[i] = NULL;
|
strings[i] = NULL;
|
||||||
@@ -83,8 +83,9 @@ Value* ConcatFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||||||
length += strlen(strings[i]);
|
length += strlen(strings[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = malloc(length+1);
|
result = reinterpret_cast<char*>(malloc(length+1));
|
||||||
int p = 0;
|
int p;
|
||||||
|
p = 0;
|
||||||
for (i = 0; i < argc; ++i) {
|
for (i = 0; i < argc; ++i) {
|
||||||
strcpy(result+p, strings[i]);
|
strcpy(result+p, strings[i]);
|
||||||
p += strlen(strings[i]);
|
p += strlen(strings[i]);
|
||||||
@@ -149,7 +150,7 @@ Value* AssertFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||||||
if (!b) {
|
if (!b) {
|
||||||
int prefix_len;
|
int prefix_len;
|
||||||
int len = argv[i]->end - argv[i]->start;
|
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: ");
|
strcpy(err_src, "assert failed: ");
|
||||||
prefix_len = strlen(err_src);
|
prefix_len = strlen(err_src);
|
||||||
memcpy(err_src + prefix_len, state->script + argv[i]->start, len);
|
memcpy(err_src + prefix_len, state->script + argv[i]->start, len);
|
||||||
@@ -290,7 +291,8 @@ Value* LessThanIntFn(const char* name, State* state, int argc, Expr* argv[]) {
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
long r_int = strtol(right, &end, 10);
|
long r_int;
|
||||||
|
r_int = strtol(right, &end, 10);
|
||||||
if (right[0] == '\0' || *end != '\0') {
|
if (right[0] == '\0' || *end != '\0') {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
@@ -325,11 +327,11 @@ Value* Literal(const char* name, State* state, int argc, Expr* argv[]) {
|
|||||||
Expr* Build(Function fn, YYLTYPE loc, int count, ...) {
|
Expr* Build(Function fn, YYLTYPE loc, int count, ...) {
|
||||||
va_list v;
|
va_list v;
|
||||||
va_start(v, count);
|
va_start(v, count);
|
||||||
Expr* e = malloc(sizeof(Expr));
|
Expr* e = reinterpret_cast<Expr*>(malloc(sizeof(Expr)));
|
||||||
e->fn = fn;
|
e->fn = fn;
|
||||||
e->name = "(operator)";
|
e->name = "(operator)";
|
||||||
e->argc = count;
|
e->argc = count;
|
||||||
e->argv = malloc(count * sizeof(Expr*));
|
e->argv = reinterpret_cast<Expr**>(malloc(count * sizeof(Expr*)));
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < count; ++i) {
|
for (i = 0; i < count; ++i) {
|
||||||
e->argv[i] = va_arg(v, Expr*);
|
e->argv[i] = va_arg(v, Expr*);
|
||||||
@@ -351,7 +353,7 @@ NamedFunction* fn_table = NULL;
|
|||||||
void RegisterFunction(const char* name, Function fn) {
|
void RegisterFunction(const char* name, Function fn) {
|
||||||
if (fn_entries >= fn_size) {
|
if (fn_entries >= fn_size) {
|
||||||
fn_size = fn_size*2 + 1;
|
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].name = name;
|
||||||
fn_table[fn_entries].fn = fn;
|
fn_table[fn_entries].fn = fn;
|
||||||
@@ -371,8 +373,8 @@ void FinishRegistration() {
|
|||||||
Function FindFunction(const char* name) {
|
Function FindFunction(const char* name) {
|
||||||
NamedFunction key;
|
NamedFunction key;
|
||||||
key.name = name;
|
key.name = name;
|
||||||
NamedFunction* nf = bsearch(&key, fn_table, fn_entries,
|
NamedFunction* nf = reinterpret_cast<NamedFunction*>(bsearch(&key, fn_table, fn_entries,
|
||||||
sizeof(NamedFunction), fn_entry_compare);
|
sizeof(NamedFunction), fn_entry_compare));
|
||||||
if (nf == NULL) {
|
if (nf == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -401,7 +403,7 @@ void RegisterBuiltins() {
|
|||||||
// zero or more char** to put them in). If any expression evaluates
|
// zero or more char** to put them in). If any expression evaluates
|
||||||
// to NULL, free the rest and return -1. Return 0 on success.
|
// to NULL, free the rest and return -1. Return 0 on success.
|
||||||
int ReadArgs(State* state, Expr* argv[], int count, ...) {
|
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_list v;
|
||||||
va_start(v, count);
|
va_start(v, count);
|
||||||
int i;
|
int i;
|
||||||
@@ -427,7 +429,7 @@ int ReadArgs(State* state, Expr* argv[], int count, ...) {
|
|||||||
// zero or more Value** to put them in). If any expression evaluates
|
// zero or more Value** to put them in). If any expression evaluates
|
||||||
// to NULL, free the rest and return -1. Return 0 on success.
|
// to NULL, free the rest and return -1. Return 0 on success.
|
||||||
int ReadValueArgs(State* state, Expr* argv[], int count, ...) {
|
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_list v;
|
||||||
va_start(v, count);
|
va_start(v, count);
|
||||||
int i;
|
int i;
|
||||||
@@ -494,7 +496,7 @@ Value** ReadValueVarArgs(State* state, int argc, Expr* argv[]) {
|
|||||||
// Use printf-style arguments to compose an error message to put into
|
// Use printf-style arguments to compose an error message to put into
|
||||||
// *state. Returns NULL.
|
// *state. Returns NULL.
|
||||||
Value* ErrorAbort(State* state, const char* format, ...) {
|
Value* ErrorAbort(State* state, const char* format, ...) {
|
||||||
char* buffer = malloc(4096);
|
char* buffer = reinterpret_cast<char*>(malloc(4096));
|
||||||
va_list v;
|
va_list v;
|
||||||
va_start(v, format);
|
va_start(v, format);
|
||||||
vsnprintf(buffer, 4096, format, v);
|
vsnprintf(buffer, 4096, format, v);
|
||||||
10
edify/expr.h
10
edify/expr.h
@@ -21,10 +21,6 @@
|
|||||||
|
|
||||||
#include "yydefs.h"
|
#include "yydefs.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAX_STRING_LEN 1024
|
#define MAX_STRING_LEN 1024
|
||||||
|
|
||||||
typedef struct Expr Expr;
|
typedef struct Expr Expr;
|
||||||
@@ -59,7 +55,7 @@ typedef Value* (*Function)(const char* name, State* state,
|
|||||||
|
|
||||||
struct Expr {
|
struct Expr {
|
||||||
Function fn;
|
Function fn;
|
||||||
char* name;
|
const char* name;
|
||||||
int argc;
|
int argc;
|
||||||
Expr** argv;
|
Expr** argv;
|
||||||
int start, end;
|
int start, end;
|
||||||
@@ -166,8 +162,4 @@ void FreeValue(Value* v);
|
|||||||
|
|
||||||
int parse_string(const char* str, Expr** root, int* error_count);
|
int parse_string(const char* str, Expr** root, int* error_count);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} // extern "C"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // _EXPRESSION_H
|
#endif // _EXPRESSION_H
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ input: expr { *root = $1; }
|
|||||||
;
|
;
|
||||||
|
|
||||||
expr: STRING {
|
expr: STRING {
|
||||||
$$ = malloc(sizeof(Expr));
|
$$ = reinterpret_cast<Expr*>(malloc(sizeof(Expr)));
|
||||||
$$->fn = Literal;
|
$$->fn = Literal;
|
||||||
$$->name = $1;
|
$$->name = $1;
|
||||||
$$->argc = 0;
|
$$->argc = 0;
|
||||||
@@ -91,7 +91,7 @@ expr: STRING {
|
|||||||
| IF expr THEN expr ENDIF { $$ = Build(IfElseFn, @$, 2, $2, $4); }
|
| IF expr THEN expr ENDIF { $$ = Build(IfElseFn, @$, 2, $2, $4); }
|
||||||
| IF expr THEN expr ELSE expr ENDIF { $$ = Build(IfElseFn, @$, 3, $2, $4, $6); }
|
| IF expr THEN expr ELSE expr ENDIF { $$ = Build(IfElseFn, @$, 3, $2, $4, $6); }
|
||||||
| STRING '(' arglist ')' {
|
| STRING '(' arglist ')' {
|
||||||
$$ = malloc(sizeof(Expr));
|
$$ = reinterpret_cast<Expr*>(malloc(sizeof(Expr)));
|
||||||
$$->fn = FindFunction($1);
|
$$->fn = FindFunction($1);
|
||||||
if ($$->fn == NULL) {
|
if ($$->fn == NULL) {
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
@@ -113,12 +113,12 @@ arglist: /* empty */ {
|
|||||||
}
|
}
|
||||||
| expr {
|
| expr {
|
||||||
$$.argc = 1;
|
$$.argc = 1;
|
||||||
$$.argv = malloc(sizeof(Expr*));
|
$$.argv = reinterpret_cast<Expr**>(malloc(sizeof(Expr*)));
|
||||||
$$.argv[0] = $1;
|
$$.argv[0] = $1;
|
||||||
}
|
}
|
||||||
| arglist ',' expr {
|
| arglist ',' expr {
|
||||||
$$.argc = $1.argc + 1;
|
$$.argc = $1.argc + 1;
|
||||||
$$.argv = realloc($$.argv, $$.argc * sizeof(Expr*));
|
$$.argv = reinterpret_cast<Expr**>(realloc($$.argv, $$.argc * sizeof(Expr*)));
|
||||||
$$.argv[$$.argc-1] = $3;
|
$$.argv[$$.argc-1] = $3;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|||||||
Reference in New Issue
Block a user