回答編集履歴

1

unifdefの改造でどうか

2021/10/07 10:40

投稿

matukeso
matukeso

スコア1681

test CHANGED
@@ -1,19 +1,179 @@
1
- unifdefをビルドし、-sオプションて.cppファイル食わせるのはどうしょうか
1
+ あーたしかによくよく処理を読めば、unifdefは引数から定義されたdefineつかっifdef剥がすだで、コードからdefine/undef/include処理しないすね
2
2
 
3
+ ま、ifdefとかの処理はできるので、こういう感じの改造を入れればそれっぽく出ましたが、incldueの処理を手抜きしてあるのでちゃんと動かすならそのあたりの手当が必要かな、という感じですね。(長いので省略しましたが、outputをダミーにしておく必要もあります)
4
+
5
+
6
+
7
+ あるいはVS2019あたりを入れて、clangに食わせたほうが速いかもしれません。
8
+
9
+ ```C
10
+
11
+
12
+
13
+ @@ -367,6 +367,17 @@
14
+
15
+ processinout(*argv, *argv);
16
+
17
+ argv++;
18
+
19
+ }
20
+
21
+ +
22
+
23
+ + {
24
+
25
+ + int i;
26
+
27
+ + fprintf(stderr, "Symbols\n");
28
+
29
+ + for( i=0; i< nsyms; i++){
30
+
31
+ + if( symname[i] && value[i] ){
32
+
33
+ + fprintf(stderr, "%s\n", symname[i] );
34
+
35
+ + }
36
+
37
+ +
38
+
39
+ + }
40
+
41
+ + }
42
+
43
+
44
+
45
+
46
+
47
+ +
48
+
49
+ +static const char *getsym(const char **cpp);
50
+
51
+ +
52
+
53
+ static Linetype
54
+
55
+ parseline(void)
56
+
57
+ {
58
+
59
+ @@ -800,6 +816,57 @@
60
+
61
+ goto done;
62
+
63
+ }
64
+
65
+ keyword = tline + (cp - tline);
66
+
67
+ +
68
+
69
+ + if ((cp = matchsym("define", keyword)) != NULL){
70
+
71
+ + const char *end = cp + strlen(cp);
72
+
73
+ +
74
+
75
+ + const char *sym = getsym(&cp);
76
+
77
+ + const char *val;
78
+
79
+ + if (sym == NULL)
80
+
81
+ + error("Missing macro name in #define");
82
+
83
+ + if (*cp == '(') {
84
+
85
+ + val = "1";
86
+
87
+ + } else {
88
+
89
+ + cp = skipcomment(cp);
90
+
91
+ + val = (cp < end) ? xstrdup(cp, end) : "";
92
+
93
+ + }
94
+
95
+ + debug("#define");
96
+
97
+ + addsym2(false, sym, val);
98
+
99
+ + }
100
+
101
+ + else if ((cp = matchsym("undef", keyword)) != NULL){
102
+
103
+ + const char *sym = getsym(&cp);
104
+
105
+ + debug("undef:%s\n", sym);
106
+
107
+ + addsym2( false, sym, NULL);
108
+
109
+ + }
110
+
111
+ + else if ((cp = matchsym("include", keyword)) != NULL){
112
+
113
+ + int pos = strcspn( cp, "\"<\n");
114
+
115
+ +
116
+
117
+ + if( cp[pos] == '"' )
118
+
119
+ + {
120
+
121
+ + const char *st = cp+pos+1;
122
+
123
+ + const char *end = strchr( st, '"');
124
+
125
+ + if( end ){
126
+
127
+ + char *incl = xstrdup(st,end);
128
+
129
+ + FILE *old = input;
130
+
131
+ + FILE *oldout = output;
132
+
133
+ +
134
+
135
+ + output = fbinmode(stdout);
136
+
137
+ +
138
+
139
+ + input = fopen(incl, "rb");
140
+
141
+ + if( input ){
142
+
143
+ + debug("INCLUDE %s start", incl );
144
+
145
+ + process();
146
+
147
+ + debug("INCLUDE %s end\n", incl );
148
+
149
+ +// fclose(input);
150
+
151
+ + }
152
+
153
+ + output = oldout;
154
+
155
+ + input = old;
156
+
157
+ + }
158
+
159
+ + }
160
+
161
+ + }
162
+
163
+
164
+
165
+ ```
166
+
167
+
168
+
169
+ ~~unifdefをビルドして、-sオプションをつけて.cppファイルを食わせるのはどうでしょうか。
170
+
3
- ビルド時点でプロジェクトによってdefineされるものは下記stackoverflowの方法で取得してunifdefに引き渡してやる必要があります。
171
+ ビルド時点でプロジェクトによってdefineされるものは下記stackoverflowの方法で取得してunifdefに引き渡してやる必要があります。~~
4
172
 
5
173
 
6
174
 
7
175
  http://dotat.at/prog/unifdef/
8
176
 
9
- > -s Instead of processing an input file as usual, this option causes
10
-
11
- unifdef to produce a list of macros that are used in preprocessor
12
-
13
- directive controlling expressions.
14
-
15
-
16
-
17
177
  参考 https://stackoverflow.com/questions/3665537/how-to-find-out-cl-exes-built-in-macros
18
178
 
19
179
  参考 https://qiita.com/tokudiro/items/0643e15f5b973ec030c5