|
|
1.1 ! root 1: /* Copyright Bell Telephone Laboratories Whippany, N.J. ! 2: ! 3: * ///////////////////////////////////// ! 4: * ///////////////////////////////////// ! 5: * ////////////// bseek.c ////////////// ! 6: * /// J. P. Hawkins HL X2268 2D-227 /// ! 7: * ///// Sun Nov 29 09:55:00 1981 ////// ! 8: * ///////////////////////////////////// ! 9: * ///////////////////////////////////// ! 10: * ! 11: * BASIC SEEK routine ! 12: * PART OF BITE ! 13: * For random file access ! 14: */ ! 15: /* "@(#) bseek.c: V 1.1 11/29/81" */ ! 16: #include "bas.h" ! 17: __seek() ! 18: { ! 19: register char *ptr; /* pointer to program string */ ! 20: char *prncpy(); ! 21: int fd; /* file descriptor */ ! 22: int fildes; /* file designator for BASIC */ ! 23: extern struct FILTBL filtbl[]; ! 24: double evalx(); ! 25: long offset; ! 26: int mode; ! 27: char field[20]; ! 28: ! 29: ptr = expr; /* point to command operand string */ ! 30: ! 31: if(*ptr == '_' && (*(ptr+1) >= '0' && *(ptr+1) <= '8')) ! 32: { ! 33: ptr++; ! 34: fildes = *ptr - '1'; /* get BASIC file desig */ ! 35: fd = filtbl[fildes].fildes; /* get file descriptor */ ! 36: } ! 37: else ! 38: { ! 39: error(inst.thing.linno, 57); ! 40: return(-1); ! 41: } ! 42: ptr++; ! 43: if(*ptr++ != ',') /* else it better be a , */ ! 44: { ! 45: error(inst.thing.linno, 13); /* delimiter error */ ! 46: return(-1); ! 47: } ! 48: ptr=prncpy(field,ptr); /* get field betw. ',' */ ! 49: offset = (long)evalx(field); ! 50: if(*ptr++ != ',') /* else it better be a , */ ! 51: { ! 52: error(inst.thing.linno, 13); /* delimiter error */ ! 53: return(-1); ! 54: } ! 55: ptr=prncpy(field,ptr); /* get field betw. ',' */ ! 56: mode = (int)evalx(field); ! 57: if(offset > 0L) ! 58: offset--; ! 59: ! 60: if(lineseek(fd, offset, mode) < 0) ! 61: { ! 62: error(inst.thing.linno, 58); ! 63: return(-1); ! 64: } ! 65: return(0); ! 66: } ! 67: ! 68: /* ! 69: * Seek to the specified line in the file. ! 70: */ ! 71: lineseek(fd, offset, mode) ! 72: long offset; ! 73: { ! 74: register long o; ! 75: ! 76: switch(mode) ! 77: { ! 78: case 0: /* ABSOLUTE SEEK */ ! 79: bof(fd); /* rewind first */ ! 80: case 1: /* RELATIVE SEEK */ ! 81: for(o=0; o<offset; o++) /* seek from there */ ! 82: skipline(fd); ! 83: break; ! 84: default: ! 85: error(inst.thing.linno, 59); ! 86: return -1; ! 87: break; ! 88: } ! 89: return 0; ! 90: } ! 91: ! 92: /* ! 93: * Skip read to the next line in file ! 94: */ ! 95: skipline(fd) ! 96: { ! 97: char c; ! 98: ! 99: while(read(fd, &c, 1) != 0) ! 100: { ! 101: if(c == '\n') ! 102: break; ! 103: } ! 104: } ! 105: ! 106: /* ! 107: * rewind to Beginning Of File ! 108: */ ! 109: bof(fd) ! 110: { ! 111: lseek(fd, 0L, 0); ! 112: } ! 113: /* ! 114: * ! 115: * BASIC "rewind" command ! 116: */ ! 117: rewin() ! 118: { ! 119: char *ptr; ! 120: int fd; /* file descriptor */ ! 121: int fildes; /* file designator for BASIC */ ! 122: ! 123: ptr = expr; ! 124: if(*ptr == '_' && (*(ptr+1) >= '0' && *(ptr+1) <= '8')) ! 125: { ! 126: ptr++; ! 127: fildes = *ptr - '1'; /* get BASIC file desig */ ! 128: fd = filtbl[fildes].fildes; /* get file descriptor */ ! 129: } ! 130: else ! 131: { ! 132: error(inst.thing.linno, 60); ! 133: return(-1); ! 134: } ! 135: bof(fd); ! 136: return(0); ! 137: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.