| 3384 | return REG_ERANGE; |
| 3385 | } |
| 3386 | elem->type = SB_CHAR; |
| 3387 | elem->opr.ch = token->opr.c; |
| 3388 | return REG_NOERROR; |
| 3389 | } |
| 3390 | |
| 3391 | /* Parse a bracket symbol in the bracket expression. Bracket symbols are |
| 3392 | such as [:<character_class>:], [.<collating_element>.], and |
| 3393 | [=<equivalent_class>=]. */ |
| 3394 | |
| 3395 | static reg_errcode_t |
| 3396 | parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp, |
| 3397 | re_token_t *token) |
| 3398 | { |
| 3399 | unsigned char ch, delim = token->opr.c; |
| 3400 | int i = 0; |
| 3401 | if (re_string_eoi(regexp)) |
| 3402 | return REG_EBRACK; |
| 3403 | for (;; ++i) |
| 3404 | { |
| 3405 | if (i >= BRACKET_NAME_BUF_SIZE) |
| 3406 | return REG_EBRACK; |
| 3407 | if (token->type == OP_OPEN_CHAR_CLASS) |
| 3408 | ch = re_string_fetch_byte_case (regexp); |
| 3409 | else |
| 3410 | ch = re_string_fetch_byte (regexp); |
| 3411 | if (re_string_eoi(regexp)) |
| 3412 | return REG_EBRACK; |
| 3413 | if (ch == delim && re_string_peek_byte (regexp, 0) == ']') |
| 3414 | break; |
| 3415 | elem->opr.name[i] = ch; |
| 3416 | } |
| 3417 | re_string_skip_bytes (regexp, 1); |
| 3418 | elem->opr.name[i] = '\0'; |
| 3419 | switch (token->type) |
| 3420 | { |
| 3421 | case OP_OPEN_COLL_ELEM: |
| 3422 | elem->type = COLL_SYM; |
| 3423 | break; |
| 3424 | case OP_OPEN_EQUIV_CLASS: |
| 3425 | elem->type = EQUIV_CLASS; |
| 3426 | break; |
| 3427 | case OP_OPEN_CHAR_CLASS: |
| 3428 | elem->type = CHAR_CLASS; |
no outgoing calls
no test coverage detected