Advertisement
bb94

Fwuffy's Danmakufu UTF-8 Reader

Feb 22nd, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. // temp workaround till pre7
  2.  
  3. let CHR_NULL = " " - " ";
  4. let CHR_1 = "!" - " ";
  5. let CHR_2 = CHR_1 + CHR_1;
  6. let CHR_4 = CHR_2 + CHR_2;
  7. let CHR_8 = CHR_4 + CHR_4;
  8. let CHR_16 = CHR_8 + CHR_8;
  9. let CHR_32 = " ";
  10. let CHR_64 = "@";
  11. let CHR_128 = "@" + "@";
  12. let CHR_256 = "Ā";
  13. let CHR_512 = "Ȁ";
  14. let CHR_1024 = "Ѐ"; // Cyrillic ye with grave; U+0400
  15. let CHR_2048 = CHR_1024 + CHR_1024;
  16. let CHR_4096 = CHR_2048 + CHR_2048;
  17. let CHR_8192 = CHR_4096 + CHR_4096;
  18. let CHR_16384 = CHR_8192 + CHR_8192;
  19. let CHR_32768 = CHR_16384 + CHR_16384;
  20.  
  21. function chr(code) {
  22. let res = CHR_NULL;
  23. if (code >= 32768) {code -= 32768; res += CHR_32768;}
  24. if (code >= 16384) {code -= 16384; res += CHR_16384;}
  25. if (code >= 8192) {code -= 8192; res += CHR_8192;}
  26. if (code >= 4096) {code -= 4096; res += CHR_4096;}
  27. if (code >= 2048) {code -= 2048; res += CHR_2048;}
  28. if (code >= 1024) {code -= 1024; res += CHR_1024;}
  29. if (code >= 512) {code -= 512; res += CHR_512;}
  30. if (code >= 256) {code -= 256; res += CHR_256;}
  31. if (code >= 128) {code -= 128; res += CHR_128;}
  32. if (code >= 64) {code -= 64; res += CHR_64;}
  33. if (code >= 32) {code -= 32; res += CHR_32;}
  34. if (code >= 16) {code -= 16; res += CHR_16;}
  35. if (code >= 8) {code -= 8; res += CHR_8;}
  36. if (code >= 4) {code -= 4; res += CHR_4;}
  37. if (code >= 2) {code -= 2; res += CHR_2;}
  38. if (code >= 1) {code -= 1; res += CHR_1;}
  39. return res;
  40. }
  41.  
  42. function utf8CharsToString(chars, len) {
  43. let res = "";
  44. function nexc(i) {
  45. let c = chars[i];
  46. if (c < 0) {c += 256;}
  47. return c;
  48. }
  49. let i = 0;
  50. while (i < len) {
  51. let curr = nexc(i);
  52. if (curr < 128) {res = res ~ chr(curr);}
  53. else if (curr < 192) {RaiseError("Unexpected continuation byte");}
  54. else {
  55. let additionalBytes = 1;
  56. let resc = curr - 192;
  57. if (curr >= 240) {additionalBytes = 3; resc -= 48;}
  58. else if (curr >= 224) {additionalBytes = 2; resc -= 32;}
  59. ascent (j in 0 .. additionalBytes) {
  60. i++;
  61. let cont = nexc(i);
  62. if (cont < 128 || cont >= 192) {RaiseError("Continuation byte expected");}
  63. resc = resc * 64 + (cont - 128);
  64. }
  65. res = res ~ chr(resc);
  66. }
  67. i++;
  68. }
  69. return ToString(res);
  70. }
  71.  
  72. function ObjFileB_ReadStringUTF8(handle, len) {
  73. let res = [];
  74. ascent (i in 0 .. len) {
  75. res = res ~ [ObjFileB_ReadByte(handle)];
  76. }
  77. return utf8CharsToString(res, len);
  78. }
  79.  
  80. // See also https://docs.google.com/document/d/1wAK3i-oDu36nodjgKzEMjn0doiAjbdhdixg6eEMOyTk/edit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement