Add feature to ignore some input bytes
[jpcrr.git] / mnj / lua / BaseLibReader.java
blob0574f04e911fcb1971da0c00e516686f656160a6
1 /* $Header: //info.ravenbrook.com/project/jili/version/1.1/code/mnj/lua/BaseLibReader.java#1 $
2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
3 * All rights reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject
11 * to the following conditions:
13 * The above copyright notice and this permission notice shall be
14 * included in all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
21 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 package mnj.lua;
27 import java.io.IOException;
29 /**
30 * Extends {@link java.io.Reader} to create a Reader from a Lua
31 * function. So that the <code>load</code> function from Lua's base
32 * library can be implemented.
34 final class BaseLibReader extends java.io.Reader
36 private String s = "";
37 private int i; // = 0;
38 private int mark = -1;
39 private Lua L;
40 private Object f;
42 BaseLibReader(Lua L, Object f)
44 this.L = L;
45 this.f = f;
48 public void close()
50 f = null;
53 public void mark(int l) throws IOException
55 if (l > 1)
57 throw new IOException("Readahead must be <= 1");
59 mark = i;
62 public boolean markSupported()
64 return true;
67 public int read()
69 if (i >= s.length())
71 L.push(f);
72 L.call(0, 1);
73 if (Lua.isNil(L.value(-1)))
75 return -1;
77 else if(Lua.isString(L.value(-1)))
79 s = L.toString(L.value(-1));
80 if (s.length() == 0)
82 return -1;
84 if (mark == i)
86 mark = 0;
88 else
90 mark = -1;
92 i = 0;
94 else
96 L.error("reader function must return a string");
99 return s.charAt(i++);
102 public int read(char[] cbuf, int off, int len)
104 int j = 0; // loop index required after loop
105 for (j=0; j<len; ++j)
107 int c = read();
108 if (c == -1)
110 if (j == 0)
112 return -1;
114 else
116 return j;
119 cbuf[off+j] = (char)c;
121 return j;
124 public void reset() throws IOException
126 if (mark < 0)
128 throw new IOException("reset() not supported now");
130 i = mark;