MB-24142: Use correct unit for slowTask recording
[ep-engine.git] / tools / gencode.cc
1 /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3  *     Copyright 2012 Couchbase, Inc
4  *
5  *   Licensed under the Apache License, Version 2.0 (the "License");
6  *   you may not use this file except in compliance with the License.
7  *   You may obtain a copy of the License at
8  *
9  *       http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *   Unless required by applicable law or agreed to in writing, software
12  *   distributed under the License is distributed on an "AS IS" BASIS,
13  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *   See the License for the specific language governing permissions and
15  *   limitations under the License.
16  */
17 #include "config.h"
18 #include <algorithm>
19 #include <cerrno>
20 #include <cstdlib>
21 #include <string.h>
22 #include <strings.h>
23 #include <cerrno>
24 #include <getopt.h>
25 #include <sys/stat.h>
26 #include <iostream>
27 #include <fstream>
28 #include <vector>
29 #include <string>
30 #include <ctype.h>
31
32 #include "cJSON.h"
33
34 using namespace std;
35
36 /**
37  * Print the JSON object quoted
38  */
39 static ostream& operator <<(ostream &out, cJSON *json)
40 {
41     char *data = cJSON_PrintUnformatted(json);
42     int ii = 0;
43
44     out << '"';
45     while (data[ii] != '\0') {
46         if (data[ii] == '"') {
47             out << '\\';
48         }
49         out << data[ii];
50         ++ii;
51     }
52
53     out << '"';
54     cJSON_Free(data);
55     return out;
56 }
57
58 static void usage(void)
59 {
60     cerr << "Usage: gencode -j JSON -c cfile -h headerfile -f function"
61          << endl
62          << "\tThe JSON file will be read to generate the c and h file."
63          << endl;
64     exit(EXIT_FAILURE);
65 }
66
67 int main(int argc, char **argv) {
68     int cmd;
69     const char *json = NULL;
70     const char *hfile = NULL;
71     const char *cfile = NULL;
72     const char *function = NULL;
73
74     while ((cmd = getopt(argc, argv, "j:c:h:f:")) != -1) {
75         switch (cmd) {
76         case 'j' :
77             json = optarg;
78             break;
79         case 'c' :
80             cfile = optarg;
81             break;
82         case 'h':
83             hfile = optarg;
84             break;
85         case 'f':
86             function = optarg;
87             break;
88         default:
89             usage();
90         }
91     }
92
93     if (json == NULL || hfile == NULL || cfile == NULL || function == NULL) {
94         usage();
95     }
96
97     struct stat st;
98     if (stat(json, &st) == -1) {
99         cerr << "Failed to look up \"" << json << "\": "
100              << strerror(errno) << endl;
101         exit(EXIT_FAILURE);
102     }
103
104     std::vector<char> data(st.st_size + 1);
105     ifstream input(json);
106     input.read(data.data(), st.st_size);
107     input.close();
108
109     cJSON *c = cJSON_Parse(data.data());
110     if (c == NULL) {
111         cerr << "Failed to parse JSON.. probably syntax error" << endl;
112         exit(EXIT_FAILURE);
113     }
114
115     ofstream headerfile(hfile);
116
117     std::string macro(hfile);
118     std::replace(macro.begin(), macro.end(), ' ', '_');
119     std::replace(macro.begin(), macro.end(), '/', '_');
120     std::replace(macro.begin(), macro.end(), '-', '_');
121     std::replace(macro.begin(), macro.end(), '.', '_');
122     std::replace(macro.begin(), macro.end(), ':', '_');
123     std::transform(macro.begin(), macro.end(), macro.begin(), ::toupper);
124
125     headerfile
126         << "/*" << endl
127         << " *     Copyright 2014 Couchbase, Inc" << endl
128         << " *" << endl
129         << " *   Licensed under the Apache License, Version 2.0 (the \"License\");" << endl
130         << " *   you may not use this file except in compliance with the License." << endl
131         << " *   You may obtain a copy of the License at" << endl
132         << " *" << endl
133         << " *       http://www.apache.org/licenses/LICENSE-2.0" << endl
134         << " *" << endl
135         << " *   Unless required by applicable law or agreed to in writing, software" << endl
136         << " *   distributed under the License is distributed on an \"AS IS\" BASIS," << endl
137         << " *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied." << endl
138         << " *   See the License for the specific language governing permissions and" << endl
139         << " *   limitations under the License." << endl
140         << " */" << endl
141         << endl
142         << "/********************************" << endl
143         << "** Generated file, do not edit **" << endl
144         << "*********************************/" << endl
145         << "#ifndef " << macro << endl
146         << "#define " << macro << endl
147         << endl
148         << "#include \"config.h\"" << endl
149         << endl
150         << "#ifdef __cplusplus" << endl
151         << "extern \"C\" {" << endl
152         << "#endif" << endl
153         << endl
154         << "const char *" << function << "(void);" << endl
155         << endl
156         << "#ifdef __cplusplus" << endl
157         << "}" << endl
158         << "#endif" << endl
159         << "#endif  /* " << macro << "*/" << endl;
160     headerfile.close();
161
162     ofstream sourcefile(cfile);
163     sourcefile
164         << "/*" << endl
165         << " *     Copyright 2014 Couchbase, Inc" << endl
166         << " *" << endl
167         << " *   Licensed under the Apache License, Version 2.0 (the \"License\");" << endl
168         << " *   you may not use this file except in compliance with the License." << endl
169         << " *   You may obtain a copy of the License at" << endl
170         << " *" << endl
171         << " *       http://www.apache.org/licenses/LICENSE-2.0" << endl
172         << " *" << endl
173         << " *   Unless required by applicable law or agreed to in writing, software" << endl
174         << " *   distributed under the License is distributed on an \"AS IS\" BASIS," << endl
175         << " *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied." << endl
176         << " *   See the License for the specific language governing permissions and" << endl
177         << " *   limitations under the License." << endl
178         << " */" << endl
179         << endl
180         << "/********************************" << endl
181         << "** Generated file, do not edit **" << endl
182         << "*********************************/" << endl
183         << "#include \"config.h\"" << endl
184         << "#include \"" << hfile << "\"" << endl
185         << endl
186         << "const char *" << function << "(void)" << endl
187         << "{" << endl
188         << "    return " << c << ";" << endl
189         << "}" << endl;
190
191     cJSON_Delete(c);
192
193     return 0;
194 }