1 #include <stdio.h>
2 
3 unsigned int ver_major;
4 unsigned int ver_minor;
5 unsigned int ver_patch;
6 unsigned int ver;
7 
hex_decode_tri(unsigned int ver)8 static void hex_decode_tri(unsigned int ver)
9 {
10   ver_major = ver / 0x100;
11   ver -= ver_major * 0x100;
12   ver_minor = ver / 0x010;
13   ver -= ver_minor * 0x010;
14   ver_patch = ver;
15 }
dec_decode_tri(unsigned int ver)16 static void dec_decode_tri(unsigned int ver)
17 {
18   ver_major = ver / 100;
19   ver -= ver_major * 100;
20   ver_minor = ver / 10;
21   ver -= ver_minor * 10;
22   ver_patch = ver;
23 }
24 
main(void)25 int main(void)
26 {
27   /* XXX: hack to allow compilation on compilers with extreme error checking
28           (unused functions cause compilation failure) */
29 
30   hex_decode_tri(1);
31   dec_decode_tri(1);
32   ver_major = 0;
33   ver_minor = 0;
34   ver_patch = 0;
35   ver = 0;
36 
37   /* Borland C++ */
38 #if defined(__BORLANDC__)
39   hex_decode_tri(__BORLANDC__);
40 #endif
41 
42   /* Comeau C++ */
43 #if defined(__COMO_VERSION__)
44   dec_decode_tri(__COMO_VERSION__);
45 #endif
46 
47   /* Compaq C */
48 #if defined(__DECC_VER)
49   ver = __DECC_VER;
50   ver_major = ver / 10000000;
51   ver -= ver_major * 10000000;
52   ver_minor = ver / 100000;
53   ver -= ver_minor * 100000;
54   ver -= (ver / 10000) * 10000;
55   ver_patch = ver;
56 #endif
57 
58   /* Compaq C++ */
59 #if defined(__DECCXX_VER)
60   ver = __DECCXX_VER;
61   ver_major = ver / 10000000;
62   ver -= ver_major * 10000000;
63   ver_minor = ver / 100000;
64   ver -= ver_minor * 100000;
65   ver -= (ver / 10000) * 10000;
66   ver_patch = ver;
67 #endif
68 
69   /* Cray C */
70 #if defined(_CRAY)
71   ver_major = _RELEASE;
72   ver_minor = _RELEASE_MINOR;
73 #endif
74 
75   /* Digital Mars */
76 #if defined(__DMC__)
77   hex_decode_tri(__DMC__);
78 #endif
79 
80   /* DJGPP */
81 #if defined(__DJGPP__)
82   ver_major = __DJGPP__;
83   ver_minor = __DJGPP_MINOR__;
84 #endif
85 
86   /* EKOPath */
87 #if defined(__PATHCC__)
88   ver_major = __PATHCC__;
89   ver_minor = __PATHCC_MINOR__;
90   ver_patch = __PATHCC_PATCHLEVEL__;
91 #endif
92 
93   /* EDG C++ Front End */
94 #if defined(__EDG__)
95   dec_decode_tri(__EDG_VERSION__);
96 #endif
97 
98   /* GNU C */
99 #if defined(__GNUC__)
100   ver_major = __GNUC__;
101   ver_minor = __GNUC_MINOR__;
102 #if defined (__GNUC_PATCHLEVEL__)
103   ver_patch = __GNUC_PATCHLEVEL__;
104 #else
105   ver_patch = 0;
106 #endif
107 #endif
108 
109   /* Green Hill C/C++ */
110 #if defined(__ghs__)
111   dec_decode_tri(__GHS_VERSION_NUMBER__);
112 #endif
113 
114   /* HP aCC */
115 #if defined(__HP_aCC)
116   ver = __HP_aCC;
117   ver_major = ver / 10000;
118   ver -= ver_major * 10000;
119   ver_minor = ver / 100;
120   ver -= ver_minor * 100;
121   ver_patch = ver;
122 #endif
123 
124   /* IBM XL C/C++ */
125 #if defined(__xlC__)
126   hex_decode_tri(__xlC__);
127 #endif
128 
129   /* IBM XL C/C++ */
130 #if defined(__IBMC__)
131   dec_decode_tri(__IBMC__);
132 #endif
133 
134   /* IBM XL C/C++ */
135 #if defined(__IBMCPP__)
136   dec_decode_tri(__IBMCPP__);
137 #endif
138 
139   /* IAR C/C++ */
140 #if defined(__IAR_SYSTEMS_ICC__)
141   ver = __VER__;
142   ver_major = ver / 100;
143   ver -= ver_major * 100;
144   ver_minor = ver;
145   ver_patch = 0;
146 #endif
147 
148   /* Intel C/C++ */
149 #if defined(__INTEL_COMPILER)
150   dec_decode_tri(__INTEL_COMPILER);
151 #endif
152 
153   /* KAI C++ */
154 #if defined(__KCC)
155   ver = __KCC_VERSION;
156   ver_major = ver / 0x1000;
157   ver -= ver_major * 0x1000;
158   ver_minor = ver / 0x100;
159   ver -= ver_minor * 0x100;
160   ver_patch = ver;
161 #endif
162 
163   /* Keil CARM */
164 #if defined(__CA__)
165   ver = __CA__;
166   ver_major = ver / 100;
167   ver -= ver_major * 100;
168   ver_minor = ver;
169   ver_patch = 0;
170 #endif
171 
172   /* Keil C166 */
173 #if defined(__C166__)
174   ver = __C166__;
175   ver_major = ver / 100;
176   ver -= ver_major * 100;
177   ver_minor = ver;
178   ver_patch = 0;
179 #endif
180 
181   /* Keil C51 */
182 #if defined(__C51__)
183   ver = __C51__;
184   ver_major = ver / 100;
185   ver -= ver_major * 100;
186   ver_minor = ver;
187   ver_patch = 0;
188 #endif
189 
190   /* Metrowerks CodeWarrior */
191 #if defined(__MWERKS__)
192   ver = __MWERKS__;
193   ver_major = ver / 0x1000;
194   ver -= ver_major * 0x1000;
195   ver_minor = ver / 0x0100;
196   ver -= ver_minor * 0x0100;
197   ver_patch = ver;
198 #endif
199 
200   /* MinGW */
201 #if defined(__MINGW32__)
202   ver_major = __MINGW32_MAJOR_VERSION;
203   ver_minor = __MINGW32_MINOR_VERSION;
204   ver_patch = 0;
205 #endif
206 
207   /* MIPSpro */
208 #if (defined(__sgi) || defined(sgi)) && defined(_SGI_COMPILER_VERSION)
209   ver = _SGI_COMPILER_VERSION;
210   ver_major = ver / 100;
211   ver -= ver_major * 100;
212   ver_minor = ver / 10;
213   ver -= ver_minor * 10;
214   ver_patch = ver;
215 #endif
216 
217   /* MIPSpro again */
218 #if (defined(__sgi) || defined(sgi)) && defined(_COMPILER_VERSION)
219   ver = _COMPILER_VERSION;
220   ver_major = ver / 100;
221   ver -= ver_major * 100;
222   ver_minor = ver / 10;
223   ver -= ver_minor * 10;
224   ver_patch = ver;
225 #endif
226 
227   /* MPW C++ */
228 #if defined(__MRC__) || defined(MPW_C) || defined(MPW_CPLUS)
229   ver = __MRC__;
230   ver_major = ver / 0x100;
231   ver -= ver_major * 0x100;
232   ver_minor = ver / 0x10;
233   ver -= ver_minor * 0x10;
234   ver_patch = 0;
235 #endif
236 
237   /* Palm C/C++ */
238 #if defined(_PACC_VER)
239   ver = _PACC_VER;
240   ver_major = ver / 0x1000000;
241   ver -= ver_major * 0x1000000;
242   ver_minor = ver / 0x100000;
243   ver -= ver_minor * 0x100000;
244   ver_patch = ver /  0x1000;
245 #endif
246 
247   /* Pelles C */
248 #if defined(__POCC__)
249   dec_decode_tri(__POCC__);
250 #endif
251 
252   /* PCC (Portable C compiler from 4.3BSD) */
253 #if defined(__PCC__)
254   ver_major = __PCC__;
255   ver_minor = __PCC_MINOR__;
256   ver_patch = __PCC_MINORMINOR__;
257 #endif
258 
259   /* Small Device C Compiler */
260 #if defined(SDCC)
261   dec_decode_tri(SDCC);
262 #endif
263 
264   /* Sun C */
265 #if defined(__SUNPRO_C)
266   hex_decode_tri(__SUNPRO_C);
267 #endif
268 
269   /* Sun C++ */
270 #if defined(__SUNPRO_CC)
271   hex_decode_tri(__SUNPRO_CC);
272 #endif
273 
274   /* Systems/C and Systems/C++ */
275 #if defined(__SYSC__)
276   ver = __SYSC_VER__;
277   ver_major = ver / 10000;
278   ver -= ver_major * 10000;
279   ver_minor = ver / 1000;
280   ver -= ver_minor * 1000;
281   ver_patch = ver;
282 #endif
283 
284   /* Ultimate C/C++ */
285 #if defined(_UCC)
286   ver_major = _MAJOR_REV;
287   ver_minor = _MINOR_REV;
288   ver_patch = 0;
289 #endif
290 
291   /* Watcom C++ */
292 #if defined(__WATCOMC__)
293   ver = __WATCOMC__;
294   ver_major = ver / 100;
295   ver -= ver_major * 100;
296   ver_minor = ver / 10;
297   ver -= ver_minor * 10;
298   ver_patch = 0;
299 #endif
300 
301   printf("%u.%u.%u\n", ver_major, ver_minor, ver_patch);
302   return 0;
303 }
304