1*eabc0478Schristos /* $NetBSD: ag-char-map.h,v 1.6 2024/08/18 20:47:24 christos Exp $ */ 2abb0f93cSkardel 3abb0f93cSkardel /* 48585484eSchristos * 29 bits for 46 character classifications 5*eabc0478Schristos * generated by char-mapper on 08/26/18 at 10:44:22 6abb0f93cSkardel * 7abb0f93cSkardel * This file contains the character classifications 8abb0f93cSkardel * used by AutoGen and AutoOpts for identifying tokens. 98585484eSchristos * The table is static scope, so %guard is empty. 108585484eSchristos * 118585484eSchristos * This file is part of AutoOpts, a companion to AutoGen. 128585484eSchristos * AutoOpts is free software. 13*eabc0478Schristos * AutoOpts is Copyright (C) 1992-2018 by Bruce Korb - all rights reserved 148585484eSchristos * 158585484eSchristos * AutoOpts is available under any one of two licenses. The license 168585484eSchristos * in use must be one of these two and the choice is under the control 178585484eSchristos * of the user of the license. 188585484eSchristos * 198585484eSchristos * The GNU Lesser General Public License, version 3 or later 208585484eSchristos * See the files "COPYING.lgplv3" and "COPYING.gplv3" 218585484eSchristos * 228585484eSchristos * The Modified Berkeley Software Distribution License 238585484eSchristos * See the file "COPYING.mbsd" 248585484eSchristos * 258585484eSchristos * These files have the following sha256 sums: 268585484eSchristos * 278585484eSchristos * 8584710e9b04216a394078dc156b781d0b47e1729104d666658aecef8ee32e95 COPYING.gplv3 288585484eSchristos * 4379e7444a0e2ce2b12dd6f5a52a27a4d02d39d247901d3285c88cf0d37f477b COPYING.lgplv3 298585484eSchristos * 13aa749a5b0a454917a944ed8fffc530b784f5ead522b1aacaf4ec8aa55a6239 COPYING.mbsd 30abb0f93cSkardel */ 31abb0f93cSkardel #ifndef AG_CHAR_MAP_H_GUARD 32abb0f93cSkardel #define AG_CHAR_MAP_H_GUARD 1 33abb0f93cSkardel 34abb0f93cSkardel #ifdef HAVE_CONFIG_H 35abb0f93cSkardel # if defined(HAVE_INTTYPES_H) 36abb0f93cSkardel # include <inttypes.h> 378585484eSchristos 38abb0f93cSkardel # elif defined(HAVE_STDINT_H) 39abb0f93cSkardel # include <stdint.h> 40abb0f93cSkardel 418585484eSchristos # elif !defined(HAVE_UINT32_T) 42abb0f93cSkardel # if SIZEOF_INT == 4 43abb0f93cSkardel typedef unsigned int uint32_t; 44abb0f93cSkardel # elif SIZEOF_LONG == 4 45abb0f93cSkardel typedef unsigned long uint32_t; 46abb0f93cSkardel # endif 47abb0f93cSkardel # endif /* HAVE_*INT*_H header */ 48abb0f93cSkardel 49abb0f93cSkardel #else /* not HAVE_CONFIG_H -- */ 50abb0f93cSkardel # include <inttypes.h> 51abb0f93cSkardel #endif /* HAVE_CONFIG_H */ 52abb0f93cSkardel 53abb0f93cSkardel #if 0 /* mapping specification source (from autogen.map) */ 54abb0f93cSkardel // 558585484eSchristos // %guard 56abb0f93cSkardel // %file ag-char-map.h 578585484eSchristos // %backup 588585484eSchristos // %optimize 59abb0f93cSkardel // 608585484eSchristos // %comment -- see above 61abb0f93cSkardel // % 62abb0f93cSkardel // 638585484eSchristos // newline "\n" 648585484eSchristos // nul-byte "\x00" 658585484eSchristos // dir-sep "/\\" 668585484eSchristos // percent "%" 678585484eSchristos // comma "," 688585484eSchristos // colon ":" 698585484eSchristos // underscore "_" 708585484eSchristos // plus "+" 718585484eSchristos // dollar "$" 728585484eSchristos // option-marker "-" 738585484eSchristos // 748585484eSchristos // horiz-white "\t " 758585484eSchristos // alt-white "\v\f\r\b" 768585484eSchristos // whitespace +horiz-white +newline +alt-white 778585484eSchristos // non-nl-white +horiz-white +alt-white 788585484eSchristos // quote "'\"" 798585484eSchristos // parentheses "()" 808585484eSchristos // 818585484eSchristos // graphic "!-~" 828585484eSchristos // inversion "~-" 83abb0f93cSkardel // oct-digit "0-7" 84abb0f93cSkardel // dec-digit "89" +oct-digit 85abb0f93cSkardel // hex-digit "a-fA-F" +dec-digit 868585484eSchristos // lower-case "a-z" 878585484eSchristos // upper-case "A-Z" 888585484eSchristos // alphabetic +lower-case +upper-case 89abb0f93cSkardel // alphanumeric +alphabetic +dec-digit 908585484eSchristos // var-first +underscore +alphabetic 91abb0f93cSkardel // variable-name +var-first +dec-digit 92abb0f93cSkardel // option-name "^-" +variable-name 938585484eSchristos // value-name +colon +option-name 948585484eSchristos // name-sep "[.]" 958585484eSchristos // compound-name +value-name +name-sep +horiz-white 968585484eSchristos // scheme-note +parentheses +quote 978585484eSchristos // 988585484eSchristos // unquotable "!-~" -"#,;<=>[\\]`{}?*" -quote -parentheses 99abb0f93cSkardel // end-xml-token "/>" +whitespace 1008585484eSchristos // plus-n-space +plus +whitespace 101abb0f93cSkardel // punctuation "!-~" -alphanumeric -"_" 102abb0f93cSkardel // suffix "-._" +alphanumeric 1038585484eSchristos // suffix-fmt +percent +suffix +dir-sep 1048585484eSchristos // false-type "nNfF0" +nul-byte 1058585484eSchristos // file-name +dir-sep +suffix 1068585484eSchristos // end-token +nul-byte +whitespace 1078585484eSchristos // end-list-entry +comma +end-token 1088585484eSchristos // set-separator "|+-!" +end-list-entry 1098585484eSchristos // signed-number +inversion +dec-digit 1108585484eSchristos // make-script +dollar +newline 1118585484eSchristos // load-line-skip +horiz-white +option-marker 112abb0f93cSkardel // 113abb0f93cSkardel #endif /* 0 -- mapping spec. source */ 114abb0f93cSkardel 115abb0f93cSkardel 1168585484eSchristos typedef uint32_t ag_char_map_mask_t; 117abb0f93cSkardel 1188585484eSchristos #define IS_NEWLINE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000001) 1198585484eSchristos #define SPN_NEWLINE_CHARS(_s) spn_ag_char_map_chars(_s, 0) 1208585484eSchristos #define BRK_NEWLINE_CHARS(_s) brk_ag_char_map_chars(_s, 0) 1218585484eSchristos #define SPN_NEWLINE_BACK(s,e) spn_ag_char_map_back(s, e, 0) 1228585484eSchristos #define BRK_NEWLINE_BACK(s,e) brk_ag_char_map_back(s, e, 0) 1238585484eSchristos #define IS_NUL_BYTE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000002) 1248585484eSchristos #define SPN_NUL_BYTE_CHARS(_s) spn_ag_char_map_chars(_s, 1) 1258585484eSchristos #define BRK_NUL_BYTE_CHARS(_s) brk_ag_char_map_chars(_s, 1) 1268585484eSchristos #define SPN_NUL_BYTE_BACK(s,e) spn_ag_char_map_back(s, e, 1) 1278585484eSchristos #define BRK_NUL_BYTE_BACK(s,e) brk_ag_char_map_back(s, e, 1) 1288585484eSchristos #define IS_DIR_SEP_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000004) 1298585484eSchristos #define SPN_DIR_SEP_CHARS(_s) spn_ag_char_map_chars(_s, 2) 1308585484eSchristos #define BRK_DIR_SEP_CHARS(_s) brk_ag_char_map_chars(_s, 2) 1318585484eSchristos #define SPN_DIR_SEP_BACK(s,e) spn_ag_char_map_back(s, e, 2) 1328585484eSchristos #define BRK_DIR_SEP_BACK(s,e) brk_ag_char_map_back(s, e, 2) 1338585484eSchristos #define IS_PERCENT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000008) 1348585484eSchristos #define SPN_PERCENT_CHARS(_s) spn_ag_char_map_chars(_s, 3) 1358585484eSchristos #define BRK_PERCENT_CHARS(_s) brk_ag_char_map_chars(_s, 3) 1368585484eSchristos #define SPN_PERCENT_BACK(s,e) spn_ag_char_map_back(s, e, 3) 1378585484eSchristos #define BRK_PERCENT_BACK(s,e) brk_ag_char_map_back(s, e, 3) 1388585484eSchristos #define IS_COMMA_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000010) 1398585484eSchristos #define SPN_COMMA_CHARS(_s) spn_ag_char_map_chars(_s, 4) 1408585484eSchristos #define BRK_COMMA_CHARS(_s) brk_ag_char_map_chars(_s, 4) 1418585484eSchristos #define SPN_COMMA_BACK(s,e) spn_ag_char_map_back(s, e, 4) 1428585484eSchristos #define BRK_COMMA_BACK(s,e) brk_ag_char_map_back(s, e, 4) 1438585484eSchristos #define IS_COLON_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000020) 1448585484eSchristos #define SPN_COLON_CHARS(_s) spn_ag_char_map_chars(_s, 5) 1458585484eSchristos #define BRK_COLON_CHARS(_s) brk_ag_char_map_chars(_s, 5) 1468585484eSchristos #define SPN_COLON_BACK(s,e) spn_ag_char_map_back(s, e, 5) 1478585484eSchristos #define BRK_COLON_BACK(s,e) brk_ag_char_map_back(s, e, 5) 1488585484eSchristos #define IS_UNDERSCORE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000040) 1498585484eSchristos #define SPN_UNDERSCORE_CHARS(_s) spn_ag_char_map_chars(_s, 6) 1508585484eSchristos #define BRK_UNDERSCORE_CHARS(_s) brk_ag_char_map_chars(_s, 6) 1518585484eSchristos #define SPN_UNDERSCORE_BACK(s,e) spn_ag_char_map_back(s, e, 6) 1528585484eSchristos #define BRK_UNDERSCORE_BACK(s,e) brk_ag_char_map_back(s, e, 6) 1538585484eSchristos #define IS_PLUS_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000080) 1548585484eSchristos #define SPN_PLUS_CHARS(_s) spn_ag_char_map_chars(_s, 7) 1558585484eSchristos #define BRK_PLUS_CHARS(_s) brk_ag_char_map_chars(_s, 7) 1568585484eSchristos #define SPN_PLUS_BACK(s,e) spn_ag_char_map_back(s, e, 7) 1578585484eSchristos #define BRK_PLUS_BACK(s,e) brk_ag_char_map_back(s, e, 7) 1588585484eSchristos #define IS_DOLLAR_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000100) 1598585484eSchristos #define SPN_DOLLAR_CHARS(_s) spn_ag_char_map_chars(_s, 8) 1608585484eSchristos #define BRK_DOLLAR_CHARS(_s) brk_ag_char_map_chars(_s, 8) 1618585484eSchristos #define SPN_DOLLAR_BACK(s,e) spn_ag_char_map_back(s, e, 8) 1628585484eSchristos #define BRK_DOLLAR_BACK(s,e) brk_ag_char_map_back(s, e, 8) 1638585484eSchristos #define IS_OPTION_MARKER_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000200) 1648585484eSchristos #define SPN_OPTION_MARKER_CHARS(_s) spn_ag_char_map_chars(_s, 9) 1658585484eSchristos #define BRK_OPTION_MARKER_CHARS(_s) brk_ag_char_map_chars(_s, 9) 1668585484eSchristos #define SPN_OPTION_MARKER_BACK(s,e) spn_ag_char_map_back(s, e, 9) 1678585484eSchristos #define BRK_OPTION_MARKER_BACK(s,e) brk_ag_char_map_back(s, e, 9) 1688585484eSchristos #define IS_HORIZ_WHITE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000400) 1698585484eSchristos #define SPN_HORIZ_WHITE_CHARS(_s) spn_ag_char_map_chars(_s, 10) 1708585484eSchristos #define BRK_HORIZ_WHITE_CHARS(_s) brk_ag_char_map_chars(_s, 10) 1718585484eSchristos #define SPN_HORIZ_WHITE_BACK(s,e) spn_ag_char_map_back(s, e, 10) 1728585484eSchristos #define BRK_HORIZ_WHITE_BACK(s,e) brk_ag_char_map_back(s, e, 10) 1738585484eSchristos #define IS_ALT_WHITE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000800) 1748585484eSchristos #define SPN_ALT_WHITE_CHARS(_s) spn_ag_char_map_chars(_s, 11) 1758585484eSchristos #define BRK_ALT_WHITE_CHARS(_s) brk_ag_char_map_chars(_s, 11) 1768585484eSchristos #define SPN_ALT_WHITE_BACK(s,e) spn_ag_char_map_back(s, e, 11) 1778585484eSchristos #define BRK_ALT_WHITE_BACK(s,e) brk_ag_char_map_back(s, e, 11) 1788585484eSchristos #define IS_WHITESPACE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C01) 1798585484eSchristos #define SPN_WHITESPACE_CHARS(_s) spn_ag_char_map_chars(_s, 12) 1808585484eSchristos #define BRK_WHITESPACE_CHARS(_s) brk_ag_char_map_chars(_s, 12) 1818585484eSchristos #define SPN_WHITESPACE_BACK(s,e) spn_ag_char_map_back(s, e, 12) 1828585484eSchristos #define BRK_WHITESPACE_BACK(s,e) brk_ag_char_map_back(s, e, 12) 1838585484eSchristos #define IS_NON_NL_WHITE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C00) 1848585484eSchristos #define SPN_NON_NL_WHITE_CHARS(_s) spn_ag_char_map_chars(_s, 13) 1858585484eSchristos #define BRK_NON_NL_WHITE_CHARS(_s) brk_ag_char_map_chars(_s, 13) 1868585484eSchristos #define SPN_NON_NL_WHITE_BACK(s,e) spn_ag_char_map_back(s, e, 13) 1878585484eSchristos #define BRK_NON_NL_WHITE_BACK(s,e) brk_ag_char_map_back(s, e, 13) 1888585484eSchristos #define IS_QUOTE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00001000) 1898585484eSchristos #define SPN_QUOTE_CHARS(_s) spn_ag_char_map_chars(_s, 14) 1908585484eSchristos #define BRK_QUOTE_CHARS(_s) brk_ag_char_map_chars(_s, 14) 1918585484eSchristos #define SPN_QUOTE_BACK(s,e) spn_ag_char_map_back(s, e, 14) 1928585484eSchristos #define BRK_QUOTE_BACK(s,e) brk_ag_char_map_back(s, e, 14) 1938585484eSchristos #define IS_PARENTHESES_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00002000) 1948585484eSchristos #define SPN_PARENTHESES_CHARS(_s) spn_ag_char_map_chars(_s, 15) 1958585484eSchristos #define BRK_PARENTHESES_CHARS(_s) brk_ag_char_map_chars(_s, 15) 1968585484eSchristos #define SPN_PARENTHESES_BACK(s,e) spn_ag_char_map_back(s, e, 15) 1978585484eSchristos #define BRK_PARENTHESES_BACK(s,e) brk_ag_char_map_back(s, e, 15) 1988585484eSchristos #define IS_GRAPHIC_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00004000) 1998585484eSchristos #define SPN_GRAPHIC_CHARS(_s) spn_ag_char_map_chars(_s, 16) 2008585484eSchristos #define BRK_GRAPHIC_CHARS(_s) brk_ag_char_map_chars(_s, 16) 2018585484eSchristos #define SPN_GRAPHIC_BACK(s,e) spn_ag_char_map_back(s, e, 16) 2028585484eSchristos #define BRK_GRAPHIC_BACK(s,e) brk_ag_char_map_back(s, e, 16) 2038585484eSchristos #define IS_INVERSION_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00008000) 2048585484eSchristos #define SPN_INVERSION_CHARS(_s) spn_ag_char_map_chars(_s, 17) 2058585484eSchristos #define BRK_INVERSION_CHARS(_s) brk_ag_char_map_chars(_s, 17) 2068585484eSchristos #define SPN_INVERSION_BACK(s,e) spn_ag_char_map_back(s, e, 17) 2078585484eSchristos #define BRK_INVERSION_BACK(s,e) brk_ag_char_map_back(s, e, 17) 2088585484eSchristos #define IS_OCT_DIGIT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00010000) 2098585484eSchristos #define SPN_OCT_DIGIT_CHARS(_s) spn_ag_char_map_chars(_s, 18) 2108585484eSchristos #define BRK_OCT_DIGIT_CHARS(_s) brk_ag_char_map_chars(_s, 18) 2118585484eSchristos #define SPN_OCT_DIGIT_BACK(s,e) spn_ag_char_map_back(s, e, 18) 2128585484eSchristos #define BRK_OCT_DIGIT_BACK(s,e) brk_ag_char_map_back(s, e, 18) 2138585484eSchristos #define IS_DEC_DIGIT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00030000) 2148585484eSchristos #define SPN_DEC_DIGIT_CHARS(_s) spn_ag_char_map_chars(_s, 19) 2158585484eSchristos #define BRK_DEC_DIGIT_CHARS(_s) brk_ag_char_map_chars(_s, 19) 2168585484eSchristos #define SPN_DEC_DIGIT_BACK(s,e) spn_ag_char_map_back(s, e, 19) 2178585484eSchristos #define BRK_DEC_DIGIT_BACK(s,e) brk_ag_char_map_back(s, e, 19) 2188585484eSchristos #define IS_HEX_DIGIT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00070000) 2198585484eSchristos #define SPN_HEX_DIGIT_CHARS(_s) spn_ag_char_map_chars(_s, 20) 2208585484eSchristos #define BRK_HEX_DIGIT_CHARS(_s) brk_ag_char_map_chars(_s, 20) 2218585484eSchristos #define SPN_HEX_DIGIT_BACK(s,e) spn_ag_char_map_back(s, e, 20) 2228585484eSchristos #define BRK_HEX_DIGIT_BACK(s,e) brk_ag_char_map_back(s, e, 20) 2238585484eSchristos #define IS_LOWER_CASE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00080000) 2248585484eSchristos #define SPN_LOWER_CASE_CHARS(_s) spn_ag_char_map_chars(_s, 21) 2258585484eSchristos #define BRK_LOWER_CASE_CHARS(_s) brk_ag_char_map_chars(_s, 21) 2268585484eSchristos #define SPN_LOWER_CASE_BACK(s,e) spn_ag_char_map_back(s, e, 21) 2278585484eSchristos #define BRK_LOWER_CASE_BACK(s,e) brk_ag_char_map_back(s, e, 21) 2288585484eSchristos #define IS_UPPER_CASE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00100000) 2298585484eSchristos #define SPN_UPPER_CASE_CHARS(_s) spn_ag_char_map_chars(_s, 22) 2308585484eSchristos #define BRK_UPPER_CASE_CHARS(_s) brk_ag_char_map_chars(_s, 22) 2318585484eSchristos #define SPN_UPPER_CASE_BACK(s,e) spn_ag_char_map_back(s, e, 22) 2328585484eSchristos #define BRK_UPPER_CASE_BACK(s,e) brk_ag_char_map_back(s, e, 22) 2338585484eSchristos #define IS_ALPHABETIC_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00180000) 2348585484eSchristos #define SPN_ALPHABETIC_CHARS(_s) spn_ag_char_map_chars(_s, 23) 2358585484eSchristos #define BRK_ALPHABETIC_CHARS(_s) brk_ag_char_map_chars(_s, 23) 2368585484eSchristos #define SPN_ALPHABETIC_BACK(s,e) spn_ag_char_map_back(s, e, 23) 2378585484eSchristos #define BRK_ALPHABETIC_BACK(s,e) brk_ag_char_map_back(s, e, 23) 2388585484eSchristos #define IS_ALPHANUMERIC_CHAR( _c) is_ag_char_map_char((char)(_c), 0x001B0000) 2398585484eSchristos #define SPN_ALPHANUMERIC_CHARS(_s) spn_ag_char_map_chars(_s, 24) 2408585484eSchristos #define BRK_ALPHANUMERIC_CHARS(_s) brk_ag_char_map_chars(_s, 24) 2418585484eSchristos #define SPN_ALPHANUMERIC_BACK(s,e) spn_ag_char_map_back(s, e, 24) 2428585484eSchristos #define BRK_ALPHANUMERIC_BACK(s,e) brk_ag_char_map_back(s, e, 24) 2438585484eSchristos #define IS_VAR_FIRST_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00180040) 2448585484eSchristos #define SPN_VAR_FIRST_CHARS(_s) spn_ag_char_map_chars(_s, 25) 2458585484eSchristos #define BRK_VAR_FIRST_CHARS(_s) brk_ag_char_map_chars(_s, 25) 2468585484eSchristos #define SPN_VAR_FIRST_BACK(s,e) spn_ag_char_map_back(s, e, 25) 2478585484eSchristos #define BRK_VAR_FIRST_BACK(s,e) brk_ag_char_map_back(s, e, 25) 2488585484eSchristos #define IS_VARIABLE_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x001B0040) 2498585484eSchristos #define SPN_VARIABLE_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 26) 2508585484eSchristos #define BRK_VARIABLE_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 26) 2518585484eSchristos #define SPN_VARIABLE_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 26) 2528585484eSchristos #define BRK_VARIABLE_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 26) 2538585484eSchristos #define IS_OPTION_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x003B0040) 2548585484eSchristos #define SPN_OPTION_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 27) 2558585484eSchristos #define BRK_OPTION_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 27) 2568585484eSchristos #define SPN_OPTION_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 27) 2578585484eSchristos #define BRK_OPTION_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 27) 2588585484eSchristos #define IS_VALUE_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x003B0060) 2598585484eSchristos #define SPN_VALUE_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 28) 2608585484eSchristos #define BRK_VALUE_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 28) 2618585484eSchristos #define SPN_VALUE_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 28) 2628585484eSchristos #define BRK_VALUE_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 28) 2638585484eSchristos #define IS_NAME_SEP_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00400000) 2648585484eSchristos #define SPN_NAME_SEP_CHARS(_s) spn_ag_char_map_chars(_s, 29) 2658585484eSchristos #define BRK_NAME_SEP_CHARS(_s) brk_ag_char_map_chars(_s, 29) 2668585484eSchristos #define SPN_NAME_SEP_BACK(s,e) spn_ag_char_map_back(s, e, 29) 2678585484eSchristos #define BRK_NAME_SEP_BACK(s,e) brk_ag_char_map_back(s, e, 29) 2688585484eSchristos #define IS_COMPOUND_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x007B0460) 2698585484eSchristos #define SPN_COMPOUND_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 30) 2708585484eSchristos #define BRK_COMPOUND_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 30) 2718585484eSchristos #define SPN_COMPOUND_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 30) 2728585484eSchristos #define BRK_COMPOUND_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 30) 2738585484eSchristos #define IS_SCHEME_NOTE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00003000) 2748585484eSchristos #define SPN_SCHEME_NOTE_CHARS(_s) spn_ag_char_map_chars(_s, 31) 2758585484eSchristos #define BRK_SCHEME_NOTE_CHARS(_s) brk_ag_char_map_chars(_s, 31) 2768585484eSchristos #define SPN_SCHEME_NOTE_BACK(s,e) spn_ag_char_map_back(s, e, 31) 2778585484eSchristos #define BRK_SCHEME_NOTE_BACK(s,e) brk_ag_char_map_back(s, e, 31) 2788585484eSchristos #define IS_UNQUOTABLE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00800000) 2798585484eSchristos #define SPN_UNQUOTABLE_CHARS(_s) spn_ag_char_map_chars(_s, 32) 2808585484eSchristos #define BRK_UNQUOTABLE_CHARS(_s) brk_ag_char_map_chars(_s, 32) 2818585484eSchristos #define SPN_UNQUOTABLE_BACK(s,e) spn_ag_char_map_back(s, e, 32) 2828585484eSchristos #define BRK_UNQUOTABLE_BACK(s,e) brk_ag_char_map_back(s, e, 32) 2838585484eSchristos #define IS_END_XML_TOKEN_CHAR( _c) is_ag_char_map_char((char)(_c), 0x01000C01) 2848585484eSchristos #define SPN_END_XML_TOKEN_CHARS(_s) spn_ag_char_map_chars(_s, 33) 2858585484eSchristos #define BRK_END_XML_TOKEN_CHARS(_s) brk_ag_char_map_chars(_s, 33) 2868585484eSchristos #define SPN_END_XML_TOKEN_BACK(s,e) spn_ag_char_map_back(s, e, 33) 2878585484eSchristos #define BRK_END_XML_TOKEN_BACK(s,e) brk_ag_char_map_back(s, e, 33) 2888585484eSchristos #define IS_PLUS_N_SPACE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C81) 2898585484eSchristos #define SPN_PLUS_N_SPACE_CHARS(_s) spn_ag_char_map_chars(_s, 34) 2908585484eSchristos #define BRK_PLUS_N_SPACE_CHARS(_s) brk_ag_char_map_chars(_s, 34) 2918585484eSchristos #define SPN_PLUS_N_SPACE_BACK(s,e) spn_ag_char_map_back(s, e, 34) 2928585484eSchristos #define BRK_PLUS_N_SPACE_BACK(s,e) brk_ag_char_map_back(s, e, 34) 2938585484eSchristos #define IS_PUNCTUATION_CHAR( _c) is_ag_char_map_char((char)(_c), 0x02000000) 2948585484eSchristos #define SPN_PUNCTUATION_CHARS(_s) spn_ag_char_map_chars(_s, 35) 2958585484eSchristos #define BRK_PUNCTUATION_CHARS(_s) brk_ag_char_map_chars(_s, 35) 2968585484eSchristos #define SPN_PUNCTUATION_BACK(s,e) spn_ag_char_map_back(s, e, 35) 2978585484eSchristos #define BRK_PUNCTUATION_BACK(s,e) brk_ag_char_map_back(s, e, 35) 2988585484eSchristos #define IS_SUFFIX_CHAR( _c) is_ag_char_map_char((char)(_c), 0x041B0000) 2998585484eSchristos #define SPN_SUFFIX_CHARS(_s) spn_ag_char_map_chars(_s, 36) 3008585484eSchristos #define BRK_SUFFIX_CHARS(_s) brk_ag_char_map_chars(_s, 36) 3018585484eSchristos #define SPN_SUFFIX_BACK(s,e) spn_ag_char_map_back(s, e, 36) 3028585484eSchristos #define BRK_SUFFIX_BACK(s,e) brk_ag_char_map_back(s, e, 36) 3038585484eSchristos #define IS_SUFFIX_FMT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x041B000C) 3048585484eSchristos #define SPN_SUFFIX_FMT_CHARS(_s) spn_ag_char_map_chars(_s, 37) 3058585484eSchristos #define BRK_SUFFIX_FMT_CHARS(_s) brk_ag_char_map_chars(_s, 37) 3068585484eSchristos #define SPN_SUFFIX_FMT_BACK(s,e) spn_ag_char_map_back(s, e, 37) 3078585484eSchristos #define BRK_SUFFIX_FMT_BACK(s,e) brk_ag_char_map_back(s, e, 37) 3088585484eSchristos #define IS_FALSE_TYPE_CHAR( _c) is_ag_char_map_char((char)(_c), 0x08000002) 3098585484eSchristos #define SPN_FALSE_TYPE_CHARS(_s) spn_ag_char_map_chars(_s, 38) 3108585484eSchristos #define BRK_FALSE_TYPE_CHARS(_s) brk_ag_char_map_chars(_s, 38) 3118585484eSchristos #define SPN_FALSE_TYPE_BACK(s,e) spn_ag_char_map_back(s, e, 38) 3128585484eSchristos #define BRK_FALSE_TYPE_BACK(s,e) brk_ag_char_map_back(s, e, 38) 3138585484eSchristos #define IS_FILE_NAME_CHAR( _c) is_ag_char_map_char((char)(_c), 0x041B0004) 3148585484eSchristos #define SPN_FILE_NAME_CHARS(_s) spn_ag_char_map_chars(_s, 39) 3158585484eSchristos #define BRK_FILE_NAME_CHARS(_s) brk_ag_char_map_chars(_s, 39) 3168585484eSchristos #define SPN_FILE_NAME_BACK(s,e) spn_ag_char_map_back(s, e, 39) 3178585484eSchristos #define BRK_FILE_NAME_BACK(s,e) brk_ag_char_map_back(s, e, 39) 3188585484eSchristos #define IS_END_TOKEN_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C03) 3198585484eSchristos #define SPN_END_TOKEN_CHARS(_s) spn_ag_char_map_chars(_s, 40) 3208585484eSchristos #define BRK_END_TOKEN_CHARS(_s) brk_ag_char_map_chars(_s, 40) 3218585484eSchristos #define SPN_END_TOKEN_BACK(s,e) spn_ag_char_map_back(s, e, 40) 3228585484eSchristos #define BRK_END_TOKEN_BACK(s,e) brk_ag_char_map_back(s, e, 40) 3238585484eSchristos #define IS_END_LIST_ENTRY_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000C13) 3248585484eSchristos #define SPN_END_LIST_ENTRY_CHARS(_s) spn_ag_char_map_chars(_s, 41) 3258585484eSchristos #define BRK_END_LIST_ENTRY_CHARS(_s) brk_ag_char_map_chars(_s, 41) 3268585484eSchristos #define SPN_END_LIST_ENTRY_BACK(s,e) spn_ag_char_map_back(s, e, 41) 3278585484eSchristos #define BRK_END_LIST_ENTRY_BACK(s,e) brk_ag_char_map_back(s, e, 41) 3288585484eSchristos #define IS_SET_SEPARATOR_CHAR( _c) is_ag_char_map_char((char)(_c), 0x10000C13) 3298585484eSchristos #define SPN_SET_SEPARATOR_CHARS(_s) spn_ag_char_map_chars(_s, 42) 3308585484eSchristos #define BRK_SET_SEPARATOR_CHARS(_s) brk_ag_char_map_chars(_s, 42) 3318585484eSchristos #define SPN_SET_SEPARATOR_BACK(s,e) spn_ag_char_map_back(s, e, 42) 3328585484eSchristos #define BRK_SET_SEPARATOR_BACK(s,e) brk_ag_char_map_back(s, e, 42) 3338585484eSchristos #define IS_SIGNED_NUMBER_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00038000) 3348585484eSchristos #define SPN_SIGNED_NUMBER_CHARS(_s) spn_ag_char_map_chars(_s, 43) 3358585484eSchristos #define BRK_SIGNED_NUMBER_CHARS(_s) brk_ag_char_map_chars(_s, 43) 3368585484eSchristos #define SPN_SIGNED_NUMBER_BACK(s,e) spn_ag_char_map_back(s, e, 43) 3378585484eSchristos #define BRK_SIGNED_NUMBER_BACK(s,e) brk_ag_char_map_back(s, e, 43) 3388585484eSchristos #define IS_MAKE_SCRIPT_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000101) 3398585484eSchristos #define SPN_MAKE_SCRIPT_CHARS(_s) spn_ag_char_map_chars(_s, 44) 3408585484eSchristos #define BRK_MAKE_SCRIPT_CHARS(_s) brk_ag_char_map_chars(_s, 44) 3418585484eSchristos #define SPN_MAKE_SCRIPT_BACK(s,e) spn_ag_char_map_back(s, e, 44) 3428585484eSchristos #define BRK_MAKE_SCRIPT_BACK(s,e) brk_ag_char_map_back(s, e, 44) 3438585484eSchristos #define IS_LOAD_LINE_SKIP_CHAR( _c) is_ag_char_map_char((char)(_c), 0x00000600) 3448585484eSchristos #define SPN_LOAD_LINE_SKIP_CHARS(_s) spn_ag_char_map_chars(_s, 45) 3458585484eSchristos #define BRK_LOAD_LINE_SKIP_CHARS(_s) brk_ag_char_map_chars(_s, 45) 3468585484eSchristos #define SPN_LOAD_LINE_SKIP_BACK(s,e) spn_ag_char_map_back(s, e, 45) 3478585484eSchristos #define BRK_LOAD_LINE_SKIP_BACK(s,e) brk_ag_char_map_back(s, e, 45) 348abb0f93cSkardel 3498585484eSchristos static ag_char_map_mask_t const ag_char_map_table[128] = { 3508585484eSchristos /*NUL*/ 0x00000002, /*x01*/ 0x00000000, /*x02*/ 0x00000000, /*x03*/ 0x00000000, 3518585484eSchristos /*x04*/ 0x00000000, /*x05*/ 0x00000000, /*x06*/ 0x00000000, /*BEL*/ 0x00000000, 3528585484eSchristos /* BS*/ 0x00000800, /* HT*/ 0x00000400, /* NL*/ 0x00000001, /* VT*/ 0x00000800, 3538585484eSchristos /* FF*/ 0x00000800, /* CR*/ 0x00000800, /*x0E*/ 0x00000000, /*x0F*/ 0x00000000, 3548585484eSchristos /*x10*/ 0x00000000, /*x11*/ 0x00000000, /*x12*/ 0x00000000, /*x13*/ 0x00000000, 3558585484eSchristos /*x14*/ 0x00000000, /*x15*/ 0x00000000, /*x16*/ 0x00000000, /*x17*/ 0x00000000, 3568585484eSchristos /*x18*/ 0x00000000, /*x19*/ 0x00000000, /*x1A*/ 0x00000000, /*ESC*/ 0x00000000, 3578585484eSchristos /*x1C*/ 0x00000000, /*x1D*/ 0x00000000, /*x1E*/ 0x00000000, /*x1F*/ 0x00000000, 3588585484eSchristos /* */ 0x00000400, /* ! */ 0x02804000, /* " */ 0x02005000, /* # */ 0x02004000, 3598585484eSchristos /* $ */ 0x02804100, /* % */ 0x02804008, /* & */ 0x02804000, /* ' */ 0x02005000, 3608585484eSchristos /* ( */ 0x02006000, /* ) */ 0x02006000, /* * */ 0x02004000, /* + */ 0x12804080, 3618585484eSchristos /* , */ 0x02004010, /* - */ 0x06A0C200, /* . */ 0x06C04000, /* / */ 0x03804004, 3628585484eSchristos /* 0 */ 0x08814000, /* 1 */ 0x00814000, /* 2 */ 0x00814000, /* 3 */ 0x00814000, 3638585484eSchristos /* 4 */ 0x00814000, /* 5 */ 0x00814000, /* 6 */ 0x00814000, /* 7 */ 0x00814000, 3648585484eSchristos /* 8 */ 0x00824000, /* 9 */ 0x00824000, /* : */ 0x02804020, /* ; */ 0x02004000, 3658585484eSchristos /* < */ 0x02004000, /* = */ 0x02004000, /* > */ 0x03004000, /* ? */ 0x02004000, 3668585484eSchristos /* @ */ 0x02804000, /* A */ 0x00944000, /* B */ 0x00944000, /* C */ 0x00944000, 3678585484eSchristos /* D */ 0x00944000, /* E */ 0x00944000, /* F */ 0x08944000, /* G */ 0x00904000, 3688585484eSchristos /* H */ 0x00904000, /* I */ 0x00904000, /* J */ 0x00904000, /* K */ 0x00904000, 3698585484eSchristos /* L */ 0x00904000, /* M */ 0x00904000, /* N */ 0x08904000, /* O */ 0x00904000, 3708585484eSchristos /* P */ 0x00904000, /* Q */ 0x00904000, /* R */ 0x00904000, /* S */ 0x00904000, 3718585484eSchristos /* T */ 0x00904000, /* U */ 0x00904000, /* V */ 0x00904000, /* W */ 0x00904000, 3728585484eSchristos /* X */ 0x00904000, /* Y */ 0x00904000, /* Z */ 0x00904000, /* [ */ 0x02404000, 3738585484eSchristos /* \ */ 0x02004004, /* ] */ 0x02404000, /* ^ */ 0x02A04000, /* _ */ 0x04804040, 3748585484eSchristos /* ` */ 0x02004000, /* a */ 0x008C4000, /* b */ 0x008C4000, /* c */ 0x008C4000, 3758585484eSchristos /* d */ 0x008C4000, /* e */ 0x008C4000, /* f */ 0x088C4000, /* g */ 0x00884000, 3768585484eSchristos /* h */ 0x00884000, /* i */ 0x00884000, /* j */ 0x00884000, /* k */ 0x00884000, 3778585484eSchristos /* l */ 0x00884000, /* m */ 0x00884000, /* n */ 0x08884000, /* o */ 0x00884000, 3788585484eSchristos /* p */ 0x00884000, /* q */ 0x00884000, /* r */ 0x00884000, /* s */ 0x00884000, 3798585484eSchristos /* t */ 0x00884000, /* u */ 0x00884000, /* v */ 0x00884000, /* w */ 0x00884000, 3808585484eSchristos /* x */ 0x00884000, /* y */ 0x00884000, /* z */ 0x00884000, /* { */ 0x02004000, 3818585484eSchristos /* | */ 0x12804000, /* } */ 0x02004000, /* ~ */ 0x0280C000, /*x7F*/ 0x00000000 382abb0f93cSkardel }; 3838585484eSchristos 3848585484eSchristos #include <stdio.h> 3858585484eSchristos #include <stdlib.h> 3868585484eSchristos #include <string.h> 3878585484eSchristos 3888585484eSchristos #ifndef _ 3898585484eSchristos # define _(_s) _s 3908585484eSchristos #endif 3918585484eSchristos 3928585484eSchristos static unsigned char const * ag_char_map_spanners[46]; 3938585484eSchristos /** 3948585484eSchristos * Character category masks. Some categories may have multiple bits, 3958585484eSchristos * if their definition incorporates other character categories. 3968585484eSchristos * This mask array is only used by calc_ag_char_map_spanners(). 3978585484eSchristos */ 3988585484eSchristos static ag_char_map_mask_t const ag_char_map_masks[46] = { 3998585484eSchristos 0x00000001, /* NEWLINE */ 4008585484eSchristos 0x00000002, /* NUL_BYTE */ 4018585484eSchristos 0x00000004, /* DIR_SEP */ 4028585484eSchristos 0x00000008, /* PERCENT */ 4038585484eSchristos 0x00000010, /* COMMA */ 4048585484eSchristos 0x00000020, /* COLON */ 4058585484eSchristos 0x00000040, /* UNDERSCORE */ 4068585484eSchristos 0x00000080, /* PLUS */ 4078585484eSchristos 0x00000100, /* DOLLAR */ 4088585484eSchristos 0x00000200, /* OPTION_MARKER */ 4098585484eSchristos 0x00000400, /* HORIZ_WHITE */ 4108585484eSchristos 0x00000800, /* ALT_WHITE */ 4118585484eSchristos 0x00000C01, /* WHITESPACE */ 4128585484eSchristos 0x00000C00, /* NON_NL_WHITE */ 4138585484eSchristos 0x00001000, /* QUOTE */ 4148585484eSchristos 0x00002000, /* PARENTHESES */ 4158585484eSchristos 0x00004000, /* GRAPHIC */ 4168585484eSchristos 0x00008000, /* INVERSION */ 4178585484eSchristos 0x00010000, /* OCT_DIGIT */ 4188585484eSchristos 0x00030000, /* DEC_DIGIT */ 4198585484eSchristos 0x00070000, /* HEX_DIGIT */ 4208585484eSchristos 0x00080000, /* LOWER_CASE */ 4218585484eSchristos 0x00100000, /* UPPER_CASE */ 4228585484eSchristos 0x00180000, /* ALPHABETIC */ 4238585484eSchristos 0x001B0000, /* ALPHANUMERIC */ 4248585484eSchristos 0x00180040, /* VAR_FIRST */ 4258585484eSchristos 0x001B0040, /* VARIABLE_NAME */ 4268585484eSchristos 0x003B0040, /* OPTION_NAME */ 4278585484eSchristos 0x003B0060, /* VALUE_NAME */ 4288585484eSchristos 0x00400000, /* NAME_SEP */ 4298585484eSchristos 0x007B0460, /* COMPOUND_NAME */ 4308585484eSchristos 0x00003000, /* SCHEME_NOTE */ 4318585484eSchristos 0x00800000, /* UNQUOTABLE */ 4328585484eSchristos 0x01000C01, /* END_XML_TOKEN */ 4338585484eSchristos 0x00000C81, /* PLUS_N_SPACE */ 4348585484eSchristos 0x02000000, /* PUNCTUATION */ 4358585484eSchristos 0x041B0000, /* SUFFIX */ 4368585484eSchristos 0x041B000C, /* SUFFIX_FMT */ 4378585484eSchristos 0x08000002, /* FALSE_TYPE */ 4388585484eSchristos 0x041B0004, /* FILE_NAME */ 4398585484eSchristos 0x00000C03, /* END_TOKEN */ 4408585484eSchristos 0x00000C13, /* END_LIST_ENTRY */ 4418585484eSchristos 0x10000C13, /* SET_SEPARATOR */ 4428585484eSchristos 0x00038000, /* SIGNED_NUMBER */ 4438585484eSchristos 0x00000101, /* MAKE_SCRIPT */ 4448585484eSchristos 0x00000600, /* LOAD_LINE_SKIP */ 4458585484eSchristos }; 4468585484eSchristos #undef LOCK_SPANNER_TABLES 4478585484eSchristos 4488585484eSchristos static unsigned char const * 4498585484eSchristos calc_ag_char_map_spanners(unsigned int mask_ix) 4508585484eSchristos { 4518585484eSchristos #ifdef LOCK_SPANNER_TABLES 4528585484eSchristos if (ag_char_map_spanners[mask_ix] != NULL) 4538585484eSchristos return ag_char_map_spanners[mask_ix]; 4548585484eSchristos 4558585484eSchristos pthread_mutex_lock(&ag_char_map_mutex); 4568585484eSchristos if (ag_char_map_spanners[mask_ix] == NULL) 4578585484eSchristos #endif 4588585484eSchristos { 4598585484eSchristos int ix = 1; 4608585484eSchristos ag_char_map_mask_t mask = ag_char_map_masks[mask_ix]; 4618585484eSchristos unsigned char * res = malloc(256 /* 1 << NBBY */); 4628585484eSchristos if (res == NULL) { 4638585484eSchristos fputs(_("no memory for char-mapper span map\n"), stderr); 4648585484eSchristos exit(EXIT_FAILURE); 4658585484eSchristos } 4668585484eSchristos 4678585484eSchristos memset(res, 0, 256); 4688585484eSchristos for (; ix < 128; ix++) 4698585484eSchristos if (ag_char_map_table[ix] & mask) 4708585484eSchristos res[ix] = 1; 4718585484eSchristos ag_char_map_spanners[mask_ix] = res; 4728585484eSchristos } 4738585484eSchristos #ifdef LOCK_SPANNER_TABLES 4748585484eSchristos pthread_mutex_unlock(&ag_char_map_mutex); 4758585484eSchristos #endif 4768585484eSchristos return ag_char_map_spanners[mask_ix]; 4778585484eSchristos } 4788585484eSchristos #define ag_char_map_masks POISONED_ag_char_map_masks 4798585484eSchristos 4808585484eSchristos static inline int 4818585484eSchristos is_ag_char_map_char(char ch, ag_char_map_mask_t mask) 4828585484eSchristos { 4838585484eSchristos unsigned int ix = (unsigned char)ch; 4848585484eSchristos return ((ix < 128) && ((ag_char_map_table[ix] & mask) != 0)); 4858585484eSchristos } 4868585484eSchristos 4878585484eSchristos static inline char * 4888585484eSchristos spn_ag_char_map_chars(char const * p, unsigned int mask_ix) 4898585484eSchristos { 4908585484eSchristos unsigned char const * v = ag_char_map_spanners[mask_ix]; 4918585484eSchristos if (v == NULL) 4928585484eSchristos v = calc_ag_char_map_spanners(mask_ix); 4938585484eSchristos while (v[(unsigned char)*p]) p++; 4948585484eSchristos return (char *)(uintptr_t)p; 4958585484eSchristos } 4968585484eSchristos 4978585484eSchristos static inline char * 4988585484eSchristos brk_ag_char_map_chars(char const * p, unsigned int mask_ix) 4998585484eSchristos { 5008585484eSchristos unsigned char const * v = ag_char_map_spanners[mask_ix]; 5018585484eSchristos if (v == NULL) 5028585484eSchristos v = calc_ag_char_map_spanners(mask_ix); 5038585484eSchristos while ((*p != '\0') && (! v[(unsigned char)*p])) p++; 5048585484eSchristos return (char *)(uintptr_t)p; 5058585484eSchristos } 5068585484eSchristos 5078585484eSchristos static inline char * 5088585484eSchristos spn_ag_char_map_back(char const * s, char const * e, unsigned int mask_ix) 5098585484eSchristos { 5108585484eSchristos unsigned char const * v = ag_char_map_spanners[mask_ix]; 5118585484eSchristos if (v == NULL) 5128585484eSchristos v = calc_ag_char_map_spanners(mask_ix); 5138585484eSchristos if (s >= e) e = s + strlen(s); 5148585484eSchristos while ((e > s) && v[(unsigned char)e[-1]]) e--; 5158585484eSchristos return (char *)(uintptr_t)e; 5168585484eSchristos } 5178585484eSchristos 5188585484eSchristos static inline char * 5198585484eSchristos brk_ag_char_map_back(char const * s, char const * e, unsigned int mask_ix) 5208585484eSchristos { 5218585484eSchristos unsigned char const * v = ag_char_map_spanners[mask_ix]; 5228585484eSchristos if (v == NULL) 5238585484eSchristos v = calc_ag_char_map_spanners(mask_ix); 5248585484eSchristos if (s == e) e += strlen(e); 5258585484eSchristos while ((e > s) && (! v[(unsigned char)e[-1]])) e--; 5268585484eSchristos return (char *)(uintptr_t)e; 5278585484eSchristos } 528abb0f93cSkardel #endif /* AG_CHAR_MAP_H_GUARD */ 529