1ca0551cfSopenharmony_ci/* 2ca0551cfSopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License. 5ca0551cfSopenharmony_ci * You may obtain a copy of the License at 6ca0551cfSopenharmony_ci * 7ca0551cfSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ca0551cfSopenharmony_ci * 9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and 13ca0551cfSopenharmony_ci * limitations under the License. 14ca0551cfSopenharmony_ci */ 15ca0551cfSopenharmony_ci 16ca0551cfSopenharmony_ci#include "options.h" 17ca0551cfSopenharmony_ci 18ca0551cfSopenharmony_ci#include <cstdio> 19ca0551cfSopenharmony_ci#include <cstring> 20ca0551cfSopenharmony_ci 21ca0551cfSopenharmony_ci#include "util/string_builder.h" 22ca0551cfSopenharmony_ci 23ca0551cfSopenharmony_cinamespace OHOS { 24ca0551cfSopenharmony_cinamespace Idl { 25ca0551cfSopenharmony_civoid Options::Parse(int argc, char** argv) 26ca0551cfSopenharmony_ci{ 27ca0551cfSopenharmony_ci StringBuilder errors; 28ca0551cfSopenharmony_ci program_ = argv[0]; 29ca0551cfSopenharmony_ci 30ca0551cfSopenharmony_ci int i = 1; 31ca0551cfSopenharmony_ci while (i < argc) { 32ca0551cfSopenharmony_ci String option(argv[i++]); 33ca0551cfSopenharmony_ci if (ParseSub(option, i, argv)) { 34ca0551cfSopenharmony_ci continue; 35ca0551cfSopenharmony_ci } else if (option.Equals("-t")) { 36ca0551cfSopenharmony_ci doKeywords_ = true; 37ca0551cfSopenharmony_ci if (targetLanguage_.Equals("cpp") && DoIllegalParameter(argv[i])) { 38ca0551cfSopenharmony_ci doLegalParameters_ = false; 39ca0551cfSopenharmony_ci return; 40ca0551cfSopenharmony_ci } 41ca0551cfSopenharmony_ci hitraceTag_ = argv[i++]; 42ca0551cfSopenharmony_ci doHitrace_ = true; 43ca0551cfSopenharmony_ci } else if (option.Equals("-log-domainid")) { 44ca0551cfSopenharmony_ci doKeywords_ = true; 45ca0551cfSopenharmony_ci if (targetLanguage_.Equals("cpp") && DoIllegalParameter(argv[i])) { 46ca0551cfSopenharmony_ci doLegalParameters_ = false; 47ca0551cfSopenharmony_ci return; 48ca0551cfSopenharmony_ci } 49ca0551cfSopenharmony_ci domainId_ = argv[i++]; 50ca0551cfSopenharmony_ci } else if (option.Equals("-log-tag")) { 51ca0551cfSopenharmony_ci doKeywords_ = true; 52ca0551cfSopenharmony_ci if (targetLanguage_.Equals("cpp") && DoIllegalParameter(argv[i])) { 53ca0551cfSopenharmony_ci doLegalParameters_ = false; 54ca0551cfSopenharmony_ci return; 55ca0551cfSopenharmony_ci } 56ca0551cfSopenharmony_ci logTag_ = argv[i++]; 57ca0551cfSopenharmony_ci } else if (!option.StartsWith("-")) { 58ca0551cfSopenharmony_ci sourceFile_ = option; 59ca0551cfSopenharmony_ci } else { 60ca0551cfSopenharmony_ci errors.Append(option); 61ca0551cfSopenharmony_ci errors.Append(" "); 62ca0551cfSopenharmony_ci } 63ca0551cfSopenharmony_ci } 64ca0551cfSopenharmony_ci 65ca0551cfSopenharmony_ci illegalOptions_ = errors.ToString(); 66ca0551cfSopenharmony_ci 67ca0551cfSopenharmony_ci attribute_.doHitrace = doHitrace_; 68ca0551cfSopenharmony_ci attribute_.hitraceTag = hitraceTag_; 69ca0551cfSopenharmony_ci attribute_.logTag = logTag_; 70ca0551cfSopenharmony_ci attribute_.domainId = domainId_; 71ca0551cfSopenharmony_ci attribute_.doLog = DoLogOn(); 72ca0551cfSopenharmony_ci} 73ca0551cfSopenharmony_ci 74ca0551cfSopenharmony_cibool Options::ParseSub(const String& option, int& i, char** argv) 75ca0551cfSopenharmony_ci{ 76ca0551cfSopenharmony_ci if (option.Equals("--help")) { 77ca0551cfSopenharmony_ci doShowUsage_ = true; 78ca0551cfSopenharmony_ci return true; 79ca0551cfSopenharmony_ci } else if (option.Equals("--version")) { 80ca0551cfSopenharmony_ci doShowVersion_ = true; 81ca0551cfSopenharmony_ci return true; 82ca0551cfSopenharmony_ci } else if (option.Equals("-c")) { 83ca0551cfSopenharmony_ci doCompile_ = true; 84ca0551cfSopenharmony_ci return true; 85ca0551cfSopenharmony_ci } else if (option.Equals("-dump-ast")) { 86ca0551cfSopenharmony_ci doDumpAST_ = true; 87ca0551cfSopenharmony_ci return true; 88ca0551cfSopenharmony_ci } else if (option.Equals("-dump-metadata")) { 89ca0551cfSopenharmony_ci doDumpMetadata_ = true; 90ca0551cfSopenharmony_ci return true; 91ca0551cfSopenharmony_ci } else if (option.Equals("-s")) { 92ca0551cfSopenharmony_ci doSaveMetadata_ = true; 93ca0551cfSopenharmony_ci metadataFile_ = argv[i++]; 94ca0551cfSopenharmony_ci return true; 95ca0551cfSopenharmony_ci } else if (option.Equals("-gen-rust")) { 96ca0551cfSopenharmony_ci doGenerateCode_ = true; 97ca0551cfSopenharmony_ci targetLanguage_ = "rust"; 98ca0551cfSopenharmony_ci return true; 99ca0551cfSopenharmony_ci } else if (option.Equals("-gen-cpp")) { 100ca0551cfSopenharmony_ci doGenerateCode_ = true; 101ca0551cfSopenharmony_ci targetLanguage_ = "cpp"; 102ca0551cfSopenharmony_ci return true; 103ca0551cfSopenharmony_ci } else if (option.Equals("-gen-ts")) { 104ca0551cfSopenharmony_ci doGenerateCode_ = true; 105ca0551cfSopenharmony_ci targetLanguage_ = "ts"; 106ca0551cfSopenharmony_ci return true; 107ca0551cfSopenharmony_ci } else if (option.Equals("-d")) { 108ca0551cfSopenharmony_ci generationDirectory_ = argv[i++]; 109ca0551cfSopenharmony_ci return true; 110ca0551cfSopenharmony_ci } 111ca0551cfSopenharmony_ci return false; 112ca0551cfSopenharmony_ci} 113ca0551cfSopenharmony_ci 114ca0551cfSopenharmony_civoid Options::ShowErrors() 115ca0551cfSopenharmony_ci{ 116ca0551cfSopenharmony_ci if (!illegalOptions_.IsEmpty()) { 117ca0551cfSopenharmony_ci String options = illegalOptions_; 118ca0551cfSopenharmony_ci int index; 119ca0551cfSopenharmony_ci while ((index = options.IndexOf(' ')) != -1) { 120ca0551cfSopenharmony_ci printf("The Option \"%s\" is illegal.\n", options.Substring(0, index).string()); 121ca0551cfSopenharmony_ci options = options.Substring(index + 1); 122ca0551cfSopenharmony_ci } 123ca0551cfSopenharmony_ci } 124ca0551cfSopenharmony_ci printf("Use \"--help\" to show usage.\n"); 125ca0551cfSopenharmony_ci} 126ca0551cfSopenharmony_ci 127ca0551cfSopenharmony_civoid Options::ShowVersion() 128ca0551cfSopenharmony_ci{ 129ca0551cfSopenharmony_ci printf("idl %d.%d\n" 130ca0551cfSopenharmony_ci "Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved.\n\n", 131ca0551cfSopenharmony_ci VERSION_MAJOR, VERSION_MINOR); 132ca0551cfSopenharmony_ci} 133ca0551cfSopenharmony_ci 134ca0551cfSopenharmony_civoid Options::ShowWarning() 135ca0551cfSopenharmony_ci{ 136ca0551cfSopenharmony_ci printf("Warning : Executed successfully, but contains invalid commands !\n"); 137ca0551cfSopenharmony_ci} 138ca0551cfSopenharmony_ci 139ca0551cfSopenharmony_civoid Options::ShowUsage() 140ca0551cfSopenharmony_ci{ 141ca0551cfSopenharmony_ci printf("Compile a .idl file and generate metadata, or generate Rust/C++/Ts codes from metadata.\n" 142ca0551cfSopenharmony_ci "Usage: idl [options] file\n" 143ca0551cfSopenharmony_ci "Options:\n" 144ca0551cfSopenharmony_ci " --help Display command line options\n" 145ca0551cfSopenharmony_ci " --version Display toolchain version information\n" 146ca0551cfSopenharmony_ci " -dump-ast Display the AST of the compiled file\n" 147ca0551cfSopenharmony_ci " -dump-metadata Display the metadata generated from the compiled file\n" 148ca0551cfSopenharmony_ci " -c Compile the .idl file\n" 149ca0551cfSopenharmony_ci " -s <file> Place the metadata into <file>\n" 150ca0551cfSopenharmony_ci " -gen-rust Generate Rust codes\n" 151ca0551cfSopenharmony_ci " -gen-cpp Generate C++ codes\n" 152ca0551cfSopenharmony_ci " -gen-ts Generate Ts codes\n" 153ca0551cfSopenharmony_ci " -d <directory> Place generated codes into <directory>\n" 154ca0551cfSopenharmony_ci " -log-domainid <domainid> Place the service domain in <domainid>, Enable log(Pair with -log-tag)\n" 155ca0551cfSopenharmony_ci " -log-tag <tag> Place the subsystem name in <tag>, Enable log(Pair with -log-domainid)\n" 156ca0551cfSopenharmony_ci " -t <hitrace tag> Place the constant name from hitrace_meter.h file in <hitrace tag>\n"); 157ca0551cfSopenharmony_ci} 158ca0551cfSopenharmony_ci} 159ca0551cfSopenharmony_ci} 160