/************************************************************************/ /* misc.c */ /* */ /* Random functions... */ /************************************************************************/ /************************************************************************/ /* history */ /* 83Jul13 BAK Looking for Rcpm bug */ /* 83Jun11 BAK Correcting userlog error - forces write of data. */ /* 83Mar12 CrT from msg.c */ /* 83Mar03 CrT & SB Various bug fixes... */ /* 83Feb27 CrT Save private mail for sender as well as recipient. */ /* 83Feb23 Various. transmitFile() won't drop first char on WC... */ /* 82Dec06 CrT 2.00 release. */ /* 82Nov05 CrT Stream retrieval. Handles messages longer than MAXTEXT.*/ /* 82Nov04 CrT Revised disk format implemented. */ /* 82Nov03 CrT Individual history begun. General cleanup. */ /************************************************************************/ #include "b:210ctdl.h" /************************************************************************/ /* contents */ /* */ /* configure() sets terminal parameters via dialogue */ /* doCR() newline on modem and console */ /* download() menu-level routine for WC-protocol sends*/ /* patchDebug() display/patch byte */ /* printDate() prints out date */ /* putFlChar() readFile() -> disk file interface */ /* putWCChar() filter[]s, readFile() to putMsgChar() */ /* transmitFile() send a host file, no formatting */ /* tutorial() prints a .hlp file */ /* upload() menu-level read-via-WC-protocol fn */ /* visible() convert control chars to letters */ /************************************************************************/ /************************************************************************/ /* configure() sets up terminal width etc via dialogue */ /************************************************************************/ configure() { termWidth = getNumber(" Screen width", 10, 255); termNulls = getNumber(" #Nulls", 0, 255); termUpper = getYesNo(" Uppercase only" ) ? UCMASK : 0; termLF = getYesNo(" Linefeeds" ) ? LFMASK : 0; termTab = getYesNo(" Tabs" ) ? TABMASK : 0; expert =!getYesNo(" Helpful hints" ) ? EXPERT : 0; Storelog(); /* Forces write to eliminate phantom configurations... */ } /************************************************************************/ /* doCR() does a newline on modem and console */ /************************************************************************/ doCR() { int i; crtColumn = 1; if (outFlag) return; /* output is being s(kip)ped */ if (whichIO==CONSOLE || echo==BOTH) putCh(NEWLINE); if (haveCarrier) { if (!usingWCprotocol) { outmod('\r'); for (i=termNulls; i; i--) outmod(0); if (termLF) outmod('\n'); } else { sendWCChar('\r'); if (termLF) sendWCChar('\n'); } } #ifdef XYZZY /* test code only */ else { if (usingWCprotocol) { sendWCChar('\r'); if (termLF) sendWCChar('\n'); } } #endif prevChar = ' '; } /************************************************************************/ /* download() is the menu-level send-message-via-WC-protocol fn */ /************************************************************************/ download(whichMess, revOrder) char whichMess, revOrder; { outFlag = OUTOK; if (!expert) tutorial("wcdown.blb"); outFlag = OUTOK; if (!getYesNo("Ready")) return; /* here we go: */ echo = NEITHER; usingWCprotocol = TRUE ; /* all points bulletin */ SFRunning = TRUE; /* init sendWCChar coroutine */ showMessages(whichMess, revOrder); while (sendWCChar(ERROR) == FALSE); /* fill last 128-byte block */ setUp(FALSE); usingWCprotocol = FALSE ; } /************************************************************************/ /* patchDebug() */ /************************************************************************/ patchDebug() { unsigned i, j, page; char c, finished, *pc; mPrintf("\bpatch\n "); page = getNumber("page", 0, 255); finished = FALSE; do { for (i=16, pc= (page*256); i; i--) { mPrintf("%d ", pc); for (j=16; j; j--) { mPrintf("%c", visible(*pc++)); } mPrintf("\n "); } switch (toLower(iChar())) { case 'r': pc = getNumber("adr", 0, 65355); *pc = getNumber("val", 0, 255); break; case 'n': page++; break; case 'p': page--; break; default: finished = TRUE; break; } } while (!finished); } /************************************************************************/ /* printDate() prints out a date packed in two-byte format */ /************************************************************************/ printDate(year, month, day) char year, month, day; { mprintf("%d%s%02d ", year, monthTab[month], day); } /************************************************************************/ /* putFlChar() is used to upload files */ /* returns: ERROR on problems else TRUE */ /* Globals: msgBuf.mbtext is used as a buffer, to save space */ /************************************************************************/ putFlChar(c) char c; { return putC(c, msgBuf.mbtext) != ERROR; } /************************************************************************/ /************************************************************************/ /* putWCChar() filter[]s from readFile() to putMsgChar() */ /* Returns: ERROR if problems, else TRUE */ /* Globals: outFlag is set to OUTSKIP when an ascii EOF (^Z) is */ /* encountered, and no further text is written to disk. */ /************************************************************************/ int putWCChar(c) int c; { if (outFlag) return TRUE; /* past ascii EOF. ignore. */ if (c == ERROR) { /* EOF. Note for overkill: */ outFlag = OUTSKIP; return TRUE; } c &= 0x7F; /* cut high stuff off */ if (c == CPMEOF) { /* ascii EOF. Ignore rest of file: */ outFlag = OUTSKIP; return TRUE; } return putMsgChar(filter[c]); } /************************************************************************/ /* transmitFile() dumps a host file with no formatting */ /************************************************************************/ transmitFile(filename) char *filename; { char mAbort(); int getc(), sendWCChar(); char fbuf[BUFSIZ], fname[NAMESIZE]; int c; outFlag = OUTOK; unspace(filename, fname); if(fopen(fname, fbuf) == ERROR) { mprintf("\n No %s.\n", fname); return(ERROR); } doCR(); if (usingWCprotocol) { SFRunning = TRUE; sendWCChar('\0'); /* warm up routine */ } while ((c=getc(fbuf)) != ERROR) { putCh(c); if (whichIO == MODEM) { if (!usingWCprotocol) outMod(c) ; else sendWCChar(c); } if (textDownload && c==CPMEOF) break; if (textDownload && mAbort() ) break; } if (usingWCprotocol) while (sendWCChar(ERROR) == FALSE); fClose(fbuf); } /************************************************************************/ /* tutorial() prints file on the modem & console */ /* Returns: TRUE on success else ERROR */ /************************************************************************/ #define MAXWORD 256 tutorial(filename) char *filename; { char fbuf[BUFSIZ]; char line[MAXWORD]; int toReturn; toReturn = TRUE; outFlag = OUTOK; if(fopen(filename, fbuf) == ERROR) { mPrintf("\n No %s.\n", filename); toReturn = ERROR; } else { if (!expert) mPrintf("\n ump

