# HG changeset patch # User Richard M. Stallman # Date 814063851 0 # Node ID 52e053f46f76c310ab9398fcca43d87deadf1739 # Parent c7dea1ffceabf3159b6129d8b849e17e7b1b0c70 (TRANSLATE, PATFETCH): Cast elt of `translate'. Don't define if already defined. (regex_compile): Use RE_TRANSLATE_TYPE for `translate'. (compile_range, re_search_2, re_match_2_internal, bcmp_translate) (regcomp): Use RE_TRANSLATE_TYPE for `translate'. diff -r c7dea1ffceab -r 52e053f46f76 src/regex.c --- a/src/regex.c Thu Oct 19 00:50:14 1995 +0000 +++ b/src/regex.c Thu Oct 19 00:50:51 1995 +0000 @@ -1153,7 +1153,7 @@ /* Push the info, starting with the registers. */ \ DEBUG_PRINT1 ("\n"); \ \ - if (!RE_NO_POSIX_BACKTRACKING & bufp->syntax) \ + if (!(RE_NO_POSIX_BACKTRACKING & bufp->syntax)) \ for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ this_reg++) \ { \ @@ -1275,7 +1275,7 @@ low_reg = (unsigned) POP_FAILURE_INT (); \ DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \ \ - if (!RE_NO_POSIX_BACKTRACKING & bufp->syntax) \ + if (!(RE_NO_POSIX_BACKTRACKING & bufp->syntax)) \ for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ { \ DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \ @@ -1289,6 +1289,16 @@ regstart[this_reg] = (const char *) POP_FAILURE_POINTER (); \ DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ } \ + else \ + { \ + for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \ + { \ + reg_info[this_reg].word = 0; \ + regend[this_reg] = 0; \ + regstart[this_reg] = 0; \ + } \ + highest_active_reg = high_reg; \ + } \ \ set_regs_matched_done = 0; \ DEBUG_STATEMENT (nfailure_points_popped++); \ @@ -1365,11 +1375,13 @@ if necessary. Also cast from a signed character in the constant string passed to us by the user to an unsigned char that we can use as an array index (in, e.g., `translate'). */ +#ifndef PATFETCH #define PATFETCH(c) \ do {if (p == pend) return REG_EEND; \ c = (unsigned char) *p++; \ - if (translate) c = translate[c]; \ + if (translate) c = (unsigned char) translate[c]; \ } while (0) +#endif /* Fetch the next character in the uncompiled pattern, with no translation. */ @@ -1386,7 +1398,10 @@ cast the subscript to translate because some data is declared as `char *', to avoid warnings when a string constant is passed. But when we use a character as a subscript we must make it unsigned. */ -#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d)) +#ifndef TRANSLATE +#define TRANSLATE(d) \ + (translate ? (char) translate[(unsigned char) (d)] : (d)) +#endif /* Macros for outputting the compiled pattern into `buffer'. */ @@ -1652,7 +1667,7 @@ const char *pend = pattern + size; /* How to translate the characters in the pattern. */ - char *translate = bufp->translate; + RE_TRANSLATE_TYPE translate = bufp->translate; /* Address of the count-byte of the most recently inserted `exactn' command. This makes it possible to tell if a new exact-match @@ -2818,7 +2833,7 @@ static reg_errcode_t compile_range (p_ptr, pend, translate, syntax, b) const char **p_ptr, *pend; - char *translate; + RE_TRANSLATE_TYPE translate; reg_syntax_t syntax; unsigned char *b; { @@ -3250,7 +3265,7 @@ { int val; register char *fastmap = bufp->fastmap; - register char *translate = bufp->translate; + register RE_TRANSLATE_TYPE translate = bufp->translate; int total_size = size1 + size2; int endpos = startpos + range; @@ -3538,7 +3553,7 @@ unsigned char *just_past_start_mem = 0; /* We use this to map every character in the string. */ - char *translate = bufp->translate; + RE_TRANSLATE_TYPE translate = bufp->translate; /* Failure point stack. Each place that can handle a failure further down the line pushes a failure point on this stack. It consists of @@ -3937,7 +3952,8 @@ do { PREFETCH (); - if (translate[(unsigned char) *d++] != (char) *p++) + if ((unsigned char) translate[(unsigned char) *d++] + != (unsigned char) *p++) goto fail; } while (--mcnt); @@ -4351,7 +4367,7 @@ for that group and all inner ones, so that if we fail back to this point, the group's information will be correct. For example, in \(a*\)*\1, we need the preceding group, - and in \(\(a*\)b*\)\2, we need the inner group. */ + and in \(zz\(a*\)b*\)\2, we need the inner group. */ /* We can't use `p' to check ahead because we push a failure point to `p + mcnt' after we do this. */ @@ -5059,7 +5075,7 @@ bcmp_translate (s1, s2, len, translate) unsigned char *s1, *s2; register int len; - char *translate; + RE_TRANSLATE_TYPE translate; { register unsigned char *p1 = s1, *p2 = s2; while (len) @@ -5231,7 +5247,9 @@ { unsigned i; - preg->translate = (char *) malloc (CHAR_SET_SIZE); + preg->translate + = (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE + * sizeof (*(RE_TRANSLATE_TYPE)0)); if (preg->translate == NULL) return (int) REG_ESPACE;