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