Changeset 11972


Ignore:
Timestamp:
05/31/09 22:12:22 (12 years ago)
Author:
ehuelsmann
Message:

Factor out bbuf-updating from read(byte[]) and read(char[])
into ensureReadBbuf().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/util/RandomAccessCharacterFile.java

    r11971 r11972  
    321321    }
    322322
     323    private final boolean ensureReadBbuf(boolean force) throws IOException {
     324        boolean bufReady = true;
     325
     326        if ((bbuf.remaining() == 0) || force) {
     327            // need to read from the file.
     328
     329            if (bbufIsDirty) {
     330                bbuf.flip();
     331                fcn.position(bbufpos);
     332                fcn.write(bbuf);
     333                bbufpos = bbufpos+bbuf.position();
     334                bbuf.clear();
     335            } else {
     336                fcn.position(bbufpos + bbuf.limit());
     337                bbufpos += bbuf.position();
     338                bbuf.compact();
     339            }
     340
     341            bufReady = (fcn.read(bbuf) != -1);
     342            fcnpos = fcn.position();
     343            // update bbufpos.
     344            bbuf.flip();
     345        }
     346
     347        return bufReady;
     348    }
     349
    323350    private int read(char[] cb, int off, int len) throws IOException {
    324351        CharBuffer cbuf = CharBuffer.wrap(cb, off, len);
     
    326353        boolean atEof = false;
    327354        while ((cbuf.remaining() > 0) && dataIsAvailableForRead() && ! atEof) {
    328             if ((bbuf.remaining() == 0) || decodeWasUnderflow) {
    329                 // need to read from the file.
    330 
    331                 if (bbufIsDirty) {
    332                     bbuf.flip();
    333                     fcn.position(bbufpos);
    334                     fcn.write(bbuf);
    335                     bbufpos = bbufpos+bbuf.position();
    336                     bbuf.clear();
    337                 } else {
    338                     fcn.position(bbufpos + bbuf.limit());
    339                     bbufpos += bbuf.position();
    340                     bbuf.compact();
    341                 }
    342 
    343                 atEof = (fcn.read(bbuf) == -1);
    344                 fcnpos = fcn.position();
    345                 // update bbufpos.
    346                 bbuf.flip();
    347             }
     355
     356            atEof = ! ensureReadBbuf(decodeWasUnderflow);
    348357            CoderResult r = cdec.decode(bbuf, cbuf, pointingAtEOF() );
    349358            decodeWasUnderflow = (CoderResult.UNDERFLOW == r);
     
    458467        while (pos - off < len && dataIsAvailableForRead()
    459468               && ! atEof) {
    460             if (bbuf.remaining() == 0) {
    461                 // need to read from the file.
    462                 flushBbuf(); // in case bbuf is dirty.
    463                 // update bbufpos.
    464                 bbufpos += bbuf.limit();
    465                 // if reads and writes are mixed, we may need to seek first.
    466                 if (bbufpos != fcnpos) {
    467                     fcn.position(bbufpos);
    468                 }
    469                 // need to read data from file.
    470                 bbuf.clear();
    471                 atEof = (fcn.read(bbuf) == -1);
    472                 bbuf.flip();
    473                 fcnpos = bbufpos + bbuf.remaining();
    474             }
     469
     470            atEof = ! ensureReadBbuf(false);
    475471            int want = len - pos;
    476472            if (want > bbuf.remaining()) {
Note: See TracChangeset for help on using the changeset viewer.