pp.nut 1.5 KB

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