[comp.lang.c] Somewhere between C and ADA...

hascall@cs.iastate.edu (John Hascall) (03/15/90)

#include <stdio.h>
#include <ctype.h>
#include "ohmygod.h"

int main(int argc, char **argv) {

	register int	i;
	register int	n;
	register char	c;

	n = strlen(argv[1]);
	begin(for_each_char, iterate, i = 0; i < n; i++)
		c = tolower(argv[1][i]);
		begin(which_kind, when, c)
			is 'a' or 'e' or 'i' or 'o' or 'u':
				printf("it's a vowel:\t");
			is 'y':
				printf("it might be a vowel:\t");
			is ' ':
				printf("(blank)\n");
				resume(for_each_char);
			is 'j':
				printf("don't like the letter `j'!\n");
				leave(for_each_char);
			is 'b':
				if (i < 5) {
					printf("don't care for this here:\t");
					leave(which_kind);
				}
				printf("this is ok here:\t
			is 'w':
				c = '?';
				resume(which_kind);
			otherwise:
				printf("it's not a vowel:\t");
		end(which_kind, when)
		printf("%c.\n", c);
	end(for_each_char, iterate)
}
-------------- ohmygod.h -------------------------

#define begin(name,what,exp) what(name,exp)
#define	end(name,what)       end_/**/what(name)
#define	iterate(name,exp)    if (0) {L/**/name: ;} else for(exp) {
#define	end_iterate(name)    R/**/name:;}
#define	when(name,exp)       if (0) {name: break;} else R/**/name: switch(exp){
#define	end_when(name)       }
#define is                   break;case
#define or                   : case
#define	otherwise            default
#define	leave(name)          goto L/**/name
#define	resume(name)         goto R/**/name
/* etc... */
-----------------------------------------------------------

Lock me away in the Wolfe ward of the loony-bin for even
dreaming this up!

John Hascall  /  ISU Comp Ctr  / hascall@atanasoff.cs.iastate.edu