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   ver_patch = __GNUC_PATCHLEVEL__;
103 #endif
104 
105   /* Green Hill C/C++ */
106 #if defined(__ghs__)
107   dec_decode_tri(__GHS_VERSION_NUMBER__);
108 #endif
109 
110   /* HP aCC */
111 #if defined(__HP_aCC)
112   ver = __HP_aCC;
113   ver_major = ver / 10000;
114   ver -= ver_major * 10000;
115   ver_minor = ver / 100;
116   ver -= ver_minor * 100;
117   ver_patch = ver;
118 #endif
119 
120   /* IBM XL C/C++ */
121 #if defined(__xlC__)
122   hex_decode_tri(__xlC__);
123 #endif
124 
125   /* IBM XL C/C++ */
126 #if defined(__IBMC__)
127   dec_decode_tri(__IBMC__);
128 #endif
129 
130   /* IBM XL C/C++ */
131 #if defined(__IBMCPP__)
132   dec_decode_tri(__IBMCPP__);
133 #endif
134 
135   /* IAR C/C++ */
136 #if defined(__IAR_SYSTEMS_ICC__)
137   ver = __VER__;
138   ver_major = ver / 100;
139   ver -= ver_major * 100;
140   ver_minor = ver;
141   ver_patch = 0;
142 #endif
143 
144   /* Intel C/C++ */
145 #if defined(__INTEL_COMPILER)
146   dec_decode_tri(__INTEL_COMPILER);
147 #endif
148 
149   /* KAI C++ */
150 #if defined(__KCC)
151   ver = __KCC_VERSION;
152   ver_major = ver / 0x1000;
153   ver -= ver_major * 0x1000;
154   ver_minor = ver / 0x100;
155   ver -= ver_minor * 0x100;
156   ver_patch = ver;
157 #endif
158 
159   /* Keil CARM */
160 #if defined(__CA__)
161   ver = __CA__;
162   ver_major = ver / 100;
163   ver -= ver_major * 100;
164   ver_minor = ver;
165   ver_patch = 0;
166 #endif
167 
168   /* Keil C166 */
169 #if defined(__C166__)
170   ver = __C166__;
171   ver_major = ver / 100;
172   ver -= ver_major * 100;
173   ver_minor = ver;
174   ver_patch = 0;
175 #endif
176 
177   /* Keil C51 */
178 #if defined(__C51__)
179   ver = __C51__;
180   ver_major = ver / 100;
181   ver -= ver_major * 100;
182   ver_minor = ver;
183   ver_patch = 0;
184 #endif
185 
186   /* Metrowerks CodeWarrior */
187 #if defined(__MWERKS__)
188   ver = __MWERKS__;
189   ver_major = ver / 0x1000;
190   ver -= ver_major * 0x1000;
191   ver_minor = ver / 0x0100;
192   ver -= ver_minor * 0x0100;
193   ver_patch = ver;
194 #endif
195 
196   /* MinGW */
197 #if defined(__MINGW32__)
198   ver_major = __MINGW32_MAJOR_VERSION;
199   ver_minor = __MINGW32_MINOR_VERSION;
200   ver_patch = 0;
201 #endif
202 
203   /* MIPSpro */
204 #if (defined(__sgi) || defined(sgi)) && defined(_SGI_COMPILER_VERSION)
205   ver = _SGI_COMPILER_VERSION;
206   ver_major = ver / 100;
207   ver -= ver_major * 100;
208   ver_minor = ver / 10;
209   ver -= ver_minor * 10;
210   ver_patch = ver;
211 #endif
212 
213   /* MIPSpro again */
214 #if (defined(__sgi) || defined(sgi)) && defined(_COMPILER_VERSION)
215   ver = _COMPILER_VERSION;
216   ver_major = ver / 100;
217   ver -= ver_major * 100;
218   ver_minor = ver / 10;
219   ver -= ver_minor * 10;
220   ver_patch = ver;
221 #endif
222 
223   /* MPW C++ */
224 #if defined(__MRC__) || defined(MPW_C) || defined(MPW_CPLUS)
225   ver = __MRC__;
226   ver_major = ver / 0x100;
227   ver -= ver_major * 0x100;
228   ver_minor = ver / 0x10;
229   ver -= ver_minor * 0x10;
230   ver_patch = 0;
231 #endif
232 
233   /* Palm C/C++ */
234 #if defined(_PACC_VER)
235   ver = _PACC_VER;
236   ver_major = ver / 0x1000000;
237   ver -= ver_major * 0x1000000;
238   ver_minor = ver / 0x100000;
239   ver -= ver_minor * 0x100000;
240   ver_patch = ver /  0x1000;
241 #endif
242 
243   /* Pelles C */
244 #if defined(__POCC__)
245   dec_decode_tri(__POCC__);
246 #endif
247 
248   /* PCC (Portable C compiler from 4.3BSD) */
249 #if defined(__PCC__)
250   ver_major = __PCC__;
251   ver_minor = __PCC_MINOR__;
252   ver_patch = __PCC_MINORMINOR__;
253 #endif
254 
255   /* Small Device C Compiler */
256 #if defined(SDCC)
257   dec_decode_tri(SDCC);
258 #endif
259 
260   /* Sun C */
261 #if defined(__SUNPRO_C)
262   hex_decode_tri(__SUNPRO_C);
263 #endif
264 
265   /* Sun C++ */
266 #if defined(__SUNPRO_CC)
267   hex_decode_tri(__SUNPRO_CC);
268 #endif
269 
270   /* Systems/C and Systems/C++ */
271 #if defined(__SYSC__)
272   ver = __SYSC_VER__;
273   ver_major = ver / 10000;
274   ver -= ver_major * 10000;
275   ver_minor = ver / 1000;
276   ver -= ver_minor * 1000;
277   ver_patch = ver;
278 #endif
279 
280   /* Ultimate C/C++ */
281 #if defined(_UCC)
282   ver_major = _MAJOR_REV;
283   ver_minor = _MINOR_REV;
284   ver_patch = 0;
285 #endif
286 
287   /* Watcom C++ */
288 #if defined(__WATCOMC__)
289   ver = __WATCOMC__;
290   ver_major = ver / 100;
291   ver -= ver_major * 100;
292   ver_minor = ver / 10;
293   ver -= ver_minor * 10;
294   ver_patch = 0;
295 #endif
296 
297   printf("%u.%u.%u\n", ver_major, ver_minor, ver_patch);
298   return 0;
299 }
300