diff tests/mpp/misc.c @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/mpp/misc.c	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,617 @@
+////////////////////////////////////////////////////////////
+... line splicing
+
+he\
+llo
+
+/\
+/ comment
+
+//\
+comment
+
+#define SPLIT splat
+SPL\
+IT
+
+int c = '\0\
+12';
+const char *x = "blah \0\
+12";
+
+////////////////////////////////////////////////////////////
+... digraphs
+
+#define DI_STR(x) %:x
+#define DI_CAT(x,y) x %:%: y
+
+DI_STR(hi)
+DI_CAT(fu,bar)
+
+DI_STR(<:)
+DI_STR(:>)
+DI_STR(<%)
+DI_STR(%>)
+DI_STR(%:)
+
+#define HASH %:
+#define HASHHASH %:%:
+HASH
+HASHHASH
+
+%:define FOO 123
+#ifdef FOO
+right
+#else
+wrong
+#endif
+%:undef FOO
+#ifdef FOO
+wrong
+#else
+right
+#endif
+
+////////////////////////////////////////////////////////////
+... comments
+
+a /**// b;
+
+a = b//*q*/ blah
+- c;
+
+#define CAT(x,y) x ## y
+#define CAT2(x,y) CAT(x,y)
+
+CAT(/,*) not comment CAT(*,/)
+CAT(/,/) not comment
+
+<a/*comment*/b>
+
+/* comment /* comment */
+not comment
+
+#define CM stuff // comment
+CM staff
+(should be stuff staff on one line)
+
+#define CMM stuff /* comment */
+CMM staff
+(should be stuff staff on one line)
+
+////////////////////////////////////////////////////////////
+... conditionals
+
+#if 0
+wrong
+#elif 1
+right
+#else
+wrong
+#endif
+
+#if NOTDEF
+wrong
+#else
+right
+#endif
+
+#if NOTDEF
+wrong
+#elif NOTDEF
+wrong
+#elif NOTDEF2
+wrong
+#elif 1
+right
+#endif
+
+#if 0
+#if 1
+wrong
+#else
+wrong
+#endif
+#if 0
+wrong
+#else
+wrong
+#endif
+#elif 1
+right
+#if 1
+right
+#else
+wrong
+#endif
+#if 0
+wrong
+#else
+right
+#endif
+#elif 1
+wrong
+#else
+wrong
+#endif
+
+#if /*blah*/ 1 /*boo*/
+right
+#else /* bar */
+wrong
+#endif /* baz */
+
+#ifdef NOTDEF
+wrong
+#else
+right
+#endif
+
+#ifndef NOTDEF
+right
+#else
+wrong
+#endif
+
+#define TWO 2
+#if TWO > 1
+right
+#else
+wrong
+#endif
+
+#if defined(TWO)
+right
+#else
+wrong
+#endif
+
+#if defined TWO 
+right
+#else
+wrong
+#endif
+
+#if defined(THREE)
+wrong
+#else
+right
+#endif
+
+#if defined THREE 
+wrong
+#else
+right
+#endif
+
+#if defined(defined)
+wrong
+#else
+right
+#endif
+
+defined(TWO) should have a 2 in it
+defined(THREE) should not be changed
+
+#define SUCC(x) x+1
+
+#if SUCC(1) == 2
+right
+#else
+wrong
+#endif
+
+#if TWO == 2
+right
+#else
+wrong
+#endif
+
+#if TWO + NOTDEF == 2
+right
+#else
+wrong
+#endif
+
+#if SUCC(TWO + NOTDEF * 12574) == 3
+right
+#else
+wrong
+#endif
+
+#if SUCC(TWO + '0') == '3'
+right
+#else
+wrong
+#endif
+
+#if 'A'
+right
+#else
+wrong
+#endif
+
+#if '\0'
+wrong
+#else
+right
+#endif
+
+#if '\007' == 7
+right
+#else
+wrong
+#endif
+
+#if defined TWO + 3 == 4
+right
+#else
+wrong
+#endif
+
+#if defined NOTDEF * 5
+wrong
+#else
+right
+#endif
+
+#undef TWO
+#if defined(TWO)
+wrong
+#else
+right
+#endif
+
+#if 1
+#elif NOTDEF(1)
+#endif
+
+#if 0
+#if NOTDEF(1)
+#endif
+#endif
+
+////////////////////////////////////////////////////////////
+... definitions
+
+#define AA aa
+#define BB() bb
+#define CC(x) x cc
+/* put these back in when/if varargs macros are supported */
+/*#define DD(...) dd*/
+/*#define EE(x, ...) x ee*/
+
+AA
+/*BB*/
+/*CC*/
+DD
+EE
+
+AA()
+BB()
+/*CC()*/
+DD()
+DD(,)
+EE(,)
+DD(,,)
+EE(,,)
+
+#undef AA
+#undef BB
+#undef CC
+#undef DD
+#undef EE
+
+/*
+#define FF(x, ...) __VA_ARGS__ x
+FF(ff, )
+FF(ff, a)
+FF(ff, a, b)
+FF(ff, a, b, c)
+FF(ff, a, b, c, d)
+*/
+
+#undef FF
+
+#define define fedine
+#define undef dunef
+#define ifndef difnef
+#define GG gg
+GG should be gg
+#ifdef GG
+right
+#else
+wrong
+#endif
+define should be fedine
+undef should be dunef
+ifndef should be difnef
+
+#ifdef define
+right
+#else
+wrong
+#endif
+
+#ifdef undef
+right
+#else
+wrong
+#endif
+
+#ifdef ifndef
+right
+#else
+wrong
+#endif
+
+#ifndef ifndef
+wrong
+#else
+right
+#endif
+
+#undef define
+#undef undef
+#undef ifndef
+
+#ifdef define
+wrong
+#else
+right
+#endif
+
+#ifdef undef
+wrong
+#else
+right
+#endif
+
+#ifdef ifndef
+wrong
+#else
+right
+#endif
+
+#define HH(a,b,c) a b c
+HH((1,2),(3,4),(5,6))
+/*
+HH(1,
+2,
+3
+)
+HH(4,
+     5,
+       6)
+*/
+#undef HH
+
+#define SUM(a,b) a + b
+#define CALL(x) x(1,2)
+CALL(SUM) should be 1+2
+
+#if CALL(SUM) == 3
+right
+#else
+wrong
+#endif
+
+#define ADD SUM
+ADD(1,ADD(2,3))  should be 1+2+3
+
+/*
+#define RECURSE RECURSE
+RECURSE
+*/
+
+/*
+#define CROSSRECURSE1(x) x CROSSRECURSE2(1)
+#define CROSSRECURSE2(x) x CROSSRECURSE1(2)
+CROSSRECURSE1(0)
+CROSSRECURSE2(0)
+*/
+
+#define TWO two
+#define ADDTWO(x) TWO + x
+#undef TWO
+ADDTWO(1) should be two + 1
+
+... legal redefinitions
+#define ZERO (1-1)
+#define ZERO /* foo */ (1-1) /* bar */
+#define IDENTITY(x)  ( x )
+#define IDENTITY(x)  ( /* foo */ x )
+
+
+////////////////////////////////////////////////////////////
+... stringize
+
+#define STR(x) #x
+#define STR2(x) STR(x)
+
+#define STRY(x, y) #y
+/* these should be using STRY not STR, but that doesn't work */
+#if 0
+STRY(, a b c)  should be "a b c"
+STRY(,   a   b   c)  should be "a b c"
+STRY(, "stry\n") should be "\"stry\\n\""
+STRY(, )  should be ""
+STRY(,)  should be ""
+STRY(, /*woodle*/ b)  should be "b"
+STRY(, a/*noodle*/b)  should be "a b"
+STRY(, a /*boodle*/ b) should be "a b"
+#endif
+STR( a b c)  should be "a b c"
+STR(   a   b   c)  should be "a b c"
+STR( "stry\n") should be "\"stry\\n\""
+/*
+STR( )  should be ""
+STR()  should be ""
+*/
+STR( /*woodle*/ b)  should be "b"
+STR( a/*noodle*/b)  should be "a b"
+STR( a /*boodle*/ b) should be "a b"
+
+#define GRACKLE(x) STR(x(1,2))
+GRACKLE(SUM)  should give "SUM(1,2)", not "1+2"
+STR2(SUM)(3,4) should give "SUM"(3,4), not "3+4"
+
+#if 0 /* broken */
+STR(/*comment*/) should be ""
+#endif
+
+////////////////////////////////////////////////////////////
+... concat
+
+#define HASHES # ## #
+#define YY(x,y) STR(x H y)
+#define ZZ(x,y) STR2(x H y)
+
+YY(1,2)  should be "1 H 2"
+ZZ(1,2)  should be "1 ## 2"
+
+... pasting of punctuation is not allowed
+CAT(+,+)
+CAT(-,-)
+CAT(<<,=)
+CAT(>>,=)
+CAT(<,<=)
+CAT(>,>=)
+CAT(<,>=)
+CAT(<,CAT(<,=))
+CAT(>,CAT(>,=))
+
+CAT2(+,+)
+CAT2(-,-)
+CAT2(<<,=)
+CAT2(>>,=)
+CAT2(<,<=)
+CAT2(>,>=)
+CAT2(<,>=)
+CAT2(<,CAT2(<,=))
+CAT2(>,CAT2(>,=))
+
+#define ONEHUNDRED 100
+CAT(ONE, HUNDRED) should be 100
+
+#define BASTET "bast"
+#define ET ET "et"
+
+CAT(BAST,ET)  ---> "bast"
+/*
+CAT2(BAST,ET)  ---> "bast" "et"
+*/
+
+#undef BASTET
+#undef ET
+
+#define KLUDGE KLU
+CAT2(KLUDGE, DGE) should be "KLU"
+#undef KLUDGE
+#define KLUDGE HACK KLUDGE
+/*
+CAT2(KLUDGE, ) should be "HACK KLUDGE" not "HACK HACK KLUDGE"
+*/
+
+#define CATE(x) x ## // comment
+CATE(10)
+#if 0
+#define ECAT(x) /* comment */ ## x
+ECAT(20)
+#endif
+
+/*
+#define CATVA(x, ...) x ## __VA_ARGS__
+CATVA(z,y,z)  should be zy,x
+*/
+
+CAT(IDENTITY,IDENTITY(z))  should be IDENTITYIDENTITY(z)
+CAT2(IDENTITY,IDENTITY(z))  should be IDENTITYz
+
+CAT(1, /*comment*/ 2)  should be 12
+
+////////////////////////////////////////////////////////////
+... directive recognition
+
+#define EMPTY
+
+/*
+EMPTY #error wrong
+EMPTY #define SHOULDNT bad
+#ifdef SHOULDNT
+wrong
+#else
+wrong
+#endif
+*/
+
+#   define SHOULD1 good
+#ifdef SHOULD1
+right
+#else
+wrong
+#endif
+
+   #define SHOULD2 good
+#ifdef SHOULD2
+right
+#else
+wrong
+#endif
+
+   #   define SHOULD3 good
+#ifdef SHOULD3
+right
+#else
+wrong
+#endif
+
+/*comment*/ #define SHOULD4 good
+#ifdef SHOULD4
+right
+#else
+wrong
+#endif
+
+/*
+#define DEFINE #define FOO foo
+DEFINE
+#ifdef FOO
+wrong
+#else
+right
+#endif
+*/
+
+/*
+#define INCLUDE #include "nosuchfile.h"
+INCLUDE
+*/
+
+/*
+#define ERROR #error wrong
+ERROR
+*/
+
+////////////////////////////////////////////////////////////
+... keywords
+
+#define register 1
+#define int +
+#define e 3
+#if register int e == 4
+right
+#else
+wrong
+#endif
+
+#undef register
+#undef int
+#undef e
+
+////////////////////////////////////////////////////////////
+... builtin macros
+
+__STDC__   should be 1
+__STDC_VERSION__  should be a date
+