X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=regex.c;h=5b1b391dab7dff072152bd3e7cf7ddb94bdf6b28;hb=69a9b8f8d7acc8677b5657adb83a8ba448737e0c;hp=022ca13eba6f13fca636e2e136bedd49f8e30254;hpb=972e3e06142a2a253a022b8ad3d8c4e0baf80c8b;p=gnulib.git diff --git a/regex.c b/regex.c index 022ca13eb..5b1b391da 100644 --- a/regex.c +++ b/regex.c @@ -33,9 +33,6 @@ #pragma alloca #endif -#undef _GNU_SOURCE -#define _GNU_SOURCE - #ifdef HAVE_CONFIG_H # include #endif @@ -160,8 +157,9 @@ { \ re_char *dtemp = (p) == (str2) ? (end1) : (p); \ re_char *dlimit = ((p) > (str2) && (p) <= (end2)) ? (str2) : (str1); \ - while (dtemp-- > dlimit && !CHAR_HEAD_P (*dtemp)); \ - c = STRING_CHAR (dtemp, (p) - dtemp); \ + re_char *d0 = dtemp; \ + PREV_CHAR_BOUNDARY (d0, dlimit); \ + c = STRING_CHAR (d0, dtemp - d0); \ } \ else \ (c = ((p) == (str2) ? (end1) : (p))[-1]); \ @@ -238,6 +236,7 @@ enum syntaxcode { Swhitespace = 0, Sword = 1 }; # define SINGLE_BYTE_CHAR_P(c) (1) # define SAME_CHARSET_P(c1, c2) (1) # define MULTIBYTE_FORM_LENGTH(p, s) (1) +# define PREV_CHAR_BOUNDARY(p, limit) ((p)--) # define STRING_CHAR(p, s) (*(p)) # define RE_STRING_CHAR STRING_CHAR # define CHAR_STRING(c, s) (*(s) = (c), 1) @@ -2066,7 +2065,7 @@ re_wctype_to_bit (cc) static void extend_range_table_work_area (work_area) struct range_table_work_area *work_area; -{ +{ work_area->allocated += 16 * sizeof (int); if (work_area->table) work_area->table @@ -2105,7 +2104,7 @@ set_image_of_range_1 (work_area, start, end, translate) `strange' indicates a character that has more than one case-equivalent. */ - + enum case_type {one_case, two_case, strange}; /* Describe the run that is in progress, @@ -2175,7 +2174,7 @@ set_image_of_range_1 (work_area, start, end, translate) } run_type = strange; } - + if (this_type == strange) { /* For a strange character, add each of its equivalents, one @@ -2625,7 +2624,7 @@ regex_compile (pattern, size, syntax, bufp) (simple || !analyse_first (laststart, b, NULL, 0)) ? on_failure_jump : on_failure_jump_loop; assert (skip_one_char (laststart) <= b); - + if (!zero_times_ok && simple) { /* Since simple * loops can be made faster by using on_failure_keep_string_jump, we turn simple P+ @@ -3942,7 +3941,7 @@ analyse_first (p, pend, fastmap, multibyte) case has already been handled, so we only need to look at the fallthrough case. */ continue; - + case succeed_n: /* If N == 0, it should be an on_failure_jump_loop instead. */ DEBUG_STATEMENT (EXTRACT_NUMBER (j, p + 2); assert (j > 0)); @@ -4067,6 +4066,10 @@ re_search (bufp, string, size, startpos, range, regs) } WEAK_ALIAS (__re_search, re_search) +/* Head address of virtual concatenation of string. */ +#define HEAD_ADDR_VSTRING(P) \ + (((P) >= size1 ? string2 : string1)) + /* End address of virtual concatenation of string. */ #define STOP_ADDR_VSTRING(P) \ (((P) >= size1 ? string2 + size2 : string1 + size1)) @@ -4302,26 +4305,17 @@ re_search_2 (bufp, str1, size1, str2, size2, startpos, range, regs, stop) /* Update STARTPOS to the previous character boundary. */ if (multibyte) { - re_char *p = POS_ADDR_VSTRING (startpos); - int len = 0; + re_char *p = POS_ADDR_VSTRING (startpos) + 1; + re_char *p0 = p; + re_char *phead = HEAD_ADDR_VSTRING (startpos); /* Find the head of multibyte form. */ - while (!CHAR_HEAD_P (*p)) - p--, len++; - - /* Adjust it. */ -#if 0 /* XXX */ - if (MULTIBYTE_FORM_LENGTH (p, len + 1) != (len + 1)) - ; - else -#endif - { - range += len; - if (range > 0) - break; + PREV_CHAR_BOUNDARY (p, phead); + range += p0 - 1 - p; + if (range > 0) + break; - startpos -= len; - } + startpos -= p0 - 1 - p; } } } @@ -4430,7 +4424,7 @@ skip_one_char (p) { case anychar: break; - + case exactn: p += *p + 1; break; @@ -4447,7 +4441,7 @@ skip_one_char (p) else p += 1 + CHARSET_BITMAP_SIZE (p - 1); break; - + case syntaxspec: case notsyntaxspec: #ifdef emacs @@ -4530,7 +4524,7 @@ mutually_exclusive_p (bufp, p1, p2) return 1; } break; - + case endline: case exactn: { @@ -4640,7 +4634,7 @@ mutually_exclusive_p (bufp, p1, p2) } } break; - + case charset_not: switch (SWITCH_ENUM_CAST (*p1)) { @@ -5324,7 +5318,7 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop) assert (!REG_UNSET (regstart[*p])); /* Strictly speaking, there should be code such as: - + assert (REG_UNSET (regend[*p])); PUSH_FAILURE_REGSTOP ((unsigned int)*p); @@ -5741,7 +5735,7 @@ re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop) PREFETCH (); c2 = RE_STRING_CHAR (d, dend - d); s2 = SYNTAX (c2); - + /* Case 2: S2 is not Sword. */ if (s2 != Sword) goto fail;