diff options
Diffstat (limited to '')
-rw-r--r-- | edify/expr.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/edify/expr.h b/edify/expr.h new file mode 100644 index 000000000..ac5df1869 --- /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 |