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
6FILE* 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
19int 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