PageRenderTime 45ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/tools/dspec/feeder.d

http://github.com/wilkie/djehuty
D | 89 lines | 52 code | 21 blank | 16 comment | 6 complexity | a117f4287e70bd95e5f2f165e34a2e67 MD5 | raw file
  1. module feeder;
  2. import core.string;
  3. import core.unicode;
  4. import core.definitions;
  5. import io.file;
  6. import io.console;
  7. char[] delims = " \t.{}()[];,-+=/\\*&^%!|?:<>`\"'";
  8. class Feeder {
  9. this(string filename) {
  10. fp = File.open(filename);
  11. //fp = fopen(std.string.toStringz(filename), "rb");
  12. // reinit
  13. lineNumber = 0;
  14. }
  15. ~this() {
  16. // *** delete
  17. //fclose(fp);
  18. }
  19. string[] feed() {
  20. char[] line;
  21. if(fp.readLine(line)) {
  22. // Minimal Logic:
  23. // - know not to parse comments
  24. // - know that first describe dictates control
  25. // - know how to expand should and shouldNot
  26. // *** delete
  27. //char[] line = readln(fp);
  28. // Increment line counter
  29. lineNumber++;
  30. // sanitize line
  31. // *** delete (I don't add newline)
  32. //line = chomp(line);
  33. // return tokens
  34. line = line.trim();
  35. return splitAll(line, delims);
  36. }
  37. return null;
  38. }
  39. uint getLineNumber() {
  40. return lineNumber;
  41. }
  42. string fileName() {
  43. return fp.name;
  44. }
  45. protected:
  46. File fp;
  47. //_iobuf* fp;
  48. uint lineNumber = 0;
  49. string[] splitAll(char[] s, char[] delim, bool keepDelim = true) {
  50. string[] ret;
  51. uint lastpos = 0;
  52. foreach(i, c; s) {
  53. foreach(cmp; delim) {
  54. if (c == cmp) {
  55. if (lastpos != i) {
  56. ret ~= s[lastpos..i].dup;
  57. }
  58. if (keepDelim) {
  59. ret ~= s[i..i+1].dup;
  60. }
  61. lastpos = i+1;
  62. }
  63. }
  64. }
  65. ret ~= ["\n"];
  66. return ret;
  67. }
  68. }