wht@tridom.uucp (Warren Tucker) (10/10/89)
---- Cut Here and unpack ---- #!/bin/sh # this is part 19 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file proc.c continued # CurArch=19 if test ! -r s2_seq_.tmp then echo "Please unpack part 1 first!" exit 1; fi ( read Scheck if test "$Scheck" != $CurArch then echo "Please unpack part $Scheck next!" exit 1; else exit 0; fi ) < s2_seq_.tmp || exit 1 echo "x - Continuing file proc.c" sed 's/^X//' << 'SHAR_EOF' >> proc.c X cmd_do(param) X cmd_goto(param) X cmd_gotob(param) X cmd_return(param) X do_proc(argc,argv) X dump_proc(pcb) X execute_esd(tesd) X execute_goto(pcb,goto_type) X execute_labelled_esd(tesd) X execute_proc(pcb) X find_labelled_lcb(label,first,last) X find_proc_cmd(cmd_list,cmd) X find_procedure(name) X free_lcb_chain(lcb) X show_error_position(pcb) X trace_proc_cmd(pcb) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */ X X#include <ctype.h> X#include "ecu.h" X#include "ecuerror.h" X#include "esd.h" X#include "var.h" X#include "proc.h" X X#define NEED_P_CMD X#include "ecucmd.h" X Xextern int rcvr_pid; Xextern int interrupt; Xextern int proc_interrupt; X XPCB *pcb_stack[PROC_STACK_MAX]; X Xint proc_level = 0; Xint proctrace = 0; X Xchar goto_label[64]; X X/*+------------------------------------------------------------------------- X _get_goto_label(param) X--------------------------------------------------------------------------*/ Xint X_get_goto_label(param) XESD *param; X{ Xregister erc; Xregister ESD *label_esd; X X goto_label[0] = 0; X if(erc = get_alphanum_zstr(param,goto_label,sizeof(goto_label))) X { X if((label_esd = make_esd(64)) == (ESD *)0) X return(eNoMemory); X if(!(erc = gstr(param,label_esd))) X strcpy(goto_label,label_esd->pb); X free_esd(label_esd); X } X X return(erc); X X} /* end of __get_goto_label */ X X/*+------------------------------------------------------------------------- X cmd_goto(param) X--------------------------------------------------------------------------*/ Xint Xcmd_goto(param) XESD *param; X{ X X if(_get_goto_label(param)) X return(eInvalidLabel); X return(eProcAttn_GOTO); X X} /* end of cmd_goto */ X X/*+------------------------------------------------------------------------- X cmd_gotob(param) X--------------------------------------------------------------------------*/ Xint Xcmd_gotob(param) XESD *param; X{ X X if(_get_goto_label(param)) X return(eInvalidLabel); X return(eProcAttn_GOTOB); X X} /* end of cmd_gotob */ X X/*+------------------------------------------------------------------------- X cmd_return(param) X--------------------------------------------------------------------------*/ Xint Xcmd_return(param) XESD *param; X{ Xlong value = 0; X if(!gint(param,&value)) X { X value &= (e_USER - 1); X if(proctrace) X pprintf("return value %ld\n",value); X return((int)value); X } X return(eProcAttn_RETURN); X} /* end of cmd_return */ X X/*+------------------------------------------------------------------------- X find_labelled_lcb(label,first,last) Xsearch for match between label X--------------------------------------------------------------------------*/ XLCB * Xfind_labelled_lcb(label,first,last) Xchar *label; Xregister LCB *first; XLCB *last; X{ Xregister llen = strlen(label); XESD *text; X X while(first) X { X text = first->text; X if((text->cb >= llen) && (!strncmp(text->pb,label,llen)) X && (!text->pb[llen] || isspace(text->pb[llen]))) X return(first); X X if(first == last) X return((LCB *)0); X first = first->next; X } X pputs("find_labelled_lab logic error\n"); X return((LCB *)0); X X} /* end of find_labelled_lcb */ X X/*+------------------------------------------------------------------------- X execute_goto(pcb,goto_type) X--------------------------------------------------------------------------*/ Xexecute_goto(pcb,goto_type) XPCB *pcb; Xint goto_type; X{ XLCB *next; /* next lcb to execute */ X X switch(goto_type) X { X case eProcAttn_GOTO: X if(!(next = find_labelled_lcb(goto_label,pcb->current,pcb->last))) X next = find_labelled_lcb(goto_label,pcb->first,pcb->current); X break; X case eProcAttn_GOTOB: X if(!(next = find_labelled_lcb(goto_label,pcb->first,pcb->current))) X next = find_labelled_lcb(goto_label,pcb->current,pcb->last); X break; X } X if(next) X { X pcb->current = next; X return(0); X } X pprintf("goto label not found: %s\n",goto_label); X return(eFATAL_ALREADY); X X} /* end of execute_goto */ X X/*+------------------------------------------------------------------------- X show_error_position(pcb) Xcursor MUST be at left margin when this is called X--------------------------------------------------------------------------*/ Xvoid Xshow_error_position(pcb) XPCB *pcb; X{ XESD *tesd = pcb->current->text; Xregister itmp = tesd->old_index; Xchar tag[64]; X X sprintf(tag,"%s %u> ",pcb->argv[0],pcb->current->lineno); X pputs(tag); X pputs(tesd->pb); X pputs("\n"); X itmp = strlen(tag) + tesd->old_index; X while(itmp--) X pputc(' '); X pputs("^\n"); X X} /* end of show_error_position */ X X/*+------------------------------------------------------------------------- X find_proc_cmd(cmd_list,cmd) X--------------------------------------------------------------------------*/ XP_CMD * Xfind_proc_cmd(cmd_list,cmd) Xregister P_CMD *cmd_list; Xregister char *cmd; X{ X while(cmd_list->token != -1) X { X if(!strcmp(cmd_list->cmd,cmd)) X break; X cmd_list++; X } X return((cmd_list->token == -1) ? (P_CMD *)0 : cmd_list); X X} /* end of find_proc_cmd */ X X/*+------------------------------------------------------------------------- X execute_esd(tesd) X--------------------------------------------------------------------------*/ Xexecute_esd(tesd) XESD *tesd; X{ Xint erc; XP_CMD *pcmd; Xstatic P_CMD *set_pcmd = (P_CMD *)0; /* quick access to 'set' */ Xchar cmd[32]; X X /* if blank, skip it */ X if(skip_cmd_break(tesd)) X return(0); X X /* if comment, skip it */ X if(!skip_cmd_char(tesd,'#')) X return(0); X X if(*(tesd->pb + tesd->index) == '{') X { X pputs("invalid '{'\n"); X return(eFATAL_ALREADY); X } X X while(1) X { X /* get command -- allow leading '$' to assume 'set' command */ X if(*(tesd->pb + tesd->index) == '$') X { X /* find 'set' in the list -- save for rapid access later */ X if(set_pcmd) X pcmd = set_pcmd; X else if((pcmd = find_proc_cmd(icmd_cmds,"set")) == (P_CMD *)0) X return(eInternalLogicError); X else X set_pcmd = pcmd; X } X else X { X if(get_alphanum_zstr(tesd,cmd,sizeof(cmd))) X return(eIllegalCommand); X /* find it in the list */ X if((pcmd = find_proc_cmd(icmd_cmds,cmd)) == (P_CMD *)0) X return(eIllegalCommand); X } X X /* check to see if this command available for procedure */ X if(!pcmd->proc) X return(eInteractiveCmd); X X /* execute the command */ X if(erc = (*pcmd->proc)(tesd)) X return(erc); X X /* look for comment */ X if(!skip_cmd_char(tesd,'#')) X break; X X /* look for multiple commands on line */ X if(skip_cmd_char(tesd,';')) X break; X X /* if blank after ';', skip it */ X if(skip_cmd_break(tesd)) X break; X } X return(0); X X} /* end of execute_esd */ X X/*+------------------------------------------------------------------------- X execute_labelled_esd(tesd) X--------------------------------------------------------------------------*/ Xexecute_labelled_esd(tesd) XESD *tesd; X{ Xregister index = 0; Xregister cb = tesd->cb; Xregister char *pb = tesd->pb; X X/* reset indices */ X tesd->index = index; X tesd->old_index = index; X X/* if comment, skip it */ X if(!skip_cmd_char(tesd,'#')) X return(0); X X/* skip over any label */ X while(!isspace(*(pb + index)) && (index < cb)) X index++; X tesd->index = index; X tesd->old_index = index; X X return(execute_esd(tesd)); X} /* end of execute_labelled_esd */ X X/*+------------------------------------------------------------------------- X dump_proc(pcb) X--------------------------------------------------------------------------*/ Xvoid Xdump_proc(pcb) XPCB *pcb; X{ Xint itmp; XLCB *lcb; X X pprintf("------ pcb @ 0x%08lx -----------------\n",pcb); X pprintf("argc=%d first=0x%08lx last=0x%08lx\n",pcb->argc, X pcb->first,pcb->last); X for(itmp = 0; itmp < pcb->argc; itmp++) X { X pprintf("argv(%d) @ 0x%lx: '%s'\n",itmp,pcb->argv[itmp], X pcb->argv[itmp]); X } X pputs("\n"); X lcb = pcb->first; X while(lcb) X { X pprintf("lcb @ 0x%08lx lineno=%u\n",lcb,lcb->lineno); X pputs("\n"); X lcb = lcb->next; X } X pflush(); X} /* end of dump_proc */ X X/*+------------------------------------------------------------------------- X trace_proc_cmd(pcb) - if asked, show command X--------------------------------------------------------------------------*/ Xvoid Xtrace_proc_cmd(pcb) XPCB *pcb; X{ X if(proctrace) X { X pprintf("%s %u> ",pcb->argv[0],pcb->current->lineno); X pputs(pcb->current->text->pb); X pputc('\n'); X } X X} /* end of trace_proc_cmd */ X X/*+------------------------------------------------------------------------- X execute_proc(pcb) X--------------------------------------------------------------------------*/ Xexecute_proc(pcb) XPCB *pcb; X{ Xregister iargv; Xint erc = 0; X X if(proc_level == PROC_STACK_MAX) X return(eProcStackTooDeep); X X pcb_stack[proc_level++] = pcb; X pcb->current = pcb->first; X mkv_proc_starting(pcb); X X while(pcb->current) X { X /* execute the command */ X trace_proc_cmd(pcb); X if(erc = execute_labelled_esd(pcb->current->text)) X { X /* handle other classes of errors */ X switch(erc & 0xF000) X { X case e_WARNING: /* warning */ X erc = 0; X break; X X case e_FATAL: /* fatal */ X goto PROC_RETURN; X X case e_ProcAttn: /* proc attention */ X switch(erc) X { X case eProcAttn_GOTO: X case eProcAttn_GOTOB: X if(erc = execute_goto(pcb,erc)) X break; /* didn't find it */ X continue; /* pcb->current is now goto target */ X X case eProcAttn_RETURN: X erc = 0; X break; X X case eProcAttn_Interrupt: X case eProcAttn_ESCAPE: X pprintf( X "procedure %s interrupted.\n",pcb->argv[0]); X erc = eFATAL_ALREADY; X break; X X default: X pprintf("procedure error 0x%x\n",erc); X erc = eFATAL_ALREADY; X break; X } X goto PROC_RETURN; X X default: /* must be proc return error code */ X goto PROC_RETURN; X break; X } X } X X if(proc_interrupt) X { X proc_interrupt = 0; X interrupt = 0; X pprintf("procedure %s interrupted\n",pcb->argv[0]); X erc = eFATAL_ALREADY; X } X X if(erc) X break; X pcb->current = pcb->current->next; X } X XPROC_RETURN: X mkv_proc_terminating(pcb); X if(erc) X { X if((erc > 0) && (erc < e_USER)) X { X pprintf(">>procedure %s returned %d\n",pcb->argv[0],erc); X erc |= e_USER; X } X else if((erc > e_USER) && (erc <= 0x1FFF)) X { X ; /* already said it */ X } X else X { X if(erc != eFATAL_ALREADY) X { X proc_error(erc); X erc = eFATAL_ALREADY; X } X show_error_position(pcb); X } X } X pcb_stack[--proc_level] = (PCB *)0; X if(erc && !proc_level) X plog_control((char *)0); X return(erc); X} /* end of execute_proc */ X X/*+------------------------------------------------------------------------- X free_lcb_chain(lcb) X--------------------------------------------------------------------------*/ Xvoid Xfree_lcb_chain(lcb) Xregister LCB *lcb; X{ XLCB *plcb; X X while(lcb) X { X if(lcb->text) X free_esd(lcb->text); X plcb = lcb; X lcb = lcb->next; X free((char *)plcb); X } X X} /* end of free_lcb_chain */ X X/*+------------------------------------------------------------------------- X find_procedure(name) X--------------------------------------------------------------------------*/ Xchar * Xfind_procedure(name) Xchar *name; X{ Xstatic char procpath[256]; X X/* try to find proc file in current directory */ X strcpy(procpath,name); X strcat(procpath,".ep"); X if(access(procpath,4)) X { X /* try to find proc file in home .ecu subdirectory */ X get_home_dir(procpath); X strcat(procpath,"/.ecu/"); X strcat(procpath,name); X strcat(procpath,".ep"); X if(access(procpath,4)) X return((char *)0); X } X return(procpath); X X} /* end of find_procedure */ X X/*+------------------------------------------------------------------------- X do_proc(argc,argv) - entry from ksr mode X--------------------------------------------------------------------------*/ Xdo_proc(argc,argv) Xint argc; Xchar **argv; X{ Xregister itmp; Xint itmp2; Xint erc; Xint iargv; Xchar *pargv[MAX_PARGV]; Xint ipargv = 0; Xchar s256[256]; Xchar *procpath; XFILE *fp; XPCB *pcb = (PCB *)0; XLCB *lcb; XLCB *plcb; Xushort line_count = 0; Xextern ulong current_colors; Xulong colors_at_entry = current_colors; X X proc_interrupt = 0; X interrupt = 0; X for(iargv = 0; iargv < argc; iargv++) X { X if(ipargv == MAX_PARGV) X { X pprintf("\nToo many arguments to %s invocation\n",pargv[0]); X erc = eFATAL_ALREADY; X goto RETURN; X } X pargv[ipargv++] = argv[iargv]; X } X X if(!ipargv) X { X pputs("\nno procedure name given\n"); X erc = eFATAL_ALREADY; X goto RETURN; X } X X if(!(procpath = find_procedure(pargv[0]))) X { X pprintf("\nprocedure %s not found\n",pargv[0]); X erc = eFATAL_ALREADY; X goto RETURN; X } X fp = fopen(procpath,"r"); X X if((pcb = (PCB *)malloc(sizeof(PCB))) == (PCB *)0) X { X erc = eNoMemory; X goto RETURN; X } X X pcb->argv = pargv; X pcb->argc = ipargv; X pcb->first = (LCB *)0; X X plcb = (LCB *)0; X line_count = 0; X while(1) X { X if(fgets(s256,sizeof(s256),fp) == NULL) X break; X line_count++; X X itmp = strlen(s256) - 1; /* skip blank lines */ X if(!itmp) X continue; X s256[itmp] = 0; /* kill trailing NL */ X for(itmp2 = 0; itmp2 < itmp; itmp2++) X { X if(s256[itmp2] == 0x09) X s256[itmp2] = 0x20; X } X if(s256[0] == '#') /* skip comments */ X continue; X X if((lcb = (LCB *)malloc(sizeof(LCB))) == (LCB *)0) X { X fclose(fp); X erc = eNoMemory; X goto RETURN; X } X X lcb->prev = plcb; X lcb->next = (LCB *)0; X lcb->lineno = line_count; X X if(plcb) X plcb->next = lcb; X else X pcb->first = lcb; X X if((lcb->text = make_esd(itmp)) == (ESD *)0) X { X fclose(fp); X erc = eNoMemory; X goto RETURN; X } X strcpy(lcb->text->pb,s256); X lcb->text->cb = itmp; X null_terminate_esd(lcb->text); X plcb = lcb; X } X fclose(fp); X pcb->last = lcb; X if(line_count) X erc = execute_proc(pcb); X else X erc = eProcEmpty; X XRETURN: X if(pcb) X { X if(pcb->first) X free_lcb_chain(pcb->first); X free((char *)pcb); X } X if((erc > e_USER) && (erc <= 0x1FFF)) X erc -= e_USER; X if(erc > e_USER) X setcolor(colors_at_entry); X return(erc); X X} /* end of do_proc */ X X/*+------------------------------------------------------------------------- X cmd_do(param) X--------------------------------------------------------------------------*/ Xcmd_do(param) XESD *param; X{ Xint erc; Xregister ipargv; Xchar *cmd_copy; Xchar *pargv[MAX_PARGV]; XESD *pargv_esd[MAX_PARGV]; Xint pargc = 0; X X if((cmd_copy = malloc(param->cb)) == (char *)0) X return(eNoMemory); X strcpy(cmd_copy,param->pb + param->old_index); X while(pargc != MAX_PARGV) X { X if(end_of_cmd(param)) X break; X if((pargv_esd[pargc] = make_esd(256)) == (ESD *)0) X { X erc = eNoMemory; X goto RETURN; X } X if(erc = gstr(param,pargv_esd[pargc])) X goto RETURN; X pargv[pargc] = pargv_esd[pargc]->pb; X pargc++; X } X X if(pargc < MAX_PARGV) X erc = do_proc(pargc,pargv); X else X { X pprintf("too many arguments to procedure\n"); X erc = eFATAL_ALREADY; X } X XRETURN: X free(cmd_copy); X for(ipargv = 0; ipargv < pargc; ipargv++) X free_esd(pargv_esd[ipargv]); X return(erc); X X} /* end of cmd_do */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of proc.c */ SHAR_EOF echo "File proc.c is complete" chmod 0644 proc.c || echo "restore of proc.c fails" echo "x - extracting proc_error.c (Text)" sed 's/^X//' << 'SHAR_EOF' > proc_error.c && X/* CHK=0x2E63 */ X/*+------------------------------------------------------------------------- X proc_error.c - print ecu procedure error X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:07-01-1989-16:46-build_err-creation from ecuerror.h */ X X#include "ecu.h" X#include "ecuerror.h" X X/*+------------------------------------------------------------------------- X proc_error(erc) - print error message X--------------------------------------------------------------------------*/ Xproc_error(erc) Xint erc; X{ X switch(erc) X { X case eProcEmpty: X pputs("empty procedure\n"); X break; X case eConnectFailed: X pputs("failed to connect\n"); X break; X case eNoSwitches: X pputs("no switches to command\n"); X break; X case eIllegalCommand: X pputs("invalid command\n"); X break; X case eNoMemory: X pputs("no more memory available\n"); X break; X case eSyntaxError: X pputs("syntax error\n"); X break; X case eIllegalVarNumber: X pputs("variable number is invalid or out of range\n"); X break; X case eIllegalVarType: X pputs("unrecognized variable type\n"); X break; X case eNotInteger: X pputs("integer expected and not found\n"); X break; X case eCONINT: X pputs("abort due to interrupt\n"); X break; X case eInvalidFunction: X pputs("invalid function name\n"); X break; X case eMissingLeftParen: X pputs("did not find expected left paren\n"); X break; X case eMissingRightParen: X pputs("did not find expected right paren\n"); X break; X case eCommaExpected: X pputs("expected comma not found\n"); X break; X case eProcStackTooDeep: X pputs("procedure stack depth exceeded\n"); X break; X case eInvalidRelOp: X pputs("invalid relational operator\n"); X break; X case eInvalidIntOp: X pputs("invalid integer operator\n"); X break; X case eInvalidStrOp: X pputs("invalid string operator\n"); X break; X case eNotExecutingProc: X pputs("not executing DO at this time\n"); X break; X case eInvalidLabel: X pputs("invalid label\n"); X break; X case eInternalLogicError: X pputs("internal logic error ... whoops\n"); X break; X case eEOF: X pputs("end of file or read error\n"); X break; X case eBufferTooSmall: X pputs("string too long\n"); X break; X case eNoParameter: X pputs("expected parameter not found\n"); X break; X case eBadParameter: X pputs("inappropriate parameter\n"); X break; X case eInvalidHexNumber: X pputs("invalid hexadecimal digit\n"); X break; X case eInvalidDecNumber: X pputs("invalid decimal digit\n"); X break; X case eInvalidOctNumber: X pputs("invalid octal digit\n"); X break; X case eInteractiveCmd: X pputs("interactive command\n"); X break; X case eNoLineAttached: X pputs("no line (modem) attached\n"); X break; X case eBadFileNumber: X pputs("file number out of range\n"); X break; X case eNotImplemented: X pputs("not implemented\n"); X break; X case eDuplicateMatch: X pputs("more than one condition matches\n"); X break; X case eColonExpected: X pputs("expected colon not found\n"); X break; X case eLabelInvalidHere: X pputs("label not allowed on this statement\n"); X break; X case eNoCloseFrame: X pputs("missing '}' for '{'\n"); X break; X case eNoFrame: X pputs("missing command or command group after 'while' or 'if'\n"); X break; X case eMissingCommand: X pputs("expected command not found\n"); X break; X case eBreakCommand: X pputs("'break' outside 'while'\n"); X break; X case eContinueCommand: X pputs("'continue' outside 'while'\n"); X break; X case eElseCommand: X pputs("'else' without matching 'if'\n"); X break; X case eInvalidVarName: X pputs("invalid variable name\n"); X break; X case eNoSuchVariable: X pputs("variable by this name not defined\n"); X break; X case eProcAttn_GOTO: X pputs("GOTO detected\n"); X break; X case eProcAttn_GOTOB: X pputs("GOTOB detected\n"); X break; X case eProcAttn_RETURN: X pputs("RETURN detected\n"); X break; X case eProcAttn_ESCAPE: X pputs("ESCAPE detected\n"); X break; X case eProcAttn_Interrupt: X pputs("procedure interrupted\n"); X break; X case eFATAL_ALREADY: X case eWARNING_ALREADY: X break; X default: X pprintf("unknown error %x\n",erc); X break; X } X} /* end of proc_error */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of proc_error.c */ SHAR_EOF chmod 0644 proc_error.c || echo "restore of proc_error.c fails" echo "x - extracting procframe.c (Text)" sed 's/^X//' << 'SHAR_EOF' > procframe.c && X/* CHK=0x5527 */ X/*+------------------------------------------------------------------------- X procframe.c - execute frame of statements X Copyright 1989 Warren H. Tucker, III. All Rights Reserved X X Defined functions: X cmd_break(param); X cmd_continue(param); X execute_frame(truth) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */ X X#include <ctype.h> X#include "ecu.h" X#include "ecukey.h" X#include "ecuerror.h" X#include "esd.h" X#include "var.h" X#include "proc.h" X Xextern PCB *pcb_stack[PROC_STACK_MAX]; Xextern int proc_level; Xextern int proc_interrupt; Xextern int proctrace; X X/*+------------------------------------------------------------------------- X cmd_break(param) X--------------------------------------------------------------------------*/ Xint Xcmd_break(param) XESD *param; X{ X return(eBreakCommand); X} /* end of cmd_break */ X X/*+------------------------------------------------------------------------- X cmd_continue(param) X--------------------------------------------------------------------------*/ Xint Xcmd_continue(param) XESD *param; X{ X return(eContinueCommand); X} /* end of cmd_continue */ X X/*+------------------------------------------------------------------------- X execute_frame(truth) X X pcb_stack[proc_level - 1]->current points to lcb behind frame: one X statement or { statements } X X if truth true, execute frame, else skip it X--------------------------------------------------------------------------*/ Xint Xexecute_frame(truth) Xint truth; X{ Xregister itmp; Xint erc = 0; XPCB *pcb = pcb_stack[proc_level - 1]; XLCB *original_lcb = pcb->current; XLCB *begin_lcb; XESD *text; Xint nest_level = 0; Xint remember_break = 0; X X if(!(pcb->current = pcb->current->next)) X { X pcb->current = original_lcb; X return(eNoFrame); X } X X text = pcb->current->text; X text->old_index = text->index = 0; X X if(*text->pb != SPACE) X return(eLabelInvalidHere); X skip_cmd_break(text); X X/* handle single statement frame */ X if(*(text->pb + text->index) != '{') X { X itmp = text->cb - text->index; X if( ((itmp > 2) && !strncmp(text->pb + text->index,"if",2))) X { X pputs("command must appear inside {} or on same line as else\n"); X erc = eFATAL_ALREADY; X } X else if( ((itmp > 5) && !strncmp(text->pb + text->index,"while",5))) X { X pputs("command must appear inside {} within this context\n"); X erc = eFATAL_ALREADY; X } X else if(truth) X { X trace_proc_cmd(pcb); X erc = execute_esd(text); X } X return(erc); X } X X/* we've got a {} frame */ X begin_lcb = pcb->current; X pcb->current = pcb->current->next; X while(pcb->current) X { X if(proc_interrupt) X return(eCONINT); X text = pcb->current->text; X text->old_index = text->index = 0; X if(*text->pb != SPACE) X return(eLabelInvalidHere); X skip_cmd_break(text); X if(*(text->pb + text->index) == '}') X { X if(!nest_level) X { X text->index = text->cb; X if(remember_break) X return(eBreakCommand); X return(0); X } X nest_level--; X } X else if(truth) X { X trace_proc_cmd(pcb); X if(erc = execute_esd(text)) X { X if(erc != eBreakCommand) X return(erc); X remember_break = 1; X truth = 0; X } X } X else if(*(text->pb + text->index) == '{') X nest_level++; X pcb->current = pcb->current->next; X } X pcb->current = begin_lcb; X return(eNoCloseFrame); X X} /* end of execute_frame */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of procframe.c */ SHAR_EOF chmod 0644 procframe.c || echo "restore of procframe.c fails" echo "x - extracting regexp.c (Text)" sed 's/^X//' << 'SHAR_EOF' > regexp.c && X/* CHK=0xEDBA */ X/*+------------------------------------------------------------------------- X regexp.c -- regular expression functions made sane X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:06-24-1989-20:40-wht-adapt for ecu */ X X#include <stdio.h> X#include "stdio_lint.h" X#include "lint_args.h" X#include "ecuerror.h" X#include "esd.h" X#include "var.h" X#include <setjmp.h> X X#define CBRA 2 X#define CCHR 4 X#define CDOT 8 X#define CCL 12 X#define CDOL 20 X#define CCEOF 22 X#define CKET 24 X#define CBACK 36 X X#define STAR 01 X#define RNGE 03 X X#define NBRA 9 X X#define PLACE(c) ep[c >> 3] |= bittab[c & 07] X#define ISTHERE(c) (ep[c >> 3] & bittab[c & 07]) X Xextern int proctrace; Xextern int proc_level; X Xchar *braslist[NBRA]; Xchar *braelist[NBRA]; Xint nbra,ebra; Xchar *match_start,*match_end,*locs; Xint sed; Xint nodelim; Xint circf; Xint low; Xint size; X Xchar bittab[] = X{ X 1,2,4,8,16,32,64,128 }; X Xjmp_buf compile_error_jmpbuf; X Xchar * Xcompile(pattern,ep,endbuf,seof) Xregister char *ep; Xchar *pattern,*endbuf; X{ X register char *sp = pattern; X register c; X register eof = seof; X char *lastep = pattern; X int cclcnt; X char bracket[NBRA],*bracketp; X int closed; X char neg; X int lc; X int i,cflg; X X lastep = 0; X if((c = *sp++) == eof || c == '\n') X { X if(c == '\n') X { X --sp; X nodelim = 1; X } X if(*ep == 0 && !sed) X longjmp(compile_error_jmpbuf,41); X return; X } X bracketp = bracket; X circf = closed = nbra = ebra = 0; X if(c == '^') X circf++; X else X --sp; X while(1) X { X if(ep >= endbuf) X longjmp(compile_error_jmpbuf,50); X c = *sp++; X if(c != '*' && ((c != '\\') || (*sp != '{'))) X lastep = ep; X if(c == eof) X { X *ep++ = CCEOF; X return; X } X switch(c) X { X X case '.': X *ep++ = CDOT; X continue; X X case '\n': X if(!sed) X { X --sp; X *ep++ = CCEOF; X nodelim = 1; X return; X } X else longjmp(compile_error_jmpbuf,36); X case '*': X if(lastep==0 || *lastep==CBRA || *lastep==CKET) X goto defchar; X *lastep |= STAR; X continue; X X case '$': X if(*sp != eof && *sp != '\n') X goto defchar; X *ep++ = CDOL; X continue; X X case '[': X if(&ep[17] >= endbuf) X longjmp(compile_error_jmpbuf,50); X X *ep++ = CCL; X lc = 0; X for(i = 0; i < 16; i++) X ep[i] = 0; X X neg = 0; X if((c = *sp++) == '^') X { X neg = 1; X c = *sp++; X } X X do X { X if(c == '\0' || c == '\n') X longjmp(compile_error_jmpbuf,49); X if(c == '-' && lc != 0) X { X if((c = *sp++) == ']') X { X PLACE('-'); X break; X } X while(lc < c) X { X PLACE(lc); X lc++; X } X } X if(c == '\\') X { X switch(c = *sp++) X { X case 'n': X c = '\n'; X break; X } X } X lc = c; X PLACE(c); X } while((c = *sp++) != ']'); X if(neg) X { X for(cclcnt = 0; cclcnt < 16; cclcnt++) X ep[cclcnt] ^= -1; X ep[0] &= 0376; X } X X ep += 16; X X continue; X X case '\\': X switch(c = *sp++) X { X X case '(': X if(nbra >= NBRA) X longjmp(compile_error_jmpbuf,43); X *bracketp++ = nbra; X *ep++ = CBRA; X *ep++ = nbra++; X continue; X X case ')': X if(bracketp <= bracket || ++ebra != nbra) X longjmp(compile_error_jmpbuf,42); X *ep++ = CKET; X *ep++ = *--bracketp; X closed++; X continue; X X case '{': X if(lastep == (char *) (0)) X goto defchar; X *lastep |= RNGE; X cflg = 0; Xnlim: X c = *sp++; X i = 0; X do X { X if('0' <= c && c <= '9') X i = 10 * i + c - '0'; X else X longjmp(compile_error_jmpbuf,16); X } while(((c = *sp++) != '\\') && (c != ',')); X if(i >= 255) X longjmp(compile_error_jmpbuf,11); X *ep++ = i; X if(c == ',') X { X if(cflg++) X longjmp(compile_error_jmpbuf,44); X if((c = *sp++) == '\\') X *ep++ = 255; X else X { X --sp; X goto nlim; X /* get 2'nd number */ X } X } X if(*sp++ != '}') X longjmp(compile_error_jmpbuf,45); X if(!cflg) /* one number */ X *ep++ = i; X else if((ep[-1] & 0377) < (ep[-2] & 0377)) X longjmp(compile_error_jmpbuf,46); X continue; X X case '\n': X longjmp(compile_error_jmpbuf,36); X X case 'n': X c = '\n'; X goto defchar; X X default: X if(c >= '1' && c <= '9') X { X if((c -= '1') >= closed) X longjmp(compile_error_jmpbuf,25); X *ep++ = CBACK; X *ep++ = c; X continue; X } X } X /* Drop through to default to use \ to turn off special chars */ X Xdefchar: X default: X lastep = ep; X *ep++ = CCHR; X *ep++ = c; X } X } X} X Xstep(p1,p2) Xregister char *p1,*p2; X{ X register c; X X if(circf) X { X match_start = p1; SHAR_EOF echo "End of part 19" echo "File regexp.c is continued in part 20" echo "20" > s2_seq_.tmp exit 0 -- ------------------------------------------------------------------- Warren Tucker, Tridom Corporation ...!gatech!emory!tridom!wht Ker-au'-lo-phon. An 8-foot partial flue-stop, having metal pipes surmounted by adjustable rings, and with a hole bored near the top of each pipe, producing a soft and "reedy" tone.