wht@n4hgf.uucp (Warren Tucker) (01/06/91)
Submitted-by: wht@n4hgf.uucp (Warren Tucker) Posting-number: Volume 16, Issue 30 Archive-name: ecu3/part06 ---- Cut Here and feed the following to sh ---- #!/bin/sh # This is part 06 of ecu3 if touch 2>&1 | fgrep 'amc' > /dev/null then TOUCH=touch else TOUCH=true fi # ============= ecuphrase.c ============== echo 'x - extracting ecuphrase.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ecuphrase.c' && X/*+----------------------------------------------------------------- X ecuphrases.c - %# phrase management X wht@n4hgf.Mt-Park.GA.US X X Defined functions: X phrase_help() X phrases(nargc,nargv) X read_phrases() X X------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */ X X#include "ecu.h" X X#define P_N_QUAN 23 Xchar *phrases_string[P_N_QUAN]; Xchar *phrases_label[P_N_QUAN]; Xint phrases_count = 0; Xint phrases_resident = 0; X X/*+----------------------------------------------------------------------- X read_phrases() X------------------------------------------------------------------------*/ Xvoid Xread_phrases() X{ Xregister char *phrases_str; Xchar phrases_buf[256]; Xchar phrases_buf_copy[256]; Xchar *phrases_lbl; XFILE *fd_phrase; X X if(phrases_resident) X { X while(phrases_count) X free(phrases_string[--phrases_count]); X phrases_resident = 0; X } X X get_home_dir(phrases_buf); X strcat(phrases_buf,"/.ecu/phrases"); X X if( (fd_phrase = fopen(phrases_buf,"r")) == NULL) X { X ff(se,"\r\n"); X perror(phrases_buf); X ff(se,"\r\n"); X ff(se,"... no phrases resident\r\n"); X return; X } X X/* we have an open .ecu/phrase file */ X phrases_count = 0; X while(fgets(phrases_buf,sizeof(phrases_buf),fd_phrase) != NULL) X { X phrases_buf[strlen(phrases_buf) - 1] = 0; X if(strlen(phrases_buf) == 0) X continue; X X if(phrases_count == P_N_QUAN) X { X ff(se,"\r\nMaximum number of phrases %d exceeded\r\n",P_N_QUAN); X ff(se,"rest of file ignored, starting with the following:\r\n"); X ff(se,"--> %s\r\n\r\n",phrases_buf); X phrases_resident = 1; X fclose(fd_phrase); X return; X } X strcpy(phrases_buf_copy,phrases_buf); X phrases_lbl = phrases_buf_copy; X for(phrases_str = phrases_buf_copy; *phrases_str; phrases_str++) X { X if(*phrases_str == ':') X { X *phrases_str++ = 0; X break; X } X if(*phrases_str == 0) X { X ff(se,"invalid entry `%s'\n",phrases_buf); X continue; X } X } X X if(!(phrases_string[phrases_count] = malloc(strlen(phrases_str)+2)) || X !(phrases_label[phrases_count] = malloc(strlen(phrases_lbl)+2))) X { X ff(se,"\r\nNo more memory for phrases\r\n"); X ff(se,"rest of file ignored, starting with the following:\r\n"); X ff(se,"--> %s\r\n\r\n",phrases_buf); X phrases_resident = 1; X fclose(fd_phrase); X if(phrases_string[phrases_count]) X free(phrases_string[phrases_count]); X return; X } X strcpy(phrases_string[phrases_count],phrases_str); X strcpy(phrases_label[phrases_count],phrases_lbl); X phrases_count++; X } /* while records left to read */ X X fclose(fd_phrase); X phrases_resident = 1; X} /* end of read_phrases */ X X/*+------------------------------------------------------------------------- X phrases(nargc,nargv) X--------------------------------------------------------------------------*/ Xphrases(nargc,nargv) Xint nargc; Xchar **nargv; X{ Xregister itmp; Xregister ichar; Xregister char *cptr; Xint old_ttymode = get_ttymode(); Xextern char *phrases_string[]; Xextern int phrases_count; Xextern int phrases_resident; Xextern int interrupt; Xextern int icmd_prompt_len; X X for(itmp = icmd_prompt_len + strlen(nargv[0]); itmp; itmp--) X fputs("\b \b",se); X X itmp = atoi(nargv[0]); X X if(itmp == 0) X { X ff(se,"\r\n"); X read_phrases(); X if(!phrases_count) X return(0); X tcap_stand_out(); X ff(se, X" # | mnemonic | phrase "); X tcap_stand_end(); X ff(se,"\r\n"); X for(itmp = 0; itmp < phrases_count; itmp++) X ff(se,"%2d | %12s | %s\r\n",itmp + 1,phrases_label[itmp], X phrases_string[itmp]); X return(0); X } X else X if(phrases_resident == 0) X read_phrases(); X X if(itmp > phrases_count) X { X ff(se," unknown: %d\r\n",itmp); X return(-1); X } X else X { X cptr = phrases_string[itmp - 1]; X ttymode(2); X while(*cptr) X { X if(interrupt) X break; X X switch(ichar = *cptr++) X { X case '^': X ichar = *cptr++; X if((ichar >= '@') && (ichar <= '_')) X lputc_paced(0,ichar & 0x1F); X else if(ichar == '?') X lputc_paced(0,0x7F); X else X { X switch(ichar) X { X case 0: X goto NULL_FOUND; X case 'r': X lputc_paced(0,'\r'); X break; X case 'n': X lputc_paced(0,'\n'); X break; X case 't': X lputc_paced(0,'\t'); X break; X case '^': X lputc_paced(0,'^'); X break; X case 'p': X itmp = atoi(cptr); X while((*cptr >= '0') && (*cptr <= '9')) X cptr++; X if(*cptr == '.') X cptr++; X if(!itmp) X itmp = 1; X nap((long)itmp * 100L); X break; X case 'a': X itmp = atoi(cptr); X while((*cptr >= '0') && (*cptr <= '9')) X cptr++; X if(*cptr == '.') X cptr++; X if(itmp < nargc) X { X lputs_paced(0,nargv[itmp]); X itmp = strlen(nargv[itmp]); X } X break; X } X } X break; X default: X lputc_paced(0,ichar); X } X } X XNULL_FOUND: X if(interrupt) X { X interrupt = 0; X ff(se,"\r\n--> interrupted\r\n"); X } X X } X X ttymode(old_ttymode); X return(0); X X} /* end of phrases */ X X X/*+------------------------------------------------------------------------- X phrase_help() X--------------------------------------------------------------------------*/ Xvoid Xphrase_help() X{ X ff(se,"^r == \\r ^n == \\n ^t == \\t ^^ == '^'\r\n"); X ff(se,"^p#. pause # secs\r\n"); X ff(se,"^a#. arg number # of %%# invocation\r\n"); X} /* end of phrase_help */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 1224223290 'ecuphrase.c' && chmod 0644 ecuphrase.c || echo 'restore of ecuphrase.c failed' Wc_c="`wc -c < 'ecuphrase.c'`" test 5521 -eq "$Wc_c" || echo 'ecuphrase.c: original size 5521, current size' "$Wc_c" # ============= ecurcvr.c ============== echo 'x - extracting ecurcvr.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ecurcvr.c' && X#define DEFENSIVE /* lots of changes this rev: defining this X * will make for screwed up screen image X * but no core dump if nassssty bugs show up X */ X/* #define ANSI_DEBUG */ /* debug ansi */ X/* #define ANSI_DEBUG_2 */ /* debug ansi intensive output */ X/* #define ANSI_DEBUG_3 */ /* debug ansi selected output */ X/* #define ANSI_DEBUG_NOBUF */ /* unbufferred logging */ X/* #define ANSI_DEBUG_LOGFILE "/dev/tty2h" */ X/* #define DEBUG_CURSOR */ X#ifdef TEMP_HACK X#define ANSI_DEBUG X#define ANSI_DEBUG_2 X#define ANSI_DEBUG_3 X#define ANSI_DEBUG_LOGFILE "/t/ansi.log" X#endif X X/*+------------------------------------------------------------------------- X ecurcvr.c - rcvr process + ANSI filter + non-ANSI<->ANSI hoop jumping X wht@n4hgf.Mt-Park.GA.US X X Defined functions: X accumulate_ansi_sequence(rchar) X ansi_CNL() X ansi_CPL() X ansi_CUB() X ansi_CUD() X ansi_CUF() X ansi_CUP() X ansi_CUU() X ansi_DCH() X ansi_DL() X ansi_DSR() X ansi_ECH() X ansi_ED() X ansi_EL() X ansi_HPA() X ansi_ICH() X ansi_IL() X ansi_SD() X ansi_SGR() X ansi_SU() X ansi_VPA() X is_ansi_terminator(rchar) X lgetc_rcvr() X process_ansi_sequence() X process_rcvd_char(rchar) X rcvd_ESC() X rcvr() X rcvr_log_open() X redisplay_rcvr_screen() X saved_cursor_restore_cursor() X saved_cursor_save_cursor() X spaces(buf,buflen) X spaces_trap(code,buf,buflen) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:12-21-1990-21:06-wht@n4hgf-CUF and CUB set non-ansi cursor incorrectly */ X/*:12-20-1990-16:27-wht@n4hgf-had SU and SD swapped */ X/*:11-30-1990-18:39-wht@n4hgf-non-ansi console rcvr appears to be working */ X/*:11-28-1990-14:13-wht@n4hgf-start non-ansi console support */ X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */ X X#include "ecu.h" X#include "ecukey.h" X Xextern int errno; Xextern char rcvr_log_file[]; /* if rcvr_log!= 0,log filename */ Xextern int rcvr_log; /* rcvr log active if != 0 */ Xextern FILE *rcvr_log_fp; /* rcvr log file */ Xextern int rcvr_log_raw; /* if true, log all, else filter ctl chrs */ Xextern int rcvr_log_append; /* if true, append, else scratch */ Xextern int rcvr_log_flusheach; /* if true, flush log on each char */ Xextern int rcvr_log_gen_title; X Xextern int want_bell_notify; Xextern uint tcap_LINES; /* terminal line quantity - see ecutcap.c */ Xextern uint tcap_COLS; /* terminal column quantity - see ecutcap.c */ Xextern uint LINESxCOLS; Xextern int tty_is_ansi; /* true if TERM contains "ansi" */ X Xstatic char esc = ESC; X#define MAX_ANSI_LEN 30 /* generous */ Xchar ansibuf[MAX_ANSI_LEN]; Xchar *ansi; Xint ansilen = 0; Xint in_ansi_accumulation = 0; X Xint saved_cursor_y; Xint saved_cursor_x; X X#define RCVR_RDQUAN 250 Xchar lgetc_buf[RCVR_RDQUAN]; Xchar *lgetc_ptr; Xint lgetc_count = 0; Xint vmin; /* quick copy of current vmin value */ X X#ifdef ANSI_DEBUG XFILE *wfp = (FILE *)0; X#endif X X/*+------------------------------------------------------------------------- X redisplay_rcvr_screen() - redisplay logical receiver screen XAs of writing, this function is called only by the XMTR process X--------------------------------------------------------------------------*/ Xvoid Xredisplay_rcvr_screen() X{ Xregister uint y; X X setcolor(colors_current); X tcap_stand_end(); X for(y = 0; y < tcap_LINES; y++) X { X tcap_cursor(y,0); X fwrite(&shm->screen[y][0], X ((y != tcap_LINES - 1) ? tcap_COLS : tcap_COLS - 1), X 1,se); X } X tcap_eeol(); X tcap_cursor(shm->cursor_y,shm->cursor_x); X X} /* end of redisplay_rcvr_screen */ X X#ifdef DEBUG_CURSOR Xvoid Xspaces_trap(code,buf,buflen) Xint code; Xregister uchar *buf; Xregister uint buflen; X{ Xchar *xyz = (char *)0x90000000; X ff(se,"rcvr 'spaces trap' code %d: cursor x,y=%d,%d\r\n", X code, X shm->cursor_y,shm->cursor_x); X ff(se,"buf=%08lx len=%08lx offs=%08lx\r\n",buf,buflen, X (ulong)buf - (ulong)shm->screen); X *xyz = 0; X abort(); X} X#endif X X/*+------------------------------------------------------------------------- X spaces(buf,buflen) - fill with spaces X--------------------------------------------------------------------------*/ Xvoid Xspaces(buf,buflen) Xregister uchar *buf; Xregister uint buflen; X{ X#ifdef DEBUG_CURSOR X if((ulong)buf > (((ulong)shm->screen) + LINESxCOLS)) X spaces_trap(1,buf,buflen); X if((ulong)buf < (ulong)shm->screen) X spaces_trap(2,buf,buflen); X if((ulong)(buf + buflen) > (((ulong)shm->screen) + LINESxCOLS)) X spaces_trap(3,buf,buflen); X if((ulong)(buf + buflen) < (ulong)shm->screen) X spaces_trap(4,buf,buflen); X#endif X X if(!buflen) X return; X X#ifdef DEFENSIVE X if((ulong)buf < (ulong)shm->screen) X return; X if((ulong)(buf + buflen) > (((ulong)shm->screen) + LINESxCOLS)) X return; X#endif X X while(buflen--) X *buf++ = ' '; X} /* end of spaces */ X X/*+------------------------------------------------------------------------- X lgetc_rcvr() - rcvr version of get char from line X--------------------------------------------------------------------------*/ Xint Xlgetc_rcvr() X{ Xextern int errno; Xchar char_rtnd; X X if(!lgetc_count) X { X if(vmin == 1) X { X char_rtnd = lgetc_xmtr(); X return(char_rtnd); X } X lgetc_ptr = lgetc_buf; XREAD_AGAIN: X errno = 0; X if((lgetc_count = X read(shm->Liofd,lgetc_buf,RCVR_RDQUAN)) < 0) X { X if(errno == EINTR) /* if signal interrupted, ... */ X goto READ_AGAIN; X hangup(HANGUP_LINE_READ_ERROR); X } X shm->rcvd_chars += lgetc_count; X shm->rcvd_chars_this_connect += lgetc_count; X X } X if(!lgetc_count) X goto READ_AGAIN; X X lgetc_count--; X return(*lgetc_ptr++); X} /* end of lgetc_rcvr */ X X/*+------------------------------------------------------------------------- X ansi_SGR() - Set Graphics Rendition X XThe DOS ANSI world expects to be able to be able to chain 0,1 and X3x,4x params together with semicolons. X X Supported modifiers for non-ansi terminals X 0 normal X 1 bold X 4 underscore X 5 blink X 7 reverse video X--------------------------------------------------------------------------*/ Xvoid Xansi_SGR() X{ Xregister itmp; Xregister char *cptr; Xchar SGRstr[MAX_ANSI_LEN]; Xchar *token; Xchar *str_token(); X X if(!tty_is_ansi) X { X cptr = ansibuf; X while(token = str_token(cptr,";")) X { X cptr = (char *)0; /* further calls to str_token need NULL */ X switch(atoi(token)) X { X case 0: /* normal */ X tcap_stand_end(); X tcap_blink_off(); X tcap_underscore_off(); X tcap_bold_off(); X break; X case 1: /* bold */ X tcap_bold_on(); X break; X case 4: /* underscore */ X tcap_underscore_on(); X break; X case 5: /* blink */ X tcap_blink_on(); X break; X case 7: /* reverse video */ X tcap_stand_out(); X break; X default: X break; X } X } X return; X } X X if(ansilen <= 3) /* 'ESC[<0-9>m' and 'ESC[m' - quickly handled */ X { X write(TTYERR,&esc,1); X write(TTYERR,ansibuf,ansilen); X return; X } X X/* check XENIX 'ESC[<2,3,7>m' extensions */ X switch(itmp = atoi(ansibuf + 1)) X { X case 7: /* XENIX 'ESC[7;<0-15>;<0-15>m' set fore/background color */ X itmp = atoi(ansibuf + 3); /* second parameter */ X if(itmp > 15) /* not XENIX extension */ X break; X /* fall through */ X case 2: /* XENIX 'ESC[2;<0-15>;<0-15>m' set fore/background color */ X case 3: /* XENIX 'ESC[3;<0-1>m' color only set/clear blink */ X write(TTYERR,&esc,1); X write(TTYERR,ansibuf,ansilen); X return; X default: X break; X } X X/* not XENIX extension */ X ansibuf[ansilen - 1] = 0; /* get rid of 'm' */ X cptr = ansibuf + 1; /* get rid of '[' */ X X while(token = str_token(cptr,";")) X { X cptr = (char *)0; /* further calls to str_token need NULL */ X sprintf(SGRstr,"\033[%sm",token); X write(TTYERR,SGRstr,strlen(SGRstr)); X } X X} /* end of ansi_SGR */ X X/*+------------------------------------------------------------------------- X ansi_CUP() - cursor position (also HVP horiz/vertical position) X--------------------------------------------------------------------------*/ Xvoid Xansi_CUP() X{ Xregister uint param_count = 0; Xchar ansicopy[MAX_ANSI_LEN]; Xregister char *cptr = ansicopy; Xregister char *token; Xchar *str_token(); X X strcpy(cptr,ansibuf + 1); X *(cptr + ansilen - 2) = 0; X X while(token = str_token(cptr,";")) X { X cptr = (char *)0; /* further calls to str_token need NULL */ X switch(++param_count) X { X case 1: shm->cursor_y = atoi(token) - 1; break; X case 2: shm->cursor_x = atoi(token) - 1; break; X } X } X switch(param_count) X { X case 0: X shm->cursor_y = 0; X case 1: X shm->cursor_x = 0; X } X if(shm->cursor_x > (tcap_COLS - 1)) X shm->cursor_x = 0; X if(shm->cursor_y > (tcap_LINES - 1)) X shm->cursor_y = 0; X X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X X} /* end of ansi_CUP */ X X/*+------------------------------------------------------------------------- X ansi_CUU() - cursor up X--------------------------------------------------------------------------*/ Xvoid Xansi_CUU() X{ Xregister uint count; Xregister uint y; X X if(ansilen == 2) /* no param */ X count = 1; X else X count = atoi(ansibuf + 1); X X y = shm->cursor_y - count; X if(y > (tcap_LINES - 1)) /* unsigned comparison */ X y = 0; X X if(y != shm->cursor_y) X { X shm->cursor_y = y; X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X X} /* end of ansi_CUU */ X X/*+------------------------------------------------------------------------- X ansi_CUD() - cursor down (also VPR vertical position relative) X--------------------------------------------------------------------------*/ Xvoid Xansi_CUD() X{ Xregister uint count; Xregister uint y; X X if(ansilen == 2) /* no param */ X count = 1; X else X count = atoi(ansibuf + 1); X X y = shm->cursor_y + count; X if(y > (tcap_LINES - 1)) X y = tcap_LINES - 1; X X if(y != shm->cursor_y) X { X shm->cursor_y = y; X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X X} /* end of ansi_CUD */ X X/*+------------------------------------------------------------------------- X ansi_CUF() - cursor forward (also HPR horizontal position relative) X--------------------------------------------------------------------------*/ Xvoid Xansi_CUF() X{ Xregister uint count; Xregister uint x; X X if(ansilen == 2) /* no param */ X count = 1; X else X count = atoi(ansibuf + 1); X X x = shm->cursor_x + count; X if(x > tcap_COLS - 1) X x = tcap_COLS - 1; X X if(x != shm->cursor_x) X { X shm->cursor_x = x; X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X X} /* end of ansi_CUF */ X X/*+------------------------------------------------------------------------- X ansi_CUB() - cursor forward X--------------------------------------------------------------------------*/ Xvoid Xansi_CUB() X{ Xregister uint count; Xregister uint x; X X if(ansilen == 2) /* no param */ X count = 1; X else X count = atoi(ansibuf + 1); X X x = shm->cursor_x - count; X if(x > (tcap_COLS - 1)) /* unsigned comparison */ X x = 0; X X if(x != shm->cursor_x) X { X shm->cursor_x = x; X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X X} /* end of ansi_CUB */ X X/*+------------------------------------------------------------------------- X ansi_DSR() - device status report X--------------------------------------------------------------------------*/ Xvoid Xansi_DSR() X{ Xchar response[MAX_ANSI_LEN]; X X sprintf(response,"\033[%d;%dR",shm->cursor_y + 1,shm->cursor_x + 1); X write(shm->Liofd,response,strlen(response)); X X} /* end of ansi_DSR */ X X/*+------------------------------------------------------------------------- X ansi_ED() - erase in display X--------------------------------------------------------------------------*/ Xvoid Xansi_ED() X{ Xregister uint param; Xint y; X X if(ansilen == 2) /* no param */ X param = 0; X else X param = atoi(ansibuf + 1); X X switch(param) X { X case 0: /* erase to end of display */ X spaces(&shm->screen[shm->cursor_y][shm->cursor_x], X LINESxCOLS - ((shm->cursor_y * tcap_COLS) + shm->cursor_x)); X if(!tty_is_ansi) X tcap_eeod(); X break; X case 1: /* erase from beginning of display */ X spaces((char *)shm->screen,(shm->cursor_y * tcap_COLS) + X shm->cursor_x); X if(!tty_is_ansi) X { X for(y = 0; y < shm->cursor_y - 1; y++) X { X tcap_cursor(y,0); X tcap_eeol(); X } X if(shm->cursor_x) X { X tcap_cursor(shm->cursor_y,0); X tcap_clear_area_char(shm->cursor_x,' '); X } X else X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X break; X case 2: /* clear display */ X shm->cursor_y = 0; X shm->cursor_x = 0; X spaces((char *)shm->screen,LINESxCOLS); X if(!tty_is_ansi) X { X tcap_clear_screen(); X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X break; X } X X} /* end of ansi_ED */ X X/*+------------------------------------------------------------------------- X ansi_EL() - erase in line X--------------------------------------------------------------------------*/ Xvoid Xansi_EL() X{ Xregister uint param; Xchar cr = CR; X X if(ansilen == 2) /* no param */ X param = 0; X else X param = atoi(ansibuf + 1); X X switch(param) X { X case 2: /* clear line */ X shm->cursor_x = 0; X if(!tty_is_ansi) X write(TTYERR,&cr,1); X /* fall thru */ X case 0: /* erase to end of line */ X spaces(&shm->screen[shm->cursor_y][shm->cursor_x], X tcap_COLS - shm->cursor_x); X if(!tty_is_ansi) X tcap_eeol(); X break; X case 1: /* erase from beginning of line */ X spaces(&shm->screen[shm->cursor_y][0],shm->cursor_x); X if(!tty_is_ansi && shm->cursor_x) X { X write(TTYERR,&cr,1); X tcap_clear_area_char(shm->cursor_x,' '); X } X break; X } X X} /* end of ansi_EL */ X X/*+------------------------------------------------------------------------- X ansi_ECH() - erase characters X--------------------------------------------------------------------------*/ Xvoid Xansi_ECH() X{ Xregister uint param; Xregister uint screen_pos; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if((shm->cursor_x + param) > (tcap_COLS - 1)) X return; X X screen_pos = (shm->cursor_y * tcap_COLS) + shm->cursor_x; X mem_cpy((char *)shm->screen + screen_pos, X (char *)shm->screen + screen_pos + param,param); X spaces((char *)shm->screen + ((shm->cursor_y + 1) * tcap_COLS) - X param, param); X X if(!tty_is_ansi) X tcap_delete_chars(param); X X} /* end of ansi_ECH */ X X/*+------------------------------------------------------------------------- X ansi_SU() - scroll up (new blank lines at the bottom) X--------------------------------------------------------------------------*/ Xvoid Xansi_SU() X{ Xregister uint param; Xregister uint count; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(param > tcap_LINES) X param = tcap_LINES; X if(!param) X return; X X#ifdef ANSI_DEBUG_3 X if(wfp) X fprintf(wfp,"SU: param=%u y,x=%d,%d\n",param, X shm->cursor_y,shm->cursor_x); X#endif X X count = tcap_COLS * param; X mem_cpy((char *)shm->screen, X (char *)shm->screen + (tcap_COLS * param), X LINESxCOLS - count); X spaces(&shm->screen[shm->cursor_y][0],count); X X if(!tty_is_ansi) X { X tcap_cursor(tcap_LINES - 1,0); X while(param--) X ff(se,"\r\n"); X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X X} /* end of ansi_SU */ X X/*+------------------------------------------------------------------------- X ansi_SD() - scroll down (new blank lines at the top) X--------------------------------------------------------------------------*/ Xvoid Xansi_SD() X{ Xregister uint param; Xregister uint count; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(param > tcap_LINES) X param = tcap_LINES; X if(!param) X return; X X#ifdef ANSI_DEBUG_3 X if(wfp) X fprintf(wfp,"SD: param=%u y,x=%d,%d\n",param, X shm->cursor_y,shm->cursor_x); X#endif X X count = tcap_COLS * param; X mem_cpy((char *)shm->screen,(char *)shm->screen + count, X LINESxCOLS - count); X spaces((char *)shm->screen + LINESxCOLS - count,count); X X if(!tty_is_ansi) X { X tcap_cursor(tcap_LINES - 1,0); X while(param--) X ff(se,"\r\n"); X tcap_cursor(shm->cursor_y,shm->cursor_x); X } X X} /* end of ansi_SD */ X X/*+------------------------------------------------------------------------- X ansi_HPA() - horizontal position absolute X--------------------------------------------------------------------------*/ Xvoid Xansi_HPA() X{ Xregister uint param; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(param > (tcap_LINES - 1)) X return; X X if((unsigned)(shm->cursor_x = param) > (unsigned)(tcap_COLS - 1)) X shm->cursor_x = tcap_COLS - 1; X X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X X} /* end of ansi_HPA */ X X/*+------------------------------------------------------------------------- X ansi_VPA() - vertical position absolute X--------------------------------------------------------------------------*/ Xvoid Xansi_VPA() X{ Xregister uint param; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(param > (tcap_COLS - 1)) X return; X X if((unsigned)(shm->cursor_y = param) > (unsigned)(tcap_LINES - 1)) X shm->cursor_y = tcap_LINES - 1; X X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X X} /* end of ansi_VPA */ X X/*+------------------------------------------------------------------------- X ansi_IL() - insert lines X--------------------------------------------------------------------------*/ Xvoid Xansi_IL() X{ Xregister uint param; Xregister uint count; Xregister uint screen_pos; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if((shm->cursor_y + param) > (tcap_LINES - 1)) X return; X X count = tcap_COLS * param; X screen_pos = shm->cursor_y * tcap_COLS; X mem_cpy((char *)shm->screen + screen_pos + count, X (char *)shm->screen + screen_pos, X LINESxCOLS - screen_pos - count); X spaces((char *)shm->screen + screen_pos,count); X X if(!tty_is_ansi) X tcap_insert_lines(param); X X} /* end of ansi_IL */ X X/*+------------------------------------------------------------------------- X ansi_ICH() - insert characters X--------------------------------------------------------------------------*/ Xvoid Xansi_ICH() X{ Xregister uint param; Xregister uint count; Xregister uint screen_pos; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(param > tcap_COLS - shm->cursor_x) X param = tcap_COLS - shm->cursor_x; X X if(!param) X return; X X screen_pos = (shm->cursor_y * tcap_COLS) + shm->cursor_x; X count = tcap_COLS - shm->cursor_x - param; X mem_cpy((char *)shm->screen + screen_pos + param, X (char *)shm->screen + screen_pos,count); X spaces((char *)shm->screen + screen_pos,param); X X if(!tty_is_ansi) X tcap_insert_chars(param); X X} /* end of ansi_ICH */ X X/*+------------------------------------------------------------------------- X ansi_DL() - delete lines X--------------------------------------------------------------------------*/ Xvoid Xansi_DL() X{ Xregister uint param; Xregister uint count; Xregister uint screen_pos; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(param > (tcap_LINES - shm->cursor_y)) X param = tcap_LINES - shm->cursor_y; X X if(!param) X return; X X count = tcap_COLS * param; X screen_pos = shm->cursor_y * tcap_COLS; X mem_cpy((char *)shm->screen + screen_pos, X (char *)shm->screen + screen_pos + count, X LINESxCOLS - screen_pos - count); X spaces((char *)shm->screen + LINESxCOLS - count,count); X X if(!tty_is_ansi) X tcap_delete_lines(param); X X} /* end of ansi_DL */ X X/*+------------------------------------------------------------------------- X ansi_DCH() - delete characters X--------------------------------------------------------------------------*/ Xvoid Xansi_DCH() X{ Xregister uint param; Xregister uint count; Xregister uint screen_pos; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if(param > tcap_COLS - shm->cursor_x) X param = tcap_COLS - shm->cursor_x; X X if(!param) X return; X X screen_pos = (shm->cursor_y * tcap_COLS) + shm->cursor_x; X count = tcap_COLS - shm->cursor_x - param; X mem_cpy((char *)shm->screen + screen_pos, X (char *)shm->screen + screen_pos + param,count); X screen_pos = ((shm->cursor_y + 1) * tcap_COLS) - param; X spaces((char *)shm->screen + screen_pos,param); X X if(!tty_is_ansi) X tcap_delete_chars(param); X X} /* end of ansi_DCH */ X X/*+------------------------------------------------------------------------- X ansi_CPL() - cursor to previous line X--------------------------------------------------------------------------*/ Xvoid Xansi_CPL() X{ Xregister uint param; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if((shm->cursor_y -= param) > (tcap_LINES - 1)) /* unsigned comparison */ X shm->cursor_y = 0; X shm->cursor_x = 0; X X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X X} /* end of ansi_CPL */ X X/*+------------------------------------------------------------------------- X ansi_CNL() - cursor to next line X--------------------------------------------------------------------------*/ Xvoid Xansi_CNL() X{ Xregister uint param; X X if(ansilen == 2) /* no param */ X param = 1; X else X param = atoi(ansibuf + 1); X X if((shm->cursor_y += param) > (tcap_LINES - 1)) X shm->cursor_y = tcap_LINES - 1; X shm->cursor_x = 0; X X if(!tty_is_ansi) X tcap_cursor(shm->cursor_y,shm->cursor_x); X X} /* end of ansi_CNL */ X X/*+------------------------------------------------------------------------- X saved_cursor_save_cursor() X--------------------------------------------------------------------------*/ Xvoid Xsaved_cursor_save_cursor() X{ X saved_cursor_y = shm->cursor_y; X saved_cursor_x = shm->cursor_x; X} /* end of saved_cursor_save_cursor */ X X/*+------------------------------------------------------------------------- X saved_cursor_restore_cursor() X--------------------------------------------------------------------------*/ Xvoid Xsaved_cursor_restore_cursor() X{ X shm->cursor_y = saved_cursor_y; X shm->cursor_x = saved_cursor_x; X tcap_cursor(shm->cursor_y,shm->cursor_x); X} /* end of saved_cursor_restore_cursor */ X X/*+------------------------------------------------------------------------- X rcvd_ESC() - ESC seen-prepare to accumulate ansi sequence X--------------------------------------------------------------------------*/ Xvoid Xrcvd_ESC() X{ X#ifdef ANSI_DEBUG X if(wfp) X fprintf(wfp,"ESC "); X#endif X X ansi = ansibuf; X ansilen = 0; X in_ansi_accumulation = 1; X X} /* end of rcvd_ESC */ X X/*+------------------------------------------------------------------------- X is_ansi_terminator(rchar) - is character terminator for ansi sequence? X--------------------------------------------------------------------------*/ Xint Xis_ansi_terminator(rchar) Xregister uint rchar; X{ X return(isalpha(rchar) || (rchar == '@')); X} /* end of is_ansi_terminator */ X X/*+------------------------------------------------------------------------- X accumulate_ansi_sequence(rchar) X--------------------------------------------------------------------------*/ Xvoid Xaccumulate_ansi_sequence(rchar) Xuint rchar; X{ X if(ansilen == (MAX_ANSI_LEN - 2)) X { X in_ansi_accumulation = 0; X return; X } X X#ifdef ANSI_DEBUG_2 X if(wfp) X fprintf(wfp,"\naas: %02x %c ansilen=%d", X rchar,(rchar & 0x7F < SPACE) ? '.' : (rchar & 0x7F),ansilen); X#endif X X *ansi++ = (uchar)rchar; X *ansi = 0; X ansilen++; X X} /* end of accumulate_ansi_sequence */ X X/*+------------------------------------------------------------------------- X process_ansi_sequence() - a full ansi sequence is to be decoded X--------------------------------------------------------------------------*/ Xvoid Xprocess_ansi_sequence() X{ Xregister itmp; X X#ifdef ANSI_DEBUG X if(wfp) X fprintf(wfp,"\npas: len=%d '%s' y,x=%d,%d\n",ansilen,ansibuf, X shm->cursor_y,shm->cursor_x); X#endif X X if(!in_ansi_accumulation) X return; X in_ansi_accumulation = 0; X X itmp = 1; /* assume write needed */ X if((ansilen > 1) && (ansibuf[1] == '=')) X ; X else switch(ansibuf[ansilen - 1]) X { X case '@': ansi_ICH(); break; X case 'A': ansi_CUU(); break; X case 'B': ansi_CUD(); break; X case 'C': ansi_CUF(); break; X case 'D': ansi_CUB(); break; X case 'E': ansi_CNL(); break; X case 'F': ansi_CPL(); break; X case 'H': ansi_CUP(); break; X case 'J': ansi_ED(); break; X case 'K': ansi_EL(); break; X case 'L': ansi_IL(); break; X case 'M': ansi_DL(); break; X case 'P': ansi_DCH(); break; X case 'S': ansi_SU(); break; X case 'T': ansi_SD(); break; X case 'X': ansi_ECH(); break; X case '`': ansi_HPA(); break; X case 'a': ansi_CUF(); break; /* HPR */ X case 'd': ansi_VPA(); break; X case 'e': ansi_CUD(); break; /* VPR */ X case 'f': ansi_CUP(); break; /* HVP */ X case 'm': ansi_SGR(); itmp = 0; break; X case 'n': ansi_DSR(); itmp = 0; break; X case 's': saved_cursor_save_cursor(); itmp = 0; break; X case 'u': saved_cursor_restore_cursor(); itmp = 0; break; X#ifdef FUTURES X case 'h': ansi_SM(); break; /* Set Mode: SCO: lock keyboard X * MSDOS: host of shit */ X case 'i': ansi_MC(); break; /* Media Copy: send screen to line */ X case 'l': ansi_RM(); break; /* Reset Mode: SCO: unlock keyboard X * MSDOS: host of shit */ X#endif /* FUTURES */ X default: X break; X } X X/* if proper ansi console and indicated, write the buffer to the screen */ X if(tty_is_ansi && itmp) X { X write(TTYERR,&esc,1); X write(TTYERR,ansibuf,ansilen); X } X X#ifdef ANSI_DEBUG X if(wfp) X fprintf(wfp,"pas: new cursor y,x=%d,%d\n",shm->cursor_y,shm->cursor_x); X#endif X} /* end of process_ansi_sequence */ X X/*+------------------------------------------------------------------------- X rcvr_log_open() X--------------------------------------------------------------------------*/ Xvoid Xrcvr_log_open() X{ X X if(rcvr_log) /* if xmtr set us up for logging */ X { X rcvr_log_fp = fopen(rcvr_log_file,rcvr_log_append ? "a" : "w"); X rcvr_log_append = 1; /* until next %log -s */ X if(!rcvr_log_fp) X { X ff(se,"ecu RCVR: Could not open log file: %s\r\n",rcvr_log_file); X ff(se,"recording aborted.\r\n"); X } X else if(!rcvr_log_raw && rcvr_log_gen_title) X { X char tstr[80]; X get_tod(2,tstr); X fprintf(rcvr_log_fp,"\n====> %s (%s, %s, %s) %s\n\n", X shm->Lrname,shm->Llogical, X shm->Ldescr,(shm->Ltelno[0]) ? shm->Ltelno : "NONE",tstr); X } X rcvr_log_gen_title = 0; X } X} /* end of rcvr_log_open */ X X/*+------------------------------------------------------------------------- X process_rcvd_char(rchar) X--------------------------------------------------------------------------*/ Xprocess_rcvd_char(rchar) Xregister uint rchar; X{ Xregister itmp; X X if(shm->Lparity) X rchar &= 0x7F; X X if(want_bell_notify == 2) X { X shmr_set_xmtr_bn_1(); X want_bell_notify = 1; X bell_notify(XBELL_3T); X } X else if(rchar == 7) X { X bell_notify(XBELL_ATTENTION); X return(0); X } X X if(rchar == ESC) X { X rcvd_ESC(); X return(1); X } X else if(in_ansi_accumulation) X { X accumulate_ansi_sequence(rchar); X if(is_ansi_terminator(rchar)) X process_ansi_sequence(); X return(1); X } X X#ifdef TANDEM_ENQ_ACK /* for my friend John Dashner at Tandem */ X if(rchar == ENQ) X { X lputc(ACK); X return(0); X } X#endif X X if(rchar < SPACE) X { X switch(rchar) X { X case CTL_L: X spaces((char *)shm->screen,LINESxCOLS); X shm->cursor_y = 0; X shm->cursor_x = 0; X break; X X case BS: X if(shm->cursor_x) X shm->cursor_x--; X break; X X case NL: X if(shm->cursor_y != tcap_LINES - 1) X shm->cursor_y++; X else X { X mem_cpy((char *)shm->screen,(char *)shm->screen + tcap_COLS, X LINESxCOLS - tcap_COLS); X spaces(&shm->screen[shm->cursor_y][0],tcap_COLS); X } X break; X X case CR: X shm->cursor_x = 0; X break; X X case TAB: X itmp = 8 - (shm->cursor_x % 8); X shm->cursor_x += itmp; X if(shm->cursor_x >= tcap_COLS) X { X shm->cursor_x = 0; X if(++shm->cursor_y > tcap_LINES - 1) X shm->cursor_y = tcap_LINES - 1; X } X#ifdef old X else X#endif X spaces(&shm->screen[shm->cursor_y][shm->cursor_x],itmp); X break; X } X } X else X { X shm->screen[shm->cursor_y][shm->cursor_x++] = (uchar)rchar; X if(shm->cursor_x > tcap_COLS - 1) X { X shm->cursor_x = 0; X if(shm->cursor_y != tcap_LINES - 1) X shm->cursor_y++; X else X { X mem_cpy((char *)shm->screen,(char *)shm->screen + tcap_COLS, X LINESxCOLS - tcap_COLS); X spaces(&shm->screen[shm->cursor_y][shm->cursor_x],tcap_COLS); X } X } X } X X#ifdef ANSI_DEBUG_2 X if(wfp) X { X if((rchar & 0x7F) == NL) X fputs("\n",wfp); X else X fputc(((rchar & 0x7F) < SPACE) ? '.' : (rchar & 0x7F),wfp); X } X#endif X X if(rcvr_log && rcvr_log_fp) X { X /* if raw mode or character not excluded from "cooked" logging */ X if(rcvr_log_raw || X ((rchar >= SPACE) && (rchar <= '~')) || X (rchar == NL) || (rchar == TAB)) X { X putc(rchar,rcvr_log_fp); X } X /* back if log file if not raw and char is backspace */ X else if(!rcvr_log_raw && (rchar == BS)) X { X long logpos = 0; X if(logpos = ftell(rcvr_log_fp)) X fseek(rcvr_log_fp,logpos - 1,0); X } X X if(rcvr_log_flusheach) X fflush(rcvr_log_fp); X } X return(0); X X} /* end of process_rcvd_char */ X X/*+----------------------------------------------------------------------- X rcvr() - copy characters from remote line to so (fd == 1) X------------------------------------------------------------------------*/ Xvoid Xrcvr() X{ Xregister itmp; Xuchar rchar; Xuchar nlchar = NL; Xchar *cptr; X X#ifdef ANSI_DEBUG Xchar s80[80]; X wfp = fopen(ANSI_DEBUG_LOGFILE,"a"); X if(ulindex(ANSI_DEBUG_LOGFILE,"/dev/tty") != -1) X { X sprintf(s80,"stty opost ocrnl < %s",ANSI_DEBUG_LOGFILE); X system(s80); X } X fprintf(wfp,"***************\n"); X#ifdef ANSI_DEBUG_NOBUF X setbuf(wfp,NULL); X#endif /* ANSI_DEBUG_NOBUF */ X#endif /* ANSI_DEBUG */ X X lgetc_count = 0; X in_ansi_accumulation = 0; X ansi = ansibuf; X ansilen = 0; X X/* yetch - magic number gretching for lines and columns */ X if(!tcap_LINES || !tcap_COLS) X { X tcap_LINES = 25; X tcap_COLS = 80; X } X if(tcap_LINES > 43) X tcap_LINES = 43; X if(tcap_COLS > 80) X tcap_COLS = 80; X LINESxCOLS = tcap_LINES * tcap_COLS; X X rcvr_signals(); X rcvr_log_open(); X X saved_cursor_y = shm->cursor_y; X saved_cursor_x = shm->cursor_x; X X while(1) /* receive loop - keep tight as possible! */ X { X rchar = lgetc_rcvr(); X X if(process_rcvd_char(rchar)) X continue; X X write(TTYERR,&rchar,1); X X if(shm->Ladd_nl_incoming && (rchar == CR)) X write(TTYERR,&nlchar,1); X X } X} /* end of rcvr */ X X/* end of ecurcvr.c */ X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF $TOUCH -am 1226051590 'ecurcvr.c' && chmod 0644 ecurcvr.c || echo 'restore of ecurcvr.c failed' Wc_c="`wc -c < 'ecurcvr.c'`" test 30050 -eq "$Wc_c" || echo 'ecurcvr.c: original size 30050, current size' "$Wc_c" # ============= ecuscrdump.c ============== echo 'x - extracting ecuscrdump.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'ecuscrdump.c' && X#define MULTISCREEN_DUMP_BUG X/*+------------------------------------------------------------------------- X ecuscrdump.c - screen dump X wht@n4hgf.Mt-Park.GA.US X X Defined functions: X screen_dump(scrfile) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:12-21-1990-17:27-wht@n4hgf-non-ansi considerations */ X/*:08-14-1990-20:40-wht@n4hgf-ecu3.00-flush old edit history */ X X#include "ecu.h" X#include "ecukey.h" X#include "pc_scr.h" X Xextern char curr_dir[]; /* current working directory */ Xextern int rcvr_pid; Xextern uint tcap_LINES; Xextern uint tcap_COLS; Xextern struct termio tty_termio_at_entry; Xextern int tty_not_char_special; Xextern int tty_is_multiscreen; X Xchar screen_dump_file_name[256]; X X/*+------------------------------------------------------------------------- X screen_dump(scrfile) - dump physical display contents Xunless stdin is non-multiscreen and/or /dev/null, in which case, Xdump rcvr virtual screen Xif scrfile == NULL, default to ~/.ecu/screen.dump X--------------------------------------------------------------------------*/ Xvoid Xscreen_dump(scrfile) Xchar *scrfile; X{ Xuchar s133[133]; Xuchar schar; Xregister uchar *cptr = s133; Xuchar *sptr; Xint srow; Xint scol; XFILE *fp; Xstruct termio dump_tty_termio_at_entry; Xstruct termio dump_tty_termio_current; Xint rcvr_alive = (rcvr_pid > 0); Xint use_ansi_MC = !(!tty_is_multiscreen || tty_not_char_special); Xuint lines_left = tcap_LINES; Xchar *vbuf = (char *)0; X X if(rcvr_alive) X kill_rcvr_process(SIGUSR1); X X if(use_ansi_MC) X { X /* save keyboard termio at entry */ X ioctl(TTYIN,TCGETA,(char *)&dump_tty_termio_at_entry); X X /* set keyboard to termio status at staart of execution of program X * plus a few mods X */ X X dump_tty_termio_current = tty_termio_at_entry; X dump_tty_termio_current.c_cflag &= ~(PARENB | PARODD); X dump_tty_termio_current.c_cflag |= CS8; X dump_tty_termio_current.c_iflag &= ~(ISTRIP); X dump_tty_termio_current.c_lflag &= ~(ICANON | ISIG | ECHO); X ioctl(TTYIN,TCSETAW,(char *) &dump_tty_termio_current); X ttyflush(2); X } X X if(scrfile) X fp = fopen(scrfile,"a"); X else X { X get_home_dir(s133); X strcat(s133,"/.ecu/screen.dump"); X fp = fopen(s133,"a"); X } X if(!fp) X { X#if defined(MORSE) X xbell(XBELL_3T,1); X#else X ring_bell(); X nap(20L); X ring_bell(); X#endif X return; X } X X if(vbuf = (char *)malloc(5120)) /* big buffer; size used elsewhere too */ X#if defined(M_XENIX) /* bassackwards */ X setvbuf(fp,_IOFBF,vbuf,5120); X#else X setvbuf(fp,vbuf,_IOFBF,5120); X#endif X X get_tod(2,s133); X fprintf(fp,"====> %s (phone %s) %s\n", X shm->Ldescr,(shm->Ltelno[0]) ? shm->Ltelno : "NONE",s133); X X if(use_ansi_MC) X write(1,"\033[2i",4); /* spill your guts, screen */ X else X { X sptr = (uchar *)shm->screen; X srow = 0; X scol = 0; X } X X while(1) X { X if(use_ansi_MC) X { X if(!rdchk(0)) X { X nap(20L); X if(!rdchk(0)) X break; X } X read(0,&schar,1); X if(!lines_left) X continue; X } X else X { X if(srow == tcap_LINES) X break; X if(scol == tcap_COLS) X { X scol = 0; X srow++; X schar = NL; X } X else X { X schar = *sptr++; X scol++; X } X } X X if((schar > 0x7E) || (schar < 0x20)) X { X switch(schar) X { X case NL: X while((cptr > s133) && (*(cptr - 1) == ' ')) X cptr--; X *cptr++ = 0x0A; X *cptr = 0; X fputs(s133,fp); X cptr = s133; X *cptr = 0; X --lines_left; X continue; X X case at_TL: X schar = vanilla_TL; X break; X case at_TR: X schar = vanilla_TR; X break; X case at_BL: X schar = vanilla_BL; X break; X case at_BR: X schar = vanilla_BR; X break; X case at_LT: /* left hand T */ X schar = vanilla_LT; X break; X case at_RT: /* right hand T */ X schar = vanilla_RT; X break; X case at_VR: /* vertical rule */ X schar = vanilla_VR; X break; X case at_HR: /* horizontal rule */ X schar = vanilla_HR; X break; X default: X schar = ' '; X } X } X *cptr++ = schar; X } X X if(use_ansi_MC) X { X /* restore keyboard termio at entry */ X ioctl(TTYIN,TCSETAW,(char *)&dump_tty_termio_at_entry); X ttyflush(2); X#if defined(MULTISCREEN_DUMP_BUG) X /* X * bug in 2.3.1 sco video driver leaves "ESC[2" active; X * use "l" (unlock tty) a noop X */ X fputs("l",stdout); X#endif /* MULTISCREEN_DUMP_BUG */ X } X X fclose(fp); X X if(vbuf) X free(vbuf); X X#if defined(MORSE) X xbell(XBELL_DONE,1); X#else X ring_bell(); X#endif X X if(rcvr_alive) X start_rcvr_process(0); X X} /* end of screen_dump */ SHAR_EOF $TOUCH -am 1224223390 'ecuscrdump.c' && chmod 0644 ecuscrdump.c || echo 'restore of ecuscrdump.c failed' Wc_c="`wc -c < 'ecuscrdump.c'`" test 4434 -eq "$Wc_c" || echo 'ecuscrdump.c: original size 4434, current size' "$Wc_c" true || echo 'restore of ecusetup.c failed' echo End of part 6, continue with part 7 exit 0 -------------------------------------------------------------------- Warren Tucker, TuckerWare emory!n4hgf!wht or wht@n4hgf.Mt-Park.GA.US Hacker Extraordinaire d' async PADs, pods, proteins and protocols exit 0 # Just in case... -- Kent Landfield INTERNET: kent@sparky.IMD.Sterling.COM Sterling Software, IMD UUCP: uunet!sparky!kent Phone: (402) 291-8300 FAX: (402) 291-4362 Please send comp.sources.misc-related mail to kent@uunet.uu.net.