ag-char-map.h 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. /*
  2. * 29 bits for 46 character classifications
  3. * generated by char-mapper on 08/26/18 at 10:44:22
  4. *
  5. * This file contains the character classifications
  6. * used by AutoGen and AutoOpts for identifying tokens.
  7. * The table is static scope, so %guard is empty.
  8. *
  9. * This file is part of AutoOpts, a companion to AutoGen.
  10. * AutoOpts is free software.
  11. * AutoOpts is Copyright (C) 1992-2018 by Bruce Korb - all rights reserved
  12. *
  13. * AutoOpts is available under any one of two licenses. The license
  14. * in use must be one of these two and the choice is under the control
  15. * of the user of the license.
  16. *
  17. * The GNU Lesser General Public License, version 3 or later
  18. * See the files "COPYING.lgplv3" and "COPYING.gplv3"
  19. *
  20. * The Modified Berkeley Software Distribution License
  21. * See the file "COPYING.mbsd"
  22. *
  23. * These files have the following sha256 sums:
  24. *
  25. * 8584710e9b04216a394078dc156b781d0b47e1729104d666658aecef8ee32e95 COPYING.gplv3
  26. * 4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b COPYING.lgplv3
  27. * 13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239 COPYING.mbsd
  28. */
  29. #ifndef AG_CHAR_MAP_H_GUARD
  30. #define AG_CHAR_MAP_H_GUARD 1
  31. #ifdef HAVE_CONFIG_H
  32. # if defined(HAVE_INTTYPES_H)
  33. # include <inttypes.h>
  34. # elif defined(HAVE_STDINT_H)
  35. # include <stdint.h>
  36. # elif !defined(HAVE_UINT32_T)
  37. # if SIZEOF_INT == 4
  38. typedef unsigned int uint32_t;
  39. # elif SIZEOF_LONG == 4
  40. typedef unsigned long uint32_t;
  41. # endif
  42. # endif /* HAVE_*INT*_H header */
  43. #else /* not HAVE_CONFIG_H -- */
  44. # include <inttypes.h>
  45. #endif /* HAVE_CONFIG_H */
  46. #if 0 /* mapping specification source (from autogen.map) */
  47. //
  48. // %guard
  49. // %file ag-char-map.h
  50. // %backup
  51. // %optimize
  52. //
  53. // %comment -- see above
  54. // %
  55. //
  56. // newline "\n"
  57. // nul-byte "\x00"
  58. // dir-sep "/\\"
  59. // percent "%"
  60. // comma ","
  61. // colon ":"
  62. // underscore "_"
  63. // plus "+"
  64. // dollar "$"
  65. // option-marker "-"
  66. //
  67. // horiz-white "\t "
  68. // alt-white "\v\f\r\b"
  69. // whitespace +horiz-white +newline +alt-white
  70. // non-nl-white +horiz-white +alt-white
  71. // quote "'\""
  72. // parentheses "()"
  73. //
  74. // graphic "!-~"
  75. // inversion "~-"
  76. // oct-digit "0-7"
  77. // dec-digit "89" +oct-digit
  78. // hex-digit "a-fA-F" +dec-digit
  79. // lower-case "a-z"
  80. // upper-case "A-Z"
  81. // alphabetic +lower-case +upper-case
  82. // alphanumeric +alphabetic +dec-digit
  83. // var-first +underscore +alphabetic
  84. // variable-name +var-first +dec-digit
  85. // option-name "^-" +variable-name
  86. // value-name +colon +option-name
  87. // name-sep "[.]"
  88. // compound-name +value-name +name-sep +horiz-white
  89. // scheme-note +parentheses +quote
  90. //
  91. // unquotable "!-~" -"#,;<=>[\\]`{}?*" -quote -parentheses
  92. // end-xml-token "/>" +whitespace
  93. // plus-n-space +plus +whitespace
  94. // punctuation "!-~" -alphanumeric -"_"
  95. // suffix "-._" +alphanumeric
  96. // suffix-fmt +percent +suffix +dir-sep
  97. // false-type "nNfF0" +nul-byte
  98. // file-name +dir-sep +suffix
  99. // end-token +nul-byte +whitespace
  100. // end-list-entry +comma +end-token
  101. // set-separator "|+-!" +end-list-entry
  102. // signed-number +inversion +dec-digit
  103. // make-script +dollar +newline
  104. // load-line-skip +horiz-white +option-marker
  105. //
  106. #endif /* 0 -- mapping spec. source */
  107. typedef uint32_t ag_char_map_mask_t;
  108. #define IS_NEWLINE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000001)
  109. #define SPN_NEWLINE_CHARS(_s) spn_ag_char_map_chars(_s, 0)
  110. #define BRK_NEWLINE_CHARS(_s) brk_ag_char_map_chars(_s, 0)
  111. #define SPN_NEWLINE_BACK(s,e) spn_ag_char_map_back(s, e, 0)
  112. #define BRK_NEWLINE_BACK(s,e) brk_ag_char_map_back(s, e, 0)
  113. #define IS_NUL_BYTE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000002)
  114. #define SPN_NUL_BYTE_CHARS(_s) spn_ag_char_map_chars(_s, 1)
  115. #define BRK_NUL_BYTE_CHARS(_s) brk_ag_char_map_chars(_s, 1)
  116. #define SPN_NUL_BYTE_BACK(s,e) spn_ag_char_map_back(s, e, 1)
  117. #define BRK_NUL_BYTE_BACK(s,e) brk_ag_char_map_back(s, e, 1)
  118. #define IS_DIR_SEP_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000004)
  119. #define SPN_DIR_SEP_CHARS(_s) spn_ag_char_map_chars(_s, 2)
  120. #define BRK_DIR_SEP_CHARS(_s) brk_ag_char_map_chars(_s, 2)
  121. #define SPN_DIR_SEP_BACK(s,e) spn_ag_char_map_back(s, e, 2)
  122. #define BRK_DIR_SEP_BACK(s,e) brk_ag_char_map_back(s, e, 2)
  123. #define IS_PERCENT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000008)
  124. #define SPN_PERCENT_CHARS(_s) spn_ag_char_map_chars(_s, 3)
  125. #define BRK_PERCENT_CHARS(_s) brk_ag_char_map_chars(_s, 3)
  126. #define SPN_PERCENT_BACK(s,e) spn_ag_char_map_back(s, e, 3)
  127. #define BRK_PERCENT_BACK(s,e) brk_ag_char_map_back(s, e, 3)
  128. #define IS_COMMA_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000010)
  129. #define SPN_COMMA_CHARS(_s) spn_ag_char_map_chars(_s, 4)
  130. #define BRK_COMMA_CHARS(_s) brk_ag_char_map_chars(_s, 4)
  131. #define SPN_COMMA_BACK(s,e) spn_ag_char_map_back(s, e, 4)
  132. #define BRK_COMMA_BACK(s,e) brk_ag_char_map_back(s, e, 4)
  133. #define IS_COLON_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000020)
  134. #define SPN_COLON_CHARS(_s) spn_ag_char_map_chars(_s, 5)
  135. #define BRK_COLON_CHARS(_s) brk_ag_char_map_chars(_s, 5)
  136. #define SPN_COLON_BACK(s,e) spn_ag_char_map_back(s, e, 5)
  137. #define BRK_COLON_BACK(s,e) brk_ag_char_map_back(s, e, 5)
  138. #define IS_UNDERSCORE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000040)
  139. #define SPN_UNDERSCORE_CHARS(_s) spn_ag_char_map_chars(_s, 6)
  140. #define BRK_UNDERSCORE_CHARS(_s) brk_ag_char_map_chars(_s, 6)
  141. #define SPN_UNDERSCORE_BACK(s,e) spn_ag_char_map_back(s, e, 6)
  142. #define BRK_UNDERSCORE_BACK(s,e) brk_ag_char_map_back(s, e, 6)
  143. #define IS_PLUS_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000080)
  144. #define SPN_PLUS_CHARS(_s) spn_ag_char_map_chars(_s, 7)
  145. #define BRK_PLUS_CHARS(_s) brk_ag_char_map_chars(_s, 7)
  146. #define SPN_PLUS_BACK(s,e) spn_ag_char_map_back(s, e, 7)
  147. #define BRK_PLUS_BACK(s,e) brk_ag_char_map_back(s, e, 7)
  148. #define IS_DOLLAR_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000100)
  149. #define SPN_DOLLAR_CHARS(_s) spn_ag_char_map_chars(_s, 8)
  150. #define BRK_DOLLAR_CHARS(_s) brk_ag_char_map_chars(_s, 8)
  151. #define SPN_DOLLAR_BACK(s,e) spn_ag_char_map_back(s, e, 8)
  152. #define BRK_DOLLAR_BACK(s,e) brk_ag_char_map_back(s, e, 8)
  153. #define IS_OPTION_MARKER_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000200)
  154. #define SPN_OPTION_MARKER_CHARS(_s) spn_ag_char_map_chars(_s, 9)
  155. #define BRK_OPTION_MARKER_CHARS(_s) brk_ag_char_map_chars(_s, 9)
  156. #define SPN_OPTION_MARKER_BACK(s,e) spn_ag_char_map_back(s, e, 9)
  157. #define BRK_OPTION_MARKER_BACK(s,e) brk_ag_char_map_back(s, e, 9)
  158. #define IS_HORIZ_WHITE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000400)
  159. #define SPN_HORIZ_WHITE_CHARS(_s) spn_ag_char_map_chars(_s, 10)
  160. #define BRK_HORIZ_WHITE_CHARS(_s) brk_ag_char_map_chars(_s, 10)
  161. #define SPN_HORIZ_WHITE_BACK(s,e) spn_ag_char_map_back(s, e, 10)
  162. #define BRK_HORIZ_WHITE_BACK(s,e) brk_ag_char_map_back(s, e, 10)
  163. #define IS_ALT_WHITE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000800)
  164. #define SPN_ALT_WHITE_CHARS(_s) spn_ag_char_map_chars(_s, 11)
  165. #define BRK_ALT_WHITE_CHARS(_s) brk_ag_char_map_chars(_s, 11)
  166. #define SPN_ALT_WHITE_BACK(s,e) spn_ag_char_map_back(s, e, 11)
  167. #define BRK_ALT_WHITE_BACK(s,e) brk_ag_char_map_back(s, e, 11)
  168. #define IS_WHITESPACE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C01)
  169. #define SPN_WHITESPACE_CHARS(_s) spn_ag_char_map_chars(_s, 12)
  170. #define BRK_WHITESPACE_CHARS(_s) brk_ag_char_map_chars(_s, 12)
  171. #define SPN_WHITESPACE_BACK(s,e) spn_ag_char_map_back(s, e, 12)
  172. #define BRK_WHITESPACE_BACK(s,e) brk_ag_char_map_back(s, e, 12)
  173. #define IS_NON_NL_WHITE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C00)
  174. #define SPN_NON_NL_WHITE_CHARS(_s) spn_ag_char_map_chars(_s, 13)
  175. #define BRK_NON_NL_WHITE_CHARS(_s) brk_ag_char_map_chars(_s, 13)
  176. #define SPN_NON_NL_WHITE_BACK(s,e) spn_ag_char_map_back(s, e, 13)
  177. #define BRK_NON_NL_WHITE_BACK(s,e) brk_ag_char_map_back(s, e, 13)
  178. #define IS_QUOTE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00001000)
  179. #define SPN_QUOTE_CHARS(_s) spn_ag_char_map_chars(_s, 14)
  180. #define BRK_QUOTE_CHARS(_s) brk_ag_char_map_chars(_s, 14)
  181. #define SPN_QUOTE_BACK(s,e) spn_ag_char_map_back(s, e, 14)
  182. #define BRK_QUOTE_BACK(s,e) brk_ag_char_map_back(s, e, 14)
  183. #define IS_PARENTHESES_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00002000)
  184. #define SPN_PARENTHESES_CHARS(_s) spn_ag_char_map_chars(_s, 15)
  185. #define BRK_PARENTHESES_CHARS(_s) brk_ag_char_map_chars(_s, 15)
  186. #define SPN_PARENTHESES_BACK(s,e) spn_ag_char_map_back(s, e, 15)
  187. #define BRK_PARENTHESES_BACK(s,e) brk_ag_char_map_back(s, e, 15)
  188. #define IS_GRAPHIC_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00004000)
  189. #define SPN_GRAPHIC_CHARS(_s) spn_ag_char_map_chars(_s, 16)
  190. #define BRK_GRAPHIC_CHARS(_s) brk_ag_char_map_chars(_s, 16)
  191. #define SPN_GRAPHIC_BACK(s,e) spn_ag_char_map_back(s, e, 16)
  192. #define BRK_GRAPHIC_BACK(s,e) brk_ag_char_map_back(s, e, 16)
  193. #define IS_INVERSION_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00008000)
  194. #define SPN_INVERSION_CHARS(_s) spn_ag_char_map_chars(_s, 17)
  195. #define BRK_INVERSION_CHARS(_s) brk_ag_char_map_chars(_s, 17)
  196. #define SPN_INVERSION_BACK(s,e) spn_ag_char_map_back(s, e, 17)
  197. #define BRK_INVERSION_BACK(s,e) brk_ag_char_map_back(s, e, 17)
  198. #define IS_OCT_DIGIT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00010000)
  199. #define SPN_OCT_DIGIT_CHARS(_s) spn_ag_char_map_chars(_s, 18)
  200. #define BRK_OCT_DIGIT_CHARS(_s) brk_ag_char_map_chars(_s, 18)
  201. #define SPN_OCT_DIGIT_BACK(s,e) spn_ag_char_map_back(s, e, 18)
  202. #define BRK_OCT_DIGIT_BACK(s,e) brk_ag_char_map_back(s, e, 18)
  203. #define IS_DEC_DIGIT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00030000)
  204. #define SPN_DEC_DIGIT_CHARS(_s) spn_ag_char_map_chars(_s, 19)
  205. #define BRK_DEC_DIGIT_CHARS(_s) brk_ag_char_map_chars(_s, 19)
  206. #define SPN_DEC_DIGIT_BACK(s,e) spn_ag_char_map_back(s, e, 19)
  207. #define BRK_DEC_DIGIT_BACK(s,e) brk_ag_char_map_back(s, e, 19)
  208. #define IS_HEX_DIGIT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00070000)
  209. #define SPN_HEX_DIGIT_CHARS(_s) spn_ag_char_map_chars(_s, 20)
  210. #define BRK_HEX_DIGIT_CHARS(_s) brk_ag_char_map_chars(_s, 20)
  211. #define SPN_HEX_DIGIT_BACK(s,e) spn_ag_char_map_back(s, e, 20)
  212. #define BRK_HEX_DIGIT_BACK(s,e) brk_ag_char_map_back(s, e, 20)
  213. #define IS_LOWER_CASE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00080000)
  214. #define SPN_LOWER_CASE_CHARS(_s) spn_ag_char_map_chars(_s, 21)
  215. #define BRK_LOWER_CASE_CHARS(_s) brk_ag_char_map_chars(_s, 21)
  216. #define SPN_LOWER_CASE_BACK(s,e) spn_ag_char_map_back(s, e, 21)
  217. #define BRK_LOWER_CASE_BACK(s,e) brk_ag_char_map_back(s, e, 21)
  218. #define IS_UPPER_CASE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00100000)
  219. #define SPN_UPPER_CASE_CHARS(_s) spn_ag_char_map_chars(_s, 22)
  220. #define BRK_UPPER_CASE_CHARS(_s) brk_ag_char_map_chars(_s, 22)
  221. #define SPN_UPPER_CASE_BACK(s,e) spn_ag_char_map_back(s, e, 22)
  222. #define BRK_UPPER_CASE_BACK(s,e) brk_ag_char_map_back(s, e, 22)
  223. #define IS_ALPHABETIC_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00180000)
  224. #define SPN_ALPHABETIC_CHARS(_s) spn_ag_char_map_chars(_s, 23)
  225. #define BRK_ALPHABETIC_CHARS(_s) brk_ag_char_map_chars(_s, 23)
  226. #define SPN_ALPHABETIC_BACK(s,e) spn_ag_char_map_back(s, e, 23)
  227. #define BRK_ALPHABETIC_BACK(s,e) brk_ag_char_map_back(s, e, 23)
  228. #define IS_ALPHANUMERIC_CHAR( _c) is_ag_char_map_char((char)(_c), 0x001B0000)
  229. #define SPN_ALPHANUMERIC_CHARS(_s) spn_ag_char_map_chars(_s, 24)
  230. #define BRK_ALPHANUMERIC_CHARS(_s) brk_ag_char_map_chars(_s, 24)
  231. #define SPN_ALPHANUMERIC_BACK(s,e) spn_ag_char_map_back(s, e, 24)
  232. #define BRK_ALPHANUMERIC_BACK(s,e) brk_ag_char_map_back(s, e, 24)
  233. #define IS_VAR_FIRST_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00180040)
  234. #define SPN_VAR_FIRST_CHARS(_s) spn_ag_char_map_chars(_s, 25)
  235. #define BRK_VAR_FIRST_CHARS(_s) brk_ag_char_map_chars(_s, 25)
  236. #define SPN_VAR_FIRST_BACK(s,e) spn_ag_char_map_back(s, e, 25)
  237. #define BRK_VAR_FIRST_BACK(s,e) brk_ag_char_map_back(s, e, 25)
  238. #define IS_VARIABLE_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x001B0040)
  239. #define SPN_VARIABLE_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 26)
  240. #define BRK_VARIABLE_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 26)
  241. #define SPN_VARIABLE_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 26)
  242. #define BRK_VARIABLE_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 26)
  243. #define IS_OPTION_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x003B0040)
  244. #define SPN_OPTION_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 27)
  245. #define BRK_OPTION_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 27)
  246. #define SPN_OPTION_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 27)
  247. #define BRK_OPTION_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 27)
  248. #define IS_VALUE_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x003B0060)
  249. #define SPN_VALUE_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 28)
  250. #define BRK_VALUE_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 28)
  251. #define SPN_VALUE_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 28)
  252. #define BRK_VALUE_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 28)
  253. #define IS_NAME_SEP_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00400000)
  254. #define SPN_NAME_SEP_CHARS(_s) spn_ag_char_map_chars(_s, 29)
  255. #define BRK_NAME_SEP_CHARS(_s) brk_ag_char_map_chars(_s, 29)
  256. #define SPN_NAME_SEP_BACK(s,e) spn_ag_char_map_back(s, e, 29)
  257. #define BRK_NAME_SEP_BACK(s,e) brk_ag_char_map_back(s, e, 29)
  258. #define IS_COMPOUND_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x007B0460)
  259. #define SPN_COMPOUND_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 30)
  260. #define BRK_COMPOUND_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 30)
  261. #define SPN_COMPOUND_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 30)
  262. #define BRK_COMPOUND_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 30)
  263. #define IS_SCHEME_NOTE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00003000)
  264. #define SPN_SCHEME_NOTE_CHARS(_s) spn_ag_char_map_chars(_s, 31)
  265. #define BRK_SCHEME_NOTE_CHARS(_s) brk_ag_char_map_chars(_s, 31)
  266. #define SPN_SCHEME_NOTE_BACK(s,e) spn_ag_char_map_back(s, e, 31)
  267. #define BRK_SCHEME_NOTE_BACK(s,e) brk_ag_char_map_back(s, e, 31)
  268. #define IS_UNQUOTABLE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00800000)
  269. #define SPN_UNQUOTABLE_CHARS(_s) spn_ag_char_map_chars(_s, 32)
  270. #define BRK_UNQUOTABLE_CHARS(_s) brk_ag_char_map_chars(_s, 32)
  271. #define SPN_UNQUOTABLE_BACK(s,e) spn_ag_char_map_back(s, e, 32)
  272. #define BRK_UNQUOTABLE_BACK(s,e) brk_ag_char_map_back(s, e, 32)
  273. #define IS_END_XML_TOKEN_CHAR( _c) is_ag_char_map_char((char)(_c), 0x01000C01)
  274. #define SPN_END_XML_TOKEN_CHARS(_s) spn_ag_char_map_chars(_s, 33)
  275. #define BRK_END_XML_TOKEN_CHARS(_s) brk_ag_char_map_chars(_s, 33)
  276. #define SPN_END_XML_TOKEN_BACK(s,e) spn_ag_char_map_back(s, e, 33)
  277. #define BRK_END_XML_TOKEN_BACK(s,e) brk_ag_char_map_back(s, e, 33)
  278. #define IS_PLUS_N_SPACE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C81)
  279. #define SPN_PLUS_N_SPACE_CHARS(_s) spn_ag_char_map_chars(_s, 34)
  280. #define BRK_PLUS_N_SPACE_CHARS(_s) brk_ag_char_map_chars(_s, 34)
  281. #define SPN_PLUS_N_SPACE_BACK(s,e) spn_ag_char_map_back(s, e, 34)
  282. #define BRK_PLUS_N_SPACE_BACK(s,e) brk_ag_char_map_back(s, e, 34)
  283. #define IS_PUNCTUATION_CHAR( _c) is_ag_char_map_char((char)(_c), 0x02000000)
  284. #define SPN_PUNCTUATION_CHARS(_s) spn_ag_char_map_chars(_s, 35)
  285. #define BRK_PUNCTUATION_CHARS(_s) brk_ag_char_map_chars(_s, 35)
  286. #define SPN_PUNCTUATION_BACK(s,e) spn_ag_char_map_back(s, e, 35)
  287. #define BRK_PUNCTUATION_BACK(s,e) brk_ag_char_map_back(s, e, 35)
  288. #define IS_SUFFIX_CHAR( _c) is_ag_char_map_char((char)(_c), 0x041B0000)
  289. #define SPN_SUFFIX_CHARS(_s) spn_ag_char_map_chars(_s, 36)
  290. #define BRK_SUFFIX_CHARS(_s) brk_ag_char_map_chars(_s, 36)
  291. #define SPN_SUFFIX_BACK(s,e) spn_ag_char_map_back(s, e, 36)
  292. #define BRK_SUFFIX_BACK(s,e) brk_ag_char_map_back(s, e, 36)
  293. #define IS_SUFFIX_FMT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x041B000C)
  294. #define SPN_SUFFIX_FMT_CHARS(_s) spn_ag_char_map_chars(_s, 37)
  295. #define BRK_SUFFIX_FMT_CHARS(_s) brk_ag_char_map_chars(_s, 37)
  296. #define SPN_SUFFIX_FMT_BACK(s,e) spn_ag_char_map_back(s, e, 37)
  297. #define BRK_SUFFIX_FMT_BACK(s,e) brk_ag_char_map_back(s, e, 37)
  298. #define IS_FALSE_TYPE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x08000002)
  299. #define SPN_FALSE_TYPE_CHARS(_s) spn_ag_char_map_chars(_s, 38)
  300. #define BRK_FALSE_TYPE_CHARS(_s) brk_ag_char_map_chars(_s, 38)
  301. #define SPN_FALSE_TYPE_BACK(s,e) spn_ag_char_map_back(s, e, 38)
  302. #define BRK_FALSE_TYPE_BACK(s,e) brk_ag_char_map_back(s, e, 38)
  303. #define IS_FILE_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x041B0004)
  304. #define SPN_FILE_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 39)
  305. #define BRK_FILE_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 39)
  306. #define SPN_FILE_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 39)
  307. #define BRK_FILE_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 39)
  308. #define IS_END_TOKEN_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C03)
  309. #define SPN_END_TOKEN_CHARS(_s) spn_ag_char_map_chars(_s, 40)
  310. #define BRK_END_TOKEN_CHARS(_s) brk_ag_char_map_chars(_s, 40)
  311. #define SPN_END_TOKEN_BACK(s,e) spn_ag_char_map_back(s, e, 40)
  312. #define BRK_END_TOKEN_BACK(s,e) brk_ag_char_map_back(s, e, 40)
  313. #define IS_END_LIST_ENTRY_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C13)
  314. #define SPN_END_LIST_ENTRY_CHARS(_s) spn_ag_char_map_chars(_s, 41)
  315. #define BRK_END_LIST_ENTRY_CHARS(_s) brk_ag_char_map_chars(_s, 41)
  316. #define SPN_END_LIST_ENTRY_BACK(s,e) spn_ag_char_map_back(s, e, 41)
  317. #define BRK_END_LIST_ENTRY_BACK(s,e) brk_ag_char_map_back(s, e, 41)
  318. #define IS_SET_SEPARATOR_CHAR( _c) is_ag_char_map_char((char)(_c), 0x10000C13)
  319. #define SPN_SET_SEPARATOR_CHARS(_s) spn_ag_char_map_chars(_s, 42)
  320. #define BRK_SET_SEPARATOR_CHARS(_s) brk_ag_char_map_chars(_s, 42)
  321. #define SPN_SET_SEPARATOR_BACK(s,e) spn_ag_char_map_back(s, e, 42)
  322. #define BRK_SET_SEPARATOR_BACK(s,e) brk_ag_char_map_back(s, e, 42)
  323. #define IS_SIGNED_NUMBER_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00038000)
  324. #define SPN_SIGNED_NUMBER_CHARS(_s) spn_ag_char_map_chars(_s, 43)
  325. #define BRK_SIGNED_NUMBER_CHARS(_s) brk_ag_char_map_chars(_s, 43)
  326. #define SPN_SIGNED_NUMBER_BACK(s,e) spn_ag_char_map_back(s, e, 43)
  327. #define BRK_SIGNED_NUMBER_BACK(s,e) brk_ag_char_map_back(s, e, 43)
  328. #define IS_MAKE_SCRIPT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000101)
  329. #define SPN_MAKE_SCRIPT_CHARS(_s) spn_ag_char_map_chars(_s, 44)
  330. #define BRK_MAKE_SCRIPT_CHARS(_s) brk_ag_char_map_chars(_s, 44)
  331. #define SPN_MAKE_SCRIPT_BACK(s,e) spn_ag_char_map_back(s, e, 44)
  332. #define BRK_MAKE_SCRIPT_BACK(s,e) brk_ag_char_map_back(s, e, 44)
  333. #define IS_LOAD_LINE_SKIP_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000600)
  334. #define SPN_LOAD_LINE_SKIP_CHARS(_s) spn_ag_char_map_chars(_s, 45)
  335. #define BRK_LOAD_LINE_SKIP_CHARS(_s) brk_ag_char_map_chars(_s, 45)
  336. #define SPN_LOAD_LINE_SKIP_BACK(s,e) spn_ag_char_map_back(s, e, 45)
  337. #define BRK_LOAD_LINE_SKIP_BACK(s,e) brk_ag_char_map_back(s, e, 45)
  338. static ag_char_map_mask_t const ag_char_map_table[128] = {
  339. /*NUL*/ 0x00000002, /*x01*/ 0x00000000, /*x02*/ 0x00000000, /*x03*/ 0x00000000,
  340. /*x04*/ 0x00000000, /*x05*/ 0x00000000, /*x06*/ 0x00000000, /*BEL*/ 0x00000000,
  341. /* BS*/ 0x00000800, /* HT*/ 0x00000400, /* NL*/ 0x00000001, /* VT*/ 0x00000800,
  342. /* FF*/ 0x00000800, /* CR*/ 0x00000800, /*x0E*/ 0x00000000, /*x0F*/ 0x00000000,
  343. /*x10*/ 0x00000000, /*x11*/ 0x00000000, /*x12*/ 0x00000000, /*x13*/ 0x00000000,
  344. /*x14*/ 0x00000000, /*x15*/ 0x00000000, /*x16*/ 0x00000000, /*x17*/ 0x00000000,
  345. /*x18*/ 0x00000000, /*x19*/ 0x00000000, /*x1A*/ 0x00000000, /*ESC*/ 0x00000000,
  346. /*x1C*/ 0x00000000, /*x1D*/ 0x00000000, /*x1E*/ 0x00000000, /*x1F*/ 0x00000000,
  347. /* */ 0x00000400, /* ! */ 0x02804000, /* " */ 0x02005000, /* # */ 0x02004000,
  348. /* $ */ 0x02804100, /* % */ 0x02804008, /* & */ 0x02804000, /* ' */ 0x02005000,
  349. /* ( */ 0x02006000, /* ) */ 0x02006000, /* * */ 0x02004000, /* + */ 0x12804080,
  350. /* , */ 0x02004010, /* - */ 0x06A0C200, /* . */ 0x06C04000, /* / */ 0x03804004,
  351. /* 0 */ 0x08814000, /* 1 */ 0x00814000, /* 2 */ 0x00814000, /* 3 */ 0x00814000,
  352. /* 4 */ 0x00814000, /* 5 */ 0x00814000, /* 6 */ 0x00814000, /* 7 */ 0x00814000,
  353. /* 8 */ 0x00824000, /* 9 */ 0x00824000, /* : */ 0x02804020, /* ; */ 0x02004000,
  354. /* < */ 0x02004000, /* = */ 0x02004000, /* > */ 0x03004000, /* ? */ 0x02004000,
  355. /* @ */ 0x02804000, /* A */ 0x00944000, /* B */ 0x00944000, /* C */ 0x00944000,
  356. /* D */ 0x00944000, /* E */ 0x00944000, /* F */ 0x08944000, /* G */ 0x00904000,
  357. /* H */ 0x00904000, /* I */ 0x00904000, /* J */ 0x00904000, /* K */ 0x00904000,
  358. /* L */ 0x00904000, /* M */ 0x00904000, /* N */ 0x08904000, /* O */ 0x00904000,
  359. /* P */ 0x00904000, /* Q */ 0x00904000, /* R */ 0x00904000, /* S */ 0x00904000,
  360. /* T */ 0x00904000, /* U */ 0x00904000, /* V */ 0x00904000, /* W */ 0x00904000,
  361. /* X */ 0x00904000, /* Y */ 0x00904000, /* Z */ 0x00904000, /* [ */ 0x02404000,
  362. /* \ */ 0x02004004, /* ] */ 0x02404000, /* ^ */ 0x02A04000, /* _ */ 0x04804040,
  363. /* ` */ 0x02004000, /* a */ 0x008C4000, /* b */ 0x008C4000, /* c */ 0x008C4000,
  364. /* d */ 0x008C4000, /* e */ 0x008C4000, /* f */ 0x088C4000, /* g */ 0x00884000,
  365. /* h */ 0x00884000, /* i */ 0x00884000, /* j */ 0x00884000, /* k */ 0x00884000,
  366. /* l */ 0x00884000, /* m */ 0x00884000, /* n */ 0x08884000, /* o */ 0x00884000,
  367. /* p */ 0x00884000, /* q */ 0x00884000, /* r */ 0x00884000, /* s */ 0x00884000,
  368. /* t */ 0x00884000, /* u */ 0x00884000, /* v */ 0x00884000, /* w */ 0x00884000,
  369. /* x */ 0x00884000, /* y */ 0x00884000, /* z */ 0x00884000, /* { */ 0x02004000,
  370. /* | */ 0x12804000, /* } */ 0x02004000, /* ~ */ 0x0280C000, /*x7F*/ 0x00000000
  371. };
  372. #include <stdio.h>
  373. #include <stdlib.h>
  374. #include <string.h>
  375. #ifndef _
  376. # define _(_s) _s
  377. #endif
  378. static unsigned char const * ag_char_map_spanners[46];
  379. /**
  380. * Character category masks. Some categories may have multiple bits,
  381. * if their definition incorporates other character categories.
  382. * This mask array is only used by calc_ag_char_map_spanners().
  383. */
  384. static ag_char_map_mask_t const ag_char_map_masks[46] = {
  385. 0x00000001, /* NEWLINE */
  386. 0x00000002, /* NUL_BYTE */
  387. 0x00000004, /* DIR_SEP */
  388. 0x00000008, /* PERCENT */
  389. 0x00000010, /* COMMA */
  390. 0x00000020, /* COLON */
  391. 0x00000040, /* UNDERSCORE */
  392. 0x00000080, /* PLUS */
  393. 0x00000100, /* DOLLAR */
  394. 0x00000200, /* OPTION_MARKER */
  395. 0x00000400, /* HORIZ_WHITE */
  396. 0x00000800, /* ALT_WHITE */
  397. 0x00000C01, /* WHITESPACE */
  398. 0x00000C00, /* NON_NL_WHITE */
  399. 0x00001000, /* QUOTE */
  400. 0x00002000, /* PARENTHESES */
  401. 0x00004000, /* GRAPHIC */
  402. 0x00008000, /* INVERSION */
  403. 0x00010000, /* OCT_DIGIT */
  404. 0x00030000, /* DEC_DIGIT */
  405. 0x00070000, /* HEX_DIGIT */
  406. 0x00080000, /* LOWER_CASE */
  407. 0x00100000, /* UPPER_CASE */
  408. 0x00180000, /* ALPHABETIC */
  409. 0x001B0000, /* ALPHANUMERIC */
  410. 0x00180040, /* VAR_FIRST */
  411. 0x001B0040, /* VARIABLE_NAME */
  412. 0x003B0040, /* OPTION_NAME */
  413. 0x003B0060, /* VALUE_NAME */
  414. 0x00400000, /* NAME_SEP */
  415. 0x007B0460, /* COMPOUND_NAME */
  416. 0x00003000, /* SCHEME_NOTE */
  417. 0x00800000, /* UNQUOTABLE */
  418. 0x01000C01, /* END_XML_TOKEN */
  419. 0x00000C81, /* PLUS_N_SPACE */
  420. 0x02000000, /* PUNCTUATION */
  421. 0x041B0000, /* SUFFIX */
  422. 0x041B000C, /* SUFFIX_FMT */
  423. 0x08000002, /* FALSE_TYPE */
  424. 0x041B0004, /* FILE_NAME */
  425. 0x00000C03, /* END_TOKEN */
  426. 0x00000C13, /* END_LIST_ENTRY */
  427. 0x10000C13, /* SET_SEPARATOR */
  428. 0x00038000, /* SIGNED_NUMBER */
  429. 0x00000101, /* MAKE_SCRIPT */
  430. 0x00000600, /* LOAD_LINE_SKIP */
  431. };
  432. #undef LOCK_SPANNER_TABLES
  433. static unsigned char const *
  434. calc_ag_char_map_spanners(unsigned int mask_ix)
  435. {
  436. #ifdef LOCK_SPANNER_TABLES
  437. if (ag_char_map_spanners[mask_ix] != NULL)
  438. return ag_char_map_spanners[mask_ix];
  439. pthread_mutex_lock(&ag_char_map_mutex);
  440. if (ag_char_map_spanners[mask_ix] == NULL)
  441. #endif
  442. {
  443. int ix = 1;
  444. ag_char_map_mask_t mask = ag_char_map_masks[mask_ix];
  445. unsigned char * res = malloc(256 /* 1 << NBBY */);
  446. if (res == NULL) {
  447. fputs(_("no memory for char-mapper span map\n"), stderr);
  448. exit(EXIT_FAILURE);
  449. }
  450. memset(res, 0, 256);
  451. for (; ix < 128; ix++)
  452. if (ag_char_map_table[ix] & mask)
  453. res[ix] = 1;
  454. ag_char_map_spanners[mask_ix] = res;
  455. }
  456. #ifdef LOCK_SPANNER_TABLES
  457. pthread_mutex_unlock(&ag_char_map_mutex);
  458. #endif
  459. return ag_char_map_spanners[mask_ix];
  460. }
  461. #define ag_char_map_masks POISONED_ag_char_map_masks
  462. static inline int
  463. is_ag_char_map_char(char ch, ag_char_map_mask_t mask)
  464. {
  465. unsigned int ix = (unsigned char)ch;
  466. return ((ix < 128) && ((ag_char_map_table[ix] & mask) != 0));
  467. }
  468. static inline char *
  469. spn_ag_char_map_chars(char const * p, unsigned int mask_ix)
  470. {
  471. unsigned char const * v = ag_char_map_spanners[mask_ix];
  472. if (v == NULL)
  473. v = calc_ag_char_map_spanners(mask_ix);
  474. while (v[(unsigned char)*p]) p++;
  475. return (char *)(uintptr_t)p;
  476. }
  477. static inline char *
  478. brk_ag_char_map_chars(char const * p, unsigned int mask_ix)
  479. {
  480. unsigned char const * v = ag_char_map_spanners[mask_ix];
  481. if (v == NULL)
  482. v = calc_ag_char_map_spanners(mask_ix);
  483. while ((*p != '\0') && (! v[(unsigned char)*p])) p++;
  484. return (char *)(uintptr_t)p;
  485. }
  486. static inline char *
  487. spn_ag_char_map_back(char const * s, char const * e, unsigned int mask_ix)
  488. {
  489. unsigned char const * v = ag_char_map_spanners[mask_ix];
  490. if (v == NULL)
  491. v = calc_ag_char_map_spanners(mask_ix);
  492. if (s >= e) e = s + strlen(s);
  493. while ((e > s) && v[(unsigned char)e[-1]]) e--;
  494. return (char *)(uintptr_t)e;
  495. }
  496. static inline char *
  497. brk_ag_char_map_back(char const * s, char const * e, unsigned int mask_ix)
  498. {
  499. unsigned char const * v = ag_char_map_spanners[mask_ix];
  500. if (v == NULL)
  501. v = calc_ag_char_map_spanners(mask_ix);
  502. if (s == e) e += strlen(e);
  503. while ((e > s) && (! v[(unsigned char)e[-1]])) e--;
  504. return (char *)(uintptr_t)e;
  505. }
  506. #endif /* AG_CHAR_MAP_H_GUARD */