|
|
1.1 ! root 1: /* Copyright Bell Telephone Laboratories Whippany, N.J. ! 2: ! 3: * ///////////////////////////////////// ! 4: * ///////////////////////////////////// ! 5: * ///////////// iprintf.c ///////////// ! 6: * /// J. P. Hawkins WH X4610 8C-001 /// ! 7: * ///// Fri Aug 24 17:38:43 1979 ////// ! 8: * ///////////////////////////////////// ! 9: * ///////////////////////////////////// ! 10: ! 11: * BITE PRINTF ! 12: * INTERPRETIVE PRINTF FOR "BITE" BASIC f and g FORMATS ALLOWED ONLY ! 13: * ! 14: */ ! 15: /* "@(#) iprintf.c: V 1.3 9/22/81" */ ! 16: int fd; ! 17: #include "bas.h" ! 18: extern struct FILTBL filtbl[]; ! 19: ! 20: iprintf() ! 21: { ! 22: int prerr; ! 23: char s[100]; ! 24: register x; ! 25: prerr = isprintf(s); ! 26: if(fd == 1) /* normal printf */ ! 27: printf(s); ! 28: else /* file printf */ ! 29: { ! 30: for(x=0; s[x] != '\0'; x++); /* count chars */ ! 31: write(fd, s, x); /* printf to file */ ! 32: } ! 33: return(prerr); ! 34: } ! 35: /* ! 36: * ! 37: * ! 38: */ ! 39: isprintf(s) ! 40: char s[]; ! 41: { ! 42: char format[80]; /* format string */ ! 43: char expbfr[40]; /* expression buffer */ ! 44: double evalx(); ! 45: int fildes; ! 46: int i; ! 47: char *ptr; ! 48: int fcount; /* number of args format string asks for */ ! 49: double arg[10]; ! 50: ! 51: ! 52: ptr = expr; ! 53: fd = 1; /* set fd for normal printf */ ! 54: ! 55: if(*ptr == '_' && (*(ptr+1) >= '0' && *(ptr+1) <= '8')) ! 56: { ! 57: *ptr++; ! 58: fildes = *ptr - '1'; /* get BASIC file designator */ ! 59: fd = filtbl[fildes].fildes; ! 60: *ptr++; ! 61: if(filtbl[fildes].mode != 'w') /* file must be open ! 62: for writing */ ! 63: { ! 64: error(inst.thing.linno, 36); /* FILE NOT OPEN FOR WRITE */ ! 65: return(-1); ! 66: } ! 67: } ! 68: /* ! 69: * COPY FORMAT STRING ! 70: */ ! 71: if(*ptr++ != '"') ! 72: { ! 73: error(inst.thing.linno, 11); /* missing quotes */ ! 74: return(-1); ! 75: } ! 76: fcount = 0; ! 77: ! 78: for(i=0; (*ptr != '"') && (*ptr != '\0'); ) ! 79: { ! 80: if(*ptr == '%') /* format delimiter */ ! 81: { ! 82: fcount += 1; /* bump expected arg count */ ! 83: format[i++] = *ptr++; ! 84: } ! 85: else if(*ptr == '\\') /* special character */ ! 86: { ! 87: ptr++; /* look at next char */ ! 88: switch(*ptr) ! 89: { ! 90: case 'n': /* NEWLINE */ ! 91: format[i] = '\n'; ! 92: break; ! 93: case 'r': /* CARRIAGE RET */ ! 94: format[i] = '\r'; ! 95: break; ! 96: case 't': /* TAB */ ! 97: format[i] = '\t'; ! 98: break; ! 99: case 'b': /* BACKSPACE */ ! 100: format[i] = '\b'; ! 101: break; ! 102: default: ! 103: format[i] = *ptr; ! 104: break; ! 105: } ! 106: ptr++; ! 107: i++; ! 108: } ! 109: else ! 110: format[i++] = *ptr++; ! 111: } ! 112: format[i] = '\0'; ! 113: if(*ptr == '\0') ! 114: { ! 115: error(inst.thing.linno, 11); /* unbalanced quotes */ ! 116: return(-1); ! 117: } ! 118: ptr++; ! 119: if(*ptr != ',' && fcount == 0) ! 120: { ! 121: sprintf(s,format); ! 122: return(0); ! 123: } ! 124: i = 0; ! 125: while(*ptr != '\0') ! 126: { ! 127: ptr++; ! 128: ptr = (char *)prncpy(expbfr,ptr); /* get nxt expr field */ ! 129: arg[i++] = evalx(expbfr); ! 130: } ! 131: if(i != fcount) /* no. args == no. expected args */ ! 132: { ! 133: error(inst.thing.linno, 39); /* arg count mismatch */ ! 134: return(-1); ! 135: } ! 136: if(fcount > 10) ! 137: { ! 138: error(inst.thing.linno, 40); /* MORE THAN 10 ARGS */ ! 139: return(-1); ! 140: } ! 141: sprintf(s,format,arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6], ! 142: arg[7],arg[8],arg[9]); ! 143: return(0); ! 144: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.