diff options
Diffstat (limited to 'example.c')
-rw-r--r-- | example.c | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/example.c b/example.c new file mode 100644 index 0000000..bf2f838 --- /dev/null +++ b/example.c @@ -0,0 +1,222 @@ + /* + * @(#) example.c 1.5 93/06/18 22:29:46 + * + * Examples of things that can be done with the unproto package + */ + +typedef char *charstar; + + /* + * New-style argument list with structured argument, one field being pointer + * to function returning pointer to function with function-pointer argument + */ + +x(struct { + struct { + int (*(*foo) (int (*arg1) (double))) (float arg2); + } foo; +} baz) { + return (0); +} + + /* New-style function-pointer declaration. */ + +int (*(*bar0) (float)) (int); + + /* Old-style argument list with new-style argument type. */ + +baz0(bar) +int (*(*bar) (float)) (int); +{} + + /* + * New-style argument list with new-style argument type, declaration + * embedded within block. Plus a couple assignments with function calls that + * look like casts. + */ + +foo(int (*(*bar) (float)) (int)) +{ + int (*baz) (int) = (int (*) (int)) 0, + y = (y * (*baz) (y)), + *(*z) (int) = (int *(*) (int)) 0; + + struct { int (*foo)(int); } *(*s)(int) = + (struct { int (*foo)(int); } *(*)(int)) 0; + + { + y = (y * (*baz) (y)); + } + { + z = (int *(*) (int)) 0; + } + { + s = (struct { int (*foo)(int); } *(*)(int)) 0; + } + + return (0); +} + +/* Multiple declarations in one statement */ + +test1() +{ + int foo2,*(*(*bar)(int))(float),*baz(double); +} + +/* Discriminate declarations from executable statements */ + +test2(charstar y) +{ + int foo = 5,atoi(charstar); + + foo = 5,atoi(y); +} + +/* Declarations without explicit type */ + +test3,test4(int); + +test5(int y) +{ + { + test3; + } + { + test4(y); + } +} + +test6[1],test7(int); + +test7(int x) +{ + { + test6[1]; + } + { + test7(x); + } +} + +/* Checking a complicated cast */ + +struct { + struct { + int (*f)(int), o; + } bar; +} (*baz2)(int) = (struct { struct { int (*f)(int), o; } bar; } (*)(int)) 0; + +/* Distinguish things with the same shape but with different meaning */ + +test8(x) +{ + { + struct { + int foo; + } bar(charstar); + } + { + do { + int foo; + } while (x); + } +} + +/* Do not think foo(*bar) is a function pointer declaration */ + +test9(char *bar) +{ + foo(*bar); +} + +/* another couple of special-cased words. */ + +test10(int x) +{ + { + int test10(int); + do test10(x); + while (x); + } + { + return test10(x); + } +} + +test11(int *x) +{ + while (*x) + (putchar(*x++)); +} + +test11a(int *x) +{ + for (*x;;) + (putchar(*x++)); +} + +/* #include directive between stuff that requires lookahead */ + +test12() +{ + char *x = "\xf\0002\002\02\2" /* foo */ +#include "/dev/null" + "\abar"; + + printf("foo" /* 1 */ "bar" /* 2 */ "baz"); + + *x = '\a'; + *x = '\xff'; +} + +int test13(void); + +/* line continuations in the middle of tokens */ + +te\ +st14(); +charstar test15 = "foo\ +bar"; +char test16 = "foo\\ +abar"; + +/* Array dimensions with unexpanded macros */ + +test17(charstar foo[bar]){} + +int (*(*test18[bar])(charstar))(charstar) = \ + (int (*(*[bar])(charstar))(charstar)) 0; + +/* Function returning pointer to function */ + +int (*(*test19(long))(int))(double); + +/* GCC accepts the following stuff, K&R C does not... */ + +void test20(int test21(double)) {} + +void test22(struct { int foo; } test23(short)) {} + +/* Do not blindly rewrite (*name(stuff))(otherstuff) */ + +void test23() +{ + int (*test24(int)) (int), + y = (*test24(2)) (3), + z = ((*test24(2)) (3)); +} + +/* Function returning pointer to function */ + +int (*(*test25(long foo))(int bar))(double baz){ /* body */ } + +int (*(*test26(foo))())() +long foo; +{ /* body */ } + +#define ARGSTR() struct {int l; char c[1];} + +void functie(ARGSTR() *cmdlin, ARGSTR() *c1) +{ +} |