diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2012-05-09 20:08:15 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2012-05-09 20:08:15 +0300 |
commit | 8ff0b4eaa7592280b5a55087c0326c6ef1f88db5 (patch) | |
tree | eae689a948e50dbf462b7e0d0c3d225409f6c7b0 /dfa.c | |
parent | 17a2a7c14dc27248d87f2561a1ec311ad4972355 (diff) | |
parent | fe0a0998411173db5cab614253562b2efd6f9664 (diff) | |
download | egawk-8ff0b4eaa7592280b5a55087c0326c6ef1f88db5.tar.gz egawk-8ff0b4eaa7592280b5a55087c0326c6ef1f88db5.tar.bz2 egawk-8ff0b4eaa7592280b5a55087c0326c6ef1f88db5.zip |
Merge branch 'gawk-4.0-stable'
Diffstat (limited to 'dfa.c')
-rw-r--r-- | dfa.c | 64 |
1 files changed, 46 insertions, 18 deletions
@@ -36,6 +36,12 @@ #if HAVE_SETLOCALE #include <locale.h> #endif +#ifdef HAVE_STDBOOL_H +#include <stdbool.h> +#else +#include "missing_d/gawkbool.h" +#endif /* HAVE_STDBOOL_H */ + #define STREQ(a, b) (strcmp (a, b) == 0) @@ -53,7 +59,7 @@ #include "gettext.h" #define _(str) gettext (str) -#include "mbsupport.h" /* defines MBS_SUPPORT to 1 or 0, as appropriate */ +#include "mbsupport.h" /* defines MBS_SUPPORT to 1 or 0, as appropriate */ #if MBS_SUPPORT /* We can handle multibyte strings. */ #include <wchar.h> @@ -61,10 +67,6 @@ #endif #ifdef GAWK -#define bool int -#define true (1) -#define false (0) - /* The __pure__ attribute was added in gcc 2.96. */ #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) @@ -343,7 +345,7 @@ struct mb_char_classes wchar_t *range_sts; /* Range characters (start of the range). */ wchar_t *range_ends; /* Range characters (end of the range). */ size_t nranges; - char **equivs; /* Equivalent classes. */ + char **equivs; /* Equivalence classes. */ size_t nequivs; char **coll_elems; size_t ncoll_elems; /* Collating elements. */ @@ -1053,12 +1055,10 @@ parse_bracket_exp (void) else if (MBS_SUPPORT && (c1 == '=' || c1 == '.')) { - char *elem; - MALLOC (elem, len + 1); - strncpy (elem, str, len + 1); + char *elem = xmemdup (str, len + 1); if (c1 == '=') - /* build equivalent class. */ + /* build equivalence class. */ { REALLOC_IF_NECESSARY (work_mbc->equivs, equivs_al, work_mbc->nequivs + 1); @@ -1136,6 +1136,33 @@ parse_bracket_exp (void) } else { +#ifndef GAWK + /* Defer to the system regex library about the meaning + of range expressions. */ + regex_t re; + char pattern[6] = { '[', 0, '-', 0, ']', 0 }; + char subject[2] = { 0, 0 }; + c1 = c; + if (case_fold) + { + c1 = tolower (c1); + c2 = tolower (c2); + } + + pattern[1] = c1; + pattern[3] = c2; + regcomp (&re, pattern, REG_NOSUB); + for (c = 0; c < NOTCHAR; ++c) + { + if ((case_fold && isupper (c)) + || (MB_CUR_MAX > 1 && btowc (c) == WEOF)) + continue; + subject[0] = c; + if (regexec (&re, subject, 0, NULL, 0) != REG_NOMATCH) + setbit_case_fold_c (c, ccl); + } + regfree (&re); +#else c1 = c; if (case_fold) { @@ -1144,6 +1171,7 @@ parse_bracket_exp (void) } for (c = c1; c <= c2; c++) setbit_case_fold_c (c, ccl); +#endif } colon_warning_state |= 8; @@ -3021,7 +3049,7 @@ match_mb_charset (struct dfa *d, state_num s, position pos, size_t idx) strncpy (buffer, (char const *) buf_begin + idx, match_len); buffer[match_len] = '\0'; - /* match with an equivalent class? */ + /* match with an equivalence class? */ for (i = 0; i < work_mbc->nequivs; i++) { op_len = strlen (work_mbc->equivs[i]); @@ -3051,8 +3079,7 @@ match_mb_charset (struct dfa *d, state_num s, position pos, size_t idx) /* match with a range? */ for (i = 0; i < work_mbc->nranges; i++) { - if (work_mbc->range_sts[i] <= wc && - wc <= work_mbc->range_ends[i]) + if (work_mbc->range_sts[i] <= wc && wc <= work_mbc->range_ends[i]) goto charset_matched; } @@ -3151,6 +3178,8 @@ transit_state_consume_1char (struct dfa *d, state_num s, if (match_lens == NULL && work_mbls != NULL) free (work_mbls); + + /* FIXME: this return value is always ignored. */ return rs; } @@ -3195,7 +3224,7 @@ transit_state (struct dfa *d, state_num s, unsigned char const **pp) /* We must update the pointer if state transition succeeded. */ if (rs == TRANSIT_STATE_DONE) - ++ * pp; + ++*pp; free (match_lens); return s1; @@ -3408,7 +3437,7 @@ dfaexec (struct dfa *d, char const *begin, char *end, if ((char *) p <= end && p[-1] == eol) { if (count) - ++ * count; + ++*count; if (d->mb_cur_max > 1) prepare_wc_buf ((const char *) p, end); @@ -3669,7 +3698,7 @@ icatalloc (char *old, char const *new) if (newsize == 0) return old; result = xrealloc (old, oldsize + newsize + 1); - strcpy (result + oldsize, new); + memcpy (result + oldsize, new, newsize + 1); return result; } @@ -4062,8 +4091,7 @@ done: { MALLOC (dm, 1); dm->exact = exact; - MALLOC (dm->must, strlen (result) + 1); - strcpy (dm->must, result); + dm->must = xmemdup (result, strlen (result) + 1); dm->next = d->musts; d->musts = dm; } |