int main () { Subject (); Verb (); Object (); return 0; };
/* process directives from file */ int process_c_callback(char *filename){ int oo, errors=0; int i, nrange, start_of_list=0; int status; wordint wstatus; int cmd_end = ')'; unsigned char cmd_strt; if(INIT) init_char_table(); INIT = 0; /* open input file if a name was specified, use stdin otherwise */ streamd=stdin; if(filename != NULL) streamd=fopen(filename,"r"); if (streamd == NULL) { fprintf(stderr,"process_c_callback: Cannot Open File -%s-\n",filename); goto error; } while(Verb(token)>0){ /* collect "verb" (command name) */ ARGLEN=0; ARGC=0; ARGV[0]=token; Skip_Blanks(0); if(cur_char_typ != 32 ) { fprintf(stderr,"Badly formed command \n"); goto error; } cmd_strt = cur_char; cmd_end = ( cur_char == '(' ) ? ')' : ';' ; /* assign proper terminator to command */ Next_Char(0); /* collect comma separated command arguments */ while(1){ collect_arg: ARGC++; ARGV[ARGC]=&ARGTXT[ARGLEN]; if((oo=Argument(ARGTXT+ARGLEN)) <= 0 ) { fprintf(stderr,"TOKEN error in argument\n"); goto error; } if((ARGC>=MAXARGS-1) || (ARGLEN+oo>=MAXARGLEN-1)) { fprintf(stderr,"Too many arguments or arguments too long \n"); fprintf(stderr,"ARGC=%d, ARGLEN=%d, oo=%d \n",ARGC,ARGLEN,oo); goto error; } if(*ARGV[ARGC]=='[') { /* Argument is '[ ', will become [nnn */ /* printf("Start of list at ARGC=%d\n",ARGC); */ ARGTXT[ARGLEN+1] = '0'; ARGTXT[ARGLEN+2] = '0'; ARGTXT[ARGLEN+3] = '0'; ARGTXT[ARGLEN+4] = ']'; ARGTXT[ARGLEN+5] = '\0'; ARGLEN=ARGLEN+6; if(start_of_list!=0) { fprintf(stderr,"List already open \n"); goto error; } start_of_list=ARGC; goto collect_arg; } ARGTXT[ARGLEN+oo]='\0'; ARGLEN=ARGLEN+oo+1; if(*ARGV[ARGC]=='>'){ /* range detected */ double dble0,dble1,dble2; char term; char pad[1024]; int nargs; nargs=sscanf(ARGV[ARGC]," > %lf , %lf , %lf%[%> ]%c",&dble0,&dble1,&dble2,pad); /* printf("Range detected, nargs=%d,pad=:%s:,from %f to %f by %f\n",nargs,pad,dble0,dble1,dble2); */ if(nargs!=4 || pad[strlen(pad)-1]!='>') { fprintf(stderr,"bad range\n"); goto error;} ARGLEN=ARGLEN-oo-1;ARGC--; nrange=(dble1-dble0)/dble2; if(nrange<0) nrange=0; while(nrange-->=0) { /* expand range into argument list */ if((ARGC>=MAXARGS-1) || (ARGLEN+oo>=MAXARGLEN-30)) { fprintf(stderr,"Too many arguments or arguments too long \n"); fprintf(stderr,"nrange:ARGC=%d, ARGLEN=%d, oo=%d \n",ARGC,ARGLEN,oo); goto error; } ARGC++; ARGV[ARGC]=ARGTXT+ARGLEN; oo=sprintf(ARGV[ARGC],"%f",dble0); ARGTXT[ARGLEN+oo]='\0'; ARGLEN=ARGLEN+oo+1; dble0=dble0+dble2; } } again: Skip_Blanks(0); Current_Char(); if(cur_char == ']') { if(start_of_list==0) { fprintf(stderr,"Cannot close non existent list \n"); goto error; } /* printf("End of %d element list at ARGC=%d\n",ARGC-start_of_list,ARGC); */ sprintf(ARGV[start_of_list],"[%3d]",ARGC-start_of_list); start_of_list=0; Next_Char(0); goto again; } if(cur_char == cmd_end) break; /* command terminator found */ if(cur_char != ',') {fprintf(stderr,"bad separator :%c:\n",cur_char); goto error;} Next_Char(0); } Next_Char(0); Skip_Blanks(0); if(start_of_list!=0) { fprintf(stderr,"Unmatched [ \n"); goto error; } if( (oo=Find_Callback(token)) >= 0 ) { if(callback_table[oo].is_ftn){ int max_arg_lng=0; int i; int arg_lng; char *F_ARGV; int j; char *temp; for (i=0 ; i<=ARGC ; i++) { /* find the length of the longest argument */ arg_lng=strlen(ARGV[i]); max_arg_lng=arg_lng>max_arg_lng?arg_lng:max_arg_lng; } F_ARGV=(char *)malloc(max_arg_lng*(1+ARGC)); /* allocate FORTRAN string space */ for (i=0 ; i<max_arg_lng*(1+ARGC) ; i++) F_ARGV[i]=' '; temp=F_ARGV; for (j=0;j<=ARGC;j++) { /* copy strings from C strings to FORTRAN strings */ arg_lng=strlen(ARGV[j]); for (i=0 ; i<max_arg_lng ; i++) { if(i<arg_lng)*temp=ARGV[j][i]; temp++; } } wstatus=callback_table[oo].command(&ARGC,F_ARGV,&cmd_strt, callback_table[oo].private_data, callback_table[oo].private_data_2,max_arg_lng,1); status=wstatus; free(F_ARGV); } else { status=callback_table[oo].command(ARGC,ARGV,cmd_strt, callback_table[oo].private_data, callback_table[oo].private_data_2); } if(status!=0) goto error; }else{ fprintf(stderr,"Command %s NOT FOUND\n",token); } continue; error: fprintf(stderr,"skipping rest of line\n"); errors++; buffer_out=buffer_in; start_of_list=0; if(abort_on_error) return(errors); } /* while verb */ return (errors); }