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 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