update_pbjs.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*jshint esversion: 6 */
  2. const fs = require('fs');
  3. const process = require('process');
  4. var pattern = process.argv[2];
  5. var file = process.argv[3];
  6. var variable = process.argv[4];
  7. var type = process.argv[5];
  8. var count = parseInt(process.argv[6]);
  9. var arrayType = '';
  10. var dataViewMethod = '';
  11. var shift = 0;
  12. switch (type) {
  13. case 'float':
  14. arrayType = 'Float32Array';
  15. dataViewMethod = 'getFloat32';
  16. shift = '2';
  17. break;
  18. case 'double':
  19. arrayType = 'Float64Array';
  20. dataViewMethod = 'getFloat64';
  21. shift = '3';
  22. break;
  23. default:
  24. console.log('ERROR: Type is not supported.');
  25. process.exit(1);
  26. break;
  27. }
  28. var source = fs.readFileSync(file, 'utf-8');
  29. var search = '';
  30. var replace = '';
  31. switch (pattern) {
  32. case 'array':
  33. search = `if ((tag & 7) === 2) {
  34. var end2 = reader.uint32() + reader.pos;
  35. while (reader.pos < end2)
  36. message.$(variable).push(reader.$(type)());
  37. } else`;
  38. replace = `if ((tag & 7) === 2) {
  39. var end2 = reader.uint32() + reader.pos;
  40. if (message.$(variable).length == 0 && (end2 - reader.pos) > 1048576) {
  41. var $(variable)Length = end2 - reader.pos;
  42. var $(variable)View = new DataView(reader.buf.buffer, reader.buf.byteOffset + reader.pos, $(variable)Length);
  43. $(variable)Length = $(variable)Length >>> $(shift);
  44. var $(variable) = new $(arrayType)($(variable)Length);
  45. for (var i = 0; i < $(variable)Length; i++) {
  46. $(variable)[i] = $(variable)View.$(dataViewMethod)(i << $(shift), true);
  47. }
  48. message.$(variable) = $(variable);
  49. reader.pos = end2;
  50. }
  51. else {
  52. while (reader.pos < end2)
  53. message.$(variable).push(reader.$(type)());
  54. }
  55. } else`;
  56. break;
  57. case 'enumeration':
  58. search = `if (!(message.$(variable) && message.$(variable).length))
  59. message.$(variable) = [];
  60. if ((tag & 7) === 2) {
  61. var end2 = reader.uint32() + reader.pos;
  62. while (reader.pos < end2)
  63. message.$(variable).push(reader.$(type)());
  64. } else
  65. message.$(variable).push(reader.$(type)());
  66. break;`;
  67. replace = `if (!(message.$(variable) && message.$(variable).length)) {
  68. if (message.$(variable) != -1) {
  69. message.$(variable) = [];
  70. message.$(variable)Count = 0;
  71. }
  72. }
  73. if (message.$(variable)Count < 1000000) {
  74. if ((tag & 7) === 2) {
  75. var end2 = reader.uint32() + reader.pos;
  76. while (reader.pos < end2) {
  77. message.$(variable).push(reader.$(type)());
  78. message.$(variable)Count++;
  79. }
  80. }
  81. else {
  82. message.$(variable).push(reader.$(type)());
  83. message.$(variable)Count++;
  84. }
  85. }
  86. else {
  87. message.$(variable) = -1;
  88. if ((tag & 7) === 2) {
  89. var endx = reader.uint32() + reader.pos;
  90. while (reader.pos < endx)
  91. reader.$(type)();
  92. }
  93. else {
  94. reader.$(type)();
  95. }
  96. }
  97. break;`;
  98. break;
  99. default:
  100. console.log('ERROR: Unknown pattern.')
  101. process.exit(1);
  102. }
  103. search = search.split('$(variable)').join(variable);
  104. search = search.split('$(type)').join(type);
  105. replace = replace.split('$(variable)').join(variable);
  106. replace = replace.split('$(type)').join(type);
  107. replace = replace.split('$(arrayType)').join(arrayType);
  108. replace = replace.split('$(dataViewMethod)').join(dataViewMethod);
  109. replace = replace.split('$(shift)').join(shift);
  110. for (var i = 0; i < 8; i++) {
  111. search = search.split('\n').map((line) => ' ' + line).join('\n');
  112. replace = replace.split('\n').map((line) => ' ' + line).join('\n');
  113. var parts = source.split(search);
  114. if (parts.length == (count + 1)) {
  115. var target = parts.join(replace);
  116. fs.writeFileSync(file, target, 'utf-8');
  117. process.exit(0);
  118. }
  119. }
  120. console.log('ERROR: Replace failed.');
  121. process.exit(1);