Stream.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. var RTL$ = require("RTL$.js").RTL$;
  2. var JsString = require("JsString.js");
  3. var Type = RTL$.extend({
  4. init: function Type(){
  5. this.s = null;
  6. this.pos = 0;
  7. }
  8. });
  9. function make(text/*Type*/){
  10. var result = null;
  11. result = new Type();
  12. result.s = text;
  13. return result;
  14. }
  15. function eof(self/*Type*/){
  16. return self.pos == JsString.len(self.s);
  17. }
  18. function pos(self/*Type*/){
  19. return self.pos;
  20. }
  21. function setPos(self/*Type*/, pos/*INTEGER*/){
  22. RTL$.assert(pos <= JsString.len(self.s));
  23. self.pos = pos;
  24. }
  25. function next(self/*Type*/, n/*INTEGER*/){
  26. RTL$.assert((self.pos + n | 0) <= JsString.len(self.s));
  27. self.pos = self.pos + n | 0;
  28. }
  29. function peekChar(self/*Type*/){
  30. RTL$.assert(!eof(self));
  31. return JsString.at(self.s, self.pos);
  32. }
  33. function getChar(self/*Type*/){
  34. var result = 0;
  35. RTL$.assert(!eof(self));
  36. result = JsString.at(self.s, self.pos);
  37. ++self.pos;
  38. return result;
  39. }
  40. function peekStr(self/*Type*/, s/*ARRAY OF CHAR*/){
  41. var result = false;
  42. var i = 0;
  43. if (s.length <= (JsString.len(self.s) - self.pos | 0)){
  44. while (true){
  45. if (i < s.length && s[i] == JsString.at(self.s, self.pos + i | 0)){
  46. ++i;
  47. } else break;
  48. }
  49. result = i == s.length;
  50. }
  51. return result;
  52. }
  53. function read(self/*Type*/, f/*ReaderProc*/){
  54. while (true){
  55. if (!eof(self) && f(peekChar(self))){
  56. next(self, 1);
  57. } else break;
  58. }
  59. return !eof(self);
  60. }
  61. function lineNumber(self/*Type*/){
  62. var line = 0;
  63. var lastPos = 0;
  64. lastPos = JsString.indexOf(self.s, 13);
  65. while (true){
  66. if (lastPos != -1 && lastPos < self.pos){
  67. ++line;
  68. lastPos = JsString.indexOfFrom(self.s, 13, lastPos + 1 | 0);
  69. } else break;
  70. }
  71. return line + 1 | 0;
  72. }
  73. exports.Type = Type;
  74. exports.make = make;
  75. exports.eof = eof;
  76. exports.pos = pos;
  77. exports.setPos = setPos;
  78. exports.next = next;
  79. exports.peekChar = peekChar;
  80. exports.getChar = getChar;
  81. exports.peekStr = peekStr;
  82. exports.read = read;
  83. exports.lineNumber = lineNumber;