diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml new file mode 100644 index 000000000..0f37bd49c --- /dev/null +++ b/.github/workflows/clang-format-check.yml @@ -0,0 +1,35 @@ +################################################################################ +# +# Copyright (C) 2024 retro.ai +# This file is part of retro3 - https://github.com/retroai/retro3 +# +# SPDX-License-Identifier: AGPL-3.0-or-later +# See the file LICENSE.txt for more information. +# +################################################################################ + +name: Clang Format Check + +on: [push, pull_request] + +jobs: + format: + # The type of runner that the job will run on + runs-on: ubuntu-22.04 + + defaults: + run: + # Set the working directory to src folder + working-directory: src + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Clang Format + run: sudo apt-get install -y clang-format-15 + + - name: Run Clang Format + run: | + find . -regex '.*\.\(cpp\|hpp\)' -exec clang-format-15 -style=file -i {} \; + git diff --exit-code --color diff --git a/src/.clang-format b/src/.clang-format new file mode 100644 index 000000000..e29c658c7 --- /dev/null +++ b/src/.clang-format @@ -0,0 +1,92 @@ +--- +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: DontAlign +AlignOperands: true +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: InlineOnly +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: true +BinPackArguments: true +BinPackParameters: false +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Allman +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 100 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 2 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +IncludeBlocks: Regroup +IncludeCategories: + - Regex: '' + Priority: 6 + - Regex: '(["/]PlatformDefs|"(system|system_gl|system_egl))\.h"' + Priority: 5 + - Regex: '"platform/[^/]+/' + Priority: 2 + - Regex: '^<[a-z0-9_]+>$' + Priority: 3 + - Regex: '^<(assert|complex|ctype|errno|fenv|float|inttypes|iso646|limits|locale|math|setjmp|signal|stdalign|stdarg|stdatomic|stdbool|stddef|stdint|stdio|stdlib|stdnoreturn|string|tgmath|threads|time|uchar|wchar|wctype)\.h>$' + Priority: 3 + - Regex: '^<' + Priority: 4 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '$' +IndentCaseLabels: true +IndentWidth: 2 +IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +ObjCBlockIndentWidth: 2 +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60000 +PointerAlignment: Left +ReflowComments: false +SortIncludes: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 +TabWidth: 8 +UseTab: Never +... diff --git a/src/backend/dapp.cpp b/src/backend/dapp.cpp index 86bd1badb..fe2c13427 100644 --- a/src/backend/dapp.cpp +++ b/src/backend/dapp.cpp @@ -41,80 +41,82 @@ extern "C" // Currently, only one system process can open the Rollup driver at a time. static int open_rollup_device() { - int fd = open(ROLLUP_DEVICE_NAME, O_RDWR); - if (fd < 0) - { - throw std::system_error(errno, std::generic_category(), "unable to open rollup device"); - } - return fd; + int fd = open(ROLLUP_DEVICE_NAME, O_RDWR); + if (fd < 0) + { + throw std::system_error(errno, std::generic_category(), "unable to open rollup device"); + } + return fd; } static std::string get_ioctl_name(int request) { - switch (request) - { + switch (request) + { case IOCTL_ROLLUP_WRITE_VOUCHER: - return {"write voucher"}; + return {"write voucher"}; case IOCTL_ROLLUP_WRITE_NOTICE: - return {"write notice"}; + return {"write notice"}; case IOCTL_ROLLUP_WRITE_REPORT: - return {"write report"}; + return {"write report"}; case IOCTL_ROLLUP_FINISH: - return {"finish"}; + return {"finish"}; case IOCTL_ROLLUP_READ_ADVANCE_STATE: - return {"advance state"}; + return {"advance state"}; case IOCTL_ROLLUP_READ_INSPECT_STATE: - return {"inspect state"}; + return {"inspect state"}; case IOCTL_ROLLUP_THROW_EXCEPTION: - return {"throw exception"}; + return {"throw exception"}; default: - return {"unknown"}; - } + return {"unknown"}; + } } // Call the ioctl system call to interact with the Cartesi Rollup device driver. // Currently, that is the only way to interact with the driver. -static void rollup_ioctl(int fd, unsigned long request, void *data) +static void rollup_ioctl(int fd, unsigned long request, void* data) { - if (ioctl(fd, request, data) < 0) - { - throw std::system_error(errno, std::generic_category(), "unable to " + get_ioctl_name(request)); - } + if (ioctl(fd, request, data) < 0) + { + throw std::system_error(errno, std::generic_category(), "unable to " + get_ioctl_name(request)); + } } -static std::string hex(const uint8_t *data, uint64_t length) +static std::string hex(const uint8_t* data, uint64_t length) { - std::stringstream ss; - ss << "0x"; - for (auto b : std::string_view{reinterpret_cast(data), length}) - { - ss << std::hex << std::setfill('0') << std::setw(2) << static_cast(b); - } - return ss.str(); + std::stringstream ss; + ss << "0x"; + for (auto b : std::string_view{reinterpret_cast(data), length}) + { + ss << std::hex << std::setfill('0') << std::setw(2) << static_cast(b); + } + return ss.str(); } void handle_advance(int fd, rollup_bytes payload_buffer) { - struct rollup_advance_state request - { - }; - request.payload = payload_buffer; - rollup_ioctl(fd, IOCTL_ROLLUP_READ_ADVANCE_STATE, &request); - auto data = std::string_view{reinterpret_cast(request.payload.data), request.payload.length}; - std::cout << "[DApp] Received advance request data " << data << std::endl; - // TODO: add application logic here + struct rollup_advance_state request + { + }; + request.payload = payload_buffer; + rollup_ioctl(fd, IOCTL_ROLLUP_READ_ADVANCE_STATE, &request); + auto data = + std::string_view{reinterpret_cast(request.payload.data), request.payload.length}; + std::cout << "[DApp] Received advance request data " << data << std::endl; + // TODO: add application logic here } void handle_inspect(int fd, rollup_bytes payload_buffer) { - struct rollup_inspect_state request - { - }; - request.payload = payload_buffer; - rollup_ioctl(fd, IOCTL_ROLLUP_READ_INSPECT_STATE, &request); - auto data = std::string_view{reinterpret_cast(request.payload.data), request.payload.length}; - std::cout << "[DApp] Received inspect request data " << data << std::endl; - // TODO: add application logic here + struct rollup_inspect_state request + { + }; + request.payload = payload_buffer; + rollup_ioctl(fd, IOCTL_ROLLUP_READ_INSPECT_STATE, &request); + auto data = + std::string_view{reinterpret_cast(request.payload.data), request.payload.length}; + std::cout << "[DApp] Received inspect request data " << data << std::endl; + // TODO: add application logic here } // Below, the DApp performs a system call finishing the previous Rollup request and asking for the @@ -128,41 +130,41 @@ void handle_inspect(int fd, rollup_bytes payload_buffer) // driver. // Finally, when the DApp finishes to process the request, it must call finish again and restart the // cycle. -int main(int argc, char **argv) +int main(int argc, char** argv) try { - int fd = open_rollup_device(); - struct rollup_finish finish_request + int fd = open_rollup_device(); + struct rollup_finish finish_request + { + }; + finish_request.accept_previous_request = true; + std::vector payload_buffer; + while (true) + { + std::cout << "[DApp] Sending finish" << std::endl; + rollup_ioctl(fd, IOCTL_ROLLUP_FINISH, &finish_request); + auto len = static_cast(finish_request.next_request_payload_length); + std::cout << "[DApp] Received finish with payload length " << len << std::endl; + payload_buffer.resize(len); + if (finish_request.next_request_type == CARTESI_ROLLUP_ADVANCE_STATE) { - }; - finish_request.accept_previous_request = true; - std::vector payload_buffer; - while (true) + handle_advance(fd, {payload_buffer.data(), len}); + } + else if (finish_request.next_request_type == CARTESI_ROLLUP_INSPECT_STATE) { - std::cout << "[DApp] Sending finish" << std::endl; - rollup_ioctl(fd, IOCTL_ROLLUP_FINISH, &finish_request); - auto len = static_cast(finish_request.next_request_payload_length); - std::cout << "[DApp] Received finish with payload length " << len << std::endl; - payload_buffer.resize(len); - if (finish_request.next_request_type == CARTESI_ROLLUP_ADVANCE_STATE) - { - handle_advance(fd, {payload_buffer.data(), len}); - } - else if (finish_request.next_request_type == CARTESI_ROLLUP_INSPECT_STATE) - { - handle_inspect(fd, {payload_buffer.data(), len}); - } + handle_inspect(fd, {payload_buffer.data(), len}); } - close(fd); - return 0; + } + close(fd); + return 0; } -catch (std::exception &e) +catch (std::exception& e) { - std::cerr << "Caught exception: " << e.what() << '\n'; - return 1; + std::cerr << "Caught exception: " << e.what() << '\n'; + return 1; } catch (...) { - std::cerr << "Caught unknown exception\n"; - return 1; + std::cerr << "Caught unknown exception\n"; + return 1; }