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