home *** CD-ROM | disk | FTP | other *** search
- /*
- * @(#) example.c 1.3 92/01/15 21:53:26
- *
- * 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;
-