comparison src/regex.c @ 83542:2d56e13fd23d

Merged from emacs@sv.gnu.org Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-413 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-414 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-415 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-416 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-417 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-418 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-419 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-420 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-421 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-422 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-423 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-424 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-425 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-426 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-427 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-428 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-429 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-430 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-431 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-432 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-433 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-434 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-435 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-436 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-437 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-438 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-439 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-440 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-441 lisp/url/url-methods.el: Fix format error when http_proxy is empty string * emacs@sv.gnu.org/emacs--devo--0--patch-442 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-443 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-444 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-445 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-446 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-447 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-448 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-449 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-450 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-451 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-452 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-453 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-454 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-455 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-456 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-457 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-458 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-459 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-460 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-461 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-462 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-463 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-464 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-465 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-466 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-467 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-468 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-469 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-470 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-471 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-472 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-473 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-128 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-129 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-130 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-131 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-132 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-133 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-134 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-135 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-136 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-137 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-138 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-139 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-140 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-141 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-142 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-143 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-144 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-145 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-146 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-147 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-148 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-149 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-582
author Karoly Lorentey <lorentey@elte.hu>
date Sat, 14 Oct 2006 17:36:28 +0000
parents 866effff65a4 3501fcb2e68c
children c71725faff1a
comparison
equal deleted inserted replaced
83541:694bbb62a75d 83542:2d56e13fd23d
2528 2528
2529 /* Initialize the pattern buffer. */ 2529 /* Initialize the pattern buffer. */
2530 bufp->syntax = syntax; 2530 bufp->syntax = syntax;
2531 bufp->fastmap_accurate = 0; 2531 bufp->fastmap_accurate = 0;
2532 bufp->not_bol = bufp->not_eol = 0; 2532 bufp->not_bol = bufp->not_eol = 0;
2533 bufp->used_syntax = 0;
2533 2534
2534 /* Set `used' to zero, so that if we return an error, the pattern 2535 /* Set `used' to zero, so that if we return an error, the pattern
2535 printer (for debugging) will think there's no pattern. We reset it 2536 printer (for debugging) will think there's no pattern. We reset it
2536 at the end. */ 2537 at the end. */
2537 bufp->used = 0; 2538 bufp->used = 0;
2940 int translated = TRANSLATE (ch); 2941 int translated = TRANSLATE (ch);
2941 if (re_iswctype (btowc (ch), cc)) 2942 if (re_iswctype (btowc (ch), cc))
2942 SET_LIST_BIT (translated); 2943 SET_LIST_BIT (translated);
2943 } 2944 }
2944 2945
2946 /* In most cases the matching rule for char classes
2947 only uses the syntax table for multibyte chars,
2948 so that the content of the syntax-table it is not
2949 hardcoded in the range_table. SPACE and WORD are
2950 the two exceptions. */
2951 if ((1 << cc) & ((1 << RECC_SPACE) | (1 << RECC_WORD)))
2952 bufp->used_syntax = 1;
2953
2945 /* Repeat the loop. */ 2954 /* Repeat the loop. */
2946 continue; 2955 continue;
2947 } 2956 }
2948 else 2957 else
2949 { 2958 {
3875 3884
3876 case exactn: 3885 case exactn:
3877 if (fastmap) 3886 if (fastmap)
3878 { 3887 {
3879 int c = RE_STRING_CHAR (p + 1, pend - p); 3888 int c = RE_STRING_CHAR (p + 1, pend - p);
3880 3889 /* When fast-scanning, the fastmap can be indexed either with
3890 a char (smaller than 256) or with the first byte of
3891 a char's byte sequence. So we have to conservatively add
3892 both to the table. */
3881 if (SINGLE_BYTE_CHAR_P (c)) 3893 if (SINGLE_BYTE_CHAR_P (c))
3882 fastmap[c] = 1; 3894 fastmap[c] = 1;
3883 else 3895 fastmap[p[1]] = 1;
3884 fastmap[p[1]] = 1;
3885 } 3896 }
3886 break; 3897 break;
3887 3898
3888 3899
3889 case anychar: 3900 case anychar:
3897 /* Chars beyond end of bitmap are possible matches. 3908 /* Chars beyond end of bitmap are possible matches.
3898 All the single-byte codes can occur in multibyte buffers. 3909 All the single-byte codes can occur in multibyte buffers.
3899 So any that are not listed in the charset 3910 So any that are not listed in the charset
3900 are possible matches, even in multibyte buffers. */ 3911 are possible matches, even in multibyte buffers. */
3901 if (!fastmap) break; 3912 if (!fastmap) break;
3913 /* We don't need to mark LEADING_CODE_8_BIT_CONTROL specially
3914 because it will automatically be set when needed by virtue of
3915 being larger than the highest char of its charset (0xbf) but
3916 smaller than (1<<BYTEWIDTH). */
3902 for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH; 3917 for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH;
3903 j < (1 << BYTEWIDTH); j++) 3918 j < (1 << BYTEWIDTH); j++)
3904 fastmap[j] = 1; 3919 fastmap[j] = 1;
3905 /* Fallthrough */ 3920 /* Fallthrough */
3906 case charset: 3921 case charset:
3907 if (!fastmap) break; 3922 if (!fastmap) break;
3908 not = (re_opcode_t) *(p - 1) == charset_not; 3923 not = (re_opcode_t) *(p - 1) == charset_not;
3909 for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH - 1, p++; 3924 for (j = CHARSET_BITMAP_SIZE (&p[-1]) * BYTEWIDTH - 1, p++;
3910 j >= 0; j--) 3925 j >= 0; j--)
3911 if (!!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) ^ not) 3926 if (!!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) ^ not)
3912 fastmap[j] = 1; 3927 {
3928 fastmap[j] = 1;
3929 #ifdef emacs
3930 if (j >= 0x80 && j < 0xa0)
3931 fastmap[LEADING_CODE_8_BIT_CONTROL] = 1;
3932 #endif
3933 }
3913 3934
3914 if ((not && multibyte) 3935 if ((not && multibyte)
3915 /* Any character set can possibly contain a character 3936 /* Any character set can possibly contain a character
3916 which doesn't match the specified set of characters. */ 3937 which doesn't match the specified set of characters. */
3917 || (CHARSET_RANGE_TABLE_EXISTS_P (&p[-2]) 3938 || (CHARSET_RANGE_TABLE_EXISTS_P (&p[-2])
4350 range--; 4371 range--;
4351 } 4372 }
4352 } 4373 }
4353 } 4374 }
4354 else 4375 else
4355 while (range > lim && !fastmap[*d]) 4376 do
4356 { 4377 {
4357 d++; 4378 re_char *d_start = d;
4358 range--; 4379 while (range > lim && !fastmap[*d])
4359 } 4380 {
4381 d++;
4382 range--;
4383 }
4384 #ifdef emacs
4385 if (multibyte && range > lim)
4386 {
4387 /* Check that we are at the beginning of a char. */
4388 int at_boundary;
4389 AT_CHAR_BOUNDARY_P (at_boundary, d, d_start);
4390 if (at_boundary)
4391 break;
4392 else
4393 { /* We have matched an internal byte of a char
4394 rather than the leading byte, so it's a false
4395 positive: we should keep scanning. */
4396 d++; range--;
4397 }
4398 }
4399 else
4400 #endif
4401 break;
4402 } while (1);
4360 4403
4361 startpos += irange - range; 4404 startpos += irange - range;
4362 } 4405 }
4363 else /* Searching backwards. */ 4406 else /* Searching backwards. */
4364 { 4407 {
6195 size_t length; 6238 size_t length;
6196 struct re_pattern_buffer *bufp; 6239 struct re_pattern_buffer *bufp;
6197 { 6240 {
6198 reg_errcode_t ret; 6241 reg_errcode_t ret;
6199 6242
6243 #ifdef emacs
6244 gl_state.current_syntax_table = current_buffer->syntax_table;
6245 #endif
6246
6200 /* GNU code is written to assume at least RE_NREGS registers will be set 6247 /* GNU code is written to assume at least RE_NREGS registers will be set
6201 (and at least one extra will be -1). */ 6248 (and at least one extra will be -1). */
6202 bufp->regs_allocated = REGS_UNALLOCATED; 6249 bufp->regs_allocated = REGS_UNALLOCATED;
6203 6250
6204 /* And GNU code determines whether or not to get register information 6251 /* And GNU code determines whether or not to get register information