nls_ucs2_utils.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Some of the source code in this file came from fs/cifs/uniupr.h
  4. * Copyright (c) International Business Machines Corp., 2000,2002
  5. *
  6. * Some of the source code in this file came from fs/cifs/cifs_unicode.c
  7. *
  8. * Copyright (c) International Business Machines Corp., 2000,2009
  9. * Modified by Steve French (sfrench@us.ibm.com)
  10. * Modified by Namjae Jeon (linkinjeon@kernel.org)
  11. *
  12. */
  13. #include <linux/fs.h>
  14. #include <linux/module.h>
  15. #include <linux/slab.h>
  16. #include <linux/unaligned.h>
  17. #include "nls_ucs2_utils.h"
  18. MODULE_DESCRIPTION("NLS UCS-2");
  19. MODULE_LICENSE("GPL");
  20. /*
  21. * Latin upper case
  22. */
  23. signed char NlsUniUpperTable[512] = {
  24. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 000-00f */
  25. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 010-01f */
  26. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 020-02f */
  27. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 030-03f */
  28. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 040-04f */
  29. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 050-05f */
  30. 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  31. -32, -32, -32, -32, -32, /* 060-06f */
  32. -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  33. -32, 0, 0, 0, 0, 0, /* 070-07f */
  34. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 080-08f */
  35. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 090-09f */
  36. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0a0-0af */
  37. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0b0-0bf */
  38. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0c0-0cf */
  39. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0d0-0df */
  40. -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  41. -32, -32, -32, -32, -32, -32, /* 0e0-0ef */
  42. -32, -32, -32, -32, -32, -32, -32, 0, -32, -32,
  43. -32, -32, -32, -32, -32, 121, /* 0f0-0ff */
  44. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 100-10f */
  45. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 110-11f */
  46. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 120-12f */
  47. 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, /* 130-13f */
  48. -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, /* 140-14f */
  49. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 150-15f */
  50. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 160-16f */
  51. 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, -1, 0, -1, 0, /* 170-17f */
  52. 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, /* 180-18f */
  53. 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, /* 190-19f */
  54. 0, -1, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, /* 1a0-1af */
  55. -1, 0, 0, 0, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, /* 1b0-1bf */
  56. 0, 0, 0, 0, 0, -1, -2, 0, -1, -2, 0, -1, -2, 0, -1, 0, /* 1c0-1cf */
  57. -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, -79, 0, -1, /* 1d0-1df */
  58. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e0-1ef */
  59. 0, 0, -1, -2, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, -1, /* 1f0-1ff */
  60. };
  61. EXPORT_SYMBOL_GPL(NlsUniUpperTable);
  62. /* Upper case range - Greek */
  63. static signed char UniCaseRangeU03a0[47] = {
  64. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -37, -37, -37, /* 3a0-3af */
  65. 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  66. -32, -32, -32, -32, /* 3b0-3bf */
  67. -32, -32, -31, -32, -32, -32, -32, -32, -32, -32, -32, -32, -64,
  68. -63, -63,
  69. };
  70. /* Upper case range - Cyrillic */
  71. static signed char UniCaseRangeU0430[48] = {
  72. -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  73. -32, -32, -32, -32, /* 430-43f */
  74. -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  75. -32, -32, -32, -32, /* 440-44f */
  76. 0, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80,
  77. -80, -80, 0, -80, -80, /* 450-45f */
  78. };
  79. /* Upper case range - Extended cyrillic */
  80. static signed char UniCaseRangeU0490[61] = {
  81. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 490-49f */
  82. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 4a0-4af */
  83. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 4b0-4bf */
  84. 0, 0, -1, 0, -1, 0, 0, 0, -1, 0, 0, 0, -1,
  85. };
  86. /* Upper case range - Extended latin and greek */
  87. static signed char UniCaseRangeU1e00[509] = {
  88. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e00-1e0f */
  89. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e10-1e1f */
  90. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e20-1e2f */
  91. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e30-1e3f */
  92. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e40-1e4f */
  93. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e50-1e5f */
  94. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e60-1e6f */
  95. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e70-1e7f */
  96. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1e80-1e8f */
  97. 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, -59, 0, -1, 0, -1, /* 1e90-1e9f */
  98. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ea0-1eaf */
  99. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1eb0-1ebf */
  100. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ec0-1ecf */
  101. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ed0-1edf */
  102. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, /* 1ee0-1eef */
  103. 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, /* 1ef0-1eff */
  104. 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f00-1f0f */
  105. 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f10-1f1f */
  106. 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f20-1f2f */
  107. 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f30-1f3f */
  108. 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f40-1f4f */
  109. 0, 8, 0, 8, 0, 8, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f50-1f5f */
  110. 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f60-1f6f */
  111. 74, 74, 86, 86, 86, 86, 100, 100, 0, 0, 112, 112,
  112. 126, 126, 0, 0, /* 1f70-1f7f */
  113. 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f80-1f8f */
  114. 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1f90-1f9f */
  115. 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fa0-1faf */
  116. 8, 8, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fb0-1fbf */
  117. 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fc0-1fcf */
  118. 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fd0-1fdf */
  119. 8, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 1fe0-1fef */
  120. 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  121. };
  122. /* Upper case range - Wide latin */
  123. static signed char UniCaseRangeUff40[27] = {
  124. 0, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  125. -32, -32, -32, -32, -32, /* ff40-ff4f */
  126. -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32,
  127. };
  128. /*
  129. * Upper Case Range
  130. */
  131. const struct UniCaseRange NlsUniUpperRange[] = {
  132. {0x03a0, 0x03ce, UniCaseRangeU03a0},
  133. {0x0430, 0x045f, UniCaseRangeU0430},
  134. {0x0490, 0x04cc, UniCaseRangeU0490},
  135. {0x1e00, 0x1ffc, UniCaseRangeU1e00},
  136. {0xff40, 0xff5a, UniCaseRangeUff40},
  137. {0}
  138. };
  139. EXPORT_SYMBOL_GPL(NlsUniUpperRange);