Hi! I have a few question about this patch.
On Tue, 2007-11-06 at 13:46 -0500, Micah Anderson wrote: > diff -Naur syslog-ng-2.0.5.orig/src/filter.c syslog-ng-2.0.5/src/filter.c > --- syslog-ng-2.0.5.orig/src/filter.c 2007-05-21 19:21:07.000000000 +0200 > +++ syslog-ng-2.0.5/src/filter.c 2007-11-03 00:30:22.000000000 +0100 > @@ -226,6 +226,7 @@ > typedef struct _FilterRE > { > FilterExprNode super; > + GString *replace; > regex_t regex; > } FilterRE; > > @@ -310,6 +311,9 @@ > filter_re_free(FilterExprNode *s) > { > FilterRE *self = (FilterRE *) s; > + > + if (self->replace != NULL) > + g_string_free(self->replace, TRUE); > > regfree(&self->regex); > g_free(s); > @@ -494,3 +498,89 @@ > self->super.eval = filter_netmask_eval; > return &self->super; > } > + > +FilterExprNode * > +filter_strip_new(const gchar *re) > +{ > + if (g_ascii_strcasecmp(re, "ips") == 0) > + return filter_replace_new(re, "0.0.0.0"); > + return filter_replace_new(re, "----"); > +} > + > +#define FMIN(a, b) (a) < (b) ? (a) : (b) Is there any difference between this macro and the MIN macro define in glib? (http://library.gnome.org/devel/glib/unstable/glib-Standard-Macros.html#MIN:CAPS) > +#define NEW_MSG_SIZE 2048 Is there a reason to limit new message size to 2048 bytes? > + > +static gboolean > +filter_replace_eval(FilterExprNode *s, LogMessage *log) > +{ > + FilterRE *self = (FilterRE *) s; > + gchar *buffer = log->msg.str; > + gint snippet_size; > + regmatch_t pmatch; > + gchar new_msg[NEW_MSG_SIZE]; > + gchar *new_msg_max = new_msg + NEW_MSG_SIZE; > + gchar *new_msg_ptr = new_msg; > + gint replace_length = self->replace->len; > + gint error; > + > + error = regexec(&self->regex, buffer, 1, &pmatch, 0); > + if (error) > + return TRUE; > + while (!error) > + { > + /* copy string snippet which preceeds matched text */ > + snippet_size = FMIN(pmatch.rm_so, new_msg_max - new_msg_ptr); > + memcpy(new_msg_ptr, buffer, snippet_size); > + new_msg_ptr += snippet_size; > + > + /* copy replacement */ > + snippet_size = FMIN(replace_length, new_msg_max - new_msg_ptr); > + memcpy(new_msg_ptr, self->replace->str, snippet_size); > + new_msg_ptr += snippet_size; > + > + /* search for next match */ > + buffer += pmatch.rm_eo; > + error = regexec(&self->regex, buffer, 1, &pmatch, REG_NOTBOL); > + } Why do You not use GString and g_string_append_len? > + > + /* copy the rest of the old message */ > + snippet_size = log->msg.len - (buffer - log->msg.str) + 1; > + snippet_size = FMIN(snippet_size, new_msg_max - new_msg_ptr); > + memcpy(new_msg_ptr, buffer, snippet_size); > + new_msg[NEW_MSG_SIZE-1] = '\0'; > + > + g_string_erase(&(log->msg), 0, -1); I think g_string_truncate is faster and explain more the intended feature (to me). > + g_string_append(&(log->msg), new_msg); > + > + return TRUE; > +} > + > +FilterExprNode * > +filter_replace_new(const gchar *re, const gchar *replacement) > +{ > + FilterRE *self = g_new0(FilterRE, 1); > + gint regerr; > + > + if (!g_ascii_strcasecmp(re, "ips")) > + re = > "(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])([\\.\\-](25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])){3}"; > + > + regerr = regcomp(&self->regex, re, REG_ICASE | REG_EXTENDED); > + if (regerr) > + { > + gchar errorbuf[256]; > + regerror(regerr, &self->regex, errorbuf, sizeof(errorbuf)); > + msg_error("Error compiling regular expression:", > + evt_tag_str("re", re), > + evt_tag_str("error", errorbuf), > + NULL); > + g_free(self); > + return NULL; > + } > + > + self->replace = g_string_new(replacement); > + self->super.eval = filter_replace_eval; > + self->super.free_fn = filter_re_free; > + > + return &self->super; > +} > + -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]