Stream.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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*/, len/*INTEGER*/){
  41. var max = 0;
  42. max = JsString.len(self.s) - self.pos | 0;
  43. if (len > max){
  44. len = max;
  45. }
  46. return JsString.substr(self.s, self.pos, len);
  47. }
  48. function read(self/*Type*/, f/*ReaderProc*/){
  49. while (true){
  50. if (!eof(self) && f(peekChar(self))){
  51. next(self, 1);
  52. } else break;
  53. }
  54. return !eof(self);
  55. }
  56. function lineNumber(self/*Type*/){
  57. var line = 0;
  58. var lastPos = 0;
  59. lastPos = JsString.indexOf(self.s, 13);
  60. while (true){
  61. if (lastPos != -1 && lastPos < self.pos){
  62. ++line;
  63. lastPos = JsString.indexOfFrom(self.s, 13, lastPos + 1 | 0);
  64. } else break;
  65. }
  66. return line + 1 | 0;
  67. }
  68. exports.make = make;
  69. exports.eof = eof;
  70. exports.pos = pos;
  71. exports.setPos = setPos;
  72. exports.next = next;
  73. exports.peekChar = peekChar;
  74. exports.getChar = getChar;
  75. exports.peekStr = peekStr;
  76. exports.read = read;
  77. exports.lineNumber = lineNumber;