pp.nut 1.5 KB

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