Alessandro Bonazzi e075990ed3 Patch level : 12.0 no-patch
Files correlati     :
Commento            :

Aggiunto il preprocessore c++ mcpp per sostituire il compilatore nella compilazione delle maschere.
2020-11-28 16:24:08 +01:00

402 lines
8.6 KiB
Raku
Raw Blame History

/*
* M I S C . T
* 1998/08 Made public. kmatsui
* 2003/11 Slightly revised. kmatsui
* 2004/11 Split samples for "Reiser cpp" as "trad.t".
* Removed duplicate samples with other testcases.
* kmatsui
*
* Miscellaneous texts for test of preprocessor.
*
* PART 1, 2 are excerpts from
* ISO C 6.8.3 "Examples"
* Some other examples are excerpted from :
* P.J.Plauger "The Standard C Library",
* GCC "cpp.info"
*/
/*
* PART 1
* Weird tests of macro rescan.
*/
#define x 3
#define f(a) f(x * (a))
#undef x
#define x 2
#define g f
#define z z[0]
#define h g(~
#define m(a) a(w)
#define w 0,1
#define t(a) a
rescan()
{
/* f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
*
* should expand to:
*
* f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1);
*/
f(y+1) + f(f(z)) % t(t(g)(0) + t)(1);
/* g(x+(3,4)-w) | h 5) & m
* (f)^m(m);
*
* should result in:
*
* f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) & f(2 * (0,1))^m(0,1);
*/
g(x+(3,4)-w) | h 5) & m
(f)^m(m);
}
/*
* PART 2
* Tests of creating string literal and concatenation of tokens.
*/
#define str(s) # s
#define xstr(s) str(s)
#define debug(s,t) printf("x" # s "= %d, x" # t "= %s", \
x ## s, x ## t)
#define INCFILE(n) vers ## n /* comment */
#define glue(a, b) a ## b
#define xglue(a, b) glue(a, b)
#define HIGHLOW "hello"
#define LOW LOW ", world"
stringize()
{
/* debug(1, 2);
*
* should result in:
*
* printf("x" "1" "= %d, x" "2" "= %s", x1, x2);
*
* after concatenation of the character string literals:
*
* printf("x1= %d, x2= %s", x1, x2);
*/
debug(1, 2);
/* fputs(str(strncmp("abc\0d", "abc", '\4')
* == 0) str(: @\n), s);
*
* should result in:
*
* fputs("strncmp(\"abc\\0d\", \"abc\", '\\4') == 0" ": @\n", s);
*
* after concatenation of the character string literals (exactly, the each
* escape sequences are converted to a corresponding character prior to the
* concatenation):
*
* fputs("strncmp(\"abc\\0d\", \"abc\", '\\4') == 0: @\n", s);
*/
fputs(str(strncmp("abc\0d", "abc", '\4') /* this goes away */
== 0) str(: @\n), s);
/* glue(HIGH, LOW);
*
* should result in:
*
* "hello";
*/
glue(HIGH, LOW);
/* xglue(HIGH, LOW)
*
* should result in:
*
* "hello" ", world"
*
* after concatenation of the character string literals:
*
* "hello, world"
*/
xglue(HIGH, LOW)
}
#undef f
#undef g
#undef h
#undef m
#undef t
#undef w
#undef x
#undef z
/* #include xstr(INCFILE(2).h)
*
* should expand to (after macro replacement, before file access):
*
* #include "vers2.h"
*
* "vers2.h" includes <stdio.h> and <limits.h> for the later tests.
*/
#include xstr(INCFILE(2).h)
/*
* PART 3
* More tests of token concatenation, taken from
* Kernighan & Ritchie "The C Programming Language", 2nd. Ed., A12.3.
*/
concat()
{
/* This is expanded to:
* abc;
*/
xglue( xglue( a, b), c);
/* This is also expanded to:
* abc;
*/
xglue( glue( a, b), c);
/* Results of these macro calls are undefined, once expanded to:
* glue( a, b)c;
* xglue( a, b)c;
* ')c' is not a valid preprocessing token.
*/
glue( glue( a, b), c);
glue( xglue( a, b), c);
}
/*
* PART 4
* More samples of token concatenation.
*/
#define COMMAND( name) { # name, name ## _command }
struct command commands[] = {
/* { "quit", quit_command }, */
COMMAND (quit),
/* { "help", help_command }, */
COMMAND (help),
};
#define maxof( type) maxof ## type
#define DefMax( type) \
type maxof( type)( type a, type b) \
{ \
return (( a > b) ? a : b); \
}
/* int maxofint( int a, int b) { return (( a > b) ? a : b); } */
DefMax( int)
/* double maxofdouble( double a, double b)
* { return (( a > b) ? a : b); }
*/
DefMax( double)
/*
* PART 5
* Test of stringization.
*/
line()
{
/* 211; "211"; "__LINE__"; */
__LINE__; xstr( __LINE__); str( __LINE__);
}
/*
* PART 6
* Tests of handling escape sequences.
* Tests of concatenation of string literals.
*/
escape()
{
#undef NDEBUG
#include <assert.h>
/* In ASCII character set */
assert( '\a' == 7);
/* After string concatenation :
* results somehow as this:
* ((strcmp( "132", "132") == 0) ? (void) 0 :
* _assert( "strcmp( \"\\x31\" \"32\", \"132\") == 0",
* "misc.t",270));
* ((strcmp( "132", "132") == 0) ? (void) 0 :
* _assert( "strcmp( \"\\61\" \"32\", \"132\") == 0",
* "misc.t",271));
*/
assert( strcmp( "\x31" "32", "132") == 0);
assert( strcmp( "\61" "32", "132") == 0);
/*
* In the messy encoding of KANJI called shift-JIS, "ɽ" is encoded as
* "\x95\x5C", the latter byte is not a beginning of an escape sequence.
*/
assert( strcmp( "ɽ" "<22><><EFBFBD><EFBFBD>", "ɽ<><C9BD><EFBFBD><EFBFBD>") == 0);
}
/*
* PART 7
* Tests of evaluating constant expression in long, unsigned long.
* Tests of <limits.h>, <assert.h>.
*/
#include <limits.h>
#if INT_MAX < INT_MIN || UINT_MAX <= INT_MAX
# error bad int properties
#endif
#if LONG_MAX < 2147483647 || -2147483647 < LONG_MIN || LONG_MAX < INT_MAX
# error bad long properties
#endif
#define NDEBUG
#include <assert.h>
assert_long()
{
/* This macro is ineffective now that NDEBUG is defined. */
assert( LONG_MAX >= 2147483647
&& -2147483647 >= LONG_MIN
&& LONG_MAX >= INT_MAX);
}
ulong()
{
/* For the compiler which has unsigned long data type */
#if defined ULONG_MAX && (ULONG_MAX < 4294967295 \
|| ULONG_MAX / 2 < LONG_MAX || ULONG_MAX < UINT_MAX)
# error bad unsigned long properties
#endif
}
internal()
{
/* The following 2 samlpes overflow on two's complement representation. */
#if -LONG_MIN == LONG_MAX
This is not a "two's complement" representation.
#endif
#if LONG_MIN * -1 == LONG_MAX
This is not a "two's complement" representation.
#endif
/* On two's complement representation this expression evaluate to false. */
#if defined (ULONG_MAX) && ULONG_MAX / 2 > LONG_MIN
This is not "two's complement" representation or mis-implementation.
#endif
/* Right bit-shift of negative number is implementation-defined. */
#if -2 >> 1 == -1
Arithmetic right shift of negative number.
#elif -2 >> 1 == LONG_MAX
Logical shift of negative number of "two's complement" representation.
#else
Maybe logical shift of other than "two's complement" representation.
#endif
/* Dividing or modulo containing negative operand is not portable. */
#if -7 / 3 != -2
Not algebraic dividing of negative number.
#endif
#if -7 % 3 != -1
What ?
#endif
}
/*
* PART 8
* Extended or obsolete facilities.
*/
non_standard()
{
#if defined __cplusplus || __STDC_VERSION__ == 199901L
// Comment in C++ style, terminating with '\x95\x5C' encoded in shift-JIS ɽ
"__cplusplus" is defined or "__STDC_VERSION__" equals 199901L.
#endif
/* sizeof in #if expression is disallowed in Standard C */
#if sizeof (long) < sizeof (int)
# error bad long properties
#endif
#if sizeof (char *) == 2 && sizeof (int (*)()) == 2
puts( "This is a small memory model.");
#endif
#if __MCPP > 1
/* Trace the process of macro expansion */
#ifdef __STDC__
#pragma MCPP debug memory /* list heap memory */
#pragma MCPP debug token /* trace token */
#else
#debug memory
#debug token
#endif
/* glue ( a, b)c; */
glue( glue( a, b), c);
#ifdef __STDC__
#pragma MCPP end_debug token /* no debug */
#else
#end_debug token
#endif
#endif /* __MCPP */
#define TRUE 1
#define FALSE 0
#ifndef __STDC__
#ifdef __MCPP
#assert TRUE != 0 && FALSE == 0
#endif
#endif
}
put_long()
{
char * line = "line";
#ifndef __STDC__
#ifdef __MWC09__
/* Assemly source for Microware-C/09 */
/* fputs( line, stdout); */
#asm
leax _iob+13,y /* stdout */
pshs x
ldd 2,s /* line */
pshs d
lbsr fputs
leas 4,s
#endasm
#endif
#endif
}
/*
* PART 9
* Ambiguous macros and others.
*/
wide_and_nonwide()
{
/* Wide-character string literal following string literal and vice versa. */
"string" L"<22><><EFBFBD><EFBFBD>";
L"<22><><EFBFBD><EFBFBD>" "string";
}
ambiguous()
{
/* Result of "f(2)(9)" is left intentionally ambiguous by Standard (ANSI C
"Rationale", 3.8.3.4). */
/* 2*f(9); or 2*9*g; */
#define f(a) a*g
#define g(a) f(a)
f(2)(9);
}