aboutsummaryrefslogtreecommitdiffstats
path: root/edify/expr.h
diff options
context:
space:
mode:
Diffstat (limited to 'edify/expr.h')
-rw-r--r--edify/expr.h80
1 files changed, 80 insertions, 0 deletions
diff --git a/edify/expr.h b/edify/expr.h
new file mode 100644
index 0000000..ac5df18
--- /dev/null
+++ b/edify/expr.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _EXPRESSION_H
+#define _EXPRESSION_H
+
+#define MAX_STRING_LEN 1024
+
+typedef struct Expr Expr;
+
+typedef char* (*Function)(const char* name, void* cookie,
+ int argc, Expr* argv[]);
+
+struct Expr {
+ Function fn;
+ char* name;
+ int argc;
+ Expr** argv;
+};
+
+char* Evaluate(void* cookie, Expr* expr);
+
+// Glue to make an Expr out of a literal.
+char* Literal(const char* name, void* cookie, int argc, Expr* argv[]);
+
+// Functions corresponding to various syntactic sugar operators.
+// ("concat" is also available as a builtin function, to concatenate
+// more than two strings.)
+char* ConcatFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* LogicalAndFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* LogicalOrFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* LogicalNotFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* SubstringFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* EqualityFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* InequalityFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* SequenceFn(const char* name, void* cookie, int argc, Expr* argv[]);
+
+// Convenience function for building expressions with a fixed number
+// of arguments.
+Expr* Build(Function fn, int count, ...);
+
+// Global builtins, registered by RegisterBuiltins().
+char* IfElseFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* AssertFn(const char* name, void* cookie, int argc, Expr* argv[]);
+char* AbortFn(const char* name, void* cookie, int argc, Expr* argv[]);
+
+typedef struct {
+ const char* name;
+ Function fn;
+} NamedFunction;
+
+// Register a new function. The same Function may be registered under
+// multiple names, but a given name should only be used once.
+void RegisterFunction(const char* name, Function fn);
+
+// Register all the builtins.
+void RegisterBuiltins();
+
+// Call this after all calls to RegisterFunction() but before parsing
+// any scripts to finish building the function table.
+void FinishRegistration();
+
+// Find the Function for a given name; return NULL if no such function
+// exists.
+Function FindFunction(const char* name);
+
+#endif // _EXPRESSION_H