wht@tridom.uucp (Warren Tucker) (10/10/89)
---- Cut Here and unpack ---- #!/bin/sh # this is part 20 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file regexp.c continued # CurArch=20 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 regexp.c" sed 's/^X//' << 'SHAR_EOF' >> regexp.c 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 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 echo "File regexp.c is complete" chmod 0644 regexp.c || echo "restore of regexp.c fails" echo "x - extracting smap.c (Text)" sed 's/^X//' << 'SHAR_EOF' > smap.c && X/* CHK=0x3FFC */ X/* X * @(#)smap.c 1.2 30/08/88 16:28:19 agc X * X * Copyright 1988, Joypace Ltd., UK. This product is "careware". X * If you find it useful, I suggest that you send what you think X * it is worth to the charity of your choice. X * X * Alistair G. Crooks, +44 5805 3114 X * Joypace Ltd., X * 2 Vale Road, X * Hawkhurst, X * Kent TN18 4BU, X * UK. X * X * UUCP Europe ...!mcvax!unido!nixpbe!nixbln!agc X * UUCP everywhere else ...!uunet!linus!nixbur!nixpbe!nixbln!agc X * X * smap.c - source file for debugging aids. X */ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */ X X#include <stdio.h> X#include <signal.h> X#include "stdio_lint.h" X#include "lint_args.h" X Xtypedef struct _slotstr X{ X char *s_ptr; /* the allocated area */ X unsigned int s_size; /* its size */ X char s_freed; /* whether it's been freed yet */ X char s_blkno; /* program block reference number */ X} SLOT; X X#ifndef MAXSLOTS X#define MAXSLOTS 4096 X#endif /* MAXSLOTS */ X Xstatic SLOT slots[MAXSLOTS]; Xstatic int slotc; Xstatic int blkno; X X#define WARNING(s1, s2) (void) fprintf(stderr, s1, s2) X Xchar *malloc(); Xchar *calloc(); Xchar *realloc(); Xvoid _abort(); X X/*+------------------------------------------------------------------------- X _dump_malloc() X--------------------------------------------------------------------------*/ Xvoid X_dump_malloc() X{ Xregister islot; Xregister slot_count = 0; Xchar dfile[32]; Xchar title[64]; XFILE *fp; XSLOT *slot; X X sprintf(dfile,"/tmp/m%05d.dmp",getpid()); X fp = fopen(dfile,"w"); X fprintf(stderr,"\r\n\n\ndumping to %s\r\n",dfile); X for(islot = 0; islot < slotc; islot++) X { X slot = &slots[islot]; X if(slot->s_freed) X continue; X sprintf(title,"%d (%d) %08x size %u", X slot_count,islot,slot->s_ptr,slot->s_size); X hex_dump_fp(fp,slot->s_ptr,slot->s_size,title,0); X slot_count++; X } X fclose(fp); X fprintf(stderr,"done\r\n"); X X} /* end of _dump_malloc */ X X X/* X * _malloc - wrapper around malloc. Warns if unusual size given, or the X * real malloc returns a NULL pointer. Returns a pointer to the X * malloc'd area X */ Xchar * X_malloc(size) Xunsigned int size; X{ X SLOT *sp; X char *ptr; X int i; X X if(size == 0) X WARNING("_malloc: unusual size %d bytes\r\n",size); X if((ptr = (char *) malloc(size)) == (char *) NULL) X _abort("_malloc: unable to malloc %u bytes\r\n",size); X for(i = 0,sp = slots ; i < slotc ; i++,sp++) X if(sp->s_ptr == ptr) X break; X if(i == slotc) X { X if(slotc == MAXSLOTS - 1) X { X _dump_malloc(); X _abort("_malloc: run out of slots\r\n",(char *) NULL); X } X sp = &slots[slotc++]; X } X else if(!sp->s_freed) X WARNING("_malloc: malloc returned a non-freed pointer\r\n",NULL); X sp->s_size = size; X sp->s_freed = 0; X sp->s_ptr = ptr; X sp->s_blkno = blkno; X#ifndef NO_EXTRA_HELP X memset(sp->s_ptr,0x12,sp->s_size); X#endif X return(sp->s_ptr); X} X X X/* X * _calloc - wrapper for calloc. Calls _malloc to allocate the area, and X * then sets the contents of the area to NUL bytes. Returns its address. X */ Xchar * X_calloc(nel,size) Xint nel; Xunsigned int size; X{ X unsigned int tot; X char *ptr; X char *cp; X X tot = nel * size; X ptr = _malloc(tot); X if((cp = ptr) == (char *) NULL) X return((char *) NULL); X while(tot--) X *cp++ = 0; X return(ptr); X} X X X/* X * _realloc - wrapper for realloc. Checks area already alloc'd and X * not freed. Returns its address X */ Xchar * X_realloc(ptr,size) Xchar *ptr; Xunsigned int size; X{ X SLOT *sp; X int i; X X for(i = 0,sp = slots ; i < slotc ; i++,sp++) X if(sp->s_ptr == ptr) X break; X if(i == slotc) X _abort("_realloc: realloc on unallocated area\r\n",(char *) NULL); X if(sp->s_freed) X WARNING("_realloc: realloc on freed area\r\n",(char *) NULL); X if((sp->s_ptr = (char *) realloc(ptr,size)) == (char *) NULL) X WARNING("_realloc: realloc failure %d bytes\r\n",size); X sp->s_size = size; X sp->s_blkno = blkno; X return(sp->s_ptr); X} X X X/* X * _free - wrapper for free. Loop through allocated slots, until you X * find the one corresponding to pointer. If none, then it's an attempt X * to free an unallocated area. If it's already freed, then tell user. X */ Xvoid X_free(ptr) Xchar *ptr; X{ X SLOT *sp; X int i; X X for(i = 0,sp = slots ; i < slotc ; i++,sp++) X if(sp->s_ptr == ptr) X break; X if(i == slotc) X _abort("_free: free not previously malloc'd\r\n",(char *) NULL); X if(sp->s_freed) X _abort("_free: free after previous freeing\r\n",(char *) NULL); X (void) free(sp->s_ptr); X sp->s_freed = 1; X} X X X/* X * _blkstart - start of a program block. Increase the block reference X * number by one. X */ Xvoid X_blkstart() X{ X blkno += 1; X} X X X/* X * _blkend - end of a program block. Check all areas allocated in this X * block have been freed. Decrease the block number by one. X */ Xvoid X_blkend() X{ X SLOT *sp; X int i; X X if(blkno == 0) X { X WARNING("_blkend: unmatched call to _blkend\r\n",NULL); X return; X } X for(i = 0,sp = slots ; i < slotc ; i++,sp++) X if(sp->s_blkno == blkno && !sp->s_freed) X WARNING("_blkend: %d bytes unfreed\r\n",sp->s_size); X blkno -= 1; X} X X X/* X * _blkignore - find the slot corresponding to ptr, and set its block X * number to zero, to avoid _blkend picking it up when checking. X */ Xvoid X_blkignore(ptr) Xchar *ptr; X{ X SLOT *sp; X int i; X X for(i = 0,sp = slots ; i < slotc ; i++,sp++) X if(sp->s_ptr == ptr) X break; X if(i == slotc) X WARNING("_blkignore: pointer has not been allocated\r\n",NULL); X else X sp->s_blkno = 0; X} X X/* X * _abort - print a warning on stderr, and send a SIGQUIT to ourself X */ X#if !defined(BUILDING_LINT_ARGS) Xstatic void X_abort(s1,s2) Xchar *s1; Xchar *s2; X{ X WARNING(s1,s2); X (void) kill(getpid(),SIGQUIT); /* core dump here */ X} X#endif SHAR_EOF chmod 0644 smap.c || echo "restore of smap.c fails" echo "x - extracting sysdep.c (Text)" sed 's/^X//' << 'SHAR_EOF' > sysdep.c && X/* CHK=0x2755 */ X/*+------------------------------------------------------------------------- X sysdep.c -- system dependency aid X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ 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_XENIX) X "M_XENIX", 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(pyr) X "pyr", X#endif X#if defined(i386) X "i386", 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{ X register int iargv; 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 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 chmod 0644 sysdep.c || echo "restore of sysdep.c fails" echo "x - extracting var.c (Text)" sed 's/^X//' << 'SHAR_EOF' > var.c && X/* CHK=0x2B08 */ X/*+------------------------------------------------------------------------- X var.c - ecu variable routines X Copyright 1989 Warren H. Tucker, III. All Rights Reserved X X Defined functions: X alloc_MKV(name) X build_mkvi(param) X build_mkvs(param) X cmd_mkvar(param) X find_mkvi(name,pplong) X find_mkvs(name,ppesd) X free_mkvi(mkv) X free_mkvs(mkv) X get_ivptr(param,ppiv) X get_svptr(param,ppsv) X mkv_proc_starting(pcb) X mkv_proc_terminating(pcb) X var_init() X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.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 Xchar *malloc(); X Xextern int proc_level; 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))) == (MKV *)0) X return((MKV *)0); X if((mkv->name = malloc(strlen(name) + 1)) == (char *)0) X { X free((char *)mkv); X return((MKV *)0); X } X strcpy(mkv->name,name); X mkv->item.iv = 0; X X} /* end of alloc_MKV */ X X/*+------------------------------------------------------------------------- X build_mkvi(param) X--------------------------------------------------------------------------*/ Xbuild_mkvi(param) XESD *param; X{ Xregister erc; Xchar name[16]; XMKV *mkv; X X if(erc = get_alphanum_zstr(param,name,sizeof(name))) X return(erc); X X if((mkv = alloc_MKV(name)) == (MKV *)0) X return(eNoMemory); X 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 X} /* end of build_mkvi */ X X/*+------------------------------------------------------------------------- X build_mkvs(param) X--------------------------------------------------------------------------*/ Xbuild_mkvs(param) XESD *param; X{ Xregister erc; Xchar name[16]; XMKV *mkv = (MKV *)0; XESD *text = (ESD *)0; 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 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 */ 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) X--------------------------------------------------------------------------*/ Xint Xfind_mkvs(name,ppesd) Xchar *name; XESD **ppesd; X{ 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 return(eNoSuchVariable); X X} /* end of find_mkvs */ X X/*+------------------------------------------------------------------------- X find_mkvi(name,pplong) X--------------------------------------------------------------------------*/ Xint Xfind_mkvi(name,pplong) Xchar *name; Xlong **pplong; X{ 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 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 X} /* end of get_subscript */ X X/*+------------------------------------------------------------------------- X get_ivptr(param,ppiv) Xcallled with index set to $i..... X ^ X--------------------------------------------------------------------------*/ Xget_ivptr(param,ppiv) XESD *param; Xlong **ppiv; 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)); X X} /* end of get_ivptr */ X X/*+------------------------------------------------------------------------- X get_svptr(param,ppsv) Xcallled with index set to $s..... X ^ X--------------------------------------------------------------------------*/ Xget_svptr(param,ppsv) XESD *param; XESD **ppsv; 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)); X X} /* end of get_svptr */ X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of var.c */ SHAR_EOF chmod 0644 var.c || echo "restore of var.c fails" echo "x - extracting dialer.h (Text)" sed 's/^X//' << 'SHAR_EOF' > dialer.h && X/* CHK=0x8F3C */ X/*+------------------------------------------------------------------------- X dialer.h - HDB UUCP dialer program return code error codes X Copyright 1989 Warren H. Tucker, III. All Rights Reserved X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:07-01-1989-21:56-wht-creation */ X X#define RC_FAIL 0x80 /* 1 = failed to connect */ X#define RCE_NULL 0 /* general purpose or unknown error code */ X#define RCE_INUSE 1 /* line in use */ X#define RCE_SIG 2 /* signal aborted dialer */ X#define RCE_ARGS 3 /* invalid arguments */ X#define RCE_PHNO 4 /* invalid phone number */ X#define RCE_SPEED 5 /* invalid baud rate -or- bad connect baud */ X#define RCE_OPEN 6 /* can't open line */ X#define RCE_IOCTL 7 /* ioctl error */ X#define RCE_TIMOUT 8 /* timeout */ X#define RCE_NOTONE 9 /* no dial tone */ X#define RCE_BUSY 13 /* phone is busy */ X#define RCE_NOCARR 14 /* no carrier */ X#define RCE_ANSWER 15 /* no answer */ X X/* code writing aid */ X#ifdef NEVER X case RCE_NULL: /* general purpose or unknown error code */ X case RCE_INUSE: /* line in use */ X case RCE_SIG: /* signal aborted dialer */ X case RCE_ARGS: /* invalid arguments */ X case RCE_PHNO: /* invalid phone number */ X case RCE_SPEED: /* invalid baud rate -or- bad connect baud */ X case RCE_OPEN: /* can't open line */ X case RCE_IOCTL: /* ioctl error */ X case RCE_TIMOUT: /* timeout */ X case RCE_NOTONE: /* no dial tone */ X case RCE_BUSY: /* phone is busy */ X case RCE_NOCARR: /* no carrier */ X case RCE_ANSWER: /* no answer */ X#endif X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of dialer.h */ SHAR_EOF chmod 0644 dialer.h || echo "restore of dialer.h fails" echo "x - extracting dvent.h (Text)" sed 's/^X//' << 'SHAR_EOF' > dvent.h && X/* CHK=0x9039 */ X/*+------------------------------------------------------------------------- X dvent.h - HDB UUCP Devices file entry (a la pwent.h) X Copyright 1989 Warren H. Tucker, III. All Rights Reserved X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:07-01-1989-14:50-wht-creation */ X Xstruct dvent X{ X char *type; /* ACU or Direct */ X char *line; /* tty name "ttyxx"-style */ X char *dialer; /* "801" dialer line */ X uint low_baud; /* lowest baud rate */ X uint high_baud; /* highest baud rate */ X char *dialprog; /* dialer program */ X}; X Xstruct dvent *getdvent(); Xstruct dvent *getdvbaud(); Xstruct dvent *getdvline(); Xvoid enddvent(); X X/* vi: set tabstop=4 shiftwidth=4: */ X/* end of dvent.h */ SHAR_EOF chmod 0644 dvent.h || echo "restore of dvent.h fails" echo "x - extracting ecu.h (Text)" sed 's/^X//' << 'SHAR_EOF' > ecu.h && X/* CHK=0xECCF */ X/*+----------------------------------------------------------------------- X ecu.h -- TuckerWare Extended Calling Unit X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved 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#if !defined(STDIO_H_INCLUDED) X#include <stdio.h> X#endif X#include <signal.h> X#include <ctype.h> X#include <sys/types.h> X#include <sys/errno.h> X X#include "ecuhangup.h" X X#define MALLOC_3X X#if defined(MALLOC_3X) X#include <malloc.h> X#endif X X#if defined(M_XENIX) X#include <memory.h> X#include <sys/stat.h> X#include <string.h> X#include <fcntl.h> X#if !defined(OMIT_TERMIO_REFERENCES) X#include <sys/ioctl.h> X#include <termio.h> X#endif X#endif X X#if defined(pyr) X#include <sys/stat.h> X#include <sys/file.h> X#if !defined(OMIT_TERMIO_REFERENCES) X#include <sys/termio.h> X#endif X#include <strings.h> X#define strchr index X#define strrchr rindex X#define memcpy(a,b,c) bcopy(b,a,c) X#endif X X#if !defined(ushort) X#define ushort unsigned short X#endif X#if !defined(uchar) X#define uchar unsigned char X#endif X#if !defined(uint) X#define uint unsigned int X#endif X#if !defined(ulong) X#define ulong unsigned long X#endif X X/* for better source line utilization, frequent use of 'fprintf' and 'stderr' X warrants the following */ X#define pf printf X#define ff fprintf X#define se stderr X#define so stdout X X#define DEFAULT_BAUD_RATE 2400 X#define TTYIN 0 X#define TTYOUT 1 /* ditto tty output */ X#define TTYERR 2 /* ditty tty output error channel */ X X/* xbell codes */ X#if defined(M_XENIX) X#define XBELL_DEEDLE 1 /* octaves */ X#define XBELL_ATTENTION 2 /* morse .-.-.- ATTENTION */ X#define XBELL_C 3 /* morse -.-. C */ X#define XBELL_3T 4 /* 3 morse T's */ X#endif X X/* lopen() and related routines error codes */ X#define LOPEN_INVALID -1 /* for invalid tty name */ X#define LOPEN_UNKPID -2 /* unknown pid using line */ X#define LOPEN_LCKERR -3 /* lock file open error */ X#define LOPEN_NODEV -4 /* device does not exist */ X#define LOPEN_OPNFAIL -5 /* could not open line */ X#define LOPEN_ALREADY -6 /* line already open */ X#define LOPEN_ENABLED -7 /* line enabled for login */ X#define LOPEN_ENABLED_IN_USE -8 /* line in use by incoming login */ X#define LOPEN_DIALOUT_IN_USE -9 /* line in use by another dial out */ X X#if defined(DECLARE_LINEVARS_PUBLIC) Xint Ladd_nl_incoming; /* when in ksr mode, add nl to cr on receive */ Xint Ladd_nl_outgoing; /* when in ksr mode, add nl to cr on xmit */ Xint Lfull_duplex; /* if non-zero, full duplex else half */ Xint Liofd; /* file descriptor for line */ Xint Lmodem_already_init; /* true if modem already initialized */ Xint Lmodem_off_hook; /* we try to keep accurate */ SHAR_EOF echo "End of part 20" echo "File ecu.h is continued in part 21" echo "21" > 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.