PageRenderTime 47ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/okapi/filters/yaml/src/main/java/net/sf/okapi/filters/yaml/parser/JavaCharStream.java

https://bitbucket.org/giusilvano/okapi
Java | 548 lines | 426 code | 83 blank | 39 comment | 61 complexity | b4e05f81b71828ba59483d02216c38aa MD5 | raw file
  1. /* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 6.1 */
  2. /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
  3. package net.sf.okapi.filters.yaml.parser;
  4. /**
  5. * An implementation of interface CharStream, where the stream is assumed to
  6. * contain only ASCII characters (with java-like unicode escape processing).
  7. */
  8. public
  9. class JavaCharStream
  10. {
  11. /** Whether parser is static. */
  12. public static final boolean staticFlag = false;
  13. static final int hexval(char c) throws java.io.IOException {
  14. switch(c)
  15. {
  16. case '0' :
  17. return 0;
  18. case '1' :
  19. return 1;
  20. case '2' :
  21. return 2;
  22. case '3' :
  23. return 3;
  24. case '4' :
  25. return 4;
  26. case '5' :
  27. return 5;
  28. case '6' :
  29. return 6;
  30. case '7' :
  31. return 7;
  32. case '8' :
  33. return 8;
  34. case '9' :
  35. return 9;
  36. case 'a' :
  37. case 'A' :
  38. return 10;
  39. case 'b' :
  40. case 'B' :
  41. return 11;
  42. case 'c' :
  43. case 'C' :
  44. return 12;
  45. case 'd' :
  46. case 'D' :
  47. return 13;
  48. case 'e' :
  49. case 'E' :
  50. return 14;
  51. case 'f' :
  52. case 'F' :
  53. return 15;
  54. }
  55. throw new java.io.IOException(); // Should never come here
  56. }
  57. /** Position in buffer. */
  58. public int bufpos = -1;
  59. int bufsize;
  60. int available;
  61. int tokenBegin;
  62. protected int bufline[];
  63. protected int bufcolumn[];
  64. protected int column = 0;
  65. protected int line = 1;
  66. protected boolean prevCharIsCR = false;
  67. protected boolean prevCharIsLF = false;
  68. protected Provider inputStream;
  69. protected char[] nextCharBuf;
  70. protected char[] buffer;
  71. protected int maxNextCharInd = 0;
  72. protected int nextCharInd = -1;
  73. protected int inBuf = 0;
  74. protected int tabSize = 1;
  75. protected boolean trackLineColumn = true;
  76. public void setTabSize(int i) { tabSize = i; }
  77. public int getTabSize(int i) { return tabSize; }
  78. protected void ExpandBuff(boolean wrapAround)
  79. {
  80. char[] newbuffer = new char[bufsize + 2048];
  81. int newbufline[] = new int[bufsize + 2048];
  82. int newbufcolumn[] = new int[bufsize + 2048];
  83. try
  84. {
  85. if (wrapAround)
  86. {
  87. System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
  88. System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
  89. buffer = newbuffer;
  90. System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
  91. System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
  92. bufline = newbufline;
  93. System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
  94. System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
  95. bufcolumn = newbufcolumn;
  96. bufpos += (bufsize - tokenBegin);
  97. }
  98. else
  99. {
  100. System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
  101. buffer = newbuffer;
  102. System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
  103. bufline = newbufline;
  104. System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
  105. bufcolumn = newbufcolumn;
  106. bufpos -= tokenBegin;
  107. }
  108. }
  109. catch (Exception t)
  110. {
  111. throw new RuntimeException(t.getMessage());
  112. }
  113. available = (bufsize += 2048);
  114. tokenBegin = 0;
  115. }
  116. protected void FillBuff() throws java.io.IOException
  117. {
  118. int i;
  119. if (maxNextCharInd == 4096)
  120. maxNextCharInd = nextCharInd = 0;
  121. try {
  122. if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
  123. 4096 - maxNextCharInd)) == -1)
  124. {
  125. inputStream.close();
  126. throw new java.io.IOException();
  127. }
  128. else
  129. maxNextCharInd += i;
  130. return;
  131. }
  132. catch(java.io.IOException e) {
  133. if (bufpos != 0)
  134. {
  135. --bufpos;
  136. backup(0);
  137. }
  138. else
  139. {
  140. bufline[bufpos] = line;
  141. bufcolumn[bufpos] = column;
  142. }
  143. throw e;
  144. }
  145. }
  146. protected char ReadByte() throws java.io.IOException
  147. {
  148. if (++nextCharInd >= maxNextCharInd)
  149. FillBuff();
  150. return nextCharBuf[nextCharInd];
  151. }
  152. /** @return starting character for token. */
  153. public char BeginToken() throws java.io.IOException
  154. {
  155. if (inBuf > 0)
  156. {
  157. --inBuf;
  158. if (++bufpos == bufsize)
  159. bufpos = 0;
  160. tokenBegin = bufpos;
  161. return buffer[bufpos];
  162. }
  163. tokenBegin = 0;
  164. bufpos = -1;
  165. return readChar();
  166. }
  167. protected void AdjustBuffSize()
  168. {
  169. if (available == bufsize)
  170. {
  171. if (tokenBegin > 2048)
  172. {
  173. bufpos = 0;
  174. available = tokenBegin;
  175. }
  176. else
  177. ExpandBuff(false);
  178. }
  179. else if (available > tokenBegin)
  180. available = bufsize;
  181. else if ((tokenBegin - available) < 2048)
  182. ExpandBuff(true);
  183. else
  184. available = tokenBegin;
  185. }
  186. protected void UpdateLineColumn(char c)
  187. {
  188. column++;
  189. if (prevCharIsLF)
  190. {
  191. prevCharIsLF = false;
  192. line += (column = 1);
  193. }
  194. else if (prevCharIsCR)
  195. {
  196. prevCharIsCR = false;
  197. if (c == '\n')
  198. {
  199. prevCharIsLF = true;
  200. }
  201. else
  202. line += (column = 1);
  203. }
  204. switch (c)
  205. {
  206. case '\r' :
  207. prevCharIsCR = true;
  208. break;
  209. case '\n' :
  210. prevCharIsLF = true;
  211. break;
  212. case '\t' :
  213. column--;
  214. column += (tabSize - (column % tabSize));
  215. break;
  216. default :
  217. break;
  218. }
  219. bufline[bufpos] = line;
  220. bufcolumn[bufpos] = column;
  221. }
  222. /** Read a character. */
  223. public char readChar() throws java.io.IOException
  224. {
  225. if (inBuf > 0)
  226. {
  227. --inBuf;
  228. if (++bufpos == bufsize)
  229. bufpos = 0;
  230. return buffer[bufpos];
  231. }
  232. char c;
  233. if (++bufpos == available)
  234. AdjustBuffSize();
  235. if ((buffer[bufpos] = c = ReadByte()) == '\\')
  236. {
  237. UpdateLineColumn(c);
  238. int backSlashCnt = 1;
  239. for (;;) // Read all the backslashes
  240. {
  241. if (++bufpos == available)
  242. AdjustBuffSize();
  243. try
  244. {
  245. if ((buffer[bufpos] = c = ReadByte()) != '\\')
  246. {
  247. UpdateLineColumn(c);
  248. // found a non-backslash char.
  249. if ((c == 'u') && ((backSlashCnt & 1) == 1))
  250. {
  251. if (--bufpos < 0)
  252. bufpos = bufsize - 1;
  253. break;
  254. }
  255. backup(backSlashCnt);
  256. return '\\';
  257. }
  258. }
  259. catch(java.io.IOException e)
  260. {
  261. // We are returning one backslash so we should only backup (count-1)
  262. if (backSlashCnt > 1)
  263. backup(backSlashCnt-1);
  264. return '\\';
  265. }
  266. UpdateLineColumn(c);
  267. backSlashCnt++;
  268. }
  269. // Here, we have seen an odd number of backslash's followed by a 'u'
  270. try
  271. {
  272. while ((c = ReadByte()) == 'u')
  273. ++column;
  274. buffer[bufpos] = c = (char)(hexval(c) << 12 |
  275. hexval(ReadByte()) << 8 |
  276. hexval(ReadByte()) << 4 |
  277. hexval(ReadByte()));
  278. column += 4;
  279. }
  280. catch(java.io.IOException e)
  281. {
  282. throw new RuntimeException("Invalid escape character at line " + line +
  283. " column " + column + ".");
  284. }
  285. if (backSlashCnt == 1)
  286. return c;
  287. else
  288. {
  289. backup(backSlashCnt - 1);
  290. return '\\';
  291. }
  292. }
  293. else
  294. {
  295. UpdateLineColumn(c);
  296. return c;
  297. }
  298. }
  299. @Deprecated
  300. /**
  301. * @deprecated
  302. * @see #getEndColumn
  303. */
  304. public int getColumn() {
  305. return bufcolumn[bufpos];
  306. }
  307. @Deprecated
  308. /**
  309. * @deprecated
  310. * @see #getEndLine
  311. */
  312. public int getLine() {
  313. return bufline[bufpos];
  314. }
  315. /** Get end column. */
  316. public int getEndColumn() {
  317. return bufcolumn[bufpos];
  318. }
  319. /** Get end line. */
  320. public int getEndLine() {
  321. return bufline[bufpos];
  322. }
  323. /** @return column of token start */
  324. public int getBeginColumn() {
  325. return bufcolumn[tokenBegin];
  326. }
  327. /** @return line number of token start */
  328. public int getBeginLine() {
  329. return bufline[tokenBegin];
  330. }
  331. /** Retreat. */
  332. public void backup(int amount) {
  333. inBuf += amount;
  334. if ((bufpos -= amount) < 0)
  335. bufpos += bufsize;
  336. }
  337. /** Constructor. */
  338. public JavaCharStream(Provider dstream,
  339. int startline, int startcolumn, int buffersize)
  340. {
  341. inputStream = dstream;
  342. line = startline;
  343. column = startcolumn - 1;
  344. available = bufsize = buffersize;
  345. buffer = new char[buffersize];
  346. bufline = new int[buffersize];
  347. bufcolumn = new int[buffersize];
  348. nextCharBuf = new char[4096];
  349. }
  350. /** Constructor. */
  351. public JavaCharStream(Provider dstream,
  352. int startline, int startcolumn)
  353. {
  354. this(dstream, startline, startcolumn, 4096);
  355. }
  356. /** Constructor. */
  357. public JavaCharStream(Provider dstream)
  358. {
  359. this(dstream, 1, 1, 4096);
  360. }
  361. /** Reinitialise. */
  362. public void ReInit(Provider dstream,
  363. int startline, int startcolumn, int buffersize)
  364. {
  365. inputStream = dstream;
  366. line = startline;
  367. column = startcolumn - 1;
  368. if (buffer == null || buffersize != buffer.length)
  369. {
  370. available = bufsize = buffersize;
  371. buffer = new char[buffersize];
  372. bufline = new int[buffersize];
  373. bufcolumn = new int[buffersize];
  374. nextCharBuf = new char[4096];
  375. }
  376. prevCharIsLF = prevCharIsCR = false;
  377. tokenBegin = inBuf = maxNextCharInd = 0;
  378. nextCharInd = bufpos = -1;
  379. }
  380. /** Reinitialise. */
  381. public void ReInit(Provider dstream,
  382. int startline, int startcolumn)
  383. {
  384. ReInit(dstream, startline, startcolumn, 4096);
  385. }
  386. /** Reinitialise. */
  387. public void ReInit(Provider dstream)
  388. {
  389. ReInit(dstream, 1, 1, 4096);
  390. }
  391. /** @return token image as String */
  392. public String GetImage()
  393. {
  394. if (bufpos >= tokenBegin)
  395. return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
  396. else
  397. return new String(buffer, tokenBegin, bufsize - tokenBegin) +
  398. new String(buffer, 0, bufpos + 1);
  399. }
  400. /** @return suffix */
  401. public char[] GetSuffix(int len)
  402. {
  403. char[] ret = new char[len];
  404. if ((bufpos + 1) >= len)
  405. System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
  406. else
  407. {
  408. System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
  409. len - bufpos - 1);
  410. System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
  411. }
  412. return ret;
  413. }
  414. /** Set buffers back to null when finished. */
  415. public void Done()
  416. {
  417. nextCharBuf = null;
  418. buffer = null;
  419. bufline = null;
  420. bufcolumn = null;
  421. }
  422. /**
  423. * Method to adjust line and column numbers for the start of a token.
  424. */
  425. public void adjustBeginLineColumn(int newLine, int newCol)
  426. {
  427. int start = tokenBegin;
  428. int len;
  429. if (bufpos >= tokenBegin)
  430. {
  431. len = bufpos - tokenBegin + inBuf + 1;
  432. }
  433. else
  434. {
  435. len = bufsize - tokenBegin + bufpos + 1 + inBuf;
  436. }
  437. int i = 0, j = 0, k = 0;
  438. int nextColDiff = 0, columnDiff = 0;
  439. while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
  440. {
  441. bufline[j] = newLine;
  442. nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
  443. bufcolumn[j] = newCol + columnDiff;
  444. columnDiff = nextColDiff;
  445. i++;
  446. }
  447. if (i < len)
  448. {
  449. bufline[j] = newLine++;
  450. bufcolumn[j] = newCol + columnDiff;
  451. while (i++ < len)
  452. {
  453. if (bufline[j = start % bufsize] != bufline[++start % bufsize])
  454. bufline[j] = newLine++;
  455. else
  456. bufline[j] = newLine;
  457. }
  458. }
  459. line = bufline[j];
  460. column = bufcolumn[j];
  461. }
  462. boolean getTrackLineColumn() { return trackLineColumn; }
  463. void setTrackLineColumn(boolean tlc) { trackLineColumn = tlc; }
  464. }
  465. /* JavaCC - OriginalChecksum=29fac787ce7aabe26719efadb2dcfe8c (do not edit this line) */