|
|
1.1 root 1: /* C K U U S 3 -- "User Interface" for Unix Kermit, part 3 */
2:
3: /*
4: Author: Frank da Cruz (SY.FDC@CU20B),
5: Columbia University Center for Computing Activities, January 1985.
6: Copyright (C) 1985, Trustees of Columbia University in the City of New York.
7: Permission is granted to any individual or institution to use, copy, or
8: redistribute this software so long as it is not sold for profit, provided this
9: copyright notice is retained.
10: */
11:
12: /* SET and REMOTE commands; screen, debug, interrupt, and logging functions */
13:
14: /* Includes */
15:
16: #include "ckcdeb.h"
17: #include <stdio.h>
18: #include <ctype.h>
19: #include "ckcker.h"
20: #include "ckucmd.h"
21: #include "ckuusr.h"
22:
23: /* Variables */
24:
25: extern int size, spsiz, rpsiz, npad, timint, rtimo, speed, local, server,
26: image, flow, displa, binary, fncnv, delay, parity, deblog, escape, xargc,
27: turn, duplex, cxseen, czseen, nfils, ckxech, pktlog, seslog, tralog, stdouf,
28: turnch, chklen, bctr, bctu, dfloc, mdmtyp, keep,
29: rptflg, ebqflg, warn, quiet, cnflg, timef, spsizf, mypadn;
30:
31: extern long filcnt, tlci, tlco, ffc, tfc, fsize;
32:
33: extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv;
34: extern char *cmarg, *cmarg2, **xargv, **cmlist;
35: extern CHAR stchr, mystch, sstate, padch, mypadc, eol, seol, ctlq;
36: extern CHAR filnam[], ttname[];
37: char *strcpy();
38:
39: /* Declarations from cmd package */
40:
41: extern char cmdbuf[]; /* Command buffer */
42:
43: /* From main ckuser module... */
44:
45: extern char line[100], *lp; /* Character buffer for anything */
46: extern char debfil[50], /* Debugging log file name */
47: pktfil[50], /* Packet log file name */
48: sesfil[50], /* Session log file name */
49: trafil[50]; /* Transaction log file name */
50:
51: extern int tlevel; /* Take Command file level */
52: extern FILE *tfile[]; /* Array of take command fd's */
53:
54:
55: /* Keyword tables for SET commands */
56:
57:
58: /* Block checks */
59:
60: struct keytab blktab[] = {
61: "1", 1, 0,
62: "2", 2, 0,
63: "3", 3, 0
64: };
65:
66: /* Duplex keyword table */
67:
68: struct keytab dpxtab[] = {
69: "full", 0, 0,
70: "half", 1, 0
71: };
72:
73: struct keytab filtab[] = {
74: "display", XYFILD, 0,
75: "names", XYFILN, 0,
76: "type", XYFILT, 0,
77: "warning", XYFILW, 0
78: };
79: int nfilp = (sizeof(filtab) / sizeof(struct keytab));
80:
81: /* Send/Receive Parameters */
82:
83: struct keytab srtab[] = {
84: "end-of-packet", XYEOL, 0,
85: "packet-length", XYLEN, 0,
86: "pad-character", XYPADC, 0,
87: "padding", XYNPAD, 0,
88: "start-of-packet", XYMARK, 0,
89: "timeout", XYTIMO, 0
90: };
91: int nsrtab = (sizeof(srtab) / sizeof(struct keytab));
92:
93: /* Flow Control */
94:
95: struct keytab flotab[] = {
96: "none", 0, 0,
97: "xon/xoff", 1, 0
98: };
99: int nflo = (sizeof(flotab) / sizeof(struct keytab));
100:
101: /* Handshake characters */
102:
103: struct keytab hshtab[] = {
104: "bell", 007, 0,
105: "cr", 015, 0,
106: "esc", 033, 0,
107: "lf", 012, 0,
108: "none", 999, 0, /* (can't use negative numbers) */
109: "xoff", 023, 0,
110: "xon", 021, 0
111: };
112: int nhsh = (sizeof(hshtab) / sizeof(struct keytab));
113:
114: struct keytab fntab[] = { /* File naming */
115: "converted", 1, 0,
116: "literal", 0, 0
117: };
118:
119: struct keytab fttab[] = { /* File types */
120: "binary", 1, 0,
121: "text", 0, 0
122: };
123:
124: extern struct keytab mdmtab[] ; /* Modem types (in module ckudia.c) */
125: extern int nmdm;
126:
127: /* Parity keyword table */
128:
129: struct keytab partab[] = {
130: "even", 'e', 0,
131: "mark", 'm', 0,
132: "none", 0, 0,
133: "odd", 'o', 0,
134: "space", 's', 0
135: };
136: int npar = (sizeof(partab) / sizeof(struct keytab));
137:
138:
139: /* On/Off table */
140:
141: struct keytab onoff[] = {
142: "off", 0, 0,
143: "on", 1, 0
144: };
145:
146: /* Incomplete File Disposition table */
147:
148: struct keytab ifdtab[] = {
149: "discard", 0, 0,
150: "keep", 1, 0
151: };
152:
153: /* D O P R M -- Set a parameter. */
154: /*
155: Returns:
156: -2: illegal input
157: -1: reparse needed
158: 0: success
159: */
160: doprm(xx) int xx; {
161: int x, y, z;
162: char *s;
163:
164: switch (xx) {
165:
166:
167: case XYEOL: /* These have all been moved to set send/receive... */
168: case XYLEN: /* Let the user know what to do. */
169: case XYMARK:
170: case XYNPAD:
171: case XYPADC:
172: case XYTIMO:
173: printf("...Use 'set send' or 'set receive' instead.\n");
174: printf("Type 'help set send' or 'help set receive' for more info.\n");
175: return(0);
176:
177: case XYIFD: /* Incomplete file disposition */
178: if ((y = cmkey(ifdtab,2,"","discard")) < 0) return(y);
179: if ((x = cmcfm()) < 0) return(x);
180: keep = y;
181: return(0);
182:
183: case XYLINE:
184: if ((x = cmtxt("Device name",dftty,&s)) < 0) return(x);
185: ttclos(); /* close old line, if any was open */
186:
187: x = strcmp(s,dftty) ? -1 : dfloc; /* Maybe let ttopen figure it out... */
188: if (ttopen(s,&x,mdmtyp) < 0 ) { /* Can we open the new line? */
189: perror("Sorry, can't open line");
190: return(-2); /* If not, give bad return */
191: }
192: if (x > -1) local = x; /* Set local/remote status. */
193: strcpy(ttname,s); /* OK, copy name into real place. */
194: if (!local) speed = -1; /* If remote, say speed unknown. */
195: debug(F111,"set line ",ttname,local);
196: return(0);
197:
198: case XYCHKT:
199: if ((y = cmkey(blktab,3,"","1")) < 0) return(y);
200: if ((x = cmcfm()) < 0) return(x);
201: bctr = y;
202: return(0);
203:
204: case XYDEBU:
205: return(seton(&deblog));
206:
207: case XYDELA:
208: y = cmnum("Number of seconds before starting to send","5",10,&x);
209: debug(F101,"XYDELA: y","",y);
210: return(setnum(&delay,x,y));
211:
212: case XYDUPL:
213: if ((y = cmkey(dpxtab,2,"","full")) < 0) return(y);
214: if ((x = cmcfm()) < 0) return(x);
215: duplex = y;
216: return(0);
217:
218: case XYESC:
219: y = cmnum("Decimal ASCII code for escape character","",10,&x);
220: return(setcc(&escape,x,y));
221:
222: case XYFILE:
223: if ((y = cmkey(filtab,nfilp,"File parameter","")) < 0) return(y);
224: switch (y) {
225: int z;
226: case XYFILD: /* Display */
227: y = seton(&z);
228: if (y < 0) return(y);
229: quiet = !z;
230: return(0);
231:
232: case XYFILN: /* Names */
233: if ((x = cmkey(fntab,2,"how to handle filenames","converted")) < 0)
234: return(x);
235: if ((z = cmcfm()) < 0) return(z);
236: fncnv = x;
237: return(0);
238:
239: case XYFILT: /* Type */
240: if ((x = cmkey(fttab,2,"type of file","text")) < 0)
241: return(x);
242: if ((z = cmcfm()) < 0) return(z);
243: binary = x;
244: return(0);
245:
246: case XYFILW: /* Warning/Write-Protect */
247: return(seton(&warn));
248:
249: default:
250: printf("?unexpected file parameter\n");
251: return(-2);
252: }
253:
254: case XYFLOW: /* Flow control */
255: if ((y = cmkey(flotab,nflo,"","xon/xoff")) < 0) return(y);
256: if ((x = cmcfm()) < 0) return(x);
257: flow = y;
258: return(0);
259:
260: case XYHAND: /* Handshake */
261: if ((y = cmkey(hshtab,nhsh,"","none")) < 0) return(y);
262: if ((x = cmcfm()) < 0) return(x);
263: turn = (y > 0127) ? 0 : 1 ;
264: turnch = y;
265: return(0);
266:
267: case XYMODM:
268: if ((x=cmkey(mdmtab,nmdm,"type of modem, direct means none","direct")) < 0)
269: return(x);
270: if ((z = cmcfm()) < 0) return(z);
271: mdmtyp = x;
272: return(0);
273:
274: case XYPARI: /* Parity */
275: if ((y = cmkey(partab,npar,"","none")) < 0) return(y);
276: if ((x = cmcfm()) < 0) return(x);
277:
278: /* If parity not none, then we also want 8th-bit prefixing */
279:
280: if (parity = y) ebqflg = 1; else ebqflg = 0;
281: return(0);
282:
283: case XYPROM:
284: if ((x = cmtxt("Program's command prompt","C-Kermit>",&s)) < 0) return(x);
285: if (*s == '\42') { /* Quoted string? */
286: x = strlen(s) - 1; /* Yes, strip quotes. */
287: if (*(s+x) == '\42') /* This allows leading or trailing */
288: *(s+x) = '\0'; /* blanks. */
289: s++;
290: }
291: cmsetp(s);
292: return(0);
293:
294:
295: /* SET SEND/RECEIVE... */
296:
297: case XYRECV:
298: case XYSEND:
299: if (xx == XYRECV)
300: strcpy(line,"Parameter for inbound packets");
301: else
302: strcpy(line,"Parameter for outbound packets");
303:
304: if ((y = cmkey(srtab,nsrtab,line,"")) < 0) return(y);
305: switch (y) {
306:
307: case XYEOL:
308: y = cmnum("Decimal ASCII code for packet terminator","0",10,&x);
309: if ((y = setcc(&z,x,y)) < 0) return(y);
310: if (xx == XYRECV) eol = z; else seol = z;
311: return(y);
312:
313: case XYLEN:
314: y = cmnum("Maximum number of characters in a packet","90",10,&x);
315: if ((y = setnum(&z,x,y)) < 0) return(y);
316: if (xx == XYRECV) { /* Receive... */
317: rpsiz = z; /* Just set it. */
318: } else { /* Send... */
319: spsiz = z; /* Set it and flag that it was set */
320: spsizf = 1; /* to allow overriding Send-Init. */
321: }
322: return(y);
323:
324: case XYMARK:
325: y = cmnum("Decimal ASCII code for packet-start character","1",10,&x);
326: if ((y = setcc(&z,x,y)) < 0) return(y);
327: if (xx == XYRECV) stchr = z; else mystch = z;
328: return(y);
329:
330: case XYNPAD: /* Padding */
331: y = cmnum("How many padding characters for inbound packets","0",10,&x);
332: if ((y = setnum(&z,x,y)) < 0) return(y);
333: if (xx == XYRECV) mypadn = z; else npad = z;
334: return(y);
335:
336: case XYPADC: /* Pad character */
337: y = cmnum("Decimal ASCII code for inbound pad character","0",10,&x);
338: if ((y = setcc(&z,x,y)) < 0) return(y);
339: if (xx == XYRECV) mypadc = z; else padch = z;
340: return(y);
341:
342: case XYTIMO:
343: y = cmnum("Interpacket timeout interval","5",10,&x);
344: if ((y = setnum(&z,x,y)) < 0) return(y);
345: if (xx == XYRECV) {
346: timef = 1;
347: timint = z;
348: } else rtimo = z;
349: return(y);
350:
351: }
352:
353: case XYSPEE:
354: if (!local) {
355: printf("\nSpeed setting can only be done on an external line\n");
356: printf("You must 'set line' before issuing this command\n");
357: return(0);
358: }
359: lp = line;
360: sprintf(lp,"Baud rate for %s",ttname);
361: if ((y = cmnum(line,"",10,&x)) < 0) return(y);
362: if (y = (cmcfm()) < 0) return(y);
363: y = chkspd(x);
364: if (y < 0)
365: printf("?Unsupported line speed - %d\n",x);
366: else {
367: speed = y;
368: printf("%s: %d baud\n",ttname,speed);
369: }
370: return(0);
371:
372: default:
373: if ((x = cmcfm()) < 0) return(x);
374: printf("Not working yet - %s\n",cmdbuf);
375: return(0);
376: }
377: }
378:
379: /* C H K S P D -- Check if argument is a valid baud rate */
380:
381: chkspd(x) int x; {
382: switch (x) {
383: case 0:
384: case 110:
385: case 150:
386: case 300:
387: case 600:
388: case 1200:
389: case 1800:
390: case 2400:
391: case 4800:
392: case 9600:
393: return(x);
394: default:
395: return(-1);
396: }
397: }
398:
399: /* S E T O N -- Parse on/off (default on), set parameter to result */
400:
401: seton(prm) int *prm; {
402: int x, y;
403: if ((y = cmkey(onoff,2,"","on")) < 0) return(y);
404: if ((x = cmcfm()) < 0) return(x);
405: *prm = y;
406: return(0);
407: }
408:
409: /* S E T N U M -- Set parameter to result of cmnum() parse. */
410: /*
411: Call with x - number from cnum parse, y - return code from cmnum
412: */
413: setnum(prm,x,y) int x, y, *prm; {
414: debug(F101,"setnum","",y);
415: if (y < 0) return(y);
416: if (x > 94) {
417: printf("\n?Sorry, 94 is the maximum\n");
418: return(-2);
419: }
420: if ((y = cmcfm()) < 0) return(y);
421: *prm = x;
422: return(0);
423: }
424:
425: /* S E T C C -- Set parameter to an ASCII control character value. */
426:
427: setcc(prm,x,y) int x, y, *prm; {
428: if (y < 0) return(y);
429: if ((x > 037) && (x != 0177)) {
430: printf("\n?Not in ASCII control range - %d\n",x);
431: return(-2);
432: }
433: if ((y = cmcfm()) < 0) return(y);
434: *prm = x;
435: return(0);
436: }
437:
438: /* D O R M T -- Do a remote command */
439:
440: dormt(xx) int xx; {
441: int x;
442: char *s, sbuf[50], *s2;
443:
444: if (xx < 0) return(xx);
445: switch (xx) {
446:
447: case XZCWD: /* CWD */
448: if ((x = cmtxt("Remote directory name","",&s)) < 0) return(x);
449: debug(F111,"XZCWD: ",s,x);
450: *sbuf = NUL;
451: s2 = sbuf;
452: if (*s != NUL) { /* If directory name given, */
453: /* get password on separate line. */
454: if (tlevel > -1) { /* From take file... */
455:
456: *line = NUL;
457: if (fgets(sbuf,50,tfile[tlevel]) == NULL)
458: ermsg("take file ends prematurely in 'remote cwd'");
459: debug(F110," pswd from take file",s2,0);
460:
461: } else { /* From terminal... */
462:
463: printf(" Password: "); /* get a password */
464: while (((x = getchar()) != NL) && (x != CR)) { /* with no echo */
465: if ((x &= 0177) == '?') {
466: printf("? Password of remote directory\n Password: ");
467: s2 = sbuf;
468: *sbuf = NUL;
469: }
470: else if (x == ESC) /* Mini command line editor... */
471: putchar(BEL);
472: else if (x == BS || x == 0177)
473: s2--;
474: else if (x == 025) {
475: s2 = sbuf;
476: *sbuf = NUL;
477: }
478: else
479: *s2++ = x;
480: }
481: *s2 = NUL;
482: putchar('\n');
483: }
484: s2 = sbuf;
485: } else s2 = "";
486: debug(F110," password",s2,0);
487: sstate = setgen('C',s,s2,"");
488: return(0);
489:
490: case XZDEL: /* Delete */
491: if ((x = cmtxt("Name of remote file(s) to delete","",&s)) < 0) return(x);
492: return(sstate = rfilop(s,'E'));
493:
494: case XZDIR: /* Directory */
495: if ((x = cmtxt("Remote directory or file specification","",&s)) < 0)
496: return(x);
497: return(sstate = setgen('D',s,"",""));
498:
499: case XZHLP: /* Help */
500: if (x = (cmcfm()) < 0) return(x);
501: sstate = setgen('H',"","","");
502: return(0);
503:
504: case XZHOS: /* Host */
505: if ((x = cmtxt("Command for remote system","",&cmarg)) < 0) return(x);
506: return(sstate = 'c');
507:
508: case XZPRI: /* Print */
509: if ((x = cmtxt("Remote file(s) to print on remote printer","",&s)) < 0)
510: return(x);
511: return(sstate = rfilop(s,'S'));
512:
513: case XZSPA: /* Space */
514: if ((x = cmtxt("Confirm, or remote directory name","",&s)) < 0) return(x);
515: return(sstate = setgen('U',s,"",""));
516:
517: case XZTYP: /* Type */
518: if ((x = cmtxt("Remote file specification","",&s)) < 0) return(x);
519: return(sstate = rfilop(s,'T'));
520:
521: case XZWHO:
522: if ((x = cmtxt("Remote user name, or carriage return","",&s)) < 0)
523: return(x);
524: return(sstate = setgen('W',s,"",""));
525:
526: default:
527: if (x = (cmcfm()) < 0) return(x);
528: printf("not working yet - %s\n",cmdbuf);
529: return(-2);
530: }
531: }
532:
533:
534:
535: /* R F I L O P -- Remote File Operation */
536:
537: rfilop(s,t) char *s, t; {
538: if (*s == NUL) {
539: printf("?File specification required\n");
540: return(-2);
541: }
542: debug(F111,"rfilop",s,t);
543: return(setgen(t,s,"",""));
544: }
545:
546: /* S C R E E N -- Screen display function */
547:
548: /* screen(f,c,n,s)
549: f - argument descriptor
550: c - a character or small integer
551: n - a long integer
552: s - a string.
553: Fill in this routine with the appropriate display update for the system.
554: This version is for a dumb tty.
555: */
556: screen(f,c,n,s) int f; long n; char c; char *s; {
557: static int p = 0; /* Screen position */
558: int len; /* Length of string */
559: char buf[80]; /* Output buffer */
560: len = strlen(s); /* Length of string */
561: if (!displa || quiet) return; /* No update if display flag off */
562:
563: switch (f) {
564:
565: case SCR_FN: /* filename */
566: conoll(""); conol(s); conoc(SP); p = len + 1; return;
567:
568: case SCR_AN: /* as-name */
569: if (p + len > 75) { conoll(""); p = 0; }
570: conol("=> "); conol(s); if ((p += (len + 3)) > 78) { conoll(""); p = 0; }
571: return;
572:
573: case SCR_FS: /* file-size */
574: sprintf(buf,", Size: %ld",n); conoll(buf); p = 0; return;
575:
576: case SCR_XD: /* x-packet data */
577: conoll(""); conoll(s); p = 0; return;
578:
579: case SCR_ST: /* File status */
580: switch (c) {
581: case ST_OK: /* Transferred OK */
582: if ((p += 5) > 78) { conoll(""); p = 0; }
583: conoll(" [OK]"); p += 5; return;
584:
585: case ST_DISC: /* Discarded */
586: if ((p += 12) > 78) { conoll(""); p = 0; }
587: conoll(" [discarded]"); p += 12; return;
588:
589: case ST_INT: /* Interrupted */
590: if ((p += 14) > 78) { conoll(""); p = 0; }
591: conoll(" [interrupted]"); p += 14; return;
592:
593: case ST_SKIP: /* Skipped */
594: conoll("");
595: conol("Skipping "); conoll(s); p = 0;
596: return;
597:
598: default:
599: conoll("*** screen() called with bad status ***"); p = 0; return;
600: }
601:
602: case SCR_PN: /* Packet number */
603: sprintf(buf,"%s: %ld",s,n); conol(buf); p += strlen(buf); return;
604:
605: case SCR_PT: /* Packet type or pseudotype */
606: if (c == 'Y') return; /* Don't bother with ACKs */
607: if (c == 'D') { /* Only show every 4th data packet */
608: if (n % 4) return;
609: c = '.';
610: }
611: if (p++ > 78) { /* If near right margin, */
612: conoll(""); /* Start new line */
613: p = 0; /* and reset counter. */
614: }
615: conoc(c); /* Display the character. */
616: return;
617:
618: case SCR_TC: /* transaction complete */
619: conoc(BEL); return;
620:
621: case SCR_EM: /* Error message */
622: conoll(""); conoc('?'); conoll(s); p = 0; return; /* +1 */
623:
624: case SCR_WM: /* Warning message */
625: conoll(""); conoll(s); p = 0; return;
626:
627: case SCR_TU: /* Undelimited text */
628: if ((p += len) > 78) { conoll(""); p = len; }
629: conol(s); return;
630:
631: case SCR_TN: /* Text delimited at beginning */
632: conoll(""); conol(s); p = len; return;
633:
634: case SCR_TZ: /* Text delimited at end */
635: if ((p += len) > 78) { conoll(""); p = len; }
636: conoll(s); return;
637:
638: case SCR_QE: /* Quantity equals */
639: sprintf(buf,"%s: %ld",s,n);
640: conoll(buf); p = 0; return;
641:
642: default:
643: conoll("*** screen() called with bad object ***"); p = 0; return;
644: }
645: }
646:
647: /* I N T M S G -- Issue message about terminal interrupts */
648:
649: intmsg(n) long n; {
650: extern char *chstr();
651: char buf[80];
652:
653: if ((!displa) || (quiet)) return;
654: #ifdef UXIII
655: (void) conchk(); /* clear out pending escape-signals in ckxbsd.c */
656: #endif
657: if (n == 1) {
658: #ifdef UXIII
659: /* we need to signal before kb input */
660: sprintf(buf,"Type escape (%s) followed by:",chstr(escape));
661: screen(SCR_TN,0,0l,buf);
662: #endif
663: screen(SCR_TN,0,0l,"CTRL-F to cancel file, CTRL-R to resend current packet");
664: screen(SCR_TN,0,0l,"CTRL-B to cancel batch, CTRL-A for status report: ");
665: }
666: else screen(SCR_TU,0,0l," ");
667: }
668:
669: /* C H K I N T -- Check for console interrupts */
670:
671: /*** should rework not to destroy typeahead ***/
672:
673: chkint() {
674: int ch, cn;
675:
676: if ((!local) || (quiet)) return(0); /* Only do this if local & not quiet */
677: cn = conchk(); /* Any input waiting? */
678: debug(F101,"conchk","",cn);
679:
680: while (cn > 0) { /* Yes, read it. */
681: cn--;
682: /* give read 5 seconds for interrupt character */
683: if ((ch = coninc(5)) < 0) return(0);
684: switch (ch & 0177) {
685: case 0001: /* CTRL-A */
686: screen(SCR_TN,0,0l,"^A Status report:");
687: screen(SCR_TN,0,0l," file type: ");
688: if (binary) screen(SCR_TZ,0,0l,"binary");
689: else screen(SCR_TZ,0,0l,"text");
690: screen(SCR_QE,0,(long)filcnt," file number");
691: screen(SCR_QE,0,(long)ffc, " characters ");
692: screen(SCR_QE,0,(long)bctu, " block check");
693: screen(SCR_QE,0,(long)rptflg," compression");
694: screen(SCR_QE,0,(long)ebqflg," 8th-bit prefixing");
695: continue;
696: case 0002: /* CTRL-B */
697: screen(SCR_TN,0,0l,"^B - Cancelling Batch ");
698: czseen = 1;
699: continue;
700: case 0006: /* CTRL-F */
701: screen(SCR_TN,0,0l,"^F - Cancelling File ");
702: cxseen = 1;
703: continue;
704: case 0022: /* CTRL-R */
705: screen(SCR_TN,0,0l,"^R - Resending ");
706: resend();
707: return(1);
708: default: /* Anything else, just ignore */
709: screen(SCR_TU,0,0l," [Ignored] ");
710: continue;
711: }
712: }
713: return(0);
714: }
715:
716: /* D E B U G -- Enter a record in the debugging log */
717:
718: /*
719: Call with a format, two strings, and a number:
720: f - Format, a bit string in range 0-7.
721: If bit x is on, then argument number x is printed.
722: s1 - String, argument number 1. If selected, printed as is.
723: s2 - String, argument number 2. If selected, printed in brackets.
724: n - Int, argument 3. If selected, printed preceded by equals sign.
725:
726: f=0 is special: print s1,s2, and interpret n as a char.
727: */
728: #ifdef DEBUG
729: debug(f,s1,s2,n) int f, n; char *s1, *s2; {
730: static char s[200];
731: char *sp = s;
732:
733: if (!deblog) return; /* If no debug log, don't */
734: switch (f) {
735: case F000: /* 0, print both strings, */
736: sprintf(sp,"%s%s%c\n",s1,s2,n); /* and interpret n as a char */
737: zsout(ZDFILE,s);
738: break;
739: case F001: /* 1, "=n" */
740: sprintf(sp,"=%d\n",n);
741: zsout(ZDFILE,s);
742: break;
743: case F010: /* 2, "[s2]" */
744: sprintf(sp,"[%s]\n",s2);
745: zsout(ZDFILE,"");
746: break;
747: case F011: /* 3, "[s2]=n" */
748: sprintf(sp,"[%s]=%d\n",s2,n);
749: zsout(ZDFILE,s);
750: break;
751: case F100: /* 4, "s1" */
752: zsoutl(ZDFILE,s1);
753: break;
754: case F101: /* 5, "s1=n" */
755: sprintf(sp,"%s=%d\n",s1,n);
756: zsout(ZDFILE,s);
757: break;
758: case F110: /* 6, "s1[s2]" */
759: sprintf(sp,"%s[%s]\n",s1,s2);
760: zsout(ZDFILE,s);
761: break;
762: case F111: /* 7, "s1[s2]=n" */
763: sprintf(sp,"%s[%s]=%d\n",s1,s2,n);
764: zsout(ZDFILE,s);
765: break;
766: default:
767: sprintf(sp,"\n?Invalid format for debug() - %d\n",n);
768: zsout(ZDFILE,s);
769: }
770: }
771: #endif
772:
773: #ifdef TLOG
774: /* T L O G -- Log a record in the transaction file */
775: /*
776: Call with a format and 3 arguments: two strings and a number:
777: f - Format, a bit string in range 0-7, bit x is on, arg #x is printed.
778: s1,s2 - String arguments 1 and 2.
779: n - Int, argument 3.
780: */
781: tlog(f,s1,s2,n) int f; long n; char *s1, *s2; {
782: static char s[200];
783: char *sp = s; int x;
784:
785: if (!tralog) return; /* If no transaction log, don't */
786: switch (f) {
787: case F000: /* 0 (special) "s1 n s2" */
788: sprintf(sp,"%s %ld %s\n",s1,n,s2);
789: zsout(ZTFILE,s);
790: break;
791: case F001: /* 1, " n" */
792: sprintf(sp," %ld\n",n);
793: zsout(ZTFILE,s);
794: break;
795: case F010: /* 2, "[s2]" */
796: x = strlen(s2);
797: if (s2[x] == '\n') s2[x] = '\0';
798: sprintf(sp,"[%s]\n",s2);
799: zsout(ZTFILE,"");
800: break;
801: case F011: /* 3, "[s2] n" */
802: x = strlen(s2);
803: if (s2[x] == '\n') s2[x] = '\0';
804: sprintf(sp,"[%s] %ld\n",s2,n);
805: zsout(ZTFILE,s);
806: break;
807: case F100: /* 4, "s1" */
808: zsoutl(ZTFILE,s1);
809: break;
810: case F101: /* 5, "s1: n" */
811: sprintf(sp,"%s: %ld\n",s1,n);
812: zsout(ZTFILE,s);
813: break;
814: case F110: /* 6, "s1 s2" */
815: x = strlen(s2);
816: if (s2[x] == '\n') s2[x] = '\0';
817: sprintf(sp,"%s %s\n",s1,s2);
818: zsout(ZTFILE,s);
819: break;
820: case F111: /* 7, "s1 s2: n" */
821: x = strlen(s2);
822: if (s2[x] == '\n') s2[x] = '\0';
823: sprintf(sp,"%s %s: %ld\n",s1,s2,n);
824: zsout(ZTFILE,s);
825: break;
826: default:
827: sprintf(sp,"\n?Invalid format for tlog() - %ld\n",n);
828: zsout(ZTFILE,s);
829: }
830: }
831: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.