1 54 package org.w3c.tidy; 55 56 import java.io.IOException ; 57 import java.io.InputStream ; 58 import java.io.InputStreamReader ; 59 import java.io.Reader ; 60 import java.io.UnsupportedEncodingException ; 61 62 63 68 public class StreamInJavaImpl implements StreamIn 69 { 70 71 74 private static final int CHARBUF_SIZE = 5; 75 76 79 private int[] charbuf = new int[CHARBUF_SIZE]; 80 81 84 private int bufpos; 85 86 89 private Reader reader; 90 91 94 private boolean endOfStream; 95 96 99 private boolean pushed; 100 101 104 private int curcol; 105 106 109 private int lastcol; 110 111 114 private int curline; 115 116 119 private int tabsize; 120 121 private int tabs; 122 123 130 public StreamInJavaImpl(InputStream stream, String encoding, int tabsize) throws UnsupportedEncodingException 131 { 132 reader = new InputStreamReader (stream, encoding); 133 this.pushed = false; 134 this.tabsize = tabsize; 135 this.curline = 1; 136 this.curcol = 1; 137 this.endOfStream = false; 138 } 139 140 143 public int readCharFromStream() 144 { 145 int c; 146 try 147 { 148 c = reader.read(); 149 if (c < 0) 150 { 151 endOfStream = true; 152 } 153 154 } 155 catch (IOException e) 156 { 157 endOfStream = true; 159 return END_OF_STREAM; 160 } 161 162 return c; 163 } 164 165 168 public int readChar() 169 { 170 int c; 171 172 if (this.pushed) 173 { 174 c = this.charbuf[--(this.bufpos)]; 175 if ((this.bufpos) == 0) 176 { 177 this.pushed = false; 178 } 179 180 if (c == '\n') 181 { 182 this.curcol = 1; 183 this.curline++; 184 return c; 185 } 186 187 this.curcol++; 188 return c; 189 } 190 191 this.lastcol = this.curcol; 192 193 if (this.tabs > 0) 194 { 195 this.curcol++; 196 this.tabs--; 197 return ' '; 198 } 199 200 c = readCharFromStream(); 201 202 if (c < 0) 203 { 204 endOfStream = true; 205 return END_OF_STREAM; 206 } 207 208 if (c == '\n') 209 { 210 this.curcol = 1; 211 this.curline++; 212 return c; 213 } 214 else if (c == '\r') { 216 c = readCharFromStream(); 217 if (c != '\n') 218 { 219 if (c != END_OF_STREAM) 220 { 221 ungetChar(c); 222 } 223 c = '\n'; 224 } 225 this.curcol = 1; 226 this.curline++; 227 return c; 228 } 229 230 if (c == '\t') 231 { 232 this.tabs = this.tabsize - ((this.curcol - 1) % this.tabsize) - 1; 233 this.curcol++; 234 c = ' '; 235 return c; 236 } 237 238 this.curcol++; 239 240 return c; 241 } 242 243 246 public void ungetChar(int c) 247 { 248 this.pushed = true; 249 if (this.bufpos >= CHARBUF_SIZE) 250 { 251 System.arraycopy(this.charbuf, 0, this.charbuf, 1, CHARBUF_SIZE - 1); 253 this.bufpos--; 254 } 255 this.charbuf[(this.bufpos)++] = c; 256 257 if (c == '\n') 258 { 259 --this.curline; 260 } 261 262 this.curcol = this.lastcol; 263 } 264 265 268 public boolean isEndOfStream() 269 { 270 return endOfStream; 271 } 272 273 277 public int getCurcol() 278 { 279 return this.curcol; 280 } 281 282 286 public int getCurline() 287 { 288 return this.curline; 289 } 290 291 294 public void setLexer(Lexer lexer) 295 { 296 } 298 299 } | Popular Tags |