blob: 5cbd5e15d222752d02f9fe2380b4027856251d1d [file] [log] [blame]
Doug Zongker37bee622009-06-08 17:35:39 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _EXPRESSION_H
18#define _EXPRESSION_H
19
Doug Zongker583fc122010-02-19 16:07:57 -080020#include <unistd.h>
Tianjie Xuc4447322017-03-06 14:44:59 -080021
22#include <memory>
Tao Bao59dcb9c2016-10-03 18:06:46 -070023#include <string>
Tianjie Xuc4447322017-03-06 14:44:59 -080024#include <vector>
Doug Zongker583fc122010-02-19 16:07:57 -080025
Tao Bao1fc5bf32017-10-06 07:43:41 -070026// Forward declaration to avoid including "otautil/error_code.h".
Tao Bao0bf20d52017-10-05 12:06:49 -070027enum ErrorCode : int;
28enum CauseCode : int;
Doug Zongker37bee622009-06-08 17:35:39 -070029
Tao Bao59dcb9c2016-10-03 18:06:46 -070030struct State {
Tao Bao0bf20d52017-10-05 12:06:49 -070031 State(const std::string& script, void* cookie);
Tao Bao59dcb9c2016-10-03 18:06:46 -070032
Tao Bao0bf20d52017-10-05 12:06:49 -070033 // The source of the original script.
34 const std::string& script;
Tao Bao59dcb9c2016-10-03 18:06:46 -070035
Tao Bao0bf20d52017-10-05 12:06:49 -070036 // Optional pointer to app-specific data; the core of edify never
37 // uses this value.
38 void* cookie;
Doug Zongkerd9c9d102009-06-12 12:24:39 -070039
Tao Bao0bf20d52017-10-05 12:06:49 -070040 // The error message (if any) returned if the evaluation aborts.
41 // Should be empty initially, will be either empty or a string that
42 // Evaluate() returns.
43 std::string errmsg;
Tianjie Xu16255832016-04-30 11:49:59 -070044
Tao Bao0bf20d52017-10-05 12:06:49 -070045 // error code indicates the type of failure (e.g. failure to update system image)
46 // during the OTA process.
47 ErrorCode error_code;
Tianjie Xu16255832016-04-30 11:49:59 -070048
Tao Bao0bf20d52017-10-05 12:06:49 -070049 // cause code provides more detailed reason of an OTA failure (e.g. fsync error)
50 // in addition to the error code.
51 CauseCode cause_code;
Tianjie Xu16255832016-04-30 11:49:59 -070052
Tao Bao0bf20d52017-10-05 12:06:49 -070053 bool is_retry = false;
Tao Bao59dcb9c2016-10-03 18:06:46 -070054};
Doug Zongkerd9c9d102009-06-12 12:24:39 -070055
Tao Bao39119ad2016-10-10 22:52:18 -070056struct Value {
Tao Bao511d7592018-06-19 15:56:49 -070057 enum class Type {
58 STRING = 1,
59 BLOB = 2,
60 };
Tianjie Xuaced5d92016-10-12 10:55:04 -070061
Tao Bao511d7592018-06-19 15:56:49 -070062 Value(Type type, const std::string& str) : type(type), data(str) {}
63
64 Type type;
65 std::string data;
Tao Bao39119ad2016-10-10 22:52:18 -070066};
Doug Zongker512536a2010-02-17 16:11:44 -080067
Tao Bao39119ad2016-10-10 22:52:18 -070068struct Expr;
69
Tianjie Xuc4447322017-03-06 14:44:59 -080070using Function = Value* (*)(const char* name, State* state,
71 const std::vector<std::unique_ptr<Expr>>& argv);
Doug Zongker37bee622009-06-08 17:35:39 -070072
73struct Expr {
Tianjie Xuc4447322017-03-06 14:44:59 -080074 Function fn;
75 std::string name;
76 std::vector<std::unique_ptr<Expr>> argv;
77 int start, end;
78
79 Expr(Function fn, const std::string& name, int start, int end) :
80 fn(fn),
81 name(name),
82 start(start),
83 end(end) {}
Doug Zongker37bee622009-06-08 17:35:39 -070084};
85
Tianjie Xuc4447322017-03-06 14:44:59 -080086// Evaluate the input expr, return the resulting Value.
87Value* EvaluateValue(State* state, const std::unique_ptr<Expr>& expr);
Doug Zongker512536a2010-02-17 16:11:44 -080088
Tianjie Xuc4447322017-03-06 14:44:59 -080089// Evaluate the input expr, assert that it is a string, and update the result parameter. This
90// function returns true if the evaluation succeeds. This is a convenience function for older
91// functions that want to deal only with strings.
92bool Evaluate(State* state, const std::unique_ptr<Expr>& expr, std::string* result);
Doug Zongker37bee622009-06-08 17:35:39 -070093
94// Glue to make an Expr out of a literal.
Tianjie Xuc4447322017-03-06 14:44:59 -080095Value* Literal(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
Doug Zongker37bee622009-06-08 17:35:39 -070096
97// Functions corresponding to various syntactic sugar operators.
98// ("concat" is also available as a builtin function, to concatenate
99// more than two strings.)
Tianjie Xuc4447322017-03-06 14:44:59 -0800100Value* ConcatFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
101Value* LogicalAndFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
102Value* LogicalOrFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
103Value* LogicalNotFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
104Value* SubstringFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
105Value* EqualityFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
106Value* InequalityFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
107Value* SequenceFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
Doug Zongker37bee622009-06-08 17:35:39 -0700108
Doug Zongker37bee622009-06-08 17:35:39 -0700109// Global builtins, registered by RegisterBuiltins().
Tianjie Xuc4447322017-03-06 14:44:59 -0800110Value* IfElseFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
111Value* AssertFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
112Value* AbortFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv);
Doug Zongker37bee622009-06-08 17:35:39 -0700113
Doug Zongker37bee622009-06-08 17:35:39 -0700114// Register a new function. The same Function may be registered under
115// multiple names, but a given name should only be used once.
Tao Bao39119ad2016-10-10 22:52:18 -0700116void RegisterFunction(const std::string& name, Function fn);
Doug Zongker37bee622009-06-08 17:35:39 -0700117
118// Register all the builtins.
119void RegisterBuiltins();
120
Doug Zongker37bee622009-06-08 17:35:39 -0700121// Find the Function for a given name; return NULL if no such function
122// exists.
Tao Bao39119ad2016-10-10 22:52:18 -0700123Function FindFunction(const std::string& name);
Doug Zongker9931f7f2009-06-10 14:11:53 -0700124
125// --- convenience functions for use in functions ---
126
Tianjie Xuc4447322017-03-06 14:44:59 -0800127// Evaluate the expressions in argv, and put the results of strings in args. If any expression
128// evaluates to nullptr, return false. Return true on success.
129bool ReadArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
130 std::vector<std::string>* args);
131bool ReadArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
132 std::vector<std::string>* args, size_t start, size_t len);
Tianjie Xuaced5d92016-10-12 10:55:04 -0700133
Tianjie Xuc4447322017-03-06 14:44:59 -0800134// Evaluate the expressions in argv, and put the results of Value* in args. If any
135// expression evaluate to nullptr, return false. Return true on success.
136bool ReadValueArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
137 std::vector<std::unique_ptr<Value>>* args);
138bool ReadValueArgs(State* state, const std::vector<std::unique_ptr<Expr>>& argv,
139 std::vector<std::unique_ptr<Value>>* args, size_t start, size_t len);
Doug Zongker512536a2010-02-17 16:11:44 -0800140
Doug Zongker47cace92009-06-18 10:11:50 -0700141// Use printf-style arguments to compose an error message to put into
142// *state. Returns NULL.
Tianjie Xu16255832016-04-30 11:49:59 -0700143Value* ErrorAbort(State* state, const char* format, ...)
144 __attribute__((format(printf, 2, 3), deprecated));
145
146// ErrorAbort has an optional (but recommended) argument 'cause_code'. If the cause code
147// is set, it will be logged into last_install and provides reason of OTA failures.
148Value* ErrorAbort(State* state, CauseCode cause_code, const char* format, ...)
149 __attribute__((format(printf, 3, 4)));
Doug Zongker47cace92009-06-18 10:11:50 -0700150
Tianjie Xuaced5d92016-10-12 10:55:04 -0700151// Copying the string into a Value.
152Value* StringValue(const char* str);
Doug Zongker512536a2010-02-17 16:11:44 -0800153
Tianjie Xuaced5d92016-10-12 10:55:04 -0700154Value* StringValue(const std::string& str);
Doug Zongker9931f7f2009-06-10 14:11:53 -0700155
Tao Baod8d514f2018-07-09 13:32:28 -0700156int ParseString(const std::string& str, std::unique_ptr<Expr>* root, int* error_count);
Doug Zongker0d32f252014-02-13 15:07:56 -0800157
Doug Zongker37bee622009-06-08 17:35:39 -0700158#endif // _EXPRESSION_H