0200-cpp.c - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
       0200-cpp.c (1291B)
       ---
            1 /* taken from ISO/IEC 9899:1999 Section 6.10.3.5 p6 */
            2 
            3 #define str(s)      # s
            4 #define xstr(s)     str(s)
            5 #define debug(s, t) test1("x" # s "= %d, x" # t "= %d", \
            6                   x ## s, x ## t)
            7 #define INCFILE(n) vers ## n
            8 #define vers2      0200-cpp
            9 #define glue(a, b) a ## b
           10 #define xglue(a, b) glue(a, b)
           11 #define HIGHLOW     "hello"
           12 #define LOW         LOW ", world"
           13 
           14 int
           15 test1(char *s, int x, int y)
           16 {
           17         int i;
           18 
           19         for (i = 0; s[i]; i++) {
           20                 if (s[i] != "x1= %d, x2= %d"[i])
           21                         return 0;
           22         }
           23         if (x + y != 3)
           24                 return 0;
           25         return 1;
           26 }
           27 
           28 int
           29 test2(char *s1, char *s2)
           30 {
           31         int i;
           32 
           33         for (i = 0; s1[i]; i++) {
           34                 if (s1[i] != s2[i])
           35                         return 0;
           36         }
           37         return s1[i] == '\0' && s2[i] == '\0';
           38 }
           39 
           40 int
           41 test4(char *s)
           42 {
           43         int i;
           44 
           45         for (i = 0; s[i]; i++) {
           46                 if (s[i] != "hello"[i])
           47                         return 0;
           48         }
           49 
           50         return 1;
           51 }
           52 
           53 int
           54 test5(char *s)
           55 {
           56         int i;
           57 
           58         for (i = 0; s[i]; i++) {
           59                 if (s[i] != "hello, world"[i])
           60                         return 0;
           61         }
           62 
           63         return 1;
           64 }
           65 
           66 int
           67 main()
           68 {
           69         int x1 = 1, x2 = 2;
           70         char *s = "strncmp(\"abc\\0d\", \"abc\", '\\4') == 0: @\n";
           71 
           72         if (!debug(1, 2))
           73                 return 1;
           74 
           75         if (!test2(str(strncmp("abc\0d", "abc", '\4') // this goes away
           76 == 0) str(: @\n), s))
           77                 return 2;
           78 
           79 #include xstr(INCFILE(2).h)
           80 
           81         if (x != 2)
           82                 return 3;
           83 
           84         if (!test4(glue(HIGH, LOW)))
           85                 return 4;
           86 
           87         if (!test5(xglue(HIGH, LOW)))
           88                 return 5;
           89 
           90         return 0;
           91 }