|
|
1.1 ! root 1: /************************************************************************* ! 2: * This program is copyright (C) 1985, 1986 by Jonathan Payne. It is * ! 3: * provided to you without charge for use only on a licensed Unix * ! 4: * system. You may copy JOVE provided that this notice is included with * ! 5: * the copy. You may not sell copies of this program or versions * ! 6: * modified for use on microcomputer systems, unless the copies are * ! 7: * included with a Unix system distribution and the source is provided. * ! 8: *************************************************************************/ ! 9: ! 10: #include "jove.h" ! 11: #include "io.h" ! 12: #include "termcap.h" ! 13: ! 14: #include <varargs.h> ! 15: ! 16: char mesgbuf[MESG_SIZE]; ! 17: ! 18: /* VARARGS2 */ ! 19: ! 20: format(buf, len, fmt, ap) ! 21: char *buf, ! 22: *fmt; ! 23: va_list ap; ! 24: { ! 25: File strbuf, ! 26: *sp = &strbuf; ! 27: ! 28: sp->f_ptr = sp->f_base = buf; ! 29: sp->f_fd = -1; /* Not legit for files */ ! 30: sp->f_cnt = len; ! 31: sp->f_flags = F_STRING; ! 32: sp->f_bufsize = len; ! 33: ! 34: doformat(sp, fmt, ap); ! 35: putc('\0', sp); ! 36: } ! 37: ! 38: static char padc = ' '; ! 39: static File *curiop = 0; ! 40: ! 41: static ! 42: PPchar(c, str) ! 43: int c; ! 44: char *str; ! 45: { ! 46: char *cp = str; ! 47: ! 48: if (c == '\033') ! 49: strcpy(cp, "ESC"); ! 50: else if (c < ' ') ! 51: sprintf(cp, "C-%c", c + '@'); ! 52: else if (c == '\177') ! 53: strcpy(cp, "^?"); ! 54: else ! 55: sprintf(cp, "%c", c); ! 56: } ! 57: ! 58: static ! 59: putld(leftadj, width, d, base) ! 60: long d; ! 61: { ! 62: int length = 1; ! 63: long tmpd = d; ! 64: ! 65: while (tmpd = (tmpd / base)) ! 66: length++; ! 67: if (d < 0) ! 68: length++; ! 69: if (!leftadj) ! 70: pad(padc, width - length); ! 71: if (d < 0) { ! 72: putc('-', curiop); ! 73: d = -d; ! 74: } ! 75: outld(d, base); ! 76: if (leftadj) ! 77: pad(padc, width - length); ! 78: } ! 79: ! 80: static ! 81: outld(d, base) ! 82: long d; ! 83: { ! 84: long n; ! 85: ! 86: if (n = (d / base)) ! 87: outld(n, base); ! 88: putc((int) ('0' + (int) (d % base)), curiop); ! 89: } ! 90: ! 91: static ! 92: puts(leftadj, width, str) ! 93: char *str; ! 94: { ! 95: int length; ! 96: register char *cp, ! 97: c; ! 98: ! 99: if (str == 0) ! 100: #if pyr ! 101: str = ""; ! 102: #else ! 103: str = "(null)"; ! 104: #endif ! 105: length = strlen(str); ! 106: cp = str; ! 107: if (!leftadj) ! 108: pad(' ', width - length); ! 109: while (c = *cp++) ! 110: putc(c, curiop); ! 111: if (leftadj) ! 112: pad(' ', width - length); ! 113: } ! 114: ! 115: static ! 116: pad(c, amount) ! 117: register int c, ! 118: amount; ! 119: { ! 120: while (--amount >= 0) ! 121: putc(c, curiop); ! 122: } ! 123: ! 124: static ! 125: doformat(sp, fmt, ap) ! 126: register File *sp; ! 127: register char *fmt; ! 128: va_list ap; ! 129: { ! 130: register char c; ! 131: int leftadj, ! 132: width; ! 133: File *pushiop = curiop; ! 134: ! 135: curiop = sp; ! 136: ! 137: while (c = *fmt++) { ! 138: if (c != '%') { ! 139: putc(c, sp); ! 140: continue; ! 141: } ! 142: ! 143: padc = ' '; ! 144: leftadj = width = 0; ! 145: c = *fmt++; ! 146: if (c == '-') { ! 147: leftadj++; ! 148: c = *fmt++; ! 149: } ! 150: if (c == '0') { ! 151: padc = '0'; ! 152: c = *fmt++; ! 153: } ! 154: while (c >= '0' && c <= '9') { ! 155: width = width * 10 + (c - '0'); ! 156: c = *fmt++; ! 157: } ! 158: if (c == '*') { ! 159: width = va_arg(ap, int); ! 160: c = *fmt++; ! 161: } ! 162: reswitch: ! 163: /* At this point, fmt points at one past the format letter. */ ! 164: switch (c) { ! 165: case 'l': ! 166: c = Upper(*++fmt); ! 167: goto reswitch; ! 168: ! 169: case '%': ! 170: putc('%', curiop); ! 171: break; ! 172: ! 173: case 'o': ! 174: putld(leftadj, width, (long) va_arg(ap, int), 8); ! 175: break; ! 176: ! 177: case 'd': ! 178: putld(leftadj, width, (long) va_arg(ap, int), 10); ! 179: break; ! 180: ! 181: case 'D': ! 182: putld(leftadj, width, va_arg(ap, long), 10); ! 183: break; ! 184: ! 185: case 'p': ! 186: { ! 187: char cbuf[20]; ! 188: ! 189: PPchar(va_arg(ap, int), cbuf); ! 190: puts(leftadj, width, cbuf); ! 191: break; ! 192: } ! 193: ! 194: case 'n': ! 195: if (va_arg(ap, int) != 1) ! 196: puts(leftadj, width, "s"); ! 197: break; ! 198: ! 199: case 's': ! 200: puts(leftadj, width, va_arg(ap, char *)); ! 201: break; ! 202: ! 203: case 'c': ! 204: putc(va_arg(ap, int), curiop); ! 205: break; ! 206: ! 207: case 'f': /* current command name gets inserted here! */ ! 208: puts(leftadj, width, LastCmd->Name); ! 209: break; ! 210: ! 211: default: ! 212: complain("%%%c?", c); ! 213: } ! 214: } ! 215: curiop = pushiop; ! 216: } ! 217: ! 218: /* VARARGS1 */ ! 219: ! 220: char * ! 221: sprint(fmt, va_alist) ! 222: char *fmt; ! 223: va_dcl ! 224: { ! 225: va_list ap; ! 226: static char line[100]; ! 227: ! 228: va_start(ap); ! 229: format(line, sizeof line, fmt, ap); ! 230: va_end(ap); ! 231: return line; ! 232: } ! 233: ! 234: /* VARARGS1 */ ! 235: ! 236: printf(fmt, va_alist) ! 237: char *fmt; ! 238: va_dcl ! 239: { ! 240: va_list ap; ! 241: ! 242: va_start(ap); ! 243: doformat(stdout, fmt, ap); ! 244: va_end(ap); ! 245: } ! 246: ! 247: /* VARARGS1 */ ! 248: ! 249: fprintf(fp, fmt, va_alist) ! 250: File *fp; ! 251: char *fmt; ! 252: va_dcl ! 253: { ! 254: va_list ap; ! 255: ! 256: va_start(ap); ! 257: doformat(fp, fmt, ap); ! 258: va_end(ap); ! 259: } ! 260: ! 261: /* VARARGS2 */ ! 262: ! 263: sprintf(str, fmt, va_alist) ! 264: char *str, ! 265: *fmt; ! 266: va_dcl ! 267: { ! 268: va_list ap; ! 269: ! 270: va_start(ap); ! 271: format(str, 130, fmt, ap); ! 272: va_end(ap); ! 273: } ! 274: ! 275: /* VARARGS1 */ ! 276: ! 277: s_mess(fmt, va_alist) ! 278: char *fmt; ! 279: va_dcl ! 280: { ! 281: va_list ap; ! 282: ! 283: if (InJoverc) ! 284: return; ! 285: va_start(ap); ! 286: format(mesgbuf, sizeof mesgbuf, fmt, ap); ! 287: va_end(ap); ! 288: message(mesgbuf); ! 289: } ! 290: ! 291: /* VARARGS1 */ ! 292: ! 293: f_mess(fmt, va_alist) ! 294: char *fmt; ! 295: va_dcl ! 296: { ! 297: va_list ap; ! 298: ! 299: va_start(ap); ! 300: format(mesgbuf, sizeof mesgbuf, fmt, ap); ! 301: va_end(ap); ! 302: DrawMesg(NO); ! 303: UpdMesg++; /* Still needs updating (for convenience) */ ! 304: } ! 305: ! 306: /* VARARGS1 */ ! 307: ! 308: add_mess(fmt, va_alist) ! 309: char *fmt; ! 310: va_dcl ! 311: { ! 312: int mesg_len = strlen(mesgbuf); ! 313: va_list ap; ! 314: ! 315: if (InJoverc) ! 316: return; ! 317: va_start(ap); ! 318: format(&mesgbuf[mesg_len], (sizeof mesgbuf) - mesg_len, fmt, ap); ! 319: va_end(ap); ! 320: message(mesgbuf); ! 321: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.