ause top\n"); mPrintf(" \n"); while (fGetS(line, fbuf)) mPrintf("%s", line); fClose(fbuf); } return toReturn; } /************************************************************************/ /* upLoad() enters a file into current directory */ /************************************************************************/ upLoad() { char fileName[NAMESIZE], *s; int putFlChar(); getString("filename", fileName, NAMESIZE); normalizeString(fileName); if (fileName[1] != ':') s = &fileName[0]; else s = &fileName[2]; setSpace(roomBuf.rbdisk, roomBuf.rbuser); if(fOpen(s, msgBuf.mbtext) != ERROR) { mprintf("\n A %s already exists.\n", s); } else { if (!expert) { setSpace(homeDisk, homeUser); tutorial("wcupload.blb"); setSpace(roomBuf.rbdisk, roomBuf.rbuser); } if (fCreat(s, msgBuf.mbtext) == ERROR) { mprintf("\n Can't create %s!\n", s); } else { readFile(putFlChar); fFlush(msgBuf.mbtext); fClose(msgBuf.mbtext); } } setSpace(homeDisk, homeUser); } /************************************************************************/ /* visible() converts given char to printable form if nonprinting */ /************************************************************************/ char visible(c) char c; { if (c==0xFF) c = '$' ; /* start-of-message in message.buf */ c = c & 0x7F ; /* kill high bit otherwise */ if ( c < ' ') c = c + 'A' -1; /* make all control chars letters */ if (c== 0x7F) c = '~' ; /* catch DELETE too */ return(c); } .