From 1fc5bf353a8719d16fd9ba29a661d211bad4038f Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Fri, 6 Oct 2017 07:43:41 -0700 Subject: Revert "Revert "Move error_code.h into otautil."" This reverts commit 26436d6d6010d5323349af7e119ff8f34f85c40c to re-land "Move error_code.h into otautil.". This way it stops requiring relative path ".." in LOCAL_C_INCLUDES (uncrypt and edify). Soong doesn't accept non-local ".." in "local_include_dirs". This CL needs to land with device-specific module changes (e.g. adding the dependency on libotautil). Test: lunch aosp_{angler,bullhead,dragon,fugu,sailfish}-userdebug; mmma bootable/recovery Change-Id: If193241801af2dae73eccd31ce57cd2b81c9fd96 --- applypatch/Android.mk | 1 + edify/Android.mk | 5 ++- edify/expr.cpp | 2 +- edify/expr.h | 2 +- error_code.h | 78 ------------------------------------ install.cpp | 2 +- otautil/Android.bp | 2 + otautil/include/otautil/error_code.h | 78 ++++++++++++++++++++++++++++++++++++ recovery.cpp | 2 +- tests/component/updater_test.cpp | 2 +- uncrypt/Android.mk | 2 +- uncrypt/uncrypt.cpp | 2 +- updater/blockimg.cpp | 2 +- updater/install.cpp | 2 +- updater/updater.cpp | 2 +- 15 files changed, 94 insertions(+), 90 deletions(-) delete mode 100644 error_code.h create mode 100644 otautil/include/otautil/error_code.h diff --git a/applypatch/Android.mk b/applypatch/Android.mk index db72e8eee..4eb0111df 100644 --- a/applypatch/Android.mk +++ b/applypatch/Android.mk @@ -116,6 +116,7 @@ LOCAL_STATIC_LIBRARIES := \ libapplypatch \ libedify \ libotafault \ + libotautil \ libbspatch \ libbase \ libziparchive \ diff --git a/edify/Android.mk b/edify/Android.mk index fbf2b1b06..527698e68 100644 --- a/edify/Android.mk +++ b/edify/Android.mk @@ -30,8 +30,9 @@ LOCAL_CFLAGS := -Wall -Werror LOCAL_CPPFLAGS := -Wno-unused-parameter LOCAL_CPPFLAGS += -Wno-deprecated-register LOCAL_MODULE := libedify -LOCAL_C_INCLUDES += $(LOCAL_PATH)/.. -LOCAL_STATIC_LIBRARIES += libbase +LOCAL_STATIC_LIBRARIES += \ + libotautil \ + libbase include $(BUILD_STATIC_LIBRARY) diff --git a/edify/expr.cpp b/edify/expr.cpp index 403162d6d..104c0fd90 100644 --- a/edify/expr.cpp +++ b/edify/expr.cpp @@ -31,7 +31,7 @@ #include #include -#include "error_code.h" +#include "otautil/error_code.h" // Functions should: // diff --git a/edify/expr.h b/edify/expr.h index 32828028a..770d1cf0d 100644 --- a/edify/expr.h +++ b/edify/expr.h @@ -23,7 +23,7 @@ #include #include -// Forward declaration to avoid including "error_code.h". +// Forward declaration to avoid including "otautil/error_code.h". enum ErrorCode : int; enum CauseCode : int; diff --git a/error_code.h b/error_code.h deleted file mode 100644 index 26b9bb40d..000000000 --- a/error_code.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2016 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 _ERROR_CODE_H_ -#define _ERROR_CODE_H_ - -enum ErrorCode : int { - kNoError = -1, - kLowBattery = 20, - kZipVerificationFailure, - kZipOpenFailure, - kBootreasonInBlacklist, - kPackageCompatibilityFailure, - kScriptExecutionFailure, - kMapFileFailure, - kForkUpdateBinaryFailure, - kUpdateBinaryCommandFailure, -}; - -enum CauseCode : int { - kNoCause = -1, - kArgsParsingFailure = 100, - kStashCreationFailure, - kFileOpenFailure, - kLseekFailure, - kFreadFailure, - kFwriteFailure, - kFsyncFailure, - kLibfecFailure, - kFileGetPropFailure, - kFileRenameFailure, - kSymlinkFailure, - kSetMetadataFailure, - kTune2FsFailure, - kRebootFailure, - kPackageExtractFileFailure, - kPatchApplicationFailure, - kVendorFailure = 200 -}; - -enum UncryptErrorCode : int { - kUncryptNoError = -1, - kUncryptErrorPlaceholder = 50, - kUncryptTimeoutError = 100, - kUncryptFileRemoveError, - kUncryptFileOpenError, - kUncryptSocketOpenError, - kUncryptSocketWriteError, - kUncryptSocketListenError, - kUncryptSocketAcceptError, - kUncryptFstabReadError, - kUncryptFileStatError, - kUncryptBlockOpenError, - kUncryptIoctlError, - kUncryptReadError, - kUncryptWriteError, - kUncryptFileSyncError, - kUncryptFileCloseError, - kUncryptFileRenameError, - kUncryptPackageMissingError, - kUncryptRealpathFindError, - kUncryptBlockDeviceFindError, -}; - -#endif // _ERROR_CODE_H_ diff --git a/install.cpp b/install.cpp index 74d1a68b3..d05893171 100644 --- a/install.cpp +++ b/install.cpp @@ -49,9 +49,9 @@ #include #include "common.h" -#include "error_code.h" #include "otautil/SysUtil.h" #include "otautil/ThermalUtil.h" +#include "otautil/error_code.h" #include "private/install.h" #include "roots.h" #include "ui.h" diff --git a/otautil/Android.bp b/otautil/Android.bp index 9cde7baa7..5905ba649 100644 --- a/otautil/Android.bp +++ b/otautil/Android.bp @@ -15,6 +15,8 @@ cc_library_static { name: "libotautil", + host_supported: true, + srcs: [ "SysUtil.cpp", "DirUtil.cpp", diff --git a/otautil/include/otautil/error_code.h b/otautil/include/otautil/error_code.h new file mode 100644 index 000000000..b0ff42d8d --- /dev/null +++ b/otautil/include/otautil/error_code.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2016 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 _ERROR_CODE_H_ +#define _ERROR_CODE_H_ + +enum ErrorCode : int { + kNoError = -1, + kLowBattery = 20, + kZipVerificationFailure, + kZipOpenFailure, + kBootreasonInBlacklist, + kPackageCompatibilityFailure, + kScriptExecutionFailure, + kMapFileFailure, + kForkUpdateBinaryFailure, + kUpdateBinaryCommandFailure, +}; + +enum CauseCode : int { + kNoCause = -1, + kArgsParsingFailure = 100, + kStashCreationFailure, + kFileOpenFailure, + kLseekFailure, + kFreadFailure, + kFwriteFailure, + kFsyncFailure, + kLibfecFailure, + kFileGetPropFailure, + kFileRenameFailure, + kSymlinkFailure, + kSetMetadataFailure, + kTune2FsFailure, + kRebootFailure, + kPackageExtractFileFailure, + kPatchApplicationFailure, + kVendorFailure = 200 +}; + +enum UncryptErrorCode : int { + kUncryptNoError = -1, + kUncryptErrorPlaceholder = 50, + kUncryptTimeoutError = 100, + kUncryptFileRemoveError, + kUncryptFileOpenError, + kUncryptSocketOpenError, + kUncryptSocketWriteError, + kUncryptSocketListenError, + kUncryptSocketAcceptError, + kUncryptFstabReadError, + kUncryptFileStatError, + kUncryptBlockOpenError, + kUncryptIoctlError, + kUncryptReadError, + kUncryptWriteError, + kUncryptFileSyncError, + kUncryptFileCloseError, + kUncryptFileRenameError, + kUncryptPackageMissingError, + kUncryptRealpathFindError, + kUncryptBlockDeviceFindError, +}; + +#endif // _ERROR_CODE_H_ diff --git a/recovery.cpp b/recovery.cpp index 4dc5b540e..243ee4af3 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -61,13 +61,13 @@ #include "adb_install.h" #include "common.h" #include "device.h" -#include "error_code.h" #include "fuse_sdcard_provider.h" #include "fuse_sideload.h" #include "install.h" #include "minadbd/minadbd.h" #include "minui/minui.h" #include "otautil/DirUtil.h" +#include "otautil/error_code.h" #include "roots.h" #include "rotate_logs.h" #include "screen_ui.h" diff --git a/tests/component/updater_test.cpp b/tests/component/updater_test.cpp index 2a0575a31..e35870dc7 100644 --- a/tests/component/updater_test.cpp +++ b/tests/component/updater_test.cpp @@ -39,8 +39,8 @@ #include "common/test_constants.h" #include "edify/expr.h" -#include "error_code.h" #include "otautil/SysUtil.h" +#include "otautil/error_code.h" #include "print_sha1.h" #include "updater/blockimg.h" #include "updater/install.h" diff --git a/uncrypt/Android.mk b/uncrypt/Android.mk index a3b0ca98d..601f9276e 100644 --- a/uncrypt/Android.mk +++ b/uncrypt/Android.mk @@ -17,10 +17,10 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := uncrypt.cpp -LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. LOCAL_MODULE := uncrypt LOCAL_STATIC_LIBRARIES := \ libbootloader_message \ + libotautil \ libbase \ liblog \ libfs_mgr \ diff --git a/uncrypt/uncrypt.cpp b/uncrypt/uncrypt.cpp index 7a2ccbc7c..645faadbf 100644 --- a/uncrypt/uncrypt.cpp +++ b/uncrypt/uncrypt.cpp @@ -116,7 +116,7 @@ #include #include -#include "error_code.h" +#include "otautil/error_code.h" static constexpr int WINDOW_SIZE = 5; static constexpr int FIBMAP_RETRY_LIMIT = 3; diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp index 696cddf41..0f8364441 100644 --- a/updater/blockimg.cpp +++ b/updater/blockimg.cpp @@ -50,8 +50,8 @@ #include #include "edify/expr.h" -#include "error_code.h" #include "otafault/ota_io.h" +#include "otautil/error_code.h" #include "print_sha1.h" #include "rangeset.h" #include "updater/install.h" diff --git a/updater/install.cpp b/updater/install.cpp index fc085d5aa..01210f51c 100644 --- a/updater/install.cpp +++ b/updater/install.cpp @@ -57,10 +57,10 @@ #include #include "edify/expr.h" -#include "error_code.h" #include "mounts.h" #include "otafault/ota_io.h" #include "otautil/DirUtil.h" +#include "otautil/error_code.h" #include "print_sha1.h" #include "tune2fs.h" #include "updater/updater.h" diff --git a/updater/updater.cpp b/updater/updater.cpp index 309c309a5..f55a0d3bd 100644 --- a/updater/updater.cpp +++ b/updater/updater.cpp @@ -31,10 +31,10 @@ #include #include "edify/expr.h" -#include "error_code.h" #include "otafault/config.h" #include "otautil/DirUtil.h" #include "otautil/SysUtil.h" +#include "otautil/error_code.h" #include "updater/blockimg.h" #include "updater/install.h" -- cgit v1.2.3 From e6f7f95d3493b47514a6104e11d206a455a6433e Mon Sep 17 00:00:00 2001 From: Tao Bao Date: Wed, 4 Oct 2017 09:33:01 -0700 Subject: edify: Export the header and move to Soong. Also make matching changes to applypatch modules which include edify/expr.h. Test: mmma bootable/recovery Change-Id: Ia72be3caa010d7f56a70add2da345e631b306378 --- Android.bp | 1 + Android.mk | 1 - applypatch/Android.mk | 1 + edify/Android.bp | 45 +++++++++++++ edify/Android.mk | 53 --------------- edify/expr.cpp | 2 +- edify/expr.h | 161 --------------------------------------------- edify/include/edify/expr.h | 161 +++++++++++++++++++++++++++++++++++++++++++++ edify/lexer.ll | 2 +- edify/parser.yy | 2 +- 10 files changed, 211 insertions(+), 218 deletions(-) create mode 100644 edify/Android.bp delete mode 100644 edify/Android.mk delete mode 100644 edify/expr.h create mode 100644 edify/include/edify/expr.h diff --git a/Android.bp b/Android.bp index 99ca3a45c..4c66c427e 100644 --- a/Android.bp +++ b/Android.bp @@ -1,5 +1,6 @@ subdirs = [ "bootloader_message", + "edify", "otafault", "otautil", ] diff --git a/Android.mk b/Android.mk index ac72bac01..b40e23dc4 100644 --- a/Android.mk +++ b/Android.mk @@ -261,7 +261,6 @@ include $(BUILD_STATIC_LIBRARY) include \ $(LOCAL_PATH)/applypatch/Android.mk \ $(LOCAL_PATH)/boot_control/Android.mk \ - $(LOCAL_PATH)/edify/Android.mk \ $(LOCAL_PATH)/minadbd/Android.mk \ $(LOCAL_PATH)/minui/Android.mk \ $(LOCAL_PATH)/tests/Android.mk \ diff --git a/applypatch/Android.mk b/applypatch/Android.mk index 4eb0111df..05d937004 100644 --- a/applypatch/Android.mk +++ b/applypatch/Android.mk @@ -29,6 +29,7 @@ LOCAL_C_INCLUDES := \ bootable/recovery LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include LOCAL_STATIC_LIBRARIES := \ + libedify \ libotafault \ libbase \ libcrypto \ diff --git a/edify/Android.bp b/edify/Android.bp new file mode 100644 index 000000000..42947eb4e --- /dev/null +++ b/edify/Android.bp @@ -0,0 +1,45 @@ +// Copyright (C) 2017 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. + +cc_library_static { + name: "libedify", + + host_supported: true, + + srcs: [ + "expr.cpp", + "lexer.ll", + "parser.yy", + ], + + cflags: [ + "-Wall", + "-Werror", + "-Wno-deprecated-register", + "-Wno-unused-parameter", + ], + + export_include_dirs: [ + "include", + ], + + local_include_dirs: [ + "include", + ], + + static_libs: [ + "libbase", + "libotautil", + ], +} diff --git a/edify/Android.mk b/edify/Android.mk deleted file mode 100644 index 527698e68..000000000 --- a/edify/Android.mk +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright 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. - -LOCAL_PATH := $(call my-dir) - -edify_src_files := \ - lexer.ll \ - parser.yy \ - expr.cpp - -# -# Build the device-side library (static library) -# -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(edify_src_files) - -LOCAL_CFLAGS := -Wall -Werror -LOCAL_CPPFLAGS := -Wno-unused-parameter -LOCAL_CPPFLAGS += -Wno-deprecated-register -LOCAL_MODULE := libedify -LOCAL_STATIC_LIBRARIES += \ - libotautil \ - libbase - -include $(BUILD_STATIC_LIBRARY) - -# -# Build the host-side library (static library) -# -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(edify_src_files) - -LOCAL_CFLAGS := -Wall -Werror -LOCAL_CPPFLAGS := -Wno-unused-parameter -LOCAL_CPPFLAGS += -Wno-deprecated-register -LOCAL_MODULE := libedify -LOCAL_C_INCLUDES += $(LOCAL_PATH)/.. -LOCAL_STATIC_LIBRARIES += libbase - -include $(BUILD_HOST_STATIC_LIBRARY) diff --git a/edify/expr.cpp b/edify/expr.cpp index 104c0fd90..1b8623f03 100644 --- a/edify/expr.cpp +++ b/edify/expr.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "expr.h" +#include "edify/expr.h" #include #include diff --git a/edify/expr.h b/edify/expr.h deleted file mode 100644 index 770d1cf0d..000000000 --- a/edify/expr.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * 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 - -#include - -#include -#include -#include - -// Forward declaration to avoid including "otautil/error_code.h". -enum ErrorCode : int; -enum CauseCode : int; - -struct State { - State(const std::string& script, void* cookie); - - // The source of the original script. - const std::string& script; - - // Optional pointer to app-specific data; the core of edify never - // uses this value. - void* cookie; - - // The error message (if any) returned if the evaluation aborts. - // Should be empty initially, will be either empty or a string that - // Evaluate() returns. - std::string errmsg; - - // error code indicates the type of failure (e.g. failure to update system image) - // during the OTA process. - ErrorCode error_code; - - // cause code provides more detailed reason of an OTA failure (e.g. fsync error) - // in addition to the error code. - CauseCode cause_code; - - bool is_retry = false; -}; - -enum ValueType { - VAL_INVALID = -1, - VAL_STRING = 1, - VAL_BLOB = 2, -}; - -struct Value { - ValueType type; - std::string data; - - Value(ValueType type, const std::string& str) : - type(type), - data(str) {} -}; - -struct Expr; - -using Function = Value* (*)(const char* name, State* state, - const std::vector>& argv); - -struct Expr { - Function fn; - std::string name; - std::vector> argv; - int start, end; - - Expr(Function fn, const std::string& name, int start, int end) : - fn(fn), - name(name), - start(start), - end(end) {} -}; - -// Evaluate the input expr, return the resulting Value. -Value* EvaluateValue(State* state, const std::unique_ptr& expr); - -// Evaluate the input expr, assert that it is a string, and update the result parameter. This -// function returns true if the evaluation succeeds. This is a convenience function for older -// functions that want to deal only with strings. -bool Evaluate(State* state, const std::unique_ptr& expr, std::string* result); - -// Glue to make an Expr out of a literal. -Value* Literal(const char* name, State* state, const std::vector>& argv); - -// Functions corresponding to various syntactic sugar operators. -// ("concat" is also available as a builtin function, to concatenate -// more than two strings.) -Value* ConcatFn(const char* name, State* state, const std::vector>& argv); -Value* LogicalAndFn(const char* name, State* state, const std::vector>& argv); -Value* LogicalOrFn(const char* name, State* state, const std::vector>& argv); -Value* LogicalNotFn(const char* name, State* state, const std::vector>& argv); -Value* SubstringFn(const char* name, State* state, const std::vector>& argv); -Value* EqualityFn(const char* name, State* state, const std::vector>& argv); -Value* InequalityFn(const char* name, State* state, const std::vector>& argv); -Value* SequenceFn(const char* name, State* state, const std::vector>& argv); - -// Global builtins, registered by RegisterBuiltins(). -Value* IfElseFn(const char* name, State* state, const std::vector>& argv); -Value* AssertFn(const char* name, State* state, const std::vector>& argv); -Value* AbortFn(const char* name, State* state, const std::vector>& argv); - -// 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 std::string& name, Function fn); - -// Register all the builtins. -void RegisterBuiltins(); - -// Find the Function for a given name; return NULL if no such function -// exists. -Function FindFunction(const std::string& name); - -// --- convenience functions for use in functions --- - -// Evaluate the expressions in argv, and put the results of strings in args. If any expression -// evaluates to nullptr, return false. Return true on success. -bool ReadArgs(State* state, const std::vector>& argv, - std::vector* args); -bool ReadArgs(State* state, const std::vector>& argv, - std::vector* args, size_t start, size_t len); - -// Evaluate the expressions in argv, and put the results of Value* in args. If any -// expression evaluate to nullptr, return false. Return true on success. -bool ReadValueArgs(State* state, const std::vector>& argv, - std::vector>* args); -bool ReadValueArgs(State* state, const std::vector>& argv, - std::vector>* args, size_t start, size_t len); - -// 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), 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))); - -// Copying the string into a Value. -Value* StringValue(const char* str); - -Value* StringValue(const std::string& str); - -int parse_string(const char* str, std::unique_ptr* root, int* error_count); - -#endif // _EXPRESSION_H diff --git a/edify/include/edify/expr.h b/edify/include/edify/expr.h new file mode 100644 index 000000000..770d1cf0d --- /dev/null +++ b/edify/include/edify/expr.h @@ -0,0 +1,161 @@ +/* + * 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 + +#include + +#include +#include +#include + +// Forward declaration to avoid including "otautil/error_code.h". +enum ErrorCode : int; +enum CauseCode : int; + +struct State { + State(const std::string& script, void* cookie); + + // The source of the original script. + const std::string& script; + + // Optional pointer to app-specific data; the core of edify never + // uses this value. + void* cookie; + + // The error message (if any) returned if the evaluation aborts. + // Should be empty initially, will be either empty or a string that + // Evaluate() returns. + std::string errmsg; + + // error code indicates the type of failure (e.g. failure to update system image) + // during the OTA process. + ErrorCode error_code; + + // cause code provides more detailed reason of an OTA failure (e.g. fsync error) + // in addition to the error code. + CauseCode cause_code; + + bool is_retry = false; +}; + +enum ValueType { + VAL_INVALID = -1, + VAL_STRING = 1, + VAL_BLOB = 2, +}; + +struct Value { + ValueType type; + std::string data; + + Value(ValueType type, const std::string& str) : + type(type), + data(str) {} +}; + +struct Expr; + +using Function = Value* (*)(const char* name, State* state, + const std::vector>& argv); + +struct Expr { + Function fn; + std::string name; + std::vector> argv; + int start, end; + + Expr(Function fn, const std::string& name, int start, int end) : + fn(fn), + name(name), + start(start), + end(end) {} +}; + +// Evaluate the input expr, return the resulting Value. +Value* EvaluateValue(State* state, const std::unique_ptr& expr); + +// Evaluate the input expr, assert that it is a string, and update the result parameter. This +// function returns true if the evaluation succeeds. This is a convenience function for older +// functions that want to deal only with strings. +bool Evaluate(State* state, const std::unique_ptr& expr, std::string* result); + +// Glue to make an Expr out of a literal. +Value* Literal(const char* name, State* state, const std::vector>& argv); + +// Functions corresponding to various syntactic sugar operators. +// ("concat" is also available as a builtin function, to concatenate +// more than two strings.) +Value* ConcatFn(const char* name, State* state, const std::vector>& argv); +Value* LogicalAndFn(const char* name, State* state, const std::vector>& argv); +Value* LogicalOrFn(const char* name, State* state, const std::vector>& argv); +Value* LogicalNotFn(const char* name, State* state, const std::vector>& argv); +Value* SubstringFn(const char* name, State* state, const std::vector>& argv); +Value* EqualityFn(const char* name, State* state, const std::vector>& argv); +Value* InequalityFn(const char* name, State* state, const std::vector>& argv); +Value* SequenceFn(const char* name, State* state, const std::vector>& argv); + +// Global builtins, registered by RegisterBuiltins(). +Value* IfElseFn(const char* name, State* state, const std::vector>& argv); +Value* AssertFn(const char* name, State* state, const std::vector>& argv); +Value* AbortFn(const char* name, State* state, const std::vector>& argv); + +// 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 std::string& name, Function fn); + +// Register all the builtins. +void RegisterBuiltins(); + +// Find the Function for a given name; return NULL if no such function +// exists. +Function FindFunction(const std::string& name); + +// --- convenience functions for use in functions --- + +// Evaluate the expressions in argv, and put the results of strings in args. If any expression +// evaluates to nullptr, return false. Return true on success. +bool ReadArgs(State* state, const std::vector>& argv, + std::vector* args); +bool ReadArgs(State* state, const std::vector>& argv, + std::vector* args, size_t start, size_t len); + +// Evaluate the expressions in argv, and put the results of Value* in args. If any +// expression evaluate to nullptr, return false. Return true on success. +bool ReadValueArgs(State* state, const std::vector>& argv, + std::vector>* args); +bool ReadValueArgs(State* state, const std::vector>& argv, + std::vector>* args, size_t start, size_t len); + +// 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), 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))); + +// Copying the string into a Value. +Value* StringValue(const char* str); + +Value* StringValue(const std::string& str); + +int parse_string(const char* str, std::unique_ptr* root, int* error_count); + +#endif // _EXPRESSION_H diff --git a/edify/lexer.ll b/edify/lexer.ll index cb4594371..4e04003b1 100644 --- a/edify/lexer.ll +++ b/edify/lexer.ll @@ -18,7 +18,7 @@ #include #include -#include "expr.h" +#include "edify/expr.h" #include "yydefs.h" #include "parser.h" diff --git a/edify/parser.yy b/edify/parser.yy index b1685eb1f..bd2e0105f 100644 --- a/edify/parser.yy +++ b/edify/parser.yy @@ -25,7 +25,7 @@ #include -#include "expr.h" +#include "edify/expr.h" #include "yydefs.h" #include "parser.h" -- cgit v1.2.3