/klipse/repo/js/brainfuck.js

https://gitlab.com/thejeshgn/lib_files · JavaScript · 120 lines · 104 code · 13 blank · 3 comment · 20 complexity · 3e48cdcd06d53f3cc5924126e979d86d MD5 · raw file

  1. // https://www.npmjs.com/package/brainfuck-javascript
  2. // 0.1.7
  3. (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.brainfuck = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
  4. var toText = function(arr) {
  5. return arr.map(function(cc) {
  6. return String.fromCharCode(cc);
  7. }).join('');
  8. };
  9. var brainfuck = function(source, input, maxIterations) {
  10. var output = [];
  11. var input_cur = 0;
  12. var source_cur = 0;
  13. var prev_source_cur = -1;
  14. var data = [];
  15. var data_cur = 0;
  16. var pointers = [];
  17. var search = 0;
  18. var numIterations = 0;
  19. var MAX_ITERATIONS = maxIterations || 1e7;
  20. data[0] = 0;
  21. reader: while ( source_cur < source.length ) {
  22. numIterations++;
  23. if (numIterations > MAX_ITERATIONS) {
  24. throw ("too many iterations: " + numIterations);
  25. }
  26. var chunk = source[source_cur];
  27. if ( search > 0 ) {
  28. switch ( chunk ) {
  29. case '[':
  30. search++;
  31. break;
  32. case ']':
  33. if ( search > 0 ) {
  34. search--;
  35. }
  36. break;
  37. }
  38. source_cur++;
  39. continue reader;
  40. }
  41. switch ( chunk ) {
  42. case '+':
  43. data[data_cur]++;
  44. break
  45. case '-':
  46. if ( data[data_cur] > 0 ) {
  47. data[data_cur]--;
  48. }
  49. break;
  50. case '>':
  51. data_cur++;
  52. if ( data.length <= data_cur ) {
  53. data[data_cur] = 0;
  54. }
  55. break;
  56. case '<':
  57. if ( data_cur > 0 ) {
  58. data_cur--;
  59. }
  60. break;
  61. case ',':
  62. data[data_cur] = input[input_cur] || -1;
  63. input_cur++;
  64. break;
  65. case '.':
  66. output.push(data[data_cur]);
  67. break;
  68. case '[':
  69. if ( data[data_cur] != 0 ) {
  70. pointers.push(source_cur);
  71. }
  72. else if ( prev_source_cur > -1 ) {
  73. source_cur = prev_source_cur;
  74. prev_source_cur = -1;
  75. }
  76. else {
  77. search = 1;
  78. }
  79. break;
  80. case ']':
  81. //prev_source_cur = source_cur;
  82. source_cur = pointers.pop();
  83. continue reader;
  84. break;
  85. }
  86. source_cur++;
  87. }
  88. return {data: data,
  89. output: output,
  90. pointer: data_cur,
  91. text: toText(output),};
  92. };
  93. var interface = function(source, input, maxIterations) {
  94. var a_source = source.replace(/[^\[\].,><+-]/g, '').split('');
  95. var a_input = !input ? [] : input.split('').map(function(char) {
  96. return char.charCodeAt(0);
  97. }).filter(function(cc) {
  98. return cc > 0 && cc < 256;
  99. });
  100. return brainfuck(a_source, a_input, maxIterations);
  101. };
  102. interface.text = function(source, input, maxIterations) {
  103. return interface(source, input, maxIterations).text;
  104. };
  105. module.exports = interface;
  106. },{}]},{},[1])(1)
  107. });