pp.nut 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. function puts(s) {
  2. fd.write(s);
  3. }
  4. function putsnl(s) {
  5. fd.write(s);
  6. fd.write("\n");
  7. }
  8. function preprocess(file_name){
  9. local fd = file(file_name, "r");
  10. local code = fd.read(fd.len());
  11. fd.close();
  12. local function escape_re(str){
  13. local new_str = str.gsub("[-.$%%[%]^]", "%%%1")
  14. return new_str
  15. }
  16. local code_generation_begin = "// generated-code:begin";
  17. local code_generation_end = "// generated-code:end";
  18. local code_generation_begin_escaped = escape_re(code_generation_begin);
  19. local code_generation_end_escaped = escape_re(code_generation_end);
  20. //print(code_generation_begin, code_generation_begin_escaped);
  21. local new_code = code.gsub(code_generation_begin_escaped + ".-" + code_generation_end_escaped, "");
  22. new_code = new_code.gsub("(//@(.-)\n)", function(m, m2) {
  23. return format("%s%s]====])\n%s;\nputsnl([====[\n%s", m, code_generation_begin, m2, code_generation_end)
  24. });
  25. new_code = new_code.gsub("(/%*SquiLu(.-)SquiLu%*/)", function(m, m2) {
  26. return format("%s]====])\n%s\nputsnl([====[", m, m2)
  27. });
  28. local buffer = blob();
  29. buffer.write("putsnl([====[");
  30. buffer.write(new_code);
  31. buffer.write("]====])");
  32. local sqcode = buffer.tostring();
  33. local code_func = compilestring(sqcode, "sqcode-preprocessed");
  34. ::fd <- file(file_name + ".cpp", "w");
  35. code_func();
  36. ::fd.close();
  37. }
  38. if(vargv.len() > 0){
  39. preprocess(vargv[0]);
  40. }