Files correlati : Commento : Aggiunto il preprocessore c++ mcpp per sostituire il compilatore nella compilazione delle maschere.
		
			
				
	
	
		
			402 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Raku
		
	
	
	
	
	
			
		
		
	
	
			402 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Raku
		
	
	
	
	
	
/*
 | 
						||
 *          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);
 | 
						||
}
 | 
						||
 |