Home
       0006-limits.c - scc - simple c99 compiler
  HTML git clone git://git.simple-cc.org/scc
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
       0006-limits.c (4279B)
       ---
            1 #include <limits.h>
            2 #include <stdio.h>
            3 
            4 /*
            5  * This test assumes that CHAR_BIT is the size of every
            6  * unit returned by sizeof. It also assumes 2 complement.
            7  */
            8 
            9 /*
           10 output:
           11 test1
           12 test2
           13 test3
           14 end:
           15 */
           16 
           17 void
           18 test1()
           19 {
           20         puts("test1");
           21 
           22         if (CHAR_BIT < 8 ||
           23             CHAR_MAX < 127 || CHAR_MIN > 0 ||
           24             CHAR_MAX != SCHAR_MAX && CHAR_MAX != UCHAR_MAX)
           25                 puts("wrong char definition");
           26 
           27         if (SCHAR_MAX < 127 || CHAR_MIN > -127)
           28                 puts("wrong signed char definition");
           29 
           30         if (UCHAR_MAX < 255 || UCHAR_MAX <= 0)
           31                 puts("wrong unsigned char definition");
           32 
           33         if (SHRT_MAX < 32767 ||
           34             SHRT_MIN > -32767 ||
           35             USHRT_MAX < 65535 || USHRT_MAX <= 0)
           36                 puts("wrong short definition");
           37 
           38         if (INT_MAX < 32767 ||
           39             INT_MIN > -32767 ||
           40             UINT_MAX < 65535 || UINT_MAX <= 0 ||
           41             INT_MAX < SCHAR_MAX || INT_MIN > SCHAR_MIN ||
           42             UINT_MAX < UCHAR_MAX ||
           43             INT_MAX < SHRT_MAX || INT_MIN > SHRT_MIN ||
           44             UINT_MAX < USHRT_MAX)
           45                 puts("wrong int definition");
           46 
           47         if (LONG_MAX < 2147483647 ||
           48             LONG_MIN > -2147483647 ||
           49             ULONG_MAX < 4294967295 || ULONG_MAX <= 0 ||
           50             LONG_MAX < SCHAR_MAX || LONG_MIN > SCHAR_MIN ||
           51             ULONG_MAX < UCHAR_MAX ||
           52             LONG_MAX < SHRT_MAX || LONG_MIN > SHRT_MIN ||
           53             ULONG_MAX < USHRT_MAX ||
           54             LONG_MAX < INT_MAX || LONG_MIN > INT_MIN ||
           55             ULONG_MAX < UINT_MAX)
           56                 puts("wrong long definition");
           57 
           58         if (LONG_MAX < 9223372036854775807 ||
           59             LONG_MIN > -9223372036854775807 ||
           60             ULONG_MAX < 18446744073709551615 || ULONG_MAX <= 0 ||
           61             LONG_MAX < SCHAR_MAX || LONG_MIN > SCHAR_MIN ||
           62             ULONG_MAX < UCHAR_MAX ||
           63             LONG_MAX < SHRT_MAX || LONG_MIN > SHRT_MIN ||
           64             ULONG_MAX < USHRT_MAX ||
           65             LONG_MAX < LONG_MAX || LONG_MIN > LONG_MIN ||
           66             ULONG_MAX < ULONG_MAX)
           67                 puts("wrong long definition");
           68 
           69         if (LLONG_MAX < 9223372036854775807 ||
           70             LLONG_MIN > -9223372036854775807 ||
           71             ULLONG_MAX < 18446744073709551615 || ULLONG_MAX <= 0 ||
           72             LLONG_MAX < SCHAR_MAX || LLONG_MIN > SCHAR_MIN ||
           73             ULLONG_MAX < UCHAR_MAX ||
           74             LLONG_MAX < SHRT_MAX || LLONG_MIN > SHRT_MIN ||
           75             ULLONG_MAX < USHRT_MAX ||
           76             LLONG_MAX < LONG_MAX || LLONG_MIN > LONG_MIN ||
           77             ULLONG_MAX < ULONG_MAX)
           78                 puts("wrong long long definition");
           79 
           80         if (MB_LEN_MAX < sizeof(char))
           81                 puts("wrong value for MB_LEN_MAX");
           82 }
           83 
           84 
           85 void
           86 test2()
           87 {
           88         char c;
           89         int i;
           90 
           91         puts("test2");
           92         if ('\xff' > 0) {
           93                 for (c = i = 0; i < CHAR_BIT; i++) {
           94                         c <<= 1;
           95                         c |= 1;
           96                 }
           97                 if (c != CHAR_MAX)
           98                         printf("wrong char max %d-%d", c, CHAR_MAX);
           99                 if (CHAR_MIN != 0)
          100                         printf("wrong char min %d-%d", c, CHAR_MIN);
          101         } else {
          102                 for (c = i = 0; i < CHAR_BIT -1; i++) {
          103                         c <<= 1;
          104                         c |= 1;
          105                 }
          106                 if (c != CHAR_MAX)
          107                         printf("wrong char max %d-%d", c, CHAR_MAX);
          108                 c = -c - 1;
          109                 if (c != CHAR_MIN)
          110                         printf("wrong char min %d-%d", c, CHAR_MIN);
          111         }
          112 }
          113 
          114 #define SMAX(t) for (t = n = 0; n < sizeof(t)*CHAR_BIT -1; n++) {t <<= 1; t |= 1;}
          115 #define UMAX(t) for (t = n = 0; n < sizeof(t)*CHAR_BIT; n++) {t <<= 1; t |= 1;}
          116 
          117 void
          118 test3()
          119 {
          120         signed char sc;
          121         unsigned char uc;
          122         int i, n;
          123         unsigned u;
          124         long l;
          125         unsigned long ul;
          126         long long ll;
          127         unsigned long long ull;
          128 
          129         puts("test3");
          130         SMAX(sc);
          131         if (sc != SCHAR_MAX)
          132                 printf("wrong signed char max %d %d\n", sc, SCHAR_MAX);
          133         sc = -sc - 1;
          134         if (sc != SCHAR_MIN)
          135                 printf("wrong signed char min %d %d\n", sc, SCHAR_MIN);
          136 
          137         UMAX(uc);
          138         if (uc != UCHAR_MAX)
          139                 printf("wrong unsigned char max %u %u", uc, UCHAR_MAX);
          140 
          141         SMAX(i);
          142         if (i != INT_MAX)
          143                 printf("wrong int max %d %d\n", i, INT_MAX);
          144         i = -i - 1;
          145         if (i != INT_MIN)
          146                 printf("wrong int min %d %d\n", i, INT_MIN);
          147 
          148         UMAX(u);
          149         if (u != UINT_MAX)
          150                 printf("wrong unsigned int max %u %u\n", u, UINT_MAX);
          151 
          152         SMAX(l);
          153         if (l != LONG_MAX)
          154                 printf("wrong long max %ld %ld\n", l, (long) LONG_MAX);
          155         l = -l - 1;
          156         if (l != LONG_MIN)
          157                 printf("wrong long max %ld %ld\n", l, (long) LONG_MIN);
          158 
          159         UMAX(ul);
          160         if (ul != ULONG_MAX)
          161                 printf("wrong int max %lu %lu\n", ul, (unsigned long) ULONG_MAX);
          162 
          163         SMAX(ll);
          164         if (ll != LLONG_MAX)
          165                 printf("wrong llong max %lld %lld\n", ll, (long long) LLONG_MAX);
          166         ll = -ll - 1;
          167         if (ll != LLONG_MIN)
          168                 printf("wrong llong min %lld %lld\n", ll, (long long) LLONG_MIN);
          169 
          170         UMAX(ull);
          171         if (ull != ULLONG_MAX)
          172                 printf("wrong ullong max %llu %llu\n", ull, (unsigned long long) ULLONG_MAX);
          173 }
          174 
          175 int
          176 main()
          177 {
          178         test1();
          179         test2();
          180         test3();
          181 
          182         return 0;
          183 }