/* SBR_C - QL-Kermit general subroutines Extracts from ck*.c files, (C) Columbia University */ /* Include files */ #include "ram1_ker_h" /* Kermit definitions */ #include "flp1_fcntl_h" /* File opening modes */ #include "flp1_ctype_h" /* Character test macros */ /* External variables */ extern int state; /* Current switcher state */ extern int ttychid; /* QDOS channel ID of comms line */ extern int tvalue; /* Receive timeout (frames) */ extern int debug; /* Debugging level */ extern int serno; /* Serial port in use */ extern int parity; /* Parity setting */ extern int speed; /* Baud rate */ extern int ttyfd; /* FD of communication line */ extern int trans; /* File name translation */ extern int tlevel; /* TAKE file nesting level */ extern int _oserr; /* QDOS error code */ extern int oserr; /* Copy of above */ extern bool timer; /* Timer enabled flag */ extern bool cxseen,czseen; /* Transfer interrupt flags */ extern bool local; /* Operation mode flag */ extern bool keep; /* Incomplete file flag */ extern char *newfilnam; /* Transfer file name */ extern char *errdata; /* Data for E packet */ extern char *suffix; /* Outgoing file suffix */ extern char ttyname[]; /* Name of communication line */ extern int fp; /* Transfer file */ extern FILE *tfile[MAXTAKE]; /* TAKE file stack */ /* External functions */ char *strchr(); /* Find first character */ char *strrchr(); /* Find last character */ /* Local variables */ static char buf[BLKSIZ]; /* Transfer file buffer */ static int bufp; /* Index into above */ static int n; /* Character count */ /* DELCH - Special QL console character delete */ delch() { sd_pcol(fgetchid(stdout),1); putchar(' '); sd_pcol(fgetchid(stdout),1); } /* TREAD - Read a character from line, with timeout */ int tread() { unsigned char t; int e; int w = 0; do { if (!io_pend(ttychid,1)) /* Check for pending input */ { io_fbyte(ttychid,0,&t); /* If a byte available, */ if (parity!=PYNONE) t &= 0177; /* remove parity */ return((int) t); /* and return immediately */ } w++; /* otherwise continue */ } while ((e = chkint())>=0 && (w=0) close(fp); /* File open? */ fp = -1; } /* TFGET - Get a character from transfer file (from K&R - MCC library getchar() gives EOF if the file contains more than one $FF byte in succession!) */ int tfget() { if (n==0) /* Buffer empty? */ { n = read(fp,buf,BLKSIZ); /* Read data */ bufp = 0; /* and restore pointer */ } return((--n>=0) ? buf[bufp++]&0377 : EOF); /* Return data or EOF indication */ } /* DEVOPEN - open transfer file, using appropriate device if necessary */ int devopen(name,dev,mode) char *name,*dev; int mode; { strcpy(newfilnam,name); /* Name for first try */ if ((fp = open(newfilnam,mode))<0) { oserr = _oserr; if (debon) printf("Open %s failed\n",newfilnam); if (oserr==ERR_NF) /* Maybe device name left off */ { strcpy(newfilnam,dev); /* Add device name */ strcat(newfilnam,name); /* to given name */ if ((fp = open(newfilnam,mode))<0) { oserr = _oserr; if (debon) printf("Open %s failed\n",newfilnam); } } } n = bufp = 0; /* Initialise read pointers */ return(fp); } /* CLS - clear a window */ cls(chan) char *chan; { struct REGS in,out; in.D0 = 0x20; /* SD.CLEAR */ in.D3 = -1; /* Timeout */ in.A0 = chan; /* Channel */ QDOS3(&in,&out); } /* SETBAUD - Set the communication line baud rate */ setbaud(speed) int speed; { struct REGS in,out; in.D0 = 0x12; /* MT.BAUD */ in.D1 = (short) speed; /* Baud rate */ if (QDOS1(&in,&out)==0) return(speed); else return(-1); } /* WAIT - Delay for d seconds, or until a key pressed */ wait(d) int d; { int i; for (i = 0; i0) { close(ttyfd); /* Close old line if open */ if (debon) printf("Closed %s\n",ttyname); ttyfd = -1; } ttyname[0] = '\0'; /* and clear out name */ local = FALSE; /* and status */ if (serno>0) /* New line to be opened? */ { mkttnam(serno,parity); /* Make new name */ ttyfd = open(ttyname,O_RDWR); /* Open line */ if (ttyfd<0) /* Open failed? */ { oserr = _oserr; /* Save QDOS error code */ error("Cannot open %s",ttyname); /* Print error messages */ qdoserr(); speed = -1; /* Unset line parameters */ return(-2); } local = TRUE; /* Set local/remote status */ ttychid = (int) getchid(ttyfd); /* Reset channel ID */ if (debon) printf("Opened %s\n",ttyname); } else speed = -1; /* Remote mode, unset speed */ return(0); } /* DISCARD - delete an incomplete file, if appropriate flag set */ discard(fn) char *fn; { if (!keep) { unlink(fn); printf("Discarded %s\n",fn); } } /* CHKQUOTE - Check for a valid quote character */ bool chkquote(c) char c; { return((c>' ' && c<'@') || (c>'a' && c0) /* Suffix to be added? */ { strcat(wrk,"_"); /* Yes, add seperator */ strcat(wrk,suffix); /* then the suffix */ } s = (int) (strchr(wrk,'_')-wrk+1); /* Find start of 2nd component */ l = (int) (strrchr(wrk,'_')-wrk); /* and last underscore */ for (j = 0; (c = wrk[s])!='\0'; s++,j++) { if (s==l) new[j] = '.'; else if (islower(c)) new[j] = toupper(c); else new[j] = c; } new[j] = '\0'; } if (debon) printf("ltor: converted %s to %s\n",old,new); } /* TCLOSE - close the current TAKE file */ tclose() { fclose(tfile[tlevel--]); if (debon) printf("TAKE file level %d closed\n",tlevel+1); }