home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-05-11 | 53.9 KB | 2,475 lines |
- Newsgroups: comp.sources.misc
- subject: v12i067: ECU 2.80 part 14/29
- from: wht%n4hgf@gatech.edu (Warren Tucker)
- Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
-
- Posting-number: Volume 12, Issue 67
- Submitted-by: wht%n4hgf@gatech.edu (Warren Tucker)
- Archive-name: ecu2.80/part14
-
- ---- Cut Here and unpack ----
- #!/bin/sh
- # This is part 14 of ecu280
- if touch 2>&1 | fgrep '[-amc]' > /dev/null
- then TOUCH=touch
- else TOUCH=true
- fi
- # ============= proc.c ==============
- echo "x - extracting proc.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > proc.c &&
- X/* CHK=0x1EED */
- X/*+-------------------------------------------------------------------------
- X proc.c
- X wht%n4hgf@gatech.edu
- X
- X Defined functions:
- X _get_goto_label(param)
- 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/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */
- X/*:04-19-1990-03:08-wht@n4hgf-GCC run found unused vars -- rm them */
- X/*:03-25-1990-14:11-wht@n4hgf------ x2.70 ------- */
- X/*:03-25-1990-12:42-wht@n4hgf-add interrupt test to execute_esd */
- X/*:10-14-1989-21:10-wht-allow user to change ecu color choices */
- X/*:07-03-1989-22:57-wht------ x2.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 interrupt, exit */
- X if(interrupt)
- X {
- X proc_interrupt = 1;
- X return(eCONINT);
- X }
- 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) - execute a memory-resident procedure
- X--------------------------------------------------------------------------*/
- Xexecute_proc(pcb)
- XPCB *pcb;
- X{
- 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) - read in a disk-based procedure and execute it
- 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 colors_current;
- Xulong colors_at_entry = colors_current;
- 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))))
- 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))))
- 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 = (char *)malloc(param->cb)))
- 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
- $TOUCH -am 0507233390 proc.c &&
- chmod 0644 proc.c ||
- echo "restore of proc.c failed"
- set `wc -c proc.c`;Wc_c=$1
- if test "$Wc_c" != "15370"; then
- echo original size 15370, current size $Wc_c
- fi
- # ============= proc_error.c ==============
- echo "x - extracting proc_error.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > proc_error.c &&
- X/* CHK=0x034A */
- X/*+-------------------------------------------------------------------------
- X proc_error.c - print ecu procedure error
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:05-08-1990-02:31-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--------------------------------------------------------------------------*/
- Xvoid
- 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 switch(es) 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("bad 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 eInvalidLogicOp:
- X pputs("invalid logical operator\n");
- X break;
- X case eExpectRespondFail:
- X pputs("expect-respond failed\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
- $TOUCH -am 0508023190 proc_error.c &&
- chmod 0644 proc_error.c ||
- echo "restore of proc_error.c failed"
- set `wc -c proc_error.c`;Wc_c=$1
- if test "$Wc_c" != "4423"; then
- echo original size 4423, current size $Wc_c
- fi
- # ============= procframe.c ==============
- echo "x - extracting procframe.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > procframe.c &&
- X/* CHK=0x83D2 */
- X/*+-------------------------------------------------------------------------
- X procframe.c - execute frame of statements
- X wht%n4hgf@gatech.edu
- X
- X Defined functions:
- X cmd_break(param);
- X cmd_continue(param);
- X execute_frame(truth)
- X
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */
- X/*:03-25-1990-14:12-wht@n4hgf------ x2.70 ------- */
- X/*:07-03-1989-22:57-wht------ x2.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
- $TOUCH -am 0507233390 procframe.c &&
- chmod 0644 procframe.c ||
- echo "restore of procframe.c failed"
- set `wc -c procframe.c`;Wc_c=$1
- if test "$Wc_c" != "3525"; then
- echo original size 3525, current size $Wc_c
- fi
- # ============= regexp.c ==============
- echo "x - extracting regexp.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > regexp.c &&
- X/* CHK=0x1078 */
- X/*+-------------------------------------------------------------------------
- X regexp.c -- regular expression functions made sane
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */
- X/*:04-19-1990-03:08-wht@n4hgf-GCC run found unused vars -- rm them */
- X/*:03-25-1990-14:12-wht@n4hgf------ x2.70 ------- */
- X/*:07-03-1989-22:57-wht------ x2.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[] = { 1,2,4,8,16,32,64,128 };
- X
- Xjmp_buf compile_error_jmpbuf;
- X
- Xvoid
- 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;
- X return(advance(p1,p2));
- X }
- X /* fast check for first character */
- X if(*p2==CCHR)
- X {
- X c = p2[1];
- X do
- X {
- X if(*p1 != c)
- X continue;
- X if(advance(p1,p2))
- X {
- X match_start = p1;
- X return(1);
- X }
- X } while(*p1++);
- X return(0);
- X }
- X /* regular algorithm */
- X do
- X {
- X if(advance(p1,p2))
- X {
- X match_start = p1;
- X return(1);
- X }
- X } while(*p1++);
- X return(0);
- X}
- X
- Xadvance(lp,ep)
- Xregister char *lp,*ep;
- X{
- X register char *curlp;
- X char c;
- X char *bbeg;
- X int ct;
- X
- X while(1)
- X switch(*ep++)
- X {
- X
- X case CCHR:
- X if(*ep++ == *lp++)
- X continue;
- X return(0);
- X
- X case CDOT:
- X if(*lp++)
- X continue;
- X return(0);
- X
- X case CDOL:
- X if(*lp==0)
- X continue;
- X return(0);
- X
- X case CCEOF:
- X match_end = lp;
- X return(1);
- X
- X case CCL:
- X c = *lp++ & 0177;
- X if(ISTHERE(c))
- X {
- X ep += 16;
- X continue;
- X }
- X return(0);
- X case CBRA:
- X braslist[*ep++] = lp;
- X continue;
- X
- X case CKET:
- X braelist[*ep++] = lp;
- X continue;
- X
- X case CCHR|RNGE:
- X c = *ep++;
- X getrnge(ep);
- X while(low--)
- X if(*lp++ != c)
- X return(0);
- X curlp = lp;
- X while(size--)
- X if(*lp++ != c)
- X break;
- X if(size < 0)
- X lp++;
- X ep += 2;
- X goto star;
- X
- X case CDOT|RNGE:
- X getrnge(ep);
- X while(low--)
- X if(*lp++ == '\0')
- X return(0);
- X curlp = lp;
- X while(size--)
- X if(*lp++ == '\0')
- X break;
- X if(size < 0)
- X lp++;
- X ep += 2;
- X goto star;
- X
- X case CCL|RNGE:
- X getrnge(ep + 16);
- X while(low--)
- X {
- X c = *lp++ & 0177;
- X if(!ISTHERE(c))
- X return(0);
- X }
- X curlp = lp;
- X while(size--)
- X {
- X c = *lp++ & 0177;
- X if(!ISTHERE(c))
- X break;
- X }
- X if(size < 0)
- X lp++;
- X ep += 18; /* 16 + 2 */
- X goto star;
- X
- X case CBACK:
- X bbeg = braslist[*ep];
- X ct = braelist[*ep++] - bbeg;
- X
- X if(ecmp(bbeg,lp,ct))
- X {
- X lp += ct;
- X continue;
- X }
- X return(0);
- X
- X case CBACK|STAR:
- X bbeg = braslist[*ep];
- X ct = braelist[*ep++] - bbeg;
- X curlp = lp;
- X while(ecmp(bbeg,lp,ct))
- X lp += ct;
- X
- X while(lp >= curlp)
- X {
- X if(advance(lp,ep)) return(1);
- X lp -= ct;
- X }
- X return(0);
- X
- X
- X case CDOT|STAR:
- X curlp = lp;
- X while(*lp++);
- X goto star;
- X
- X case CCHR|STAR:
- X curlp = lp;
- X while(*lp++ == *ep);
- X ep++;
- X goto star;
- X
- X case CCL|STAR:
- X curlp = lp;
- X do
- X {
- X c = *lp++ & 0177;
- X } while(ISTHERE(c));
- X ep += 16;
- X goto star;
- X
- Xstar:
- X do
- X {
- X if(--lp == locs)
- X break;
- X if(advance(lp,ep))
- X return(1);
- X } while(lp > curlp);
- X return(0);
- X
- X }
- X}
- X
- Xvoid
- Xgetrnge(regexp)
- Xregister char *regexp;
- X{
- X low = *regexp++ & 0377;
- X size = ((*regexp & 0377) == 255) ? 20000 : (*regexp & 0377) - low;
- X}
- X
- Xecmp(a,b,count)
- Xregister char *a,*b;
- Xregister count;
- X{
- X while(count--)
- X if(*a++ != *b++)
- X return(0);
- X return(1);
- X}
- X
- X/*+-------------------------------------------------------------------------
- X itmp = regexp_compile(regexp,cmpbuf,cmpbuf_size,emsg)
- X
- Xreturns 0 if no compile error,
- Xelse error occurred (*emsg points to error message text)
- X--------------------------------------------------------------------------*/
- Xint
- Xregexp_compile(regexp,cmpbuf,cmpbuf_size,emsg)
- Xchar *regexp;
- Xchar *cmpbuf;
- Xint cmpbuf_size;
- Xchar **emsg;
- X{
- X register int itmp;
- X static char errm[40];
- X
- X if(itmp = setjmp(compile_error_jmpbuf))
- X {
- X switch(itmp)
- X {
- X case 11:
- X *emsg = "Range endpoint too large";
- X break;
- X case 16:
- X *emsg = "Bad number";
- X break;
- X case 25:
- X *emsg = "\"\\digit\" out of range";
- X break;
- X case 36:
- X *emsg = "Illegal or missing delimiter";
- X break;
- X case 41:
- X *emsg = "No previous regular expression";
- X break;
- X case 42:
- X *emsg = "More \\)'s than \\('s in regular expression";
- X break;
- X case 43:
- X *emsg = "More \\('s than \\)'s in regular expression";
- X break;
- X case 44:
- X *emsg = "More than 2 numbers in \\{ \\}";
- X break;
- X case 45:
- X *emsg = "} expected after \\";
- X break;
- X case 46:
- X *emsg = "First number exceeds second in \\{ \\}";
- X break;
- X case 49:
- X *emsg = "[] imbalance";
- X break;
- X case 50:
- X *emsg = "Regular expression too complex";
- X break;
- X default:
- X sprintf(errm,"Unknown regexp compile error %d",itmp);
- X *emsg = errm;
- X break;
- X }
- X return(itmp);
- X }
- X
- X compile(regexp,cmpbuf,cmpbuf + cmpbuf_size,0);
- X return(0);
- X} /* end of regexp_compile */
- X
- X/*+-------------------------------------------------------------------------
- X regexp_scan(cmpbuf,str_to_search,&match,&matchlen)
- Xreturn 1 if string match found, else 0
- Xif string matches, match receives pointer to first byte, matchlen = length
- Xof matching string
- X--------------------------------------------------------------------------*/
- Xregexp_scan(cmpbuf,str_to_search,match,matchlen)
- Xchar *cmpbuf;
- Xchar *str_to_search;
- Xchar **match;
- Xint *matchlen;
- X{
- X register int itmp = step(str_to_search,cmpbuf);
- X if(itmp)
- X {
- X *match = match_start;
- X *matchlen = (int)(match_end - match_start);
- X }
- X return(itmp);
- X} /* end of regexp_scan */
- X
- X#define CMPBUF_SIZE 256
- Xchar cmpbuf[CMPBUF_SIZE];
- X
- X/*+-------------------------------------------------------------------------
- X regexp_operation(match_str,regexp_str,rtn_value)
- X--------------------------------------------------------------------------*/
- Xint
- Xregexp_operation(match_str,regexp_str,rtn_value)
- Xchar *match_str;
- Xchar *regexp_str;
- Xlong *rtn_value;
- X{
- Xchar *emsg;
- Xchar *match;
- Xint matchlen;
- X
- X if(regexp_compile(regexp_str,cmpbuf,sizeof(cmpbuf),&emsg))
- X {
- X pprintf("compile 1 error: %s\n",emsg);
- X return(eFATAL_ALREADY);
- X }
- X
- X if(regexp_scan(cmpbuf,match_str,&match,&matchlen))
- X {
- X *rtn_value = (long)(match - match_str);
- X iv[0] = (long)matchlen;
- X if(proc_level && proctrace)
- X pprintf("%match set $i00 = %ld\n",iv[0]);
- X }
- X else
- X *rtn_value = -1;
- X
- X return(0);
- X} /* end of regexp_operation */
- X
- X/* vi: set tabstop=4 shiftwidth=4: */
- X/* end of regexp.c */
- SHAR_EOF
- $TOUCH -am 0507232990 regexp.c &&
- chmod 0644 regexp.c ||
- echo "restore of regexp.c failed"
- set `wc -c regexp.c`;Wc_c=$1
- if test "$Wc_c" != "10420"; then
- echo original size 10420, current size $Wc_c
- fi
- # ============= sysdep.c ==============
- echo "x - extracting sysdep.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > sysdep.c &&
- X/* CHK=0xCD25 */
- X/*+-------------------------------------------------------------------------
- X sysdep.c -- system dependency aid
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */
- X/*:03-25-1990-14:12-wht@n4hgf------ x2.70 ------- */
- X/*:11-25-1989-16:13-wht-add M_UNIX */
- X/*:07-06-1989-15:06-wht-added i386 */
- X/*:02-27-1989-21:59-wht-add M_I286 and M_I386 */
- X/*:11-17-1988-15:17-wht-creation */
- X
- X#include <stdio.h>
- X
- Xchar *defines[] =
- X{
- X#if defined(M_UNIX)
- X "M_UNIX",
- X#undef M_XENIX /* <---------------------- */
- X#endif
- X#if defined(M_XENIX)
- X "M_XENIX",
- X#endif
- X#if defined(M_SYS5)
- X "M_SYS5",
- X#endif
- X#if defined(M_I386)
- X "M_I386",
- X#endif
- X#if defined(M_I286)
- X "M_I286",
- X#endif
- X#if defined(M_I186)
- X "M_I186",
- X#endif
- X#if defined(M_I8086)
- X "M_I8086",
- X#endif
- X#if defined(M_I86)
- X "M_I86",
- X#endif
- X#if defined(pyr)
- X "pyr",
- X#endif
- X#if defined(i386)
- X "i386",
- X#endif
- X#if defined(sun)
- X "sun",
- X#endif
- X#if defined(sun2)
- X "sun2,
- X#endif
- X#if defined(sun3)
- X "sun3",
- X#endif
- X#if defined(sun4)
- X "sun4",
- X#endif
- X#if defined(vax)
- X "vax",
- X#endif
- X#if defined(pdp11)
- X "pdp11",
- X#endif
- X#if defined(M_INTERNAT)
- X "M_INTERNAT",
- X#endif
- X (char *)0
- X};
- X
- X/*+-------------------------------------------------------------------------
- X pos_in_ztermed_list(test,list)
- X--------------------------------------------------------------------------*/
- Xint
- Xpos_in_ztermed_list(test,list)
- Xchar *test;
- Xchar **list;
- X{
- X register int itmp = 0;
- X
- X while(*list)
- X {
- X if(!strcmp(*list++,test))
- X return(itmp);
- X itmp++;
- X }
- X return(-1);
- X} /* end of pos_in_ztermed_list */
- X
- X/*+-------------------------------------------------------------------------
- X main(argc,argv,envp)
- X--------------------------------------------------------------------------*/
- Xmain(argc,argv,envp)
- Xint argc;
- Xchar **argv;
- Xchar **envp;
- X{
- Xregister int iargv;
- Xchar **cpptr;
- X
- X for(iargv = 1; iargv < argc; iargv++)
- X {
- X if(*argv[iargv] == '=')
- X {
- X if(pos_in_ztermed_list(argv[iargv] + 1,defines) >= 0)
- X break;
- X }
- X }
- X if(iargv == argc)
- X {
- X fprintf(stderr,"\n\nsysdep: no system match\n\n");
- X fprintf(stderr,"On this system, I recognize:\n");
- X cpptr = defines;
- X while(*cpptr)
- X fprintf(stderr," %s\n",*cpptr++);
- X fputs("\n",stderr);
- X exit(1);
- X }
- X
- X while(++iargv <argc)
- X {
- X if(*argv[iargv] == '=')
- X break;
- X fputs(argv[iargv],stdout);
- X fputc(' ',stdout);
- X }
- X fputs("\n",stdout);
- X exit(0);
- X} /* end of main */
- X
- SHAR_EOF
- $TOUCH -am 0507232990 sysdep.c &&
- chmod 0644 sysdep.c ||
- echo "restore of sysdep.c failed"
- set `wc -c sysdep.c`;Wc_c=$1
- if test "$Wc_c" != "2419"; then
- echo original size 2419, current size $Wc_c
- fi
- # ============= utmpstat.c ==============
- echo "x - extracting utmpstat.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > utmpstat.c &&
- X/* CHK=0xEAB0 */
- X
- X#if defined(WHT)
- X#define LOG_UTMP
- X#endif
- X/*+-------------------------------------------------------------------------
- X utmpstat.c - utmp status for XENIX/UNIX line
- X wht%n4hgf@gatech.edu
- X
- X Defined functions:
- X strcmpi(s1,s2)
- X utmp_status(line)
- X
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */
- X/*:03-25-1990-14:12-wht@n4hgf------ x2.70 ------- */
- X/*:03-23-1990-14:44-wht@n4hgf-add strcmpi */
- X/*:11-24-1989-21:04-wht-creation */
- X
- X#include "ecu.h"
- X#include "ecuhangup.h"
- X#include "utmpstatus.h"
- X#include "ecuungetty.h"
- X#include "dialer.h"
- X#include <errno.h>
- X#include <utmp.h>
- X
- Xextern int errno;
- X
- Xchar *utmp_file = "/etc/utmp";
- Xstruct utmp last_utmp;
- X
- X/*+-------------------------------------------------------------------------
- X strcmpi(s1,s2) - case-insensitive strcmp
- X--------------------------------------------------------------------------*/
- Xint
- Xstrcmpi(s1,s2)
- Xregister char *s1;
- Xregister char *s2;
- X{
- Xregister char c1,c2;
- X
- X for ( ; *s1 ; s1++, s2++)
- X {
- X if(isupper(*s1))
- X c1 = tolower(*s1);
- X else
- X c1 = *s1;
- X if(isupper(*s2))
- X c2 = tolower(*s2);
- X else
- X c2 = *s2;
- X if(c1 != c2)
- X break;
- X }
- X return (*s1 - *s2);
- X} /* end of strcmpi */
- X
- X/*+-------------------------------------------------------------------------
- X utmp_status(line) - check line status in utmp
- X'line' is "/dev/ttyxx"-style
- Xreturns US_ value and global utmp struct last_utmp;
- X--------------------------------------------------------------------------*/
- Xint
- Xutmp_status(line)
- Xchar *line;
- X{
- Xregister ufd;
- Xregister itmp;
- Xregister status = US_NOTFOUND;
- X#if defined(LOG_UTMP)
- Xchar logstr[128];
- X#endif
- X
- X if((ufd = open(utmp_file,O_RDONLY,755)) < 0)
- X {
- X perror(utmp_file);
- X hangup(HANGUP_LINE_OPEN_ERROR);
- X }
- X
- X while(read(ufd,(char *)&last_utmp,sizeof(last_utmp)) > 0)
- X {
- X#if defined(M_UNIX)
- X if((!strcmp(last_utmp.ut_name,"uugetty") ||
- X !strcmp(last_utmp.ut_name,"getty")) &&
- X (ulindex(last_utmp.ut_id,line + 8) == (strlen(last_utmp.ut_id) - 2)))
- X {
- X if(itmp = line_locked(line))
- X status = US_DIALOUT;
- X else
- X status = US_LOGIN;
- X break;
- X }
- X if((!strcmpi(last_utmp.ut_line,line + 5)) &&
- X (!kill(last_utmp.ut_pid,0) || (errno != ESRCH)))
- X {
- X status = US_LOGGEDIN;
- X break;
- X }
- X#else
- X if((!strcmpi(last_utmp.ut_line,line + 5)) &&
- X (!kill(last_utmp.ut_pid,0) || (errno != ESRCH)))
- X {
- X if(!strcmp(last_utmp.ut_user,"LOGIN"))
- X status = US_LOGIN;
- X else if(!strcmp(last_utmp.ut_user,"DIALOUT"))
- X status = US_DIALOUT;
- X else
- X status = US_LOGGEDIN;
- X break;
- X }
- X#endif
- X }
- X
- X#if defined(LOG_UTMP)
- X if(status == US_NOTFOUND)
- X sprintf(logstr,"UTMP %s: no entry in utmp, status=%d",line,status);
- X else
- X {
- X char *ctime();
- X sprintf(logstr,"UTMP %s:%s:%s:%d:status=%d:%s",
- X last_utmp.ut_user, last_utmp.ut_id, last_utmp.ut_line,
- X last_utmp.ut_pid,status, ctime(&last_utmp.ut_time));
- X logstr[strlen(logstr) - 1] = 0; /* kill NL from ctime() */
- X }
- X ecu_log_event(logstr);
- X#endif
- X close(ufd);
- X return(status);
- X
- X} /* end of utmp_status */
- X
- X/* vi: set tabstop=4 shiftwidth=4: */
- X/* end of utmpstat.c */
- SHAR_EOF
- $TOUCH -am 0507233390 utmpstat.c &&
- chmod 0644 utmpstat.c ||
- echo "restore of utmpstat.c failed"
- set `wc -c utmpstat.c`;Wc_c=$1
- if test "$Wc_c" != "3130"; then
- echo original size 3130, current size $Wc_c
- fi
- # ============= var.c ==============
- echo "x - extracting var.c (Text)"
- sed 's/^X//' << 'SHAR_EOF' > var.c &&
- X/* CHK=0xF525 */
- X/*+-------------------------------------------------------------------------
- X var.c - ecu variable routines
- X wht%n4hgf@gatech.edu
- X
- X Defined functions:
- X alloc_MKV(name)
- X build_mkvi(param)
- X build_mkvi_primitive(name)
- X build_mkvs(param)
- X build_mkvs_primitive(name,length)
- X cmd_mkvar(param)
- X find_mkvs(name,ppesd,auto_create)
- X find_mkvi(name,pplong,auto_create)
- X free_mkvi(mkv)
- X free_mkvs(mkv)
- X get_ivptr(param,ppiv,auto_create)
- X get_subscript(param,psubscript)
- X get_svptr(param,ppsv,auto_create)
- X mkv_proc_starting(pcb)
- X mkv_proc_terminating(pcb)
- X var_init()
- X
- X--------------------------------------------------------------------------*/
- X/*+:EDITS:*/
- X/*:05-07-1990-21:24-wht@n4hgf---- 2.80 --- */
- X/*:04-19-1990-03:08-wht@n4hgf-GCC run found unused vars -- rm them */
- X/*:04-19-1990-03:04-wht@n4hgf-miraculous: alloc_MKV was working w/no return */
- X/*:04-08-1990-19:07-wht@n4hgf-add auto_create to get_{i,s}vptr */
- X/*:03-25-1990-14:12-wht@n4hgf------ x2.70 ------- */
- X/*:03-24-1990-18:54-wht@n4hgf-add switch to funcs to control auto creation */
- X/*:03-24-1990-18:54-wht@n4hgf-fix bug in auto string var creation */
- X/*:11-20-1989-17:01-wht-auto-make named variables, warn if proctrace on */
- X/*:11-20-1989-16:50-wht-add build_mkv?_primitive functions */
- X/*:07-03-1989-22:57-wht------ x2.00 ----- */
- X/*:06-27-1989-21:37-wht-start on mkv */
- X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */
- X
- X#include "ecu.h"
- X#include "esd.h"
- X#define VDECL
- X#include "var.h"
- X#include "proc.h"
- X#include "ecukey.h"
- X#include "ecuerror.h"
- X
- Xextern int proc_level;
- Xextern int proctrace;
- X
- Xtypedef union mkvu_type
- X{
- X ESD *sv;
- X long iv;
- X} MKVU;
- X
- Xtypedef struct mkv_type
- X{
- X MKVU item; /* pointer to esd if sv or long if iv */
- X struct mkv_type *next; /* next MKV in chain; if==NULL, no more in chain */
- X struct mkv_type *prev; /* previous MKV in chain; if==NULL, top of chain */
- X char *name; /* name of variable */
- X} MKV;
- X
- XMKV *mkvi_last = (MKV *)0;
- XMKV *mkvs_last = (MKV *)0;
- X
- X/*+-------------------------------------------------------------------------
- X var_init()
- X--------------------------------------------------------------------------*/
- Xvoid
- Xvar_init()
- X{
- Xregister itmp;
- X
- X for(itmp = 0; itmp < SVQUAN; itmp++)
- X {
- X if((sv[itmp] = make_esd(SVLEN)) == (ESD *)0)
- X {
- X pputs("out of memory\n");
- X exit(1);
- X }
- X }
- X
- X for(itmp = 0; itmp < IVQUAN; itmp++)
- X iv[itmp] = 0;
- X
- X} /* end of var_init */
- X
- X/*+-------------------------------------------------------------------------
- X alloc_MKV(name)
- X--------------------------------------------------------------------------*/
- XMKV *
- Xalloc_MKV(name)
- Xchar *name;
- X{
- XMKV *mkv;
- X if(!(mkv = (MKV *)malloc(sizeof(MKV))))
- X return((MKV *)0);
- X if(!(mkv->name = malloc(strlen(name) + 1)))
- X {
- X free((char *)mkv);
- X return((MKV *)0);
- X }
- X strcpy(mkv->name,name);
- X mkv->item.iv = 0;
- X return(mkv);
- X} /* end of alloc_MKV */
- X
- X/*+-------------------------------------------------------------------------
- X build_mkvi_primitive(name)
- X--------------------------------------------------------------------------*/
- Xbuild_mkvi_primitive(name)
- Xchar *name;
- X{
- XMKV *mkv;
- X
- X if((mkv = alloc_MKV(name)) == (MKV *)0)
- X return(eNoMemory);
- X if(mkvi_last)
- X mkvi_last->next = mkv;
- X mkv->prev = mkvi_last;
- X mkv->next = (MKV *)0;
- X mkvi_last = mkv;
- X return(0);
- X} /* end of build_mkvi_primitive */
- X
- X/*+-------------------------------------------------------------------------
- X build_mkvi(param)
- X--------------------------------------------------------------------------*/
- Xbuild_mkvi(param)
- XESD *param;
- X{
- Xregister erc;
- Xchar name[16];
- X
- X if(erc = get_alphanum_zstr(param,name,sizeof(name)))
- X return(erc);
- X return(build_mkvi_primitive(name));
- X
- X} /* end of build_mkvi */
- X
- X/*+-------------------------------------------------------------------------
- X build_mkvs_primitive(name,length)
- Xtrusts caller not to exceed 5120 max size
- X--------------------------------------------------------------------------*/
- Xbuild_mkvs_primitive(name,length)
- Xchar *name;
- Xint length;
- X{
- XMKV *mkv;
- XESD *text;
- X
- X if((text = make_esd((int)length)) == (ESD *)0)
- X return(eNoMemory);
- X
- X if((mkv = alloc_MKV(name)) == (MKV *)0)
- X {
- X free_esd(text);
- X return(eNoMemory);
- X }
- X
- X mkv->item.sv = text;
- X
- X if(mkvs_last)
- X mkvs_last->next = mkv;
- X mkv->prev = mkvs_last;
- X mkv->next = (MKV *)0;
- X mkvs_last = mkv;
- X return(0);
- X
- X} /* end of build_mkvs_primitive */
- X
- X/*+-------------------------------------------------------------------------
- X build_mkvs(param)
- X--------------------------------------------------------------------------*/
- Xbuild_mkvs(param)
- XESD *param;
- X{
- Xregister erc;
- Xchar name[16];
- Xulong length;
- X
- X if(erc = get_alphanum_zstr(param,name,sizeof(name)))
- X return(erc);
- X
- X if(erc = skip_paren(param,1))
- X return(erc);
- X if(erc = gint(param,&length))
- X return(erc);
- X if(length > 5120)
- X {
- X pprintf("max string size is 5120 ... cannot make %lu byte string\n",
- X length);
- X return(eFATAL_ALREADY);
- X }
- X if(erc = skip_paren(param,0))
- X return(erc);
- X
- X return(build_mkvs_primitive(name,(int)length));
- X
- X} /* end of build_mkvs */
- X
- X/*+-------------------------------------------------------------------------
- X cmd_mkvar(param)
- X
- Xmkvar i<name>
- Xmkvar s<name>(<size-int>)
- X--------------------------------------------------------------------------*/
- Xint
- Xcmd_mkvar(param)
- XESD *param;
- X{
- Xregister erc;
- Xchar vartype;
- X
- X if(!proc_level)
- X return(eNotExecutingProc);
- X
- X do {
- X if(erc = get_cmd_char(param,&vartype))
- X return(erc);
- X if(vartype == '$')
- X {
- X if(erc = get_cmd_char(param,&vartype))
- X return(erc);
- X }
- X vartype = to_lower(vartype);
- X switch(vartype)
- X {
- X case 'i':
- X erc = build_mkvi(param);
- X break;
- X case 's':
- X erc = build_mkvs(param);
- X break;
- X default:
- X return(eIllegalVarType);
- X }
- X if(erc)
- X return(erc);
- X } while(!skip_comma(param));
- X
- X if(!end_of_cmd(param))
- X return(eSyntaxError);
- X
- X return(0);
- X
- X} /* end of cmd_mkvar */
- X
- X/*+-------------------------------------------------------------------------
- X free_mkvi(mkv)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xfree_mkvi(mkv)
- XMKV *mkv;
- X{
- X free(mkv->name);
- X free((char *)mkv);
- X} /* end of free_mkvi */
- X
- X/*+-------------------------------------------------------------------------
- X free_mkvs(mkv)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xfree_mkvs(mkv)
- XMKV *mkv;
- X{
- X free_esd(mkv->item.sv);
- X free(mkv->name);
- X free((char *)mkv);
- X} /* end of free_mkvs */
- X
- X/*+-------------------------------------------------------------------------
- X mkv_proc_starting(pcb)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xmkv_proc_starting(pcb)
- XPCB *pcb;
- X{
- X pcb->mkvs_last = (char *)mkvs_last;
- X pcb->mkvi_last = (char *)mkvi_last;
- X} /* end of mkv_proc_starting */
- X
- X/*+-------------------------------------------------------------------------
- X mkv_proc_terminating(pcb)
- X--------------------------------------------------------------------------*/
- Xvoid
- Xmkv_proc_terminating(pcb)
- XPCB *pcb;
- X{
- XMKV *pmkv;
- X
- X while(mkvi_last != (MKV *)pcb->mkvi_last)
- X {
- X pmkv = mkvi_last->prev;
- X free_mkvi(mkvi_last);
- X mkvi_last = pmkv;
- X }
- X while(mkvs_last != (MKV *)pcb->mkvs_last)
- X {
- X pmkv = mkvs_last->prev;
- X free_mkvs(mkvs_last);
- X mkvs_last = pmkv;
- X }
- X
- X} /* end of mkv_proc_terminating */
- X
- X/*+-------------------------------------------------------------------------
- X find_mkvs(name,ppesd,auto_create)
- X--------------------------------------------------------------------------*/
- Xint
- Xfind_mkvs(name,ppesd,auto_create)
- Xchar *name;
- XESD **ppesd;
- Xint auto_create;
- X{
- Xint erc;
- XMKV *mkv = mkvs_last;
- X
- X while(mkv)
- X {
- X if(!strcmp(name,mkv->name))
- X {
- X *ppesd = mkv->item.sv;
- X return(0);
- X }
- X mkv = mkv->prev;
- X }
- X
- X if(auto_create)
- X {
- X if(proctrace)
- X pprintf("creating $s%s(256)\n",name);
- X if(erc = build_mkvs_primitive(name,256))
- X return(erc);
- X *ppesd = mkvs_last->item.sv;
- X return(0);
- X }
- X
- X return(eNoSuchVariable);
- X
- X} /* end of find_mkvs */
- X
- X/*+-------------------------------------------------------------------------
- X find_mkvi(name,pplong,auto_create)
- X--------------------------------------------------------------------------*/
- Xint
- Xfind_mkvi(name,pplong,auto_create)
- Xchar *name;
- Xlong **pplong;
- Xint auto_create;
- X{
- Xint erc;
- XMKV *mkv = mkvi_last;
- X
- X while(mkv)
- X {
- X if(!strcmp(name,mkv->name))
- X {
- X *pplong = &mkv->item.iv;
- X return(0);
- X }
- X mkv = mkv->prev;
- X }
- X
- X if(auto_create)
- X {
- X if(proctrace)
- X pprintf("creating $i%s\n",name);
- X if(erc = build_mkvi_primitive(name))
- X return(erc);
- X *pplong = &mkvi_last->item.iv;
- X return(0);
- X }
- X
- X return(eNoSuchVariable);
- X
- X} /* end of find_mkvi */
- X
- X/*+-------------------------------------------------------------------------
- X get_subscript(param,psubscript)
- Xonly called when '[' at pb + index
- X--------------------------------------------------------------------------*/
- Xget_subscript(param,psubscript)
- XESD *param;
- Xulong *psubscript;
- X{
- Xregister erc;
- X
- X param->index++;
- X if(erc = gint(param,psubscript))
- X return(erc);
- X if(skip_cmd_char(param,']'))
- X return(eSyntaxError);
- X return(0);
- X} /* end of get_subscript */
- X
- X/*+-------------------------------------------------------------------------
- X get_ivptr(param,ppiv,auto_create)
- Xcalled with index set to $i.....
- X ^
- X--------------------------------------------------------------------------*/
- Xget_ivptr(param,ppiv,auto_create)
- XESD *param;
- Xlong **ppiv;
- Xint auto_create;
- X{
- Xregister erc;
- Xulong varnum;
- Xchar name[16];
- X
- X if(end_of_cmd(param))
- X return(eSyntaxError);
- X else if(!get_numeric_value(param,&varnum))
- X goto TEST_VARNUM;
- X else if(*(param->pb + param->index) == '[')
- X {
- X if(erc = get_subscript(param,&varnum))
- X return(erc);
- XTEST_VARNUM:
- X if(varnum >= IVQUAN)
- X return(eIllegalVarNumber);
- X *ppiv = &iv[(int)varnum];
- X return(0);
- X }
- X else if(get_alphanum_zstr(param,name,sizeof(name)))
- X return(eInvalidVarName);
- X
- X return(find_mkvi(name,ppiv,auto_create));
- X
- X} /* end of get_ivptr */
- X
- X/*+-------------------------------------------------------------------------
- X get_svptr(param,ppsv,auto_create)
- Xcalled with index set to $s.....
- X ^
- X--------------------------------------------------------------------------*/
- Xget_svptr(param,ppsv,auto_create)
- XESD *param;
- XESD **ppsv;
- Xint auto_create;
- X{
- Xregister erc;
- Xulong varnum;
- Xchar name[16];
- X
- X if(end_of_cmd(param))
- X return(eSyntaxError);
- X else if(!get_numeric_value(param,&varnum))
- X goto TEST_VARNUM;
- X else if(*(param->pb + param->index) == '[')
- X {
- X if(erc = get_subscript(param,&varnum))
- X return(erc);
- XTEST_VARNUM:
- X if(varnum >= SVQUAN)
- X return(eIllegalVarNumber);
- X *ppsv = sv[(int)varnum];
- X return(0);
- X }
- X if(get_alphanum_zstr(param,name,sizeof(name)))
- X return(eInvalidVarName);
- X return(find_mkvs(name,ppsv,0));
- X
- X} /* end of get_svptr */
- X
- X/* vi: set tabstop=4 shiftwidth=4: */
- X/* end of var.c */
- SHAR_EOF
- $TOUCH -am 0507233390 var.c &&
- chmod 0644 var.c ||
- echo "restore of var.c failed"
- set `wc -c var.c`;Wc_c=$1
- if test "$Wc_c" != "10708"; then
- echo original size 10708, current size $Wc_c
- fi
- echo "End of part 14, continue with part 15"
- exit 0
-
-