vFile seek(long n) {
public vFile seek(long n) {
vFile seek(long n) {						// seek(n)    if (randfile == null) {			// if not seekable	return null; /*FAIL*/    }    try {	long len;	if (ibuf != null) {	    len = iflen;			// length known if read-buffered	} else {	    len = randfile.length();		// others can change; must ask	}	if (n > 0) {	    n--;				// remove Icon bias from address	} else {	    n = len + n;			// distance from end	}	if (n < 0 || n > len) {	    return null; /*FAIL*/	}	if (ibuf != null) {			// if buffered, we know position	    int bdata = inext + icount;		// valid data in buffer	    long off = bdata - ifpos + n;	// offset to new posn in buffer	    if (off >= 0 && off <= bdata) {		// sought position is within current buffer		inext = (int) off;		icount = bdata - inext;		return this;	    }	}	// not buffered, or position is not in buffer	randfile.seek(n);			// reposition file	ifpos = n;				// record new position	inext = icount = 0;			// clear input buffer	return this;    } catch (IOException e) {	return null; /*FAIL*/    }}