Blame test-t/misc.t

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