convert.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. var fs = require('fs'),
  2. jsminc = fs.readFileSync(__dirname + '/jsmin.c', 'utf8');
  3. // Strip out includes
  4. jsminc = jsminc.replace(/#include[^\n]+\s*/g, '');
  5. // Replace static int with 'the' prefixes with vars
  6. jsminc = jsminc.replace(/static int\s+(the[^\n]+)/g, function (_, varStr) {
  7. return 'var ' + varStr;
  8. });
  9. // Throw in an EOF before the first theA
  10. jsminc = jsminc.replace('var theA;', 'var EOF = -1;\nvar theA;');
  11. // Replace static void and static int with function
  12. jsminc = jsminc.replace(/static void[^A-Za-z]*/g, 'function ');
  13. jsminc = jsminc.replace(/static int[^A-Za-z]*/g, 'function ');
  14. jsminc = jsminc.replace(/extern int[^A-Za-z]*/g, 'function ');
  15. // Remove types from function statements
  16. jsminc = jsminc.replace(/function ([^\(]+)\(([^\)]*)\)[^{]+/g, function (_, fnName, params) {
  17. var paramArr = params.split(', '),
  18. cleanParamArr = paramArr.map(function (param) {
  19. var paramSansFront = param.replace(/^[^\s]+\s+/, ''),
  20. paramSansBack = paramSansFront.replace('[]', '');
  21. return paramSansBack;
  22. }),
  23. cleanParams = cleanParamArr.join(', ');
  24. return 'function ' + fnName + '(' + cleanParams + ') ';
  25. });
  26. // Replace types inside functions with vars
  27. jsminc = jsminc.replace(/int /g, 'var ');
  28. // Upcase equality to strict equality
  29. jsminc = jsminc.replace(/==/g, '===');
  30. jsminc = jsminc.replace(/!=/g, '!==');
  31. // Upcast jsmin into a reusable module
  32. // TODO: This step is too damn big
  33. jsminc = jsminc.replace(/var EOF = -1;(.|\n)*/, function (jsmin) {
  34. // Generate prefix text and indent all of jsmin
  35. var prefix = 'function jsminFn(stdin, options) {',
  36. prefixToIndent = [
  37. '',
  38. '// Fallback options',
  39. 'options = options || {};',
  40. '',
  41. '// Grab stdout, stderr, exit, argc, and argv',
  42. 'var stdout = options.stdout || console.log,',
  43. ' stderr = options.stderr || console.error,',
  44. ' exit = options.exit || process.exit,',
  45. ' argc = options.argc || 0,',
  46. ' argv = options.argv || [];',
  47. '',
  48. '// Generate fputs, fputc, getc, putc, fprintf',
  49. 'var fputs = function (str, stream) {',
  50. ' stream(str);',
  51. ' },',
  52. ' fputc = fputs,',
  53. ' putc = fputs,',
  54. ' fprintf = function (stream, formatStr, input) {',
  55. ' var outStr = formatStr.replace(\'%s\', input);',
  56. ' fputs(outStr, stream);',
  57. ' },',
  58. ' getc = function () {',
  59. ' return stdin.read(1);',
  60. ' };',
  61. '',
  62. '// Begin normal jsmin.c code',
  63. ''
  64. ].join('\n');
  65. // Add prefix to indent onto jsmin
  66. jsmin = prefixToIndent + jsmin;
  67. // Indent jsmin
  68. var jsminIndented = jsmin.replace(/\n([^\n])/g, function (_, letter) {
  69. return '\n ' + letter;
  70. });
  71. // Join together prefix and jsmin and return
  72. var retVal = prefix + jsminIndented;
  73. return retVal;
  74. });
  75. jsminc = jsminc + [
  76. '',
  77. ' // Invoke and return main',
  78. ' return main(argc, argv);',
  79. '',
  80. '}',
  81. '',
  82. '// Export jsminFn',
  83. 'module.exports = jsminFn;'
  84. ].join('\n');
  85. // Write out the converted file
  86. fs.writeFileSync(__dirname + '/../lib/jsmin.c.js', jsminc, 'utf8');