Transform.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. namespace System.Net.ApiService.Compression.Brotli {
  2. /// <summary>Transformations on dictionary words.</summary>
  3. internal sealed class Transform {
  4. private readonly byte[] prefix;
  5. private readonly int type;
  6. private readonly byte[] suffix;
  7. internal Transform(string prefix, int type, string suffix) {
  8. this.prefix = ReadUniBytes(prefix);
  9. this.type = type;
  10. this.suffix = ReadUniBytes(suffix);
  11. }
  12. internal static byte[] ReadUniBytes(string uniBytes) {
  13. byte[] result = new byte[uniBytes.Length];
  14. for (int i = 0; i < result.Length; ++i) {
  15. result[i] = unchecked((byte)uniBytes[i]);
  16. }
  17. return result;
  18. }
  19. internal static readonly System.Net.ApiService.Compression.Brotli.Transform[] Transforms = new System.Net.ApiService.Compression.Brotli.Transform[] {
  20. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, string.Empty),
  21. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " "),
  22. new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " "),
  23. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst1, string.Empty),
  24. new System.Net.ApiService.Compression.Brotli.Transform (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, " "),
  25. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " the "),
  26. new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, string.Empty),
  27. new System.Net.ApiService.Compression.Brotli.Transform("s ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " "),
  28. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " of "),
  29. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, string.Empty),
  30. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " and "),
  31. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst2, string.Empty),
  32. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast1, string.Empty),
  33. new System.Net.ApiService.Compression.Brotli.Transform(", ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " "),
  34. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, ", "),
  35. new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, " "),
  36. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " in "),
  37. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " to "), new System.Net.ApiService.Compression.Brotli.Transform("e ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " "),
  38. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "\""),
  39. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "."),
  40. new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "\">"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "\n"), new
  41. System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast3, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "]"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType
  42. .Identity, " for "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst3, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast2, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform
  43. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " a "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " that "), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst
  44. , string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, ". "), new System.Net.ApiService.Compression.Brotli.Transform(".", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType
  45. .Identity, ", "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst4, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " with "), new System.Net.ApiService.Compression.Brotli.Transform
  46. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "'"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " from "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity
  47. , " by "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst5, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst6, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform
  48. (" the ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast4, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType
  49. .Identity, ". The "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " on "), new System.Net.ApiService.Compression.Brotli.Transform
  50. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " as "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " is "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast7
  51. , string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast1, "ing "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "\n\t"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty
  52. , System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, ":"), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, ". "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "ed "), new System.Net.ApiService.Compression.Brotli.Transform
  53. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst9, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitFirst7, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType
  54. .OmitLast6, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "("), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, ", "), new System.Net.ApiService.Compression.Brotli.Transform
  55. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast8, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " at "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType
  56. .Identity, "ly "), new System.Net.ApiService.Compression.Brotli.Transform(" the ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " of "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast5, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(
  57. string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.OmitLast9, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, ", "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst
  58. , "\""), new System.Net.ApiService.Compression.Brotli.Transform(".", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "("), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, " "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType
  59. .UppercaseFirst, "\">"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "=\""), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "."), new System.Net.ApiService.Compression.Brotli.Transform(".com/",
  60. System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(" the ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " of the "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst
  61. , "'"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, ". This "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, ","), new System.Net.ApiService.Compression.Brotli.Transform(".", System.Net.ApiService.Compression.Brotli.WordTransformType
  62. .Identity, " "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, "("), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, "."), new System.Net.ApiService.Compression.Brotli.Transform
  63. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, " not "), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "=\""), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "er "
  64. ), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, " "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "al "), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType
  65. .UppercaseAll, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "='"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "\""), new System.Net.ApiService.Compression.Brotli.Transform
  66. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, ". "), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "("), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity,
  67. "ful "), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, ". "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "ive "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType
  68. .Identity, "less "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "'"), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "est "), new System.Net.ApiService.Compression.Brotli.Transform
  69. (" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, "."), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "\">"), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "='"
  70. ), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, ","), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, "ize "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType
  71. .UppercaseAll, "."), new System.Net.ApiService.Compression.Brotli.Transform("\u00c2\u00a0", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, string.Empty), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.Identity, ","), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty
  72. , System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, "=\""), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "=\""), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.Identity
  73. , "ous "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, ", "), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, "='"), new System.Net.ApiService.Compression.Brotli.Transform(" ",
  74. System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, ","), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "=\""), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, ", "), new System.Net.ApiService.Compression.Brotli.Transform
  75. (string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, ","), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "("), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.
  76. UppercaseAll, ". "), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "."), new System.Net.ApiService.Compression.Brotli.Transform(string.Empty, System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "='"), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType
  77. .UppercaseAll, ". "), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst, "=\""), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll, "='"), new System.Net.ApiService.Compression.Brotli.Transform(" ", System.Net.ApiService.Compression.Brotli.WordTransformType
  78. .UppercaseFirst, "='") };
  79. internal static int TransformDictionaryWord(byte[] dst, int dstOffset, byte[] word, int wordOffset, int len, System.Net.ApiService.Compression.Brotli.Transform transform) {
  80. int offset = dstOffset;
  81. // Copy prefix.
  82. byte[] @string = transform.prefix;
  83. int tmp = @string.Length;
  84. int i = 0;
  85. // In most cases tmp < 10 -> no benefits from System.arrayCopy
  86. while (i < tmp) {
  87. dst[offset++] = @string[i++];
  88. }
  89. // Copy trimmed word.
  90. int op = transform.type;
  91. tmp = System.Net.ApiService.Compression.Brotli.WordTransformType.GetOmitFirst(op);
  92. if (tmp > len) {
  93. tmp = len;
  94. }
  95. wordOffset += tmp;
  96. len -= tmp;
  97. len -= System.Net.ApiService.Compression.Brotli.WordTransformType.GetOmitLast(op);
  98. i = len;
  99. while (i > 0) {
  100. dst[offset++] = word[wordOffset++];
  101. i--;
  102. }
  103. if (op == System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseAll || op == System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst) {
  104. int uppercaseOffset = offset - len;
  105. if (op == System.Net.ApiService.Compression.Brotli.WordTransformType.UppercaseFirst) {
  106. len = 1;
  107. }
  108. while (len > 0) {
  109. tmp = dst[uppercaseOffset] & unchecked((int)(0xFF));
  110. if (tmp < unchecked((int)(0xc0))) {
  111. if (tmp >= 'a' && tmp <= 'z') {
  112. dst[uppercaseOffset] ^= unchecked((byte)32);
  113. }
  114. uppercaseOffset += 1;
  115. len -= 1;
  116. } else if (tmp < unchecked((int)(0xe0))) {
  117. dst[uppercaseOffset + 1] ^= unchecked((byte)32);
  118. uppercaseOffset += 2;
  119. len -= 2;
  120. } else {
  121. dst[uppercaseOffset + 2] ^= unchecked((byte)5);
  122. uppercaseOffset += 3;
  123. len -= 3;
  124. }
  125. }
  126. }
  127. // Copy suffix.
  128. @string = transform.suffix;
  129. tmp = @string.Length;
  130. i = 0;
  131. while (i < tmp) {
  132. dst[offset++] = @string[i++];
  133. }
  134. return offset - dstOffset;
  135. }
  136. }
  137. }