$NetBSD: patch-ab,v 1.1.1.1 2007/01/04 02:51:02 rillig Exp $ Replaced the GNU regular expressions with POSIX regular expressions, since the latter are more portable. --- src/backends/libgbf_mkfile/gbf-mkfile-build.c.orig 2005-09-22 13:18:46.000000000 +0200 +++ src/backends/libgbf_mkfile/gbf-mkfile-build.c 2007-01-04 03:28:10.000000000 +0100 @@ -43,10 +43,11 @@ typedef struct { GList *callbacks; /* Regex structures. */ - struct re_pattern_buffer dir_buf; - struct re_pattern_buffer warn_buf; - struct re_pattern_buffer err_buf; - struct re_registers reg; + regex_t dir_buf; + regex_t warn_buf; + regex_t err_buf; +#define N_GROUPS 5 /* 1 + maximum number of groups + 1 */ + regmatch_t reg[N_GROUPS]; /* Build info. */ char *build_dir; @@ -60,12 +61,9 @@ build_info_free (BuildInfo *info) if (info->build_dir) g_free (info->build_dir); - if (info->dir_buf.fastmap) - g_free (info->dir_buf.fastmap); - if (info->warn_buf.fastmap) - g_free (info->warn_buf.fastmap); - if (info->err_buf.fastmap) - g_free (info->err_buf.fastmap); + regfree (&info->dir_buf); + regfree (&info->warn_buf); + regfree (&info->err_buf); g_free (info); } @@ -84,6 +82,11 @@ build_msg (BuildInfo *info, } } +/* Returns a copy of the ''n''th captured group. */ +#define GBF_GETGROUP(n) \ + g_strndup (line + info->reg[n].rm_so, \ + info->reg[n].rm_eo - info->reg[n].rm_so) + static void parse_output (BuildInfo *info, const char *line) @@ -91,26 +94,20 @@ parse_output (BuildInfo *info, int line_length = strlen (line); /* Check for directory changes. */ - if (re_search (&info->dir_buf, line, line_length, 0, - line_length, &info->reg) != -1) { - if (info->reg.num_regs >= 2) { - if (info->build_dir) - g_free (info->build_dir); - info->build_dir = g_strndup (line + info->reg.start[1], - info->reg.end[1] - info->reg.start[1]); - } + if (regexec (&info->dir_buf, line, N_GROUPS, info->reg, 0) == 0) { + g_assert(info->reg[1].rm_so != -1); + g_free (info->build_dir); + info->build_dir = GBF_GETGROUP(1); } /* Check for warnings & errors. */ - if (re_search (&info->warn_buf, line, line_length, 0, - line_length, &info->reg) != -1) { + if (regexec (&info->warn_buf, line, N_GROUPS, info->reg, 0) == 0) { GbfBuildWarning *warn; char *text; /* Create new warning. */ warn = g_new0 (GbfBuildWarning, 1); - text = g_strndup (line + info->reg.start[1], - info->reg.end[1] - info->reg.start[1]); + text = GBF_GETGROUP(1); if (text[0] != '/') { /* only prepend build_dir if path not absolute */ warn->filename = g_strconcat (info->build_dir, "/", text, NULL); g_free (text); @@ -118,25 +115,21 @@ parse_output (BuildInfo *info, warn->filename = text; } - text = g_strndup (line + info->reg.start[2], - info->reg.end[2] - info->reg.start[2]); + text = GBF_GETGROUP(2); warn->line = atoi (text); g_free (text); - warn->warning = g_strndup (line + info->reg.start[3], - info->reg.end[3] - info->reg.start[3]); + warn->warning = GBF_GETGROUP(3); warn->output = g_strdup (line); build_msg (info, GBF_BUILD_WARNING, warn); /* FIXME: We should free warn here, and make copy in gbf-build-info.c. */ - } else if (re_search (&info->err_buf, line, line_length, 0, - line_length, &info->reg) != -1) { + } else if (regexec(&info->err_buf, line, N_GROUPS, info->reg, 0) == 0) { GbfBuildError *err; char *text; /* Create new error. */ err = g_new0 (GbfBuildError, 1); - text = g_strndup (line + info->reg.start[1], - info->reg.end[1] - info->reg.start[1]); + text = GBF_GETGROUP(1); if (text[0] != '/') { /* only prepend build_dir if path not absolute */ err->filename = g_strconcat (info->build_dir, "/", text, NULL); g_free (text); @@ -144,12 +137,10 @@ parse_output (BuildInfo *info, err->filename = text; } - text = g_strndup (line + info->reg.start[2], - info->reg.end[2] - info->reg.start[2]); + text = GBF_GETGROUP(2); err->line = atoi (text); g_free (text); - err->error = g_strndup (line + info->reg.start[3], - info->reg.end[3] - info->reg.start[3]); + err->error = GBF_GETGROUP(3); err->output = g_strdup (line); build_msg (info, GBF_BUILD_ERROR, err); @@ -158,6 +149,7 @@ parse_output (BuildInfo *info, build_msg (info, GBF_BUILD_OUTPUT, (gpointer)line); } } +#undef GBF_GETGROUP static gboolean build_output_cb (GIOChannel *chan, @@ -197,24 +189,10 @@ build_output_cb (GIOChannel *chan, } static gboolean -compile_pattern (struct re_pattern_buffer *buf, +compile_pattern (regex_t *buf, const char *pattern) { - memset (buf, 0, sizeof (struct re_pattern_buffer)); - buf->translate = NULL; - buf->fastmap = g_malloc (256); - buf->allocated = 0; - buf->buffer = NULL; - buf->can_be_null = 0; - buf->no_sub = 0; - - if (!re_compile_pattern (pattern, strlen (pattern), buf)) { - if (re_compile_fastmap (buf) != 0) { - g_warning ("IMPORTANT REGEX FAILED TO CREASTE FASTMAP"); - g_free (buf->fastmap); - buf->fastmap = NULL; - } - } else { + if (regcomp(buf, pattern, REG_EXTENDED) != 0) { g_warning ("IMPORTANT REGEX FAILED TO COMPILE"); return FALSE; } @@ -239,7 +217,6 @@ gbf_build_run (GbfMkfileProject *proj char *tmp, *msg; int output, err, pid; GIOChannel *out_channel, *err_channel; - reg_syntax_t old_options; GError *error = NULL; const char *charset; GNode *g_node; @@ -342,9 +319,6 @@ gbf_build_run (GbfMkfileProject *proj info->build_dir = NULL; /* Intialize regexs. */ - old_options = re_syntax_options; - re_syntax_options = RE_SYNTAX_EGREP; - if (!compile_pattern (&info->dir_buf, dir_regex) || !compile_pattern (&info->warn_buf, warn_regex) || !compile_pattern (&info->err_buf, err_regex)) { @@ -355,8 +329,6 @@ gbf_build_run (GbfMkfileProject *proj return -1; } - re_syntax_options = old_options; - g_signal_emit_by_name (G_OBJECT (project), "build_start"); tmp = g_strjoinv (" ", (char **) argv);