Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #if !defined (_ParseRules_h_)
00025 #define _ParseRules_h_
00026
00027 #include <string.h>
00028
00029 #include "ink_defs.h"
00030 #include "ink_apidefs.h"
00031 #include "ink_platform.h"
00032
00033 typedef unsigned int CTypeResult;
00034
00035
00036
00037 #define USE_SI_MULTILIERS 1
00038
00039 #define is_char_BIT (1 << 0)
00040 #define is_upalpha_BIT (1 << 1)
00041 #define is_loalpha_BIT (1 << 2)
00042 #define is_alpha_BIT (1 << 3)
00043 #define is_digit_BIT (1 << 4)
00044 #define is_ctl_BIT (1 << 5)
00045 #define is_ws_BIT (1 << 6)
00046 #define is_hex_BIT (1 << 7)
00047 #define is_pchar_BIT (1 << 8)
00048 #define is_extra_BIT (1 << 9)
00049 #define is_safe_BIT (1 << 10)
00050 #define is_unsafe_BIT (1 << 11)
00051 #define is_national_BIT (1 << 12)
00052 #define is_reserved_BIT (1 << 13)
00053 #define is_unreserved_BIT (1 << 14)
00054 #define is_punct_BIT (1 << 15)
00055 #define is_end_of_url_BIT (1 << 16)
00056 #define is_tspecials_BIT (1 << 17)
00057 #define is_spcr_BIT (1 << 18)
00058 #define is_splf_BIT (1 << 19)
00059 #define is_wslfcr_BIT (1 << 20)
00060 #define is_eow_BIT (1 << 21)
00061 #define is_token_BIT (1 << 22)
00062 #define is_wildmat_BIT (1 << 23)
00063 #define is_sep_BIT (1 << 24)
00064 #define is_empty_BIT (1 << 25)
00065 #define is_alnum_BIT (1 << 26)
00066 #define is_space_BIT (1 << 27)
00067 #define is_control_BIT (1 << 28)
00068 #define is_mime_sep_BIT (1 << 29)
00069 #define is_http_field_name_BIT (1 << 30)
00070
00071 #define is_http_field_value_BIT (((CTypeResult)1) << 31)
00072
00073 extern ink_undoc_liapi const CTypeResult parseRulesCType[];
00074 inkcoreapi extern const char parseRulesCTypeToUpper[];
00075 inkcoreapi extern const char parseRulesCTypeToLower[];
00076
00077 class ParseRules
00078 {
00079 public:
00080 ParseRules();
00081
00082
00083
00084
00085
00086 enum
00087 {
00088 CHAR_SP = 32,
00089 CHAR_HT = 9,
00090 CHAR_LF = 10,
00091 CHAR_VT = 11,
00092 CHAR_NP = 12,
00093 CHAR_CR = 13
00094 };
00095
00096
00097
00098
00099
00100 static CTypeResult is_type(char c, uint32_t bit);
00101
00102 static CTypeResult is_char(char c);
00103 static CTypeResult is_upalpha(char c);
00104 static CTypeResult is_loalpha(char c);
00105 static CTypeResult is_alpha(char c);
00106 static CTypeResult is_digit(char c);
00107 static CTypeResult is_ctl(char c);
00108 static CTypeResult is_hex(char c);
00109 static CTypeResult is_ws(char c);
00110 static CTypeResult is_cr(char c);
00111 static CTypeResult is_lf(char c);
00112 static CTypeResult is_spcr(char c);
00113 static CTypeResult is_splf(char c);
00114 static CTypeResult is_wslfcr(char c);
00115 static CTypeResult is_tspecials(char c);
00116 static CTypeResult is_token(char c);
00117 static CTypeResult is_extra(char c);
00118 static CTypeResult is_safe(char c);
00119 static CTypeResult is_unsafe(char c);
00120 static CTypeResult is_national(char c);
00121 static CTypeResult is_reserved(char c);
00122 static CTypeResult is_unreserved(char c);
00123 static CTypeResult is_punct(char c);
00124 static CTypeResult is_end_of_url(char c);
00125 static CTypeResult is_eow(char c);
00126 static CTypeResult is_wildmat(char c);
00127 static CTypeResult is_sep(char c);
00128 static CTypeResult is_empty(char c);
00129 static CTypeResult is_alnum(char c);
00130 static CTypeResult is_space(char c);
00131 static CTypeResult is_control(char c);
00132 static CTypeResult is_mime_sep(char c);
00133 static CTypeResult is_http_field_name(char c);
00134 static CTypeResult is_http_field_value(char c);
00135
00136
00137
00138
00139
00140 static CTypeResult is_escape(const char *seq);
00141 static CTypeResult is_uchar(const char *seq);
00142 static CTypeResult is_pchar(const char *seq);
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 static CTypeResult strncasecmp_eow(const char *s1, const char *s2, int n);
00156 static const char *strcasestr(const char *s1, const char *s2);
00157 static int strlen_eow(const char *s);
00158 static const char *strstr_eow(const char *s1, const char *s2);
00159
00160 static char ink_toupper(char c);
00161 static char ink_tolower(char c);
00162 static void ink_tolower_buffer(char *ptr, unsigned int n);
00163 static const char *memchr(const char *s, char c, int max_length);
00164 static const char *strchr(const char *s, char c);
00165
00166 static unsigned char *scan_while(unsigned char *ptr, unsigned int n, uint32_t bitmask);
00167
00168 private:
00169 ParseRules(const ParseRules &);
00170 ParseRules & operator =(const ParseRules &);
00171 };
00172
00173
00174
00175
00176
00177 inline CTypeResult
00178 ParseRules::is_type(char c, uint32_t bitmask)
00179 {
00180 return (parseRulesCType[(unsigned char) c] & bitmask);
00181 }
00182
00183 inline CTypeResult
00184 ParseRules::is_char(char c)
00185 {
00186 #ifndef COMPILE_PARSE_RULES
00187 return (parseRulesCType[(unsigned char) c] & is_char_BIT);
00188 #else
00189 return ((c & 0x80) == 0);
00190 #endif
00191 }
00192
00193 inline CTypeResult
00194 ParseRules::is_upalpha(char c)
00195 {
00196 #ifndef COMPILE_PARSE_RULES
00197 return (parseRulesCType[(unsigned char) c] & is_upalpha_BIT);
00198 #else
00199 return (c >= 'A' && c <= 'Z');
00200 #endif
00201 }
00202
00203 inline CTypeResult
00204 ParseRules::is_loalpha(char c)
00205 {
00206 #ifndef COMPILE_PARSE_RULES
00207 return (parseRulesCType[(unsigned char) c] & is_loalpha_BIT);
00208 #else
00209 return (c >= 'a' && c <= 'z');
00210 #endif
00211 }
00212
00213 inline CTypeResult
00214 ParseRules::is_alpha(char c)
00215 {
00216 #ifndef COMPILE_PARSE_RULES
00217 return (parseRulesCType[(unsigned char) c] & is_alpha_BIT);
00218 #else
00219 return (is_upalpha(c) || is_loalpha(c));
00220 #endif
00221 }
00222
00223 inline CTypeResult
00224 ParseRules::is_digit(char c)
00225 {
00226 #ifndef COMPILE_PARSE_RULES
00227 return (parseRulesCType[(unsigned char) c] & is_digit_BIT);
00228 #else
00229 return (c >= '0' && c <= '9');
00230 #endif
00231 }
00232
00233 inline CTypeResult
00234 ParseRules::is_alnum(char c)
00235 {
00236 #ifndef COMPILE_PARSE_RULES
00237 return (parseRulesCType[(unsigned char) c] & is_alnum_BIT);
00238 #else
00239 return (is_alpha(c) || is_digit(c));
00240 #endif
00241 }
00242
00243 inline CTypeResult
00244 ParseRules::is_ctl(char c)
00245 {
00246 #ifndef COMPILE_PARSE_RULES
00247 return (parseRulesCType[(unsigned char) c] & is_ctl_BIT);
00248 #else
00249 return ((!(c & 0x80) && c <= 31) || c == 127);
00250 #endif
00251 }
00252
00253 inline CTypeResult
00254 ParseRules::is_ws(char c)
00255 {
00256 #ifndef COMPILE_PARSE_RULES
00257 return (parseRulesCType[(unsigned char) c] & is_ws_BIT);
00258 #else
00259 return (c == CHAR_SP || c == CHAR_HT);
00260 #endif
00261 }
00262
00263 inline CTypeResult
00264 ParseRules::is_hex(char c)
00265 {
00266 #ifndef COMPILE_PARSE_RULES
00267 return (parseRulesCType[(unsigned char) c] & is_hex_BIT);
00268 #else
00269 return ((c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f') || (c >= '0' && c <= '9'));
00270 #endif
00271 }
00272
00273 inline CTypeResult
00274 ParseRules::is_cr(char c)
00275 {
00276 return (c == CHAR_CR);
00277 }
00278
00279 inline CTypeResult
00280 ParseRules::is_lf(char c)
00281 {
00282 return (c == CHAR_LF);
00283 }
00284
00285 inline CTypeResult
00286 ParseRules::is_splf(char c)
00287 {
00288 #ifndef COMPILE_PARSE_RULES
00289 return (parseRulesCType[(unsigned char) c] & is_splf_BIT);
00290 #else
00291 return (c == CHAR_SP || c == CHAR_LF);
00292 #endif
00293 }
00294
00295 inline CTypeResult
00296 ParseRules::is_spcr(char c)
00297 {
00298 #ifndef COMPILE_PARSE_RULES
00299 return (parseRulesCType[(unsigned char) c] & is_spcr_BIT);
00300 #else
00301 return (c == CHAR_SP || c == CHAR_CR);
00302 #endif
00303 }
00304
00305 inline CTypeResult
00306 ParseRules::is_wslfcr(char c)
00307 {
00308 #ifndef COMPILE_PARSE_RULES
00309 return (parseRulesCType[(unsigned char) c] & is_wslfcr_BIT);
00310 #else
00311 return ParseRules::is_ws(c) || ParseRules::is_splf(c) || ParseRules::is_spcr(c);
00312 #endif
00313 }
00314
00315 inline CTypeResult
00316 ParseRules::is_extra(char c)
00317 {
00318 #ifndef COMPILE_PARSE_RULES
00319 return (parseRulesCType[(unsigned char) c] & is_extra_BIT);
00320 #else
00321 switch (c) {
00322 case '!':
00323 case '*':
00324 case '\'':
00325 case '(':
00326 case ')':
00327 case ',':
00328 return (true);
00329 }
00330 return (false);
00331 #endif
00332 }
00333
00334 inline CTypeResult
00335 ParseRules::is_safe(char c)
00336 {
00337 #ifndef COMPILE_PARSE_RULES
00338 return (parseRulesCType[(unsigned char) c] & is_safe_BIT);
00339 #else
00340 return (c == '$' || c == '-' || c == '_' || c == '.' || c == '+');
00341 #endif
00342 }
00343
00344 inline CTypeResult
00345 ParseRules::is_unsafe(char c)
00346 {
00347 #ifndef COMPILE_PARSE_RULES
00348 return (parseRulesCType[(unsigned char) c] & is_unsafe_BIT);
00349 #else
00350 if (is_ctl(c))
00351 return (true);
00352
00353 switch (c) {
00354 case ' ':
00355 case '\"':
00356 case '#':
00357 case '%':
00358 case '<':
00359 case '>':
00360 return (true);
00361 }
00362 return (false);
00363 #endif
00364 }
00365
00366 inline CTypeResult
00367 ParseRules::is_reserved(char c)
00368 {
00369 #ifndef COMPILE_PARSE_RULES
00370 return (parseRulesCType[(unsigned char) c] & is_reserved_BIT);
00371 #else
00372 switch (c) {
00373 case ';':
00374 case '/':
00375 case '?':
00376 case ':':
00377 case '@':
00378 case '&':
00379 case '=':
00380 return (true);
00381 }
00382 return (false);
00383 #endif
00384 }
00385
00386 inline CTypeResult
00387 ParseRules::is_national(char c)
00388 {
00389 #ifndef COMPILE_PARSE_RULES
00390 return (parseRulesCType[(unsigned char) c] & is_national_BIT);
00391 #else
00392 switch (c) {
00393 case '{':
00394 case '}':
00395 case '|':
00396 case '\\':
00397 case '^':
00398 case '~':
00399 case '[':
00400 case ']':
00401 case '`':
00402 return (true);
00403 }
00404 return (false);
00405 #endif
00406 }
00407
00408 inline CTypeResult
00409 ParseRules::is_unreserved(char c)
00410 {
00411 #ifndef COMPILE_PARSE_RULES
00412 return (parseRulesCType[(unsigned char) c] & is_unreserved_BIT);
00413 #else
00414 return (is_alpha(c) || is_digit(c) || is_safe(c) || is_extra(c) || is_national(c));
00415 #endif
00416 }
00417
00418 inline CTypeResult
00419 ParseRules::is_punct(char c)
00420 {
00421 #ifndef COMPILE_PARSE_RULES
00422 return (parseRulesCType[(unsigned char) c] & is_punct_BIT);
00423 #else
00424 switch (c) {
00425 case '!':
00426 case '"':
00427 case '#':
00428 case '%':
00429 case '&':
00430 case '\'':
00431 case '(':
00432 case ')':
00433 case '*':
00434 case '+':
00435 case ',':
00436 case '-':
00437 case '.':
00438 case '/':
00439 case ':':
00440 case ';':
00441 case '<':
00442 case '=':
00443 case '>':
00444 case '?':
00445 case '@':
00446 case '[':
00447 case '\\':
00448 case ']':
00449 case '^':
00450 case '_':
00451 case '`':
00452 case '{':
00453 case '|':
00454 case '}':
00455 case '~':
00456 return (true);
00457 }
00458 return (false);
00459 #endif
00460 }
00461
00462 inline CTypeResult
00463 ParseRules::is_end_of_url(char c)
00464 {
00465 #ifndef COMPILE_PARSE_RULES
00466 return (parseRulesCType[(unsigned char) c] & is_end_of_url_BIT);
00467 #else
00468 return (c == '\0' || c == '\n' || c == ' ' || ParseRules::is_ctl(c)
00469 );
00470 #endif
00471 }
00472
00473 inline CTypeResult
00474 ParseRules::is_escape(const char *seq)
00475 {
00476 return (seq[0] == '%' && is_hex(seq[1]) && is_hex(seq[2]));
00477 }
00478
00479 inline CTypeResult
00480 ParseRules::is_uchar(const char *seq)
00481 {
00482 return (is_unreserved(seq[0]) || is_escape(seq));
00483 }
00484
00485
00486
00487
00488 inline CTypeResult
00489 ParseRules::is_pchar(const char *seq)
00490 {
00491 #ifndef COMPILE_PARSE_RULES
00492 if (*seq != '%')
00493 return (parseRulesCType[(uint8_t)*seq] & is_pchar_BIT);
00494 else
00495 return is_hex(seq[1]) && is_hex(seq[2]);
00496 #else
00497 if (is_unreserved(*seq))
00498 return (true);
00499
00500 switch (seq[0]) {
00501 case ':':
00502 case '@':
00503 case '&':
00504 case '=':
00505 case '+':
00506 return (true);
00507 }
00508 return (false);
00509 #endif
00510 }
00511
00512 inline CTypeResult
00513 ParseRules::is_tspecials(char c)
00514 {
00515 #ifndef COMPILE_PARSE_RULES
00516 return (parseRulesCType[(unsigned char) c] & is_tspecials_BIT);
00517 #else
00518 switch (c) {
00519 case '(':
00520 case ')':
00521 case '<':
00522 case '>':
00523 case '@':
00524 case ',':
00525 case ';':
00526 case ':':
00527 case '\\':
00528 case '"':
00529 case '/':
00530 case '[':
00531 case ']':
00532 case '?':
00533 case '=':
00534 case '{':
00535 case '}':
00536 case CHAR_SP:
00537 case CHAR_HT:
00538 return (true);
00539 }
00540 return (false);
00541 #endif
00542 }
00543
00544 inline CTypeResult
00545 ParseRules::is_token(char c)
00546 {
00547 #ifndef COMPILE_PARSE_RULES
00548 return (parseRulesCType[(unsigned char) c] & is_token_BIT);
00549 #else
00550 return (is_char(c) && !(is_ctl(c) || is_tspecials(c)));
00551 #endif
00552 }
00553
00554 inline char
00555 ParseRules::ink_toupper(char c)
00556 {
00557 #ifndef COMPILE_PARSE_RULES
00558 return parseRulesCTypeToUpper[(unsigned char) c];
00559 #else
00560 int up_case = c;
00561 const int up_case_diff = 'a' - 'A';
00562
00563 if (c >= 'a' && c <= 'z') {
00564 up_case = c - up_case_diff;
00565 }
00566 return (up_case);
00567 #endif
00568 }
00569
00570 inline char
00571 ParseRules::ink_tolower(char c)
00572 {
00573 #ifndef COMPILE_PARSE_RULES
00574 return parseRulesCTypeToLower[(unsigned char) c];
00575 #else
00576 int lo_case = c;
00577 const int lo_case_diff = 'a' - 'A';
00578
00579 if (c >= 'A' && c <= 'Z') {
00580 lo_case = c + lo_case_diff;
00581 }
00582 return (lo_case);
00583 #endif
00584 }
00585
00586 inline CTypeResult
00587 ParseRules::is_eow(char c)
00588 {
00589 #ifndef COMPILE_PARSE_RULES
00590 return (parseRulesCType[(unsigned char) c] & is_eow_BIT);
00591 #else
00592 return (c == '\0' || c == '\r' || c == '\n');
00593 #endif
00594 }
00595
00596 inline CTypeResult
00597 ParseRules::is_wildmat(char c)
00598 {
00599 #ifndef COMPILE_PARSE_RULES
00600 return (parseRulesCType[(unsigned char) c] & is_wildmat_BIT);
00601 #else
00602 return (c == '*' || c == '?' || c == '[' || c == '\\');
00603 #endif
00604 }
00605
00606 inline CTypeResult
00607 ParseRules::is_sep(char c)
00608 {
00609 #ifndef COMPILE_PARSE_RULES
00610 return (parseRulesCType[(unsigned char) c] & is_sep_BIT);
00611 #else
00612 return (!c || c == ',' || c == ':' || c == '!' || is_wslfcr(c));
00613 #endif
00614 }
00615
00616 inline CTypeResult
00617 ParseRules::is_empty(char c)
00618 {
00619 #ifndef COMPILE_PARSE_RULES
00620 return (parseRulesCType[(unsigned char) c] & is_empty_BIT);
00621 #else
00622 return (c == '#' || is_wslfcr(c));
00623 #endif
00624 }
00625
00626 inline CTypeResult
00627 ParseRules::is_space(char c)
00628 {
00629 #ifndef COMPILE_PARSE_RULES
00630 return (parseRulesCType[(unsigned char) c] & is_space_BIT);
00631 #else
00632 switch (c) {
00633 case CHAR_SP:
00634 case CHAR_HT:
00635 case CHAR_LF:
00636 case CHAR_VT:
00637 case CHAR_NP:
00638 case CHAR_CR:
00639 return (true);
00640 }
00641 return (false);
00642 #endif
00643 }
00644
00645 inline CTypeResult
00646 ParseRules::is_control(char c)
00647 {
00648 #ifndef COMPILE_PARSE_RULES
00649 return (parseRulesCType[(unsigned char) c] & is_control_BIT);
00650 #else
00651 if (((unsigned char) c) < 32 || ((unsigned char) c) == 127)
00652 return true;
00653 return false;
00654 #endif
00655 }
00656
00657 inline CTypeResult
00658 ParseRules::is_mime_sep(char c)
00659 {
00660 #ifndef COMPILE_PARSE_RULES
00661 return (parseRulesCType[(unsigned char) c] & is_mime_sep_BIT);
00662 #else
00663 if ((c == '(') || (c == ')') || (c == '<') || (c == '>') || (c == '@') ||
00664 (c == ',') || (c == ';') || (c == '\\') || (c == '\"') ||
00665 (c == '/') || (c == '[') || (c == ']') || (c == '?') || (c == '{') || (c == '}') || (c == ' ') || (c == '\t'))
00666 return true;
00667 return false;
00668 #endif
00669 }
00670
00671 inline CTypeResult
00672 ParseRules::is_http_field_name(char c)
00673 {
00674 #ifndef COMPILE_PARSE_RULES
00675 return (parseRulesCType[(unsigned char) c] & is_http_field_name_BIT);
00676 #else
00677 if ((c == ':') || (is_mime_sep(c) && (c != '@')))
00678 return false;
00679 return true;
00680 #endif
00681 }
00682
00683 inline CTypeResult
00684 ParseRules::is_http_field_value(char c)
00685 {
00686 #ifndef COMPILE_PARSE_RULES
00687 return (CTypeResult) (parseRulesCType[(unsigned char) c] & is_http_field_value_BIT);
00688 #else
00689 switch (c) {
00690 case CHAR_CR:
00691 case CHAR_LF:
00692 case '\"':
00693 case ',':
00694 return false;
00695 }
00696 return true;
00697 #endif
00698 }
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710 inline CTypeResult
00711 ParseRules::strncasecmp_eow(const char *s1, const char *s2, int count)
00712 {
00713 for (int i = 0; i < count; i++) {
00714 const char &a = s1[i];
00715 const char &b = s2[i];
00716
00717
00718
00719
00720 if (ink_tolower(a) != ink_tolower(b))
00721 return (is_eow(a) && is_eow(b));
00722 }
00723 return (true);
00724 }
00725
00726
00727
00728
00729
00730
00731
00732 inline int
00733 ParseRules::strlen_eow(const char *s)
00734 {
00735 for (int i = 0; true; i++) {
00736 if (is_eow(s[i]))
00737 return (i);
00738 }
00739 }
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749 inline const char *
00750 ParseRules::strstr_eow(const char *s1, const char *s2)
00751 {
00752 int i1;
00753
00754 int s2_len = strlen_eow(s2);
00755
00756 for (i1 = 0; !is_eow(s1[i1]); i1++)
00757 if (ink_tolower(s1[i1]) == ink_tolower(s2[0]))
00758 if (strncasecmp_eow(&s1[i1], &s2[0], s2_len))
00759 return (&s1[i1]);
00760
00761 return (0);
00762 }
00763
00764 inline const char *
00765 ParseRules::strcasestr(const char *s1, const char *s2)
00766 {
00767 int i1;
00768
00769 size_t s2_len = strlen(s2);
00770
00771 for (i1 = 0; s1[i1] != '\0'; i1++)
00772 if (ink_tolower(s1[i1]) == ink_tolower(s2[0]))
00773 if (strncasecmp_eow(&s1[i1], &s2[0], (int) s2_len))
00774 return (&s1[i1]);
00775
00776 return (0);
00777 }
00778
00779 inline const char *
00780 ParseRules::memchr(const char *s, char c, int max_length)
00781 {
00782 for (int i = 0; i < max_length; i++)
00783 if (s[i] == c)
00784 return (&s[i]);
00785 return (0);
00786 }
00787
00788 inline const char *
00789 ParseRules::strchr(const char *s, char c)
00790 {
00791 for (int i = 0; s[i] != '\0'; i++)
00792 if (s[i] == c)
00793 return (&s[i]);
00794 return (0);
00795 }
00796
00797 static inline int
00798 ink_get_hex(char c)
00799 {
00800 if (ParseRules::is_digit(c))
00801 return (int) (c - '0');
00802 c = ParseRules::ink_tolower(c);
00803 return (int) ((c - 'a') + 10);
00804 }
00805
00806 int64_t ink_atoi64(const char *);
00807 uint64_t ink_atoui64(const char *);
00808 int64_t ink_atoi64(const char *, int);
00809
00810
00811 static inline int
00812 ink_atoi(const char *str)
00813 {
00814 int64_t val = ink_atoi64(str);
00815
00816 if (val > INT_MAX)
00817 return INT_MAX;
00818 else if (val < INT_MIN)
00819 return INT_MIN;
00820 else
00821 return static_cast<int>(val);
00822 }
00823
00824 static inline int
00825 ink_atoi(const char *str, int len)
00826 {
00827 int64_t val = ink_atoi64(str, len);
00828
00829 if (val > INT_MAX)
00830 return INT_MAX;
00831 else if (val < INT_MIN)
00832 return INT_MIN;
00833 else
00834 return static_cast<int>(val);
00835 }
00836
00837 static inline unsigned int
00838 ink_atoui(const char *str)
00839 {
00840 uint64_t val = ink_atoui64(str);
00841
00842 if (val > INT_MAX)
00843 return INT_MAX;
00844 else
00845 return static_cast<int>(val);
00846 }
00847
00848 #endif