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)8static 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)16static 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)25int 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