You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

599 lines
37 KiB

25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
25 years ago
  1. #line 1 "intparam.d"
  2. /* Bestimmung einiger Maschinen-Parameter und -Abh�gigkeiten */
  3. /* und Ausgabe in ein Include-File */
  4. /* Bruno Haible 10.9.1991, 12.10.1992, 6.12.1992, 24.10.1993 */
  5. /* Auf einigen Systemen werden in <sys/types.h> die Typen uchar, ushort, uint, */
  6. /* ulong definiert. Normalerweise reicht _POSIX_SOURCE aus, dies zu verhindern, */
  7. /* bei AIX 3.2.5 (rs6000-ibm-aix3.2.5) jedoch nicht. Wir mssen Gewalt anwenden. */
  8. #define _POSIX_SOURCE
  9. #define uchar os_uchar
  10. #define ushort os_ushort
  11. #define uint os_uint
  12. #define ulong os_ulong
  13. #include <stdio.h>
  14. #undef ulong
  15. #undef uint
  16. #undef ushort
  17. #undef uchar
  18. #if !(defined(__STDC__) || defined(__cplusplus))
  19. /* Only for use in function parameter lists and as function return type. */
  20. #define void
  21. #endif
  22. #define loop while(1)
  23. typedef int boolean;
  24. #define TRUE 1
  25. #define FALSE 0
  26. #ifdef __CHAR_UNSIGNED__
  27. typedef signed char schar;
  28. #else
  29. typedef char schar;
  30. #endif
  31. typedef unsigned char uchar;
  32. typedef unsigned short ushort;
  33. typedef unsigned /* int */ uint;
  34. typedef unsigned long ulong;
  35. #ifdef HAVE_LONGLONG
  36. typedef long long longlong;
  37. typedef unsigned long long ulonglong;
  38. #endif
  39. typedef int (function)();
  40. static int random_table[256] = /* 2048 zuf�lige Bits, hier von pi */
  41. { 0xC9,0x0F,0xDA,0xA2,0x21,0x68,0xC2,0x34,0xC4,0xC6,0x62,0x8B,
  42. 0x80,0xDC,0x1C,0xD1,0x29,0x02,0x4E,0x08,0x8A,0x67,0xCC,0x74,
  43. 0x02,0x0B,0xBE,0xA6,0x3B,0x13,0x9B,0x22,0x51,0x4A,0x08,0x79,
  44. 0x8E,0x34,0x04,0xDD,0xEF,0x95,0x19,0xB3,0xCD,0x3A,0x43,0x1B,
  45. 0x30,0x2B,0x0A,0x6D,0xF2,0x5F,0x14,0x37,0x4F,0xE1,0x35,0x6D,
  46. 0x6D,0x51,0xC2,0x45,0xE4,0x85,0xB5,0x76,0x62,0x5E,0x7E,0xC6,
  47. 0xF4,0x4C,0x42,0xE9,0xA6,0x37,0xED,0x6B,0x0B,0xFF,0x5C,0xB6,
  48. 0xF4,0x06,0xB7,0xED,0xEE,0x38,0x6B,0xFB,0x5A,0x89,0x9F,0xA5,
  49. 0xAE,0x9F,0x24,0x11,0x7C,0x4B,0x1F,0xE6,0x49,0x28,0x66,0x51,
  50. 0xEC,0xE4,0x5B,0x3D,0xC2,0x00,0x7C,0xB8,0xA1,0x63,0xBF,0x05,
  51. 0x98,0xDA,0x48,0x36,0x1C,0x55,0xD3,0x9A,0x69,0x16,0x3F,0xA8,
  52. 0xFD,0x24,0xCF,0x5F,0x83,0x65,0x5D,0x23,0xDC,0xA3,0xAD,0x96,
  53. 0x1C,0x62,0xF3,0x56,0x20,0x85,0x52,0xBB,0x9E,0xD5,0x29,0x07,
  54. 0x70,0x96,0x96,0x6D,0x67,0x0C,0x35,0x4E,0x4A,0xBC,0x98,0x04,
  55. 0xF1,0x74,0x6C,0x08,0xCA,0x18,0x21,0x7C,0x32,0x90,0x5E,0x46,
  56. 0x2E,0x36,0xCE,0x3B,0xE3,0x9E,0x77,0x2C,0x18,0x0E,0x86,0x03,
  57. 0x9B,0x27,0x83,0xA2,0xEC,0x07,0xA2,0x8F,0xB5,0xC5,0x5D,0xF0,
  58. 0x6F,0x4C,0x52,0xC9,0xDE,0x2B,0xCB,0xF6,0x95,0x58,0x17,0x18,
  59. 0x39,0x95,0x49,0x7C,0xEA,0x95,0x6A,0xE5,0x15,0xD2,0x26,0x18,
  60. 0x98,0xFA,0x05,0x10,0x15,0x72,0x8E,0x5A,0x8A,0xAA,0xC4,0x2D,
  61. 0xAD,0x33,0x17,0x0D,0x04,0x50,0x7A,0x33,0xA8,0x55,0x21,0xAB,
  62. 0xDF,0x1C,0xBA,0x65,
  63. };
  64. #define random_table_length (8*256)
  65. static int random_position = -1;
  66. int next_random_bit(void)
  67. { random_position++;
  68. if (random_position==random_table_length) random_position = 0;
  69. return (random_table[random_position/8] >> (random_position % 8)) & 1;
  70. }
  71. #if defined(__STDC__) || defined(__cplusplus)
  72. void printf_underscored (const char* string)
  73. #else
  74. void printf_underscored(string)
  75. char* string;
  76. #endif
  77. { char c;
  78. while (!((c = *string++) == '\0')) { printf("%c",(c==' ' ? '_' : c)); }
  79. }
  80. /* string_length(string) is the same as strlen(string). */
  81. /* Better avoid to depend on <string.h>. */
  82. #if defined(__STDC__) || defined(__cplusplus)
  83. int string_length (char* string)
  84. #else
  85. int string_length(string)
  86. char* string;
  87. #endif
  88. { int count = 0;
  89. while (!(*string++ == '\0')) { count++; }
  90. return count;
  91. }
  92. static int char_bitsize, short_bitsize, int_bitsize, long_bitsize;
  93. static int uchar_bitsize, ushort_bitsize, uint_bitsize, ulong_bitsize;
  94. static boolean char_uchar_same, short_ushort_same, int_uint_same, long_ulong_same;
  95. static int pointer_bitsize;
  96. #ifdef HAVE_LONGLONG
  97. static int longlong_bitsize, ulonglong_bitsize;
  98. static boolean longlong_ulonglong_same;
  99. #endif
  100. void main1(void) {
  101. #define get_unsigned_integer_bitsize(type,where) \
  102. { type x = 1; \
  103. int bits = 0; \
  104. loop { \
  105. if (x==0) break; \
  106. x = x+x; \
  107. bits++; \
  108. if (bits==1000) { bits = -1; break; } \
  109. } \
  110. where = bits; \
  111. }
  112. #define get_signed_integer_bitsize(type,unsigned_type,where) \
  113. { /* Signed integer overflow is "undefined behaviour" in C99, and gcc-4.3 \
  114. (without -fwrapv option) actually does weird things when signed integer \
  115. overflow occurs. Therefore perform the addition on the unsigned type. \
  116. Drawback: This will not detect cases where the signed type has more bits\
  117. than the unsigned type but the same size according to sizeof. Blech. */ \
  118. type x = 1; \
  119. int bits = 0; \
  120. loop { \
  121. if (x==0) break; \
  122. x = (unsigned_type)x + (unsigned_type)x;\
  123. bits++; \
  124. if (bits==1000) { bits = -1; break; } \
  125. } \
  126. where = bits; \
  127. }
  128. #define print_integer_bitsize(type,typestr,where) \
  129. { if (where >= 0) \
  130. { printf("/* Integers of t%spe %s have %ld bits. */\n","y",typestr,(long)where); \
  131. if (!(typestr[0] == 'u')) \
  132. { printf("#define "); printf_underscored(typestr); printf("_bitsize %ld\n",(long)where); } \
  133. printf("\n"); \
  134. } \
  135. else \
  136. { printf("#error \"Integers of t%spe %s have no binary representation!!\"\n","y",typestr); } \
  137. if (!(where == char_bitsize * sizeof(type))) \
  138. { printf("#error \"Formula BITSIZE(T) = SIZEOF(T) * BITSPERBYTE does not hold for t%spe %s!!\"\n","y",typestr); } \
  139. }
  140. get_signed_integer_bitsize(schar,uchar,char_bitsize);
  141. get_signed_integer_bitsize(short,ushort,short_bitsize);
  142. get_signed_integer_bitsize(int,uint,int_bitsize);
  143. get_signed_integer_bitsize(long,ulong,long_bitsize);
  144. print_integer_bitsize(schar,"char",char_bitsize);
  145. print_integer_bitsize(short,"short",short_bitsize);
  146. print_integer_bitsize(int,"int",int_bitsize);
  147. print_integer_bitsize(long,"long",long_bitsize);
  148. #ifdef HAVE_LONGLONG
  149. get_signed_integer_bitsize(longlong,ulonglong,longlong_bitsize);
  150. print_integer_bitsize(longlong,"long long",longlong_bitsize);
  151. #endif
  152. get_unsigned_integer_bitsize(uchar,uchar_bitsize);
  153. get_unsigned_integer_bitsize(ushort,ushort_bitsize);
  154. get_unsigned_integer_bitsize(uint,uint_bitsize);
  155. get_unsigned_integer_bitsize(ulong,ulong_bitsize);
  156. print_integer_bitsize(uchar,"unsigned char",uchar_bitsize);
  157. print_integer_bitsize(ushort,"unsigned short",ushort_bitsize);
  158. print_integer_bitsize(uint,"unsigned int",uint_bitsize);
  159. print_integer_bitsize(ulong,"unsigned long",ulong_bitsize);
  160. #ifdef HAVE_LONGLONG
  161. get_unsigned_integer_bitsize(ulonglong,ulonglong_bitsize);
  162. print_integer_bitsize(ulonglong,"unsigned long long",ulonglong_bitsize);
  163. #endif
  164. }
  165. void main2(void) {
  166. #define compare_integer_bitsizes(typestr1,typestr2,type1_bitsize,type2_bitsize) \
  167. { if (!(type1_bitsize==type2_bitsize)) \
  168. printf("#error \"Integer types %s and %s have different sizes!!\"\n",typestr1,typestr2); \
  169. }
  170. compare_integer_bitsizes("char","unsigned char",char_bitsize,uchar_bitsize);
  171. compare_integer_bitsizes("short","unsigned short",short_bitsize,ushort_bitsize);
  172. compare_integer_bitsizes("int","unsigned int",int_bitsize,uint_bitsize);
  173. compare_integer_bitsizes("long","unsigned long",long_bitsize,ulong_bitsize);
  174. #ifdef HAVE_LONGLONG
  175. compare_integer_bitsizes("long long","unsigned long long",longlong_bitsize,ulonglong_bitsize);
  176. #endif
  177. }
  178. #define get_a_random(type,bitsize,where) \
  179. { type x = 0; \
  180. int i = bitsize; \
  181. while (i>0) { x = (x<<1) + next_random_bit(); i--; } \
  182. where = x; \
  183. }
  184. #define get_a_random_twice(type1,type2,bitsize,where1,where2) \
  185. { type1 x1 = 0; type2 x2 = 0; \
  186. int i = bitsize; \
  187. while (i>0) \
  188. { type1 b = next_random_bit(); \
  189. x1 = ((x1<<1) + b); x2 = ((x2<<1) + b); \
  190. i--; \
  191. } \
  192. where1 = x1; where2 = x2; \
  193. }
  194. void main3(void) {
  195. #define compare_integer_representation(type1,type2,typestr1,typestr2,type1_bitsize,type2_bitsize,where) \
  196. { if ((type1_bitsize>=0) && (type2_bitsize>=0) && (type1_bitsize==type2_bitsize)) \
  197. { int i,j; \
  198. type1 sample1; type2 sample2; \
  199. where = TRUE; \
  200. for (i = 0; i<100; i++) \
  201. { get_a_random_twice(type1,type2,type1_bitsize,sample1,sample2); \
  202. if (!(sample1 == (type1)(sample2))) { where = FALSE; } \
  203. if (!(sample2 == (type2)(sample1))) { where = FALSE; } \
  204. } \
  205. for (i = 0; i<100; i++) \
  206. { get_a_random(type1,type1_bitsize,sample1); \
  207. sample2 = (type2)(sample1); \
  208. for (j = 0; j < type1_bitsize; j++) \
  209. if (!( ((sample1 & ((type1)1<<j)) == 0) \
  210. == ((sample2 & ((type2)1<<j)) == 0) \
  211. ) ) \
  212. { where = FALSE; } \
  213. } \
  214. if (where) \
  215. { printf("/* Integer types %s and %s have the same binary representation. */\n",typestr1,typestr2); } \
  216. else \
  217. { printf("#error \"Integer types %s and %s have different binary representations!!\"\n",typestr1,typestr2); } \
  218. } \
  219. else \
  220. { where = FALSE; } \
  221. }
  222. compare_integer_representation(schar,uchar,"char","unsigned char",char_bitsize,uchar_bitsize,char_uchar_same);
  223. compare_integer_representation(short,ushort,"short","unsigned short",short_bitsize,ushort_bitsize,short_ushort_same);
  224. compare_integer_representation(int,uint,"int","unsigned int",int_bitsize,uint_bitsize,int_uint_same);
  225. compare_integer_representation(long,ulong,"long","unsigned long",long_bitsize,ulong_bitsize,long_ulong_same);
  226. #ifdef HAVE_LONGLONG
  227. compare_integer_representation(longlong,ulonglong,"long long","unsigned long long",longlong_bitsize,ulonglong_bitsize,longlong_ulonglong_same);
  228. #endif
  229. printf("\n");
  230. }
  231. void main4(void) {
  232. #define test_integer_ushift(type,typestr,type_bitsize) \
  233. if (type_bitsize >= 0) \
  234. { int i,j,shc; \
  235. type sample1,sample2; \
  236. boolean left_works = TRUE, right_works = TRUE; \
  237. for (i = 0; i<100; i++) \
  238. { get_a_random(type,type_bitsize,sample1); \
  239. for (shc = 0; shc < type_bitsize; shc++) \
  240. { sample2 = sample1 << shc; \
  241. for (j=0; j < type_bitsize; j++) \
  242. { if (!( ((sample2 & ((type)1<<j)) == 0) \
  243. == \
  244. (j < shc ? TRUE : ((sample1 & ((type)1<<(j-shc))) == 0)) \
  245. ) ) \
  246. { left_works = FALSE; } \
  247. } } } \
  248. for (i = 0; i<100; i++) \
  249. { get_a_random(type,type_bitsize,sample1); \
  250. for (shc = 0; shc < type_bitsize; shc++) \
  251. { sample2 = sample1 >> shc; \
  252. for (j=0; j < type_bitsize; j++) \
  253. { if (!( ((sample2 & ((type)1<<j)) == 0) \
  254. == \
  255. (j >= type_bitsize-shc ? TRUE : ((sample1 & ((type)1<<(j+shc))) == 0)) \
  256. ) ) \
  257. { right_works = FALSE; } \
  258. } } } \
  259. if (!left_works) \
  260. { printf("#error \"Left shift of integers of t%spe %s does not work!!\"\n","y",typestr); } \
  261. if (!right_works) \
  262. { printf("#error \"Right shift of integers of t%spe %s does not work!!\"\n","y",typestr); } \
  263. }
  264. #define test_integer_sshift(type,typestr,type_bitsize) \
  265. if (type_bitsize >= 0) \
  266. { int i,j,shc; \
  267. type sample1,sample2; \
  268. boolean left_works = TRUE, right_works = TRUE; \
  269. for (i = 0; i<100; i++) \
  270. { get_a_random(type,type_bitsize,sample1); \
  271. for (shc = 0; shc < type_bitsize; shc++) \
  272. { sample2 = sample1 << shc; \
  273. for (j=0; j < type_bitsize; j++) \
  274. { if (!( ((sample2 & ((type)1<<j)) == 0) \
  275. == \
  276. (j < shc ? TRUE : ((sample1 & ((type)1<<(j-shc))) == 0)) \
  277. ) ) \
  278. { left_works = FALSE; } \
  279. } } } \
  280. for (i = 0; i<100; i++) \
  281. { get_a_random(type,type_bitsize,sample1); \
  282. for (shc = 0; shc < type_bitsize; shc++) \
  283. { sample2 = sample1 >> shc; \
  284. for (j=0; j < type_bitsize; j++) \
  285. { if (!( ((sample2 & ((type)1<<j)) == 0) \
  286. == \
  287. ((sample1 & ((type)1<< (j+shc>=type_bitsize ? type_bitsize-1 : j+shc))) == 0) \
  288. ) ) \
  289. { right_works = FALSE; } \
  290. } } } \
  291. if (!left_works) \
  292. { printf("#error \"Left shift of integers of t%spe %s does not work!!\"\n","y",typestr); } \
  293. if (!right_works) \
  294. { printf("#error \"Right shift of integers of t%spe %s does not work!!\"\n","y",typestr); } \
  295. }
  296. test_integer_ushift(uchar,"unsigned char",uchar_bitsize);
  297. test_integer_ushift(ushort,"unsigned short",ushort_bitsize);
  298. test_integer_ushift(uint,"unsigned int",uint_bitsize);
  299. test_integer_ushift(ulong,"unsigned long",ulong_bitsize);
  300. #ifdef HAVE_LONGLONG
  301. test_integer_ushift(ulonglong,"unsigned long long",ulonglong_bitsize);
  302. #endif
  303. test_integer_sshift(schar,"char",char_bitsize);
  304. test_integer_sshift(short,"short",short_bitsize);
  305. test_integer_sshift(int,"int",int_bitsize);
  306. test_integer_sshift(long,"long",long_bitsize);
  307. #ifdef HAVE_LONGLONG
  308. test_integer_sshift(longlong,"long long",longlong_bitsize);
  309. #endif
  310. }
  311. void main5(void) {
  312. #define test_integer_casts(type1,type2,typestr1,typestr2,type1_bitsize,type2_bitsize,want) \
  313. if (type1_bitsize <= type2_bitsize) \
  314. { int i,j; \
  315. boolean modifies = FALSE; \
  316. boolean zero_extends = TRUE; \
  317. boolean sign_extends = TRUE; \
  318. for (i = 0; i<100; i++) \
  319. { type1 sample1; \
  320. type2 sample2; \
  321. get_a_random(type1,type1_bitsize,sample1); \
  322. sample2 = (type2)sample1; \
  323. if (!(sample1 == (type1)sample2)) { modifies = TRUE; } \
  324. for (j = 0; j<type1_bitsize; j++) \
  325. if (!( ((sample1 & ((type1)1<<j)) == 0) == ((sample2 & ((type2)1<<j)) == 0) )) \
  326. { zero_extends = FALSE; sign_extends = FALSE; } \
  327. for (j = type1_bitsize; j<type2_bitsize; j++) \
  328. if (!((sample2 & ((type2)1<<j)) == 0)) \
  329. { zero_extends = FALSE; } \
  330. for (j = type1_bitsize; j<type2_bitsize; j++) \
  331. if (!( ((sample1 & ((type1)1<<(type1_bitsize-1))) == 0) == ((sample2 & ((type2)1<<j)) == 0) )) \
  332. { sign_extends = FALSE; } \
  333. } \
  334. if (modifies) \
  335. printf("#error \"Casts: (%s)(%s)(x) == x does not hold for every %s x !!\"\n",typestr1,typestr2,typestr1); \
  336. if (zero_extends && sign_extends) \
  337. { if (!(type1_bitsize == type2_bitsize)) \
  338. printf("#error \"Casts from %s to %s works by identity!!\"\n",typestr1,typestr2); \
  339. } \
  340. if (zero_extends && !sign_extends) \
  341. { if ((type1_bitsize == type2_bitsize) || !(typestr1[0] == 'u') || !(want==1)) \
  342. printf("#error \"Casts from %s to %s works by zero-extend!!\"\n",typestr1,typestr2); \
  343. } \
  344. if (sign_extends && !zero_extends) \
  345. { if ((type1_bitsize == type2_bitsize) || (typestr1[0] == 'u') || !(want==2)) \
  346. printf("#error \"Casts from %s to %s works by sign-extend!!\"\n",typestr1,typestr2); \
  347. } \
  348. if (!sign_extends && !zero_extends) \
  349. printf("#error \"Casts from %s to %s works in an unknown manner!!\"\n",typestr1,typestr2); \
  350. }
  351. /* erst Casts zwischen Integers vermutlich gleicher Gr�e: */
  352. test_integer_casts(schar,uchar,"char","unsigned char",char_bitsize,uchar_bitsize,0);
  353. test_integer_casts(short,ushort,"short","unsigned short",short_bitsize,ushort_bitsize,0);
  354. test_integer_casts(int,uint,"int","unsigned int",int_bitsize,uint_bitsize,0);
  355. test_integer_casts(long,ulong,"long","unsigned long",long_bitsize,ulong_bitsize,0);
  356. test_integer_casts(uchar,schar,"unsigned char","char",uchar_bitsize,char_bitsize,0);
  357. test_integer_casts(ushort,short,"unsigned short","short",ushort_bitsize,short_bitsize,0);
  358. test_integer_casts(uint,int,"unsigned int","int",uint_bitsize,int_bitsize,0);
  359. test_integer_casts(ulong,long,"unsigned long","long",ulong_bitsize,long_bitsize,0);
  360. #ifdef HAVE_LONGLONG
  361. test_integer_casts(longlong,ulonglong,"long long","unsigned long long",longlong_bitsize,ulonglong_bitsize,0);
  362. test_integer_casts(ulonglong,longlong,"unsigned long long","long long",ulonglong_bitsize,longlong_bitsize,0);
  363. #endif
  364. /* dann Casts zwischen Integers unterschiedlicher Gr�e, aber gleichen Vorzeichens: */
  365. test_integer_casts(uchar,ushort,"unsigned char","unsigned short",uchar_bitsize,ushort_bitsize,1);
  366. test_integer_casts(uchar,uint,"unsigned char","unsigned int",uchar_bitsize,uint_bitsize,1);
  367. test_integer_casts(uchar,ulong,"unsigned char","unsigned long",uchar_bitsize,ulong_bitsize,1);
  368. test_integer_casts(ushort,uint,"unsigned short","unsigned int",ushort_bitsize,uint_bitsize,1);
  369. test_integer_casts(ushort,ulong,"unsigned short","unsigned long",ushort_bitsize,ulong_bitsize,1);
  370. test_integer_casts(uint,ulong,"unsigned int","unsigned long",uint_bitsize,ulong_bitsize,1);
  371. #ifdef HAVE_LONGLONG
  372. test_integer_casts(uchar,ulonglong,"unsigned char","unsigned long long",uchar_bitsize,ulonglong_bitsize,1);
  373. test_integer_casts(ushort,ulonglong,"unsigned short","unsigned long long",ushort_bitsize,ulonglong_bitsize,1);
  374. test_integer_casts(uint,ulonglong,"unsigned int","unsigned long long",uint_bitsize,ulonglong_bitsize,1);
  375. test_integer_casts(ulong,ulonglong,"unsigned long","unsigned long long",ulong_bitsize,ulonglong_bitsize,1);
  376. #endif
  377. test_integer_casts(schar,short,"char","short",char_bitsize,short_bitsize,2);
  378. test_integer_casts(schar,int,"char","int",char_bitsize,int_bitsize,2);
  379. test_integer_casts(schar,long,"char","long",char_bitsize,long_bitsize,2);
  380. test_integer_casts(short,int,"short","int",short_bitsize,int_bitsize,2);
  381. test_integer_casts(short,long,"short","long",short_bitsize,long_bitsize,2);
  382. test_integer_casts(int,long,"int","long",int_bitsize,long_bitsize,2);
  383. #ifdef HAVE_LONGLONG
  384. test_integer_casts(schar,longlong,"char","long long",char_bitsize,longlong_bitsize,2);
  385. test_integer_casts(short,longlong,"short","long long",short_bitsize,longlong_bitsize,2);
  386. test_integer_casts(int,longlong,"int","long long",int_bitsize,longlong_bitsize,2);
  387. test_integer_casts(long,longlong,"long","long long",long_bitsize,longlong_bitsize,2);
  388. #endif
  389. /* dann Casts zwischen Integers unterschiedlicher Gr�e und unterschiedlichen Vorzeichens: */
  390. test_integer_casts(uchar,short,"unsigned char","short",uchar_bitsize,short_bitsize,1);
  391. test_integer_casts(uchar,int,"unsigned char","int",uchar_bitsize,int_bitsize,1);
  392. test_integer_casts(uchar,long,"unsigned char","long",uchar_bitsize,long_bitsize,1);
  393. test_integer_casts(ushort,int,"unsigned short","int",ushort_bitsize,int_bitsize,1);
  394. test_integer_casts(ushort,long,"unsigned short","long",ushort_bitsize,long_bitsize,1);
  395. test_integer_casts(uint,long,"unsigned int","long",uint_bitsize,long_bitsize,1);
  396. #ifdef HAVE_LONGLONG
  397. test_integer_casts(uchar,longlong,"unsigned char","long long",uchar_bitsize,longlong_bitsize,1);
  398. test_integer_casts(ushort,longlong,"unsigned short","long long",ushort_bitsize,longlong_bitsize,1);
  399. test_integer_casts(uint,longlong,"unsigned int","long long",uint_bitsize,longlong_bitsize,1);
  400. test_integer_casts(ulong,longlong,"unsigned long","long long",ulong_bitsize,longlong_bitsize,1);
  401. #endif
  402. test_integer_casts(schar,ushort,"char","unsigned short",char_bitsize,ushort_bitsize,2);
  403. test_integer_casts(schar,uint,"char","unsigned int",char_bitsize,uint_bitsize,2);
  404. test_integer_casts(schar,ulong,"char","unsigned long",char_bitsize,ulong_bitsize,2);
  405. test_integer_casts(short,uint,"short","unsigned int",short_bitsize,uint_bitsize,2);
  406. test_integer_casts(short,ulong,"short","unsigned long",short_bitsize,ulong_bitsize,2);
  407. test_integer_casts(int,ulong,"int","unsigned long",int_bitsize,ulong_bitsize,2);
  408. #ifdef HAVE_LONGLONG
  409. test_integer_casts(schar,ulonglong,"char","unsigned long long",char_bitsize,ulonglong_bitsize,2);
  410. test_integer_casts(short,ulonglong,"short","unsigned long long",short_bitsize,ulonglong_bitsize,2);
  411. test_integer_casts(int,ulonglong,"int","unsigned long long",int_bitsize,ulonglong_bitsize,2);
  412. test_integer_casts(long,ulonglong,"long","unsigned long long",long_bitsize,ulonglong_bitsize,2);
  413. #endif
  414. }
  415. void main6(void) {
  416. #define check_sizeof_pointer(type,typestr) \
  417. { if (!(sizeof(type) <= sizeof(long))) \
  418. printf("#error \"Type %s does not fit into a long!!\"\n",typestr); \
  419. }
  420. check_sizeof_pointer(char*,"char *");
  421. check_sizeof_pointer(long*,"long *");
  422. check_sizeof_pointer(function*,"function *");
  423. pointer_bitsize = char_bitsize * sizeof(char*);
  424. printf("/* Pointers of t%spe %s have %ld bits. */\n","y","char *",(long)pointer_bitsize);
  425. printf("#define pointer_bitsize %ld\n",(long)pointer_bitsize);
  426. printf("\n");
  427. }
  428. void main7(void) {
  429. #define test_pointer_casts(type1,type2,typestr1,typestr2) \
  430. if (!(sizeof(type1) == sizeof(type2))) \
  431. { printf("#error \"Pointer types %s and %s have different sizes!!\"\n",typestr1,typestr2); } \
  432. else \
  433. { int i; \
  434. ulong differences1 = 0, differences2 = 0; \
  435. for (i = 0; i<100; i++) \
  436. { ulong sample; \
  437. type1 sample1; \
  438. type2 sample2; \
  439. get_a_random(ulong,ulong_bitsize,sample); \
  440. sample1 = (type1)sample; \
  441. sample2 = (type2)sample; \
  442. differences1 |= ((ulong)sample1 ^ (ulong)(type1)(sample2)); \
  443. differences2 |= ((ulong)sample2 ^ (ulong)(type2)(sample1)); \
  444. } \
  445. if (differences1==0) \
  446. printf("/* Casts from %s to %s is OK (does nothing). */\n",typestr2,typestr1); \
  447. else \
  448. if (differences1 == ~(ulong)0) \
  449. printf("#error \"Casts from %s to %s work in an unknown way!!\"\n",typestr2,typestr1); \
  450. else \
  451. printf("#error \"Casts from %s to %s modify part 0x%8lX of pointer!!\"\n",typestr2,typestr1,differences1); \
  452. if (differences2==0) \
  453. printf("/* Casts from %s to %s is OK (does nothing). */\n",typestr1,typestr2); \
  454. else \
  455. if (differences2 == ~(ulong)0) \
  456. printf("#error \"Casts from %s to %s work in an unknown way!!\"\n",typestr1,typestr2); \
  457. else \
  458. printf("#error \"Casts from %s to %s modify part 0x%8lX of pointer!!\"\n",typestr1,typestr2,differences2); \
  459. }
  460. test_pointer_casts(char*,long*,"char *","long *");
  461. test_pointer_casts(char*,function*,"char *","function *");
  462. printf("\n");
  463. }
  464. void main8(void) {
  465. /* The following macro works only in C, not in C++, because C++ restricts the
  466. use of NULL pointers and also because C++ forbids defining types within a
  467. cast. */
  468. #define alignmentof(type) \
  469. (int)(&((struct { char dummy1; type dummy2; } *)0)->dummy2)
  470. #define get_alignment(type,typestr) \
  471. { struct { char dummy1; type dummy2; } dummy; \
  472. long alignment = (char*)&dummy.dummy2 - (char*)&dummy; \
  473. printf("/* Type %s has sizeof = %ld and alignment = %ld. */\n",typestr,(long)sizeof(type),alignment); \
  474. if (!(typestr[0] == 'u') && !(typestr[string_length(typestr)-1] == '*')) \
  475. { printf("#define sizeof_"); printf_underscored(typestr); printf(" %ld\n",(long)sizeof(type)); \
  476. printf("#define alignment_"); printf_underscored(typestr); printf(" %ld\n",alignment); \
  477. } \
  478. if (!((alignment & (alignment-1)) == 0)) \
  479. printf("#error \"The alignment %ld of t%spe %s is not a power of two!!\"\n",alignment,"y",typestr); \
  480. printf("\n"); \
  481. }
  482. get_alignment(char,"char"); get_alignment(uchar,"unsigned char");
  483. get_alignment(short,"short"); get_alignment(ushort,"unsigned short");
  484. get_alignment(int,"int"); get_alignment(uint,"unsigned int");
  485. get_alignment(long,"long"); get_alignment(ulong,"unsigned long");
  486. #ifdef HAVE_LONGLONG
  487. get_alignment(longlong,"long long"); get_alignment(ulonglong,"unsigned long long");
  488. #endif
  489. get_alignment(float,"float");
  490. get_alignment(double,"double");
  491. get_alignment(char*,"char *");
  492. get_alignment(long*,"long *");
  493. get_alignment(function*,"function *");
  494. }
  495. void main9(void) {
  496. #define get_endian(type,typestr,type_bitsize) \
  497. { if (type_bitsize == uchar_bitsize * sizeof(type)) \
  498. { auto union { uchar einzeln[sizeof(type)]; type gesamt; } x; \
  499. int i,j; \
  500. boolean big_endian = TRUE; \
  501. boolean little_endian = TRUE; \
  502. for (i = 0; i<100; i++) \
  503. { type sample; \
  504. get_a_random(type,type_bitsize,sample); \
  505. x.gesamt = sample; \
  506. for (j = 0; j<sizeof(type); j++, sample >>= uchar_bitsize) \
  507. { if (!( (sample & (((type)1<<uchar_bitsize)-1)) == x.einzeln[j] )) \
  508. { little_endian = FALSE; } \
  509. if (!( (sample & (((type)1<<uchar_bitsize)-1)) == x.einzeln[sizeof(type)-1-j] )) \
  510. { big_endian = FALSE; } \
  511. } } \
  512. if (big_endian && little_endian) \
  513. { if (!(sizeof(type) == 1)) \
  514. printf("#error \"Endianness of t%spe %s in memory doesn't matter.\"\n","y",typestr); } \
  515. if (big_endian && !little_endian) \
  516. { printf("/* Type %s is stored BIG-ENDIAN in memory (i.e. like mc68000 or sparc). */\n",typestr); \
  517. printf("#define "); printf_underscored(&typestr[9]); printf("_big_endian\n"); \
  518. } \
  519. if (little_endian && !big_endian) \
  520. { printf("/* Type %s is stored LITTLE-ENDIAN in memory (i.e. like Z80 or VAX). */\n",typestr); \
  521. printf("#define "); printf_underscored(&typestr[9]); printf("_little_endian\n"); \
  522. } \
  523. if (!big_endian && !little_endian) \
  524. { printf("#error \"Type %s is stored in memory in an obscure manner!!\"\n",typestr); } \
  525. } \
  526. else \
  527. { printf("#error \"Endianness makes no sense for t%spe %s !!\"\n","y",typestr); } \
  528. }
  529. get_endian(uchar,"unsigned char",uchar_bitsize);
  530. get_endian(ushort,"unsigned short",ushort_bitsize);
  531. get_endian(uint,"unsigned int",uint_bitsize);
  532. get_endian(ulong,"unsigned long",ulong_bitsize);
  533. #ifdef HAVE_LONGLONG
  534. get_endian(ulonglong,"unsigned long long",ulonglong_bitsize);
  535. #endif
  536. printf("\n");
  537. }
  538. long get_stack_direction(void)
  539. { auto char dummy;
  540. static char* dummyaddr = (char*)0;
  541. if (!(dummyaddr == (char*)0))
  542. { return (&dummy) - dummyaddr; }
  543. else
  544. { dummyaddr = &dummy;
  545. { long result = get_stack_direction();
  546. /* The next assignment avoids tail recursion elimination (IRIX 6.4 CC). */
  547. dummyaddr = (char*)0;
  548. return result;
  549. } }
  550. }
  551. void main10(void)
  552. { long stack_direction = get_stack_direction();
  553. if (stack_direction > 0)
  554. { printf("/* Stack grows up, ca. %ld bytes per function call. */\n",(long)stack_direction);
  555. printf("#define stack_grows_up\n");
  556. }
  557. else if (stack_direction < 0)
  558. { printf("/* Stack grows down, ca. %ld bytes per function call. */\n",-(long)stack_direction);
  559. printf("#define stack_grows_down\n");
  560. }
  561. else
  562. printf("#error \"Unknown stack model -- incorrect C semantics!!\"\n");
  563. }
  564. int main()
  565. { main1();
  566. main2();
  567. main3();
  568. main4();
  569. main5();
  570. main6();
  571. main7();
  572. main8();
  573. main9();
  574. main10();
  575. if (ferror(stdout)) return 1;
  576. return 0;
  577. }