wht@tridom.uucp (Warren Tucker) (10/09/89)
---- Cut Here and unpack ---- #!/bin/sh # this is part 6 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file eculine.c continued # CurArch=6 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 eculine.c" sed 's/^X//' << 'SHAR_EOF' >> eculine.c X Ltermio.c_cflag |= CS7 | PARENB | PARODD; X Ltermio.c_iflag |= ISTRIP; X break; X default: X ff(se,"invalid parity: %c ... defaulting to no parity\r\n"); X case 0: X case 'n': X Ltermio.c_cflag |= CS8; X Ltermio.c_iflag &= ~(ISTRIP); X Lparity = 0; X break; X } X X#if defined(HO_HUM) X if(ioctl_flag) X#endif X ioctl(Liofd,TCSETA,(char *)&Ltermio); X X} /* end of lset_parity */ X X/*+------------------------------------------------------------------------- X lclear_xmtr_xoff() X--------------------------------------------------------------------------*/ Xvoid Xlclear_xmtr_xoff() X{ X ioctl(Liofd,TCXONC,(char *)1); /* restart xmtr output */ X} /* end of lclear_xmtr_xoff */ X X/*+------------------------------------------------------------------------- X lbreak() X--------------------------------------------------------------------------*/ Xvoid Xlbreak() X{ X ioctl(Liofd,TCSBRK,(char *)0); X} /* end of lbreak */ X X/*+---------------------------------------------------------------------- X lopen() Xreturns negative LOPEN_ codes if failure else positive pid using line Xelse 0 if successful open X------------------------------------------------------------------------*/ Xint Xlopen() X{ Xregister itmp = strlen(Lline); Xstruct stat ttystat; X X if(Liofd >= 0) X return(LOPEN_ALREADY); X if(isupper(Lline[itmp - 1])) X Lline[itmp - 1] = tolower(Lline[itmp - 1]); X if(!strcmp(Lline,"/dev/tty")) X return(LOPEN_INVALID); X if(itmp = lock_tty()) /* get lock file */ X return(itmp); X if(stat(Lline,&ttystat) < 0) X return(LOPEN_NODEV); X Liofd = open(Lline,O_RDWR,0777); X if(Liofd < 0) X return(LOPEN_OPNFAIL); X else X { X ioctl(Liofd,TCGETA,(char *) &Ltermio); X Ltermio.c_iflag = (IGNPAR | IGNBRK | IXOFF ); X Ltermio.c_cflag |= (CLOCAL | CREAD | HUPCL); X Ltermio.c_lflag = 0; X X Ltermio.c_cc[VMIN] = 1; X Ltermio.c_cc[VTIME] = 1; X lset_baud_rate(0); /* do not perform ioctl */ X lset_parity(1); /* do perform ioctl */ X } X X return(0); X X} /* end of lopen */ X X/*+----------------------------------------------------------------------- X lclose() X------------------------------------------------------------------------*/ Xvoid Xlclose() X{ X if(Liofd < 0) X return; X unlock_tty(); /* kill lock file (writes to line; must go before close) */ X close(Liofd); X Liofd = -1; X X} /* end of lclose */ X X/*+------------------------------------------------------------------------- X ltoggle_dtr() X--------------------------------------------------------------------------*/ Xvoid Xltoggle_dtr() X{ X close(Liofd); X nap(300L); X Liofd = open(Lline,O_RDWR,0777); X ioctl(Liofd,TCSETA,(char *)&Ltermio); X nap(600L); X} /* end of ltoggle_dtr */ X X/*+------------------------------------------------------------------------- X lxon_xoff(flag) XIXON specifies whether or not we respond to xon/xoff characters XIXOFF specifies whether or not we generate XON/XOFF characters X--------------------------------------------------------------------------*/ Xvoid Xlxon_xoff(flag) Xint flag; X{ X if(flag & IXON) X Ltermio.c_iflag |= IXON; X else X Ltermio.c_iflag &= ~IXON; X X if(flag & IXOFF) X Ltermio.c_iflag |= IXOFF; X else X Ltermio.c_iflag &= ~IXOFF; X X ioctl(Liofd,TCSETA,(char *)&Ltermio); X X} /* end of lxon_xoff */ X X/*+------------------------------------------------------------------------- X lget_xon_xoff(ixon,ixoff) X--------------------------------------------------------------------------*/ Xvoid Xlget_xon_xoff(ixon,ixoff) Xint *ixon; Xint *ixoff; X{ X *ixon = (Ltermio.c_iflag & IXON) != 0; X *ixoff = (Ltermio.c_iflag & IXOFF) != 0; X} /* end of lget_xon_xoff */ X X/*+------------------------------------------------------------------------- X lopen_err_text(lerr) X--------------------------------------------------------------------------*/ Xchar * Xlopen_err_text(lerr) Xint lerr; X{ Xstatic char lerr_s40[40]; X X switch(lerr) X { X case LOPEN_INVALID: return("invalid line name"); X case LOPEN_UNKPID: return("unknown pid is using line"); X case LOPEN_LCKERR: return("error creating lock file"); X case LOPEN_NODEV: return("line does not exist"); X case LOPEN_ALREADY: return("line already open"); X case LOPEN_OPNFAIL: return("line open error (not installed?)"); X case LOPEN_ENABLED: return("line enabled for incoming login"); X case LOPEN_ENABLED_IN_USE: return("line in use by incoming login"); X case LOPEN_DIALOUT_IN_USE: return("line in use by another dial out"); X } X if(lerr > 0) X sprintf(lerr_s40,"pid %d using line",lerr); X else X sprintf(lerr_s40,"unknown line error %d",lerr); X return(lerr_s40); X} /* end of lopen_err_text */ X X/* end of eculine.c */ X X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF echo "File eculine.c is complete" chmod 0644 eculine.c || echo "restore of eculine.c fails" echo "x - extracting ecunumrev.c (Text)" sed 's/^X//' << 'SHAR_EOF' > ecunumrev.c && X/* CHK=0x0985 */ X/*+----------------------------------------------------------------------- X ecunumrev.c 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 Xchar *numeric_revision = "unet1"; X X/* vi: set tabstop=4 shiftwidth=4: */ SHAR_EOF chmod 0644 ecunumrev.c || echo "restore of ecunumrev.c fails" echo "x - extracting ecuphone.c (Text)" sed 's/^X//' << 'SHAR_EOF' > ecuphone.c && X/* CHK=0x0280 */ X/*+------------------------------------------------------------------------- X ecuphone.c -- visual phone dialer/directory editor X Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved X X .---[ title ]------------modified-.<-- dirw "top line" X | stand out mode |<-- dirw "header line" X | |<-- scrw first line X | | X | | X | | X | |<-- scrw last line X | stand out mode |<-- dirw "cmd line" X `---------------------------------'<-- dirw bottom line X X Defined functions: X check_curr_pde() X choose_line(baud) X copy_pde_to_lvar(tpde) X dirw_bot_msg(msg) X dirw_cmd_line_setup(prompt) X dirw_display_top() X dirw_get_cmd(prompt) X lookup_logical_telno() X pde_add_or_edit(tpde,edit) X pde_add_or_edit_read(prompt,edit,x,buf,max,delim) X pde_cmd_add(tpde) X pde_cmd_down() X pde_cmd_dump_list() X pde_cmd_find() X pde_cmd_remove() X pde_cmd_remove_oops() X pde_cmd_save() X pde_cmd_up() X pde_display(line,tpde,stand_out) X pde_display_logical(line,tpde,stand_out) X pde_list_add(tpde) X pde_list_erase() X pde_list_manager() X pde_list_read() X pde_list_remove(tpde) X pde_list_save_if_dirty() X pde_list_search(logical,exact_flag) X pde_list_set_dirty(flag) X scrw_fill(tpde,curr_pde_line) X scrw_fill_at(line_num,tpde,curr_pde_line) X X--------------------------------------------------------------------------*/ X/*+:EDITS:*/ X/*:08-31-1989-12:37-wht-was not always setting brate/parity properly */ X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */ X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */ X X#include <curses.h> X#include "pc_scr.h" X X#define STDIO_H_INCLUDED X#define OMIT_TERMIO_REFERENCES X#include "ecu.h" X X#include "ecupde.h" X#include "ecukey.h" X#include "ecuxkey.h" X#include "ecuhangup.h" X#include "utmpstatus.h" X#include "dvent.h" X X#if defined(M_XENIX) X#define DIAL XFend X#else X#define DIAL CTL_D X#endif X Xvoid dirw_bot_msg(); X X#if defined(M_XENIX) Xchar *strchr(); Xchar *strrchr(); X#endif X X#if defined(pyr) X#define strchr index X#define strrchr rindex Xchar *index(); Xchar *rindex(); X#endif X X/* window definitions */ X#define DIRW_LINES (LINES - 1) X#define DIRW_COLS (COLS) X#define DIRW_COLS (COLS) X#define DIRW_TOP_LINES 2 X#define DIRW_BOT_LINES 2 X#define DIRW_CMD_LINE (DIRW_LINES - 2) X#define SCRW_LINES (DIRW_LINES - DIRW_TOP_LINES - DIRW_BOT_LINES) X#define SCRW_COLS (DIRW_COLS) X#define SCRW_TLY (DIRW_TOP_LINES) X#define SCRW_TLX 0 X Xextern int windows_active; Xextern int rcvr_pid; Xextern char errmsg[]; X XWINDOW *dirw; XWINDOW *scrw; X XPDE *pde_list_head = (PDE *)0; /* pointer to first pde in linked list */ XPDE *curr_pde = (PDE *)0; /* current pde */ XPDE *remove_pde = (PDE *)0; /* if non-zero, pde just removed */ Xint remove_dirty_flag; /* pde_list_dirty at remove time */ Xint pde_list_quan = 0; /* count of items in list now */ Xint pde_list_dirty = 0; /* pde_list modified but not saved */ Xint scrw_curr_pde_line; /* scrw line curr_pde is on */ Xchar ecuphone_name[256]; /* phone directory name */ X X/*+------------------------------------------------------------------------- X pde_list_erase() X--------------------------------------------------------------------------*/ Xvoid Xpde_list_erase() X{ Xregister PDE *pde = pde_list_head; Xregister PDE *next; X X while(pde) X { X next = pde->next; X free((char *)pde); X pde = next; X } X pde_list_head = (PDE *)0; X pde_list_quan = 0; X} /* end of pde_list_erase */ X X/*+------------------------------------------------------------------------- X pde_list_set_dirty(flag) X0: clean, 1 dirty, -1 do not modify;update screen only X--------------------------------------------------------------------------*/ Xvoid Xpde_list_set_dirty(flag) Xint flag; X{ Xregister itmp; X if(flag != pde_list_dirty) X { X if(flag != -1) X pde_list_dirty = flag; X wmove(dirw,0,DIRW_COLS - 14); X if(pde_list_dirty) X waddstr(dirw," modified "); X else X { X itmp = 10; X while(itmp--) X waddch(dirw,sHR); X } X wrefresh(dirw); X } X} /* end of pde_list_set_dirty */ X X/*+------------------------------------------------------------------------- X pde_list_add(tpde) -- add to linked list X--------------------------------------------------------------------------*/ Xvoid Xpde_list_add(tpde) XPDE *tpde; X{ Xregister PDE *this = tpde; Xregister PDE *prev; Xregister PDE *next; X X/* if empty, init list with this one and quit */ X if(pde_list_head == (PDE *)0) X { X pde_list_head = this; X this->next = (PDE *)0; X pde_list_quan++; X return; X } X X/* list not empty */ X prev = (PDE *)0; /* no previous yet */ X next = pde_list_head; /* init next to top of list */ X X while(strcmp(next->logical,this->logical) < 0) X { X prev = next; X next = prev->next; X if(next == (PDE *)0) X break; X } X X if(prev) /* if non-zero, we will not update the list head */ X { X this->next = prev->next; X this->prev = prev; X prev->next = this; X if(next) X next->prev = this; X } X else /* 'this' is to become the new list head (1st element) */ X { X this->next = next; X this->prev = (PDE *)0; X if(next) X next->prev = this; X pde_list_head = this; X } X pde_list_quan++; X X} /* end of pde_add */ X X/*+------------------------------------------------------------------------- X pde_list_remove(tpde) -- add to linked list X--------------------------------------------------------------------------*/ Xvoid Xpde_list_remove(tpde) Xregister PDE *tpde; X{ Xregister PDE *prev; Xregister PDE *next; X X prev = (PDE *)0; /* there is no previous now */ X X if((next = pde_list_head) == (PDE *)0) /* if empty list */ X return; X X while(next != tpde) X { X prev = next; X next = prev->next; X if(next == (PDE *)0) X return; X } X X/* take care of "current pde" */ X if(tpde == curr_pde) X { X if(tpde->next) X curr_pde = tpde->next; X else if(tpde->prev) X curr_pde = tpde->prev; X else X curr_pde = (PDE *)0; X } X X/* unlink */ X X if(prev) /* if non-zero, we will not update the list head */ X { X prev->next = tpde->next; X if(tpde->next) X (tpde->next)->prev = prev; X } X else X { X pde_list_head = tpde->next; X if(tpde->next) X (tpde->next)->prev = (PDE *)0; X } X X tpde->next = (PDE *)0; X tpde->prev = (PDE *)0; X X pde_list_quan--; X} /* end of pde_list_remove */ X X/*+----------------------------------------------------------------------- X PDE *pde_list_search(logical,exact_flag) X------------------------------------------------------------------------*/ XPDE * Xpde_list_search(logical,exact_flag) Xchar *logical; Xint exact_flag; X{ Xregister PDE *tpde; X X if(!pde_list_quan) X { X if(pde_list_read()) X return((PDE *)0); X } X X tpde = pde_list_head; X while(tpde) X { X /* only first few chars necessary for match with ulcmpb */ X if(exact_flag) X { X if(strcmp(tpde->logical,logical) == 0) X return(tpde); X } X else X { X if(ulcmpb(tpde->logical,logical) < 0) X return(tpde); X } X tpde = tpde->next; X } X if(!tpde) X sprintf(errmsg,"'%s' not found",logical); X return(tpde); X X} /* end of pde_list_search */ X X/*+------------------------------------------------------------------------- X pde_cmd_dump_list() X--------------------------------------------------------------------------*/ X#if defined(PDE_DEBUG) Xvoid Xpde_cmd_dump_list() X{ Xregister PDE *tpde = pde_list_head; Xint count = 0; X X curmove(LINES - 1,0); X while(tpde) X { X ff(se,"p:%04x t:%04x n:%04x %c %s\r\n", X tpde->prev,tpde,tpde->next,(tpde == curr_pde) ? '*' : ' ', X tpde->logical); X if((count++ % 15) == 14) X { X ff(se,"press return: "); X ttygetc(1); X ff(se,"\r\n"); X } X tpde = tpde->next; X } X ff(se,"press return: "); X ttygetc(1); X touchwin(stdscr); X touchwin(dirw); X touchwin(scrw); X wrefresh(stdscr); X wrefresh(dirw); X wrefresh(scrw); X X} /* end of pde_cmd_dump_list */ X#endif X X/*+----------------------------------------------------------------------- X pde_list_read() Xsample .ecu/phone: X#tri2:426-0624:2400:E:Tridom Pyramid comment Xarc:393-3083:2400:N:Atlanta Radio Club X Xreturn 0 if entire list read, else 1 if error (error msg in errmsg) X------------------------------------------------------------------------*/ Xint Xpde_list_read() X{ Xregister itmp; Xregister token_number; Xregister char *cptr; Xregister char *token; Xchar readpde_buf[128]; Xchar s80[80]; XFILE *fp_phone; XPDE *tpde; Xchar *str_token(); Xchar *malloc(); X X if(!ecuphone_name[0]) X { X get_home_dir(ecuphone_name); X strcat(ecuphone_name,"/.ecu/phone"); X } X X if( (fp_phone = fopen(ecuphone_name,"r")) == NULL) X { X perror_errmsg(ecuphone_name); X return(1); X } X X/* we have an open .ecu/phone file */ X pde_list_erase(); /* clear any previous directory */ X while(fgets(readpde_buf,sizeof(readpde_buf),fp_phone) != NULL) X { X if(readpde_buf[0] == '#') /* comment? */ X continue; X if(itmp = strlen(readpde_buf)) /* itmp = len; if > 0 ... */ X { X itmp--; X readpde_buf[itmp] = 0; /* ... strip trailing NL */ X } X cptr = readpde_buf; /* first call to str_token, -> buff */ X while((*cptr == 0x20) || (*cptr == TAB)) X *cptr++; /* strip leading spaces */ X if(*cptr == 0) /* if line all blank, skip it */ X continue; X X if((tpde = (PDE *)malloc(sizeof(PDE))) == (PDE *)0) X { X fclose(fp_phone); X strcpy(errmsg,"Out of memory reading phone list"); X return(1); X } X X tpde->descr[0] = 0; X tpde->logical[0] = 0; X tpde->telno[0] = 0; X tpde->tty[0] = 0; X tpde->parity = 0; X tpde->baud = 2400; X tpde->prev = (PDE *)0; X tpde->next = (PDE *)0; X X token_number = 0; X while((token = str_token(cptr,":")) != NULL) X { X cptr = NULL; /* further calls to str_token need NULL */ X switch(token_number++) X { X case 0: /* first field is logical name */ X strncpy(tpde->logical,token,sizeof(tpde->logical)); X tpde->logical[sizeof(tpde->logical) - 1] = 0; X break; X case 1: /* second field is tpde->telno phone number */ X strncpy(tpde->telno,token,sizeof(tpde->telno)); X tpde->telno[sizeof(tpde->telno) - 1] = 0; X break; X case 2: /* third field is line */ X strncpy(tpde->tty,token,sizeof(tpde->tty)); X tpde->tty[sizeof(tpde->tty) - 1] = 0; X break; X case 3: /* fourth field is baud rate */ X tpde->baud = atoi(token); X break; X case 4: /* fifth field is parity */ X switch(itmp = to_lower(token[0])) X { X case 'o': X case 'e': X case 'm': X case 's': X tpde->parity = itmp; X break; X default: X case 'n': X tpde->parity = 0; X break; X } X break; X default: X strncpy(tpde->descr,token,sizeof(tpde->descr)); X tpde->descr[sizeof(tpde->descr) - 1] = 0; X break; X } /* end of switch(token_number) */ X } /* end while not end of record */ X X pde_list_add(tpde); X X } /* while records left to ready */ X X fclose(fp_phone); X return(0); X} /* end of pde_list_read */ X X/*+----------------------------------------------------------------------- X dirw_display_top() X------------------------------------------------------------------------*/ Xvoid Xdirw_display_top() X{ X wmove(dirw,1,1); X wstandout(dirw); X wprintw(dirw, X" entry name %c telephone number %c tty %c baud P %c description ", X sVR,sVR,sVR,sVR); X wstandend(dirw); X wrefresh(dirw); X} /* end of dirw_display_top() */ X X/*+------------------------------------------------------------------------- X dirw_bot_msg(msg) X--------------------------------------------------------------------------*/ Xvoid Xdirw_bot_msg(msg) Xchar *msg; X{ Xregister itmp; Xregister itmp2; Xstatic last_msglen = 0; X#define DIRW_BOT_LINE_TLX 2 X#define DIRW_BOT_LINE_MAX_MSGLEN (DIRW_COLS - DIRW_BOT_LINE_TLX - 8) Xchar msg2[80]; X X if(!last_msglen && !strlen(msg)) X return; X X wmove(dirw,DIRW_LINES - 1,DIRW_BOT_LINE_TLX); X X if((itmp = strlen(msg)) == 0) X { X itmp2 = last_msglen + 2; X for(itmp = 0; itmp < itmp2; itmp++) X waddch(dirw,sHR); X last_msglen = 0; X } X else X { X waddch(dirw,' '); X if(itmp > DIRW_BOT_LINE_MAX_MSGLEN) X { X strncpy(msg2,msg,DIRW_BOT_LINE_MAX_MSGLEN); X msg2[DIRW_BOT_LINE_MAX_MSGLEN + 1] = 0; X waddstr(dirw,msg2); X itmp = strlen(msg2); X } X else X { X waddstr(dirw,msg); X itmp = strlen(msg); X } X waddch(dirw,' '); X if((itmp2 = last_msglen - itmp) > 0) X { X while(itmp2--) X waddch(dirw,sHR); X } X last_msglen = itmp; /* remember last message length */ X } X wrefresh(dirw); X} /* end of dirw_bot_msg */ X X/*+------------------------------------------------------------------------- X pde_display_logical(line,tpde,stand_out) X--------------------------------------------------------------------------*/ Xpde_display_logical(line,tpde,stand_out) Xint line; XPDE *tpde; Xint stand_out; X{ X wmove(scrw,line,0); X waddch(scrw,sVR); X X if(stand_out) X wstandout(scrw); X wprintw(scrw," %-10.10s",tpde->logical); X if(stand_out) X wstandend(scrw); X X} /* end of pde_display_logical */ X X/*+----------------------------------------------------------------------- X pde_display(win,line,tpde,stand_out) X00000000001111111111222222222233333333334444444444555555555566666666667777777777 X01234567890123456789012345678901234567890123456789012345678901234567890123456789 X| entry name | telephone number | tty | baud P | description | X| 0123456789 | 0123456789012345 | 01 | baud P | 01234567890123456789012345678 | X--------------------------------------------------------------------------*/ Xpde_display(line,tpde,stand_out) Xint line; XPDE *tpde; Xint stand_out; X{ X X pde_display_logical(line,tpde,stand_out); X waddch(scrw,' '); X waddch(scrw,sVR); X waddch(scrw,' '); X wprintw(scrw,"%-16.16s %c ",tpde->telno,sVR); X if(tpde->tty[0]) X wprintw(scrw,"%-2.2s %c",tpde->tty,sVR); X else X wprintw(scrw,"Any %c",sVR); X wprintw(scrw,"%5u %c %c ",tpde->baud, X (tpde->parity) ? to_upper(tpde->parity) : 'N',sVR); X wprintw(scrw,"%-29.29s %c",tpde->descr,sVR); X return(0); X X} /* end of pde_display */ X X/*+----------------------------------------------------------------------- X scrw_fill(first_pde,curr_pde_line) X------------------------------------------------------------------------*/ Xvoid Xscrw_fill(tpde,curr_pde_line) Xregister PDE *tpde; Xint *curr_pde_line; X{ Xregister line; Xregister is_curr_pde; X X *curr_pde_line = -1; X for(line = 0; line < SCRW_LINES; line++) X { X if(tpde) X { X if(is_curr_pde = (tpde == curr_pde)) X *curr_pde_line = line; X pde_display(line,tpde,(tpde == curr_pde)); X tpde = tpde->next; X } X else X { X wmove(scrw,line,0); X waddch(scrw,sVR); X wclrtoeol(scrw); X wmove(scrw,line,SCRW_COLS - 1); X waddch(scrw,sVR); X } X } X wrefresh(scrw); X X} /* end of scrw_fill */ X X/*+------------------------------------------------------------------------- X scrw_fill_at(line_num,first_pde,curr_pde_line) X--------------------------------------------------------------------------*/ Xvoid Xscrw_fill_at(line_num,tpde,curr_pde_line) Xint line_num; Xregister PDE *tpde; Xint *curr_pde_line; X{ Xregister itmp; X X if(!tpde) X { X wclear(scrw); X wrefresh(scrw); X return; X } X for(itmp = 0; itmp < line_num; itmp++) X { X if(!tpde->prev) X break; X tpde = tpde->prev; X } X X scrw_fill(tpde,curr_pde_line); X X} /* end of scrw_fill_at */ X X/*+------------------------------------------------------------------------- X dirw_cmd_line_setup(prompt) X--------------------------------------------------------------------------*/ Xvoid Xdirw_cmd_line_setup(prompt) Xchar *prompt; X{ Xregister icol; Xint y; Xint x; X X wmove(dirw,DIRW_CMD_LINE,1); X wstandout(dirw); X waddch(dirw,' '); X waddstr(dirw,prompt); X waddch(dirw,' '); X getyx(dirw,y,x); X for(icol = x; icol < DIRW_COLS - 1; icol++) X waddch(dirw,' '); X wmove(dirw,y,x); X wstandend(dirw); X wrefresh(dirw); X} /* end of dirw_cmd_line_setup */ X X/*+------------------------------------------------------------------------- X dirw_get_cmd() X--------------------------------------------------------------------------*/ Xuchar Xdirw_get_cmd(prompt) Xchar *prompt; X{ Xregister uchar cmd; X X dirw_cmd_line_setup(prompt); X cmd = ttygetc(1); X dirw_bot_msg(""); X return(cmd); X X} /* end of dirw_get_cmd */ X X/*+------------------------------------------------------------------------- X pde_cmd_save() X--------------------------------------------------------------------------*/ Xvoid Xpde_cmd_save() X{ XFILE *fpold; XFILE *fpnew; XPDE *tpde; Xchar ecuphone_ntmp[256]; /* temp phone directory name */ Xchar iobuf[128]; Xint count = 0; X X if(!pde_list_dirty) X { X dirw_bot_msg("directory has not been modified"); X return; X } X X strcpy(ecuphone_ntmp,ecuphone_name); X strcat(ecuphone_ntmp,".t"); X X if((fpnew = fopen(ecuphone_ntmp,"w")) == NULL) /* open old file */ X { X sprintf(iobuf,"cannot open %s",ecuphone_ntmp); X dirw_bot_msg(iobuf); X return; X } X X/* retain commented entries */ X if((fpold = fopen(ecuphone_name,"r")) != NULL) /* open old file */ X { X while(fgets(iobuf,sizeof(iobuf),fpold) != NULL) X { X if(iobuf[0] == '#') X fputs(iobuf,fpnew); X } X fclose(fpold); X } X X/* write new entries */ X tpde = pde_list_head; X while(tpde) X { X sprintf(iobuf,"%d",count+1); X dirw_bot_msg(iobuf); X sprintf(iobuf,"%s:%s:%s:%u:%c:%s\n",tpde->logical,tpde->telno, X tpde->tty,tpde->baud, X (tpde->parity) ? to_upper(tpde->parity) : 'N', X tpde->descr); X fputs(iobuf,fpnew); X tpde = tpde->next; X count++; X } X X fclose(fpnew); X unlink(ecuphone_name); X rename(ecuphone_ntmp,ecuphone_name); X sprintf(iobuf,"saved %d entries",count); X dirw_bot_msg(iobuf); X pde_list_set_dirty(0); X X} /* end of pde_cmd_save */ X X/*+------------------------------------------------------------------------- X pde_list_save_if_dirty() X--------------------------------------------------------------------------*/ Xvoid Xpde_list_save_if_dirty() X{ Xint cmd = 0; X X if(pde_list_dirty) X { X while(!cmd) X { X ring_bell(); X cmd = dirw_get_cmd("directory modified: save?"); X if(isupper(cmd)) X cmd = tolower(cmd); X switch(cmd) X { X case 'y': pde_cmd_save(); break; X case 'n': break; X default: X ring_bell(); X cmd = 0; X break; X } X } X } X} /* end of pde_list_save_if_dirty */ X X/*+------------------------------------------------------------------------- X pde_cmd_up() X--------------------------------------------------------------------------*/ Xvoid Xpde_cmd_up() X{ Xregister itmp; Xregister PDE *tpde; X X if((!curr_pde) || (curr_pde->prev == (PDE *)0)) X { X ring_bell(); X return; X } X if(scrw_curr_pde_line) X { X pde_display_logical(scrw_curr_pde_line,curr_pde,0); X curr_pde = curr_pde->prev; X pde_display_logical(--scrw_curr_pde_line,curr_pde,1); X } X else X { X tpde = curr_pde; X curr_pde = curr_pde->prev; X scrw_fill_at(10,tpde,&scrw_curr_pde_line); X } X X} /* end of pde_cmd_up */ X X/*+------------------------------------------------------------------------- X pde_cmd_down() X--------------------------------------------------------------------------*/ Xvoid Xpde_cmd_down() X{ Xregister itmp; Xregister PDE *tpde; X X if((!curr_pde) || (curr_pde->next == (PDE *)0)) X { X ring_bell(); X return; X } X if(scrw_curr_pde_line < (SCRW_LINES - 1)) X { X pde_display_logical(scrw_curr_pde_line,curr_pde,0); X curr_pde = curr_pde->next; X pde_display_logical(++scrw_curr_pde_line,curr_pde,1); X } X else X { X tpde = curr_pde; X curr_pde = curr_pde->next; X scrw_fill_at(SCRW_LINES - 10,tpde,&scrw_curr_pde_line); X } X X} /* end of pde_cmd_down */ X X/*+------------------------------------------------------------------------- X check_curr_pde() -- return 1 if there is a current pde, else 0 X--------------------------------------------------------------------------*/ Xcheck_curr_pde() X{ X if(!curr_pde) X { X dirw_bot_msg("no directory entry selected"); X return(0); X } X return(1); X} /* end of check_curr_pde */ X X/*+------------------------------------------------------------------------- X pde_add_or_edit_read(prompt,edit,x,buf,max,delim) Xmax must not wrap around to another line X--------------------------------------------------------------------------*/ Xpde_add_or_edit_read(prompt,edit,x,buf,max,delim) Xchar *prompt; Xint edit; Xint x; Xchar *buf; Xint max; Xchar *delim; X{ Xregister itmp; Xchar s82[82]; X X while(1) X { X dirw_cmd_line_setup(prompt); X wstandout(scrw); X itmp = wingets(scrw,scrw_curr_pde_line,x,s82,max,delim,edit); X wstandend(scrw); X X switch(*delim) X { X case ESC: X return; X X case CR: X case NL: X if(edit && (itmp == 0)) X { X *delim = TAB; X return; X } X strcpy(buf,s82); X return; X X case CTL_B: X *buf = 0; X return; X X case TAB: X if(!edit) X continue; X *buf = 0; X return; X X default: X break; X } X } X} /* end of pde_add_or_edit_read */ X X/*+------------------------------------------------------------------------- X pde_add_or_edit(tpde,edit) Xif called with edit == 1, tpde MUST == curr_pde !!! X00000000001111111111222222222233333333334444444444555555555566666666667777777777 X01234567890123456789012345678901234567890123456789012345678901234567890123456789 X| entry name | telephone number | tty | baud P | description | X| 0123456789 | 0123456789012345 | 01 | baud P | 01234567890123456789012345678 | X--------------------------------------------------------------------------*/ Xint Xpde_add_or_edit(tpde,edit) Xregister PDE *tpde; Xint edit; X{ Xregister itmp; Xint input_state = 0; Xchar s50[50]; Xchar delim; Xint done = 0; Xint y,x; XPDE *old_curr_pde; Xuint baud; X X if(!edit) X { X dirw_bot_msg("ESC: abort ^U: erase input"); X dirw_cmd_line_setup("Enter new directory entry name: "); X getyx(dirw,y,x); X wstandout(dirw); X wingets(dirw,y,x,tpde->logical,10+1,&delim,0); X wstandend(dirw); X if((!strlen(tpde->logical)) || (tpde->logical[0] == ESC)) X { X dirw_bot_msg("add aborted"); X return(0); X } X X if(!isalpha(tpde->logical[0])) X { X dirw_bot_msg("first character must be alphabetic"); X return(0); X } X X if(pde_list_search(tpde->logical,1)) X { X sprintf(s50,"'%s' is already in the directory",tpde->logical); X dirw_bot_msg(s50); X return(0); X } X X tpde->descr[0] = 0; X tpde->telno[0] = 0; X tpde->tty[0] = 0; X tpde->parity = '-'; X tpde->baud = 0; X X pde_list_add(tpde); X old_curr_pde = curr_pde; X curr_pde = tpde; X scrw_fill_at(SCRW_LINES / 2,tpde,&scrw_curr_pde_line); SHAR_EOF echo "End of part 6" echo "File ecuphone.c is continued in part 7" echo "7" > 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.