History

TimeSeriesPlatformLibrary: Added metadata schemas as embedded resources to simplify metadata generation.

J. Ritchie Carroll committed 7 years ago

Commit 48e12f81 parent e766a8220 files · +1906 −23Browse files

Showing the changes to Source/Tools/EmbedFile/EmbedFile.cpp (1 of 20 files). Show all

Unified · Split

Source/Tools/EmbedFile/EmbedFile.cpp+143−0
@@ -0,0 +1,143 @@
1+// EmbedFile.cpp : This file contains the 'main' function. Program execution begins and ends there.
2+//
3+
4+#include "pch.h"
5+
6+FILE* open_or_exit(const char* fname, const char* mode)
7+{
8+ FILE* f;
9+ errno_t err;
10+
11+ if ((err = fopen_s(&f, fname, mode)) != 0) {
12+ perror(fname);
13+ exit(EXIT_FAILURE);
14+ }
15+
16+ return f;
17+}
18+
19+int main(int argc, char** argv)
20+{
21+ if (argc < 3) {
22+ fprintf(stderr, "USAGE: %s {sym} {rsrc} [(namespace}]\n\n"
23+ " Creates {sym}.cpp from the contents of {rsrc}\n",
24+ argv[0]);
25+ return EXIT_FAILURE;
26+ }
27+
28+ const char* sym = argv[1];
29+ FILE* in = open_or_exit(argv[2], "r");
30+ char empty[1] = "";
31+ const char* prefix = "";
32+
33+ if (argc > 3)
34+ prefix = argv[3];
35+
36+ char symfile[256];
37+ snprintf(symfile, sizeof(symfile), "%s.h", sym);
38+ FILE* out = open_or_exit(symfile,"w");
39+
40+ char symdirective[256];
41+ const char* s = sym;
42+ char* d = symdirective;
43+
44+ while (*s) {
45+ if (isupper(*s))
46+ *d++ = '_';
47+ *d++ = toupper(*s++);
48+ }
49+
50+ *d = '\0';
51+
52+ char now[256];
53+ time_t rawtime;
54+ struct tm timeinfo {};
55+ time(&rawtime);
56+ localtime_s(&timeinfo, &rawtime);
57+ asctime_s(now, 256, &timeinfo);
58+
59+ fprintf(out, "// Auto-generated on %s", now);
60+ fprintf(out, "// EmbedFile.exe %s %s %s\n\n", sym, argv[2], prefix);
61+ fprintf(out, "#ifndef %s\n", symdirective);
62+ fprintf(out, "#define %s\n\n", symdirective);
63+ fprintf(out, "#include <cstdint>\n\n");
64+
65+ if (strlen(prefix) > 0)
66+ {
67+ char source[256];
68+ strcpy_s(source, 256, prefix);
69+
70+ char* next_token;
71+ char* token = strtok_s(source, "::", &next_token);
72+ int32_t count = 0;
73+
74+ while (token) {
75+ if (count++ > 0)
76+ fprintf(out, " {\n");
77+
78+ fprintf(out, "namespace %s", token);
79+ token = strtok_s(nullptr, "::", &next_token);
80+ }
81+
82+ fprintf(out, "\n{\n");
83+ fprintf(out, " const extern uint8_t %s[];\n", sym);
84+ fprintf(out, " const extern uint32_t %sLength;\n", sym);
85+
86+ for (int32_t i = 0; i < count; i++)
87+ fprintf(out, "}");
88+ }
89+ else
90+ {
91+ fprintf(out, "const extern uint8_t %s[];\n", sym);
92+ fprintf(out, "const extern uint32_t %sLength;", sym);
93+ }
94+
95+ fprintf(out, "\n\n#endif\n");
96+ fclose(out);
97+
98+ snprintf(symfile, sizeof(symfile), "%s.cpp", sym);
99+ out = open_or_exit(symfile,"w");
100+
101+ fprintf(out, "// Auto-generated on %s", now);
102+ fprintf(out, "// EmbedFile.exe %s %s %s\n\n", sym, argv[2], prefix);
103+ fprintf(out, "#include \"%s.h\"\n\n", sym);
104+ fprintf(out, "const uint8_t %s%s[] = {", prefix, sym);
105+
106+ unsigned char buf[256];
107+ size_t nread = 0;
108+ int32_t chars = 0;
109+ bool first = true;
110+
111+ do
112+ {
113+ nread = fread(buf, 1, sizeof(buf), in);
114+ size_t i;
115+
116+ for (i = 0; i < nread; i++)
117+ {
118+ if (chars++ % 10 == 0)
119+ {
120+ if (!first)
121+ fprintf(out, ",");
122+
123+ fprintf(out, "\n ");
124+ }
125+ else
126+ {
127+ fprintf(out, ", ");
128+ }
129+
130+ fprintf(out, "0x%02X", buf[i]);
131+ first = false;
132+ }
133+ }
134+ while (nread > 0);
135+
136+ fprintf(out, "\n};\n\n");
137+ fprintf(out, "const uint32_t %s%sLength = sizeof(%s%s);\n", prefix, sym, prefix, sym);
138+
139+ fclose(in);
140+ fclose(out);
141+
142+ return EXIT_SUCCESS;
143+}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t