SF.net SVN: geany:[5987] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Mon Oct 3 14:35:11 UTC 2011


Revision: 5987
          http://geany.svn.sourceforge.net/geany/?rev=5987&view=rev
Author:   ntrel
Date:     2011-10-03 14:35:11 +0000 (Mon, 03 Oct 2011)
Log Message:
-----------
 * Merge branches/unstable:
 - tagmanager/php.c:
   Fix parsing keyword-qualified functions strictly, e.g. don't 
   parse 'staticfunction' or 'fatfunction'.
 - src/utils.c, src/utils.h, src/editor.c:
   Use GRegex for snippet indentation replacement - fixes wrong 
   behaviour with Mac line endings.
 - tagmanager/lregex.c, TODO:
   Use GRegex for CTags instead of POSIX regex - GRegex is more 
   powerful. This also fixes a (HTML) performance issue on Windows. 
   Geany will now print a debug warning when using the "b" CTags 
   regex flag option for non-extended syntax. This is not currently 
   used by Geany's parsers.
   Note: GNU regex can't be removed yet as it's still used elsewhere 
   by Geany.
 - src/build.c, doc/pluginsignals.c:
   When saving on build, prompt for a filename if necessary.
   Emit the "build-start" signal only if saving succeeds.
 - src/build.c:
   Use #ifdef SYNC_SPAWN instead of G_OS_WIN32 for easier testing with 
   glib's asynchronous spawning (which doesn't work on Windows).
 - src/win32.c, src/win32.h, src/dialogs.c:
   Use GTK unsaved file dialog on Windows too because the button names 
   should be specific.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/TODO
    trunk/doc/pluginsignals.c
    trunk/src/build.c
    trunk/src/dialogs.c
    trunk/src/editor.c
    trunk/src/socket.c
    trunk/src/utils.c
    trunk/src/utils.h
    trunk/src/win32.c
    trunk/src/win32.h
    trunk/tagmanager/lregex.c
    trunk/tagmanager/php.c

Property Changed:
----------------
    trunk/


Property changes on: trunk
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/build-system:3867-4119
   + /branches/build-system:3867-4119
/branches/unstable:5939-5986

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/ChangeLog	2011-10-03 14:35:11 UTC (rev 5987)
@@ -1,3 +1,31 @@
+2011-10-03  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * Merge branches/unstable:
+ - tagmanager/php.c:
+   Fix parsing keyword-qualified functions strictly, e.g. don't 
+   parse 'staticfunction' or 'fatfunction'.
+ - src/utils.c, src/utils.h, src/editor.c:
+   Use GRegex for snippet indentation replacement - fixes wrong 
+   behaviour with Mac line endings.
+ - tagmanager/lregex.c, TODO:
+   Use GRegex for CTags instead of POSIX regex - GRegex is more 
+   powerful. This also fixes a (HTML) performance issue on Windows. 
+   Geany will now print a debug warning when using the "b" CTags 
+   regex flag option for non-extended syntax. This is not currently 
+   used by Geany's parsers.
+   Note: GNU regex can't be removed yet as it's still used elsewhere 
+   by Geany.
+ - src/build.c, doc/pluginsignals.c:
+   When saving on build, prompt for a filename if necessary.
+   Emit the "build-start" signal only if saving succeeds.
+ - src/build.c:
+   Use #ifdef SYNC_SPAWN instead of G_OS_WIN32 for easier testing with 
+   glib's asynchronous spawning (which doesn't work on Windows).
+ - src/win32.c, src/win32.h, src/dialogs.c:
+   Use GTK unsaved file dialog on Windows too because the button names 
+   should be specific.
+
+
 2011-10-02  Colomban Wendling  <colomban(at)geany(dot)org>
 
  * doc/geany.txt, doc/geany.html:

Modified: trunk/TODO
===================================================================
--- trunk/TODO	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/TODO	2011-10-03 14:35:11 UTC (rev 5987)
@@ -14,7 +14,7 @@
 	o common default highlighting styles configurable for all
 	  programming languages (done for C-like filetypes using
 	  filetypes.common named styles)
-	o update included regex library (and other CTags improvements)
+	o use GRegex only and remove GNU regex
 	o asynchronous build commands on Windows
 	o (filetype-independent run command in build dialog & keybinding)
 	o (better custom filetype support)

Modified: trunk/doc/pluginsignals.c
===================================================================
--- trunk/doc/pluginsignals.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/doc/pluginsignals.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -187,7 +187,7 @@
  */
 signal void (*geany_startup_complete)(GObject *obj, gpointer user_data);
 
-/** Sent before build is started. Plugins can use this signal e.g. to save the opened documents
+/** Sent before build is started. A plugin could use this signal e.g. to save all unsaved documents
  *  before the build starts.
  *
  *  @param obj a GeanyObject instance, should be ignored.

Modified: trunk/src/build.c
===================================================================
--- trunk/src/build.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/build.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -64,6 +64,11 @@
 #include "toolbar.h"
 #include "geanymenubuttonaction.h"
 
+/* g_spawn_async_with_pipes doesn't work on Windows */
+#ifdef G_OS_WIN32
+#define SYNC_SPAWN
+#endif
+
 /* Number of editor indicators to draw - limited as this can affect performance */
 #define GEANY_BUILD_ERR_HIGHLIGHT_MAX 50
 
@@ -114,7 +119,7 @@
 static gint build_groups_count[GEANY_GBG_COUNT] = { 3, 4, 2 };
 static gint build_items_count = 9;
 
-#ifndef G_OS_WIN32
+#ifndef SYNC_SPAWN
 static void build_exit_cb(GPid child_pid, gint status, gpointer user_data);
 static gboolean build_iofunc(GIOChannel *ioc, GIOCondition cond, gpointer data);
 #endif
@@ -571,7 +576,7 @@
 }
 
 
-#ifdef G_OS_WIN32
+#ifdef SYNC_SPAWN
 static void parse_build_output(const gchar **output, gint status)
 {
 	guint x, i, len;
@@ -590,7 +595,7 @@
 				{
 					line = lines[i];
 					while (*line != '\0')
-					{	/* replace any conrol characters in the output */
+					{	/* replace any control characters in the output */
 						if (*line < 32)
 							*line = 32;
 						line++;
@@ -679,7 +684,7 @@
 	gchar *utf8_working_dir;
 	gchar *cmd_string;
 	gchar *utf8_cmd_string;
-#ifdef G_OS_WIN32
+#ifdef SYNC_SPAWN
 	gchar *output[2];
 	gint status;
 #else
@@ -726,7 +731,7 @@
 	build_info.file_type_id = (doc == NULL) ? GEANY_FILETYPES_NONE : doc->file_type->id;
 	build_info.message_count = 0;
 
-#ifdef G_OS_WIN32
+#ifdef SYNC_SPAWN
 	if (! utils_spawn_sync(working_dir, argv, NULL, G_SPAWN_SEARCH_PATH,
 			NULL, NULL, &output[0], &output[1], &status, &error))
 #else
@@ -744,7 +749,7 @@
 		return (GPid) 0;
 	}
 
-#ifdef G_OS_WIN32
+#ifdef SYNC_SPAWN
 	parse_build_output((const gchar**) output, status);
 	g_free(output[0]);
 	g_free(output[1]);
@@ -1026,7 +1031,7 @@
 }
 
 
-#ifndef G_OS_WIN32
+#ifndef SYNC_SPAWN
 static gboolean build_iofunc(GIOChannel *ioc, GIOCondition cond, gpointer data)
 {
 	if (cond & (G_IO_IN | G_IO_PRI))
@@ -1121,11 +1126,14 @@
 }
 
 
-#ifndef G_OS_WIN32
+#ifndef SYNC_SPAWN
 static void build_exit_cb(GPid child_pid, gint status, gpointer user_data)
 {
 	gboolean failure = FALSE;
 
+#ifdef G_OS_WIN32
+	failure = status;
+#else
 	if (WIFEXITED(status))
 	{
 		if (WEXITSTATUS(status) != EXIT_SUCCESS)
@@ -1140,6 +1148,7 @@
 	{	/* any other failure occured */
 		failure = TRUE;
 	}
+#endif
 	show_build_result_message(failure);
 
 	utils_beep();
@@ -1261,10 +1270,16 @@
 	gint grp = GPOINTER_TO_GRP(user_data);
 	gint cmd = GPOINTER_TO_CMD(user_data);
 
+	if (doc && doc->changed)
+	{
+		if (document_need_save_as(doc) && !dialogs_show_save_as())
+			return;
+			
+		if (!document_save_file(doc, FALSE))
+			return;
+	}
 	g_signal_emit_by_name(geany_object, "build-start");
 
-	if (doc && doc->changed)
-		document_save_file(doc, FALSE);
 	if (grp == GEANY_GBG_NON_FT && cmd == GBO_TO_CMD(GEANY_GBO_CUSTOM))
 	{
 		static GtkWidget *dialog = NULL; /* keep dialog for combo history */

Modified: trunk/src/dialogs.c
===================================================================
--- trunk/src/dialogs.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/dialogs.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -804,7 +804,6 @@
 }
 
 
-#ifndef G_OS_WIN32
 static gint run_unsaved_dialog(const gchar *msg, const gchar *msg2)
 {
 	GtkWidget *dialog, *button;
@@ -812,6 +811,7 @@
 
 	dialog = gtk_message_dialog_new(GTK_WINDOW(main_widgets.window), GTK_DIALOG_DESTROY_WITH_PARENT,
 			GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "%s", msg);
+	gtk_window_set_title(GTK_WINDOW(dialog), _("Question"));
 	gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), "%s", msg2);
 	gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
 
@@ -828,7 +828,6 @@
 
 	return ret;
 }
-#endif
 
 
 gboolean dialogs_show_unsaved_file(GeanyDocument *doc)
@@ -851,12 +850,7 @@
 	msg2 = _("Do you want to save it before closing?");
 	g_free(short_fn);
 
-#ifdef G_OS_WIN32
-	setptr(msg, g_strconcat(msg, "\n", msg2, NULL));
-	ret = win32_message_dialog_unsaved(msg);
-#else
 	ret = run_unsaved_dialog(msg, msg2);
-#endif
 	g_free(msg);
 
 	switch (ret)

Modified: trunk/src/editor.c
===================================================================
--- trunk/src/editor.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/editor.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -2272,63 +2272,18 @@
 }
 
 
-static gboolean utils_regex_find(regex_t *regex, const gchar *haystack, gsize start,
-		gsize nmatches, regmatch_t *matches)
-{
-	gint eflags = 0;
-
-	if (start > 0)
-	{
-		gchar c = haystack[start - 1];
-
-		if (c == '\n' || c == '\r')
-			eflags = REG_NOTBOL;
-	}
-	return regexec(regex, haystack + start, nmatches, matches, eflags) == 0;
-}
-
-
-/* match_index: which match to replace, 0 for whole regex.
- * note: this doesn't support backreferences in replacements */
-static guint utils_string_regex_replace_all(GString *haystack,
-		regex_t *regex, guint match_index, const gchar *replace)
-{
-	gssize pos;
-	regmatch_t matches[10];
-	guint ret = 0;
-
-	g_return_val_if_fail(match_index < 10, 0);
-
-	/* ensure haystack->str is not null */
-	if (haystack->len == 0)
-		return 0;
-
-	pos = 0;
-	while (utils_regex_find(regex, haystack->str, pos, G_N_ELEMENTS(matches), matches))
-	{
-		regmatch_t *match = &matches[match_index];
-
-		g_return_val_if_fail(match->rm_so >= 0, FALSE);
-		pos += match->rm_so;
-		pos = utils_string_replace(haystack, pos, match->rm_eo - match->rm_so, replace);
-		ret++;
-	}
-	return ret;
-}
-
-
 static void fix_indentation(GeanyEditor *editor, GString *buf)
 {
 	const GeanyIndentPrefs *iprefs = editor_get_indent_prefs(editor);
 	gchar *whitespace;
-	regex_t regex;
-	gint cflags = REG_EXTENDED | REG_NEWLINE;
+	GRegex *regex;
+	gint cflags = G_REGEX_MULTILINE;
 
 	/* transform leading tabs into indent widths (in spaces) */
 	whitespace = g_strnfill(iprefs->width, ' ');
-	regcomp(&regex, "^ *(\t)", cflags);
-	while (utils_string_regex_replace_all(buf, &regex, 1, whitespace));
-	regfree(&regex);
+	regex = g_regex_new("^ *(\t)", cflags, 0, NULL);
+	while (utils_string_regex_replace_all(buf, regex, 1, whitespace, TRUE));
+	g_regex_unref(regex);
 
 	/* remaining tabs are for alignment */
 	if (iprefs->type != GEANY_INDENT_TYPE_TABS)
@@ -2343,9 +2298,9 @@
 		setptr(whitespace, g_strnfill(sci_get_tab_width(editor->sci), ' '));
 		str = g_strdup_printf("^\t*(%s)", whitespace);
 
-		regcomp(&regex, str, cflags);
-		while (utils_string_regex_replace_all(buf, &regex, 1, "\t"));
-		regfree(&regex);
+		regex = g_regex_new(str, cflags, 0, NULL);
+		while (utils_string_regex_replace_all(buf, regex, 1, "\t", TRUE));
+		g_regex_unref(regex);
 		g_free(str);
 	}
 	g_free(whitespace);

Modified: trunk/src/socket.c
===================================================================
--- trunk/src/socket.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/socket.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -588,7 +588,7 @@
 	gint fd, sock;
 	gchar buf[BUFFER_LENGTH];
 	struct sockaddr_in caddr;
-	guint caddr_len = sizeof(caddr);
+	socklen_t caddr_len = sizeof(caddr);
 	GtkWidget *window = data;
 	gboolean popup = FALSE;
 

Modified: trunk/src/utils.c
===================================================================
--- trunk/src/utils.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/utils.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -1622,6 +1622,45 @@
 }
 
 
+/* Similar to g_regex_replace but allows matching a subgroup.
+ * match_num: which match to replace, 0 for whole match.
+ * literal: FALSE to interpret escape sequences in @a replace.
+ * returns: number of replacements.
+ * bug: replaced text can affect matching of ^ or \b */
+guint utils_string_regex_replace_all(GString *haystack, GRegex *regex,
+		guint match_num, const gchar *replace, gboolean literal)
+{
+	GMatchInfo *minfo;
+	guint ret = 0;
+	gint start = 0;
+
+	g_assert(literal); /* escapes not implemented yet */
+	g_return_val_if_fail(replace, 0);
+
+	/* ensure haystack->str is not null */
+	if (haystack->len == 0)
+		return 0;
+
+	/* passing a start position makes G_REGEX_MATCH_NOTBOL automatic */
+	while (g_regex_match_full(regex, haystack->str, -1, start, 0, &minfo, NULL))
+	{
+		gint end, len;
+		
+		g_match_info_fetch_pos(minfo, match_num, &start, &end);
+		len = end - start;
+		utils_string_replace(haystack, start, len, replace);
+		ret++;
+		
+		/* skip past whole match */
+		g_match_info_fetch_pos(minfo, 0, NULL, &end);
+		start = end - len + strlen(replace);
+		g_match_info_free(minfo);
+	}
+	g_match_info_free(minfo);
+	return ret;
+}
+
+
 /* Get project or default startup directory (if set), or NULL. */
 const gchar *utils_get_default_dir_utf8(void)
 {

Modified: trunk/src/utils.h
===================================================================
--- trunk/src/utils.h	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/utils.h	2011-10-03 14:35:11 UTC (rev 5987)
@@ -178,6 +178,9 @@
 
 guint utils_string_replace_first(GString *haystack, const gchar *needle, const gchar *replace);
 
+guint utils_string_regex_replace_all(GString *haystack, GRegex *regex,
+		guint match_num, const gchar *replace, gboolean literal);
+
 void utils_str_replace_all(gchar **haystack, const gchar *needle, const gchar *replacement);
 
 gint utils_strpos(const gchar* haystack, const gchar *needle);

Modified: trunk/src/win32.c
===================================================================
--- trunk/src/win32.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/win32.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -732,33 +732,6 @@
 }
 
 
-/* Special dialog to ask for an action when closing an unsaved file */
-gint win32_message_dialog_unsaved(const gchar *msg)
-{
-	static wchar_t w_msg[512];
-	static wchar_t w_title[512];
-	HWND parent_hwnd = NULL;
-	gint ret;
-
-	/* convert the Unicode chars to wide chars */
-	MultiByteToWideChar(CP_UTF8, 0, msg, -1, w_msg, G_N_ELEMENTS(w_msg));
-	MultiByteToWideChar(CP_UTF8, 0, _("Question"), -1, w_title, G_N_ELEMENTS(w_title));
-
-	if (main_widgets.window != NULL)
-		parent_hwnd = GDK_WINDOW_HWND(main_widgets.window->window);
-
-	ret = MessageBoxW(parent_hwnd, w_msg, w_title, MB_YESNOCANCEL | MB_ICONQUESTION);
-	switch (ret)
-	{
-		case IDYES: ret = GTK_RESPONSE_YES; break;
-		case IDNO: ret = GTK_RESPONSE_NO; break;
-		case IDCANCEL: ret = GTK_RESPONSE_CANCEL; break;
-	}
-
-	return ret;
-}
-
-
 /* Just a simple wrapper function to open a browser window */
 void win32_open_browser(const gchar *uri)
 {

Modified: trunk/src/win32.h
===================================================================
--- trunk/src/win32.h	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/src/win32.h	2011-10-03 14:35:11 UTC (rev 5987)
@@ -40,8 +40,6 @@
 
 gboolean win32_message_dialog(GtkWidget *parent, GtkMessageType type, const gchar *msg);
 
-gint win32_message_dialog_unsaved(const gchar *msg);
-
 void win32_open_browser(const gchar *uri);
 
 gchar *win32_show_project_open_dialog(GtkWidget *parent, const gchar *title,

Modified: trunk/tagmanager/lregex.c
===================================================================
--- trunk/tagmanager/lregex.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/tagmanager/lregex.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -28,11 +28,6 @@
 # ifdef HAVE_SYS_TYPES_H
 #  include <sys/types.h>  /* declare off_t (not known to regex.h on FreeBSD) */
 # endif
-# ifdef HAVE_REGEX_H
-#  include <regex.h>
-# else
-#  include "gnuregex.h"
-# endif
 #endif
 
 #include "main.h"
@@ -70,7 +65,7 @@
 enum pType { PTRN_TAG, PTRN_CALLBACK };
 
 typedef struct {
-	regex_t *pattern;
+	GRegex *pattern;
 	enum pType type;
 	union {
 		struct {
@@ -113,10 +108,7 @@
 		for (i = 0  ;  i < set->count  ;  ++i)
 		{
 			regexPattern *p = &set->patterns [i];
-#if defined (POSIX_REGEX)
-			regfree (p->pattern);
-#endif
-			eFree (p->pattern);
+			g_regex_unref(p->pattern);
 			p->pattern = NULL;
 
 			if (p->type == PTRN_TAG)
@@ -255,7 +247,7 @@
 }
 
 static void addCompiledTagPattern (
-		const langType language, regex_t* const pattern,
+		const langType language, GRegex* const pattern,
 		char* const name, const char kind, char* const kindName,
 		char *const description)
 {
@@ -287,7 +279,7 @@
 }
 
 static void addCompiledCallbackPattern (
-		const langType language, regex_t* const pattern,
+		const langType language, GRegex* const pattern,
 		const regexCallback callback)
 {
 	patternSet* set;
@@ -315,32 +307,27 @@
 
 #if defined (POSIX_REGEX)
 
-static regex_t* compileRegex (const char* const regexp, const char* const flags)
+static GRegex* compileRegex (const char* const regexp, const char* const flags)
 {
-	int cflags = REG_EXTENDED | REG_NEWLINE;
-	regex_t *result = NULL;
-	int errcode;
+	int cflags = G_REGEX_MULTILINE;
+	GRegex *result = NULL;
+	GError *error = NULL;
 	int i;
 	for (i = 0  ; flags != NULL  &&  flags [i] != '\0'  ;  ++i)
 	{
 		switch ((int) flags [i])
 		{
-			case 'b': cflags &= ~REG_EXTENDED; break;
-			case 'e': cflags |= REG_EXTENDED;  break;
-			case 'i': cflags |= REG_ICASE;     break;
+			case 'b': g_warning("CTags 'b' flag not supported by Geany!"); break;
+			case 'e': break;
+			case 'i': cflags |= G_REGEX_CASELESS; break;
 			default: printf ("regex: unknown regex flag: '%c'\n", *flags); break;
 		}
 	}
-	result = xMalloc (1, regex_t);
-	errcode = regcomp (result, regexp, cflags);
-	if (errcode != 0)
+	result = g_regex_new(regexp, cflags, 0, &error);
+	if (error)
 	{
-		char errmsg[256];
-		regerror (errcode, result, errmsg, 256);
-		printf ("regex: regcomp %s: %s\n", regexp, errmsg);
-		regfree (result);
-		eFree (result);
-		result = NULL;
+		printf ("regex: regcomp %s: %s\n", regexp, error->message);
+		g_error_free(error);
 	}
 	return result;
 }
@@ -433,7 +420,7 @@
 
 static vString* substitute (
 		const char* const in, const char* out,
-		const int nmatch, const regmatch_t* const pmatch)
+		const int nmatch, const GMatchInfo* const minfo)
 {
 	vString* result = vStringNew ();
 	const char* p;
@@ -442,10 +429,12 @@
 		if (*p == '\\'  &&  isdigit ((int) *++p))
 		{
 			const int dig = *p - '0';
-			if (0 < dig  &&  dig < nmatch  &&  pmatch [dig].rm_so != -1)
+			int so, eo;
+			if (0 < dig  &&  dig < nmatch  &&
+				g_match_info_fetch_pos(minfo, dig, &so, &eo) && so != -1)
 			{
-				const int diglen = pmatch [dig].rm_eo - pmatch [dig].rm_so;
-				vStringNCatS (result, in + pmatch [dig].rm_so, diglen);
+				const int diglen = eo - so;
+				vStringNCatS (result, in + so, diglen);
 			}
 		}
 		else if (*p != '\n'  &&  *p != '\r')
@@ -457,10 +446,10 @@
 
 static void matchTagPattern (const vString* const line,
 		const regexPattern* const patbuf,
-		const regmatch_t* const pmatch)
+		const GMatchInfo* const minfo)
 {
 	vString *const name = substitute (vStringValue (line),
-			patbuf->u.tag.name_pattern, BACK_REFERENCE_COUNT, pmatch);
+			patbuf->u.tag.name_pattern, BACK_REFERENCE_COUNT, minfo);
 	vStringStripLeading (name);
 	vStringStripTrailing (name);
 	if (vStringLength (name) > 0)
@@ -474,15 +463,18 @@
 
 static void matchCallbackPattern (
 		const vString* const line, const regexPattern* const patbuf,
-		const regmatch_t* const pmatch)
+		const GMatchInfo* const minfo)
 {
 	regexMatch matches [BACK_REFERENCE_COUNT];
 	unsigned int count = 0;
 	int i;
-	for (i = 0  ;  i < BACK_REFERENCE_COUNT  &&  pmatch [i].rm_so != -1  ;  ++i)
+	for (i = 0  ;  i < BACK_REFERENCE_COUNT  ;  ++i)
 	{
-		matches [i].start  = pmatch [i].rm_so;
-		matches [i].length = pmatch [i].rm_eo - pmatch [i].rm_so;
+		int so, eo;
+		if (!g_match_info_fetch_pos(minfo, i, &so, &eo) || so == -1)
+			break;
+		matches [i].start  = so;
+		matches [i].length = eo - so;
 		++count;
 	}
 	patbuf->u.callback.function (vStringValue (line), matches, count);
@@ -492,22 +484,21 @@
 		const regexPattern* const patbuf)
 {
 	boolean result = FALSE;
-	regmatch_t pmatch [BACK_REFERENCE_COUNT];
-	const int match = regexec (patbuf->pattern, vStringValue (line),
-							   BACK_REFERENCE_COUNT, pmatch, 0);
-	if (match == 0)
+	GMatchInfo *minfo;
+	if (g_regex_match(patbuf->pattern, vStringValue(line), 0, &minfo))
 	{
 		result = TRUE;
 		if (patbuf->type == PTRN_TAG)
-			matchTagPattern (line, patbuf, pmatch);
+			matchTagPattern (line, patbuf, minfo);
 		else if (patbuf->type == PTRN_CALLBACK)
-			matchCallbackPattern (line, patbuf, pmatch);
+			matchCallbackPattern (line, patbuf, minfo);
 		else
 		{
 			Assert ("invalid pattern type" == NULL);
 			result = FALSE;
 		}
 	}
+	g_match_info_free(minfo);
 	return result;
 }
 
@@ -554,7 +545,7 @@
 	Assert (name != NULL);
 	if (! regexBroken)
 	{
-		regex_t* const cp = compileRegex (regex, flags);
+		GRegex* const cp = compileRegex (regex, flags);
 		if (cp != NULL)
 		{
 			char kind;
@@ -578,7 +569,7 @@
 	Assert (regex != NULL);
 	if (! regexBroken)
 	{
-		regex_t* const cp = compileRegex (regex, flags);
+		GRegex* const cp = compileRegex (regex, flags);
 		if (cp != NULL)
 			addCompiledCallbackPattern (language, cp, callback);
 	}
@@ -695,7 +686,7 @@
 /* Check for broken regcomp() on Cygwin */
 extern void checkRegex (void)
 {
-#if defined (HAVE_REGEX) && defined (CHECK_REGCOMP)
+#if 0 && defined (HAVE_REGEX) && defined (CHECK_REGCOMP)
 	regex_t patbuf;
 	int errcode;
 	if (regcomp (&patbuf, "/hello/", 0) != 0)

Modified: trunk/tagmanager/php.c
===================================================================
--- trunk/tagmanager/php.c	2011-10-03 14:14:33 UTC (rev 5986)
+++ trunk/tagmanager/php.c	2011-10-03 14:35:11 UTC (rev 5987)
@@ -79,10 +79,14 @@
 		"\\1", "m,macro,macros", NULL);
 	addTagRegex(language, "^[ \t]*const[ \t]*([" ALPHA "_][" ALNUM "_]*)[ \t]*[=;]",
 		"\\1", "m,macro,macros", NULL);
-	/* Note: Using [] to match words is wrong, but using () doesn't seem to match 'function' on its own */
 	addCallbackRegex(language,
-		"^[ \t]*[(public|protected|private|static|final)[ \t]*]*[ \t]*function[ \t]+&?[ \t]*([" ALPHA "_][" ALNUM "_]*)[[:space:]]*(\\(.*\\))",
+		"^[ \t]*((public|protected|private|static|final)[ \t]+)+function[ \t]+&?[ \t]*([" ALPHA "_][" ALNUM "_]*)[[:space:]]*(\\(.*\\))",
 		NULL, function_cb);
+	/* note: using (qualifiers)* instead of (qualifiers)+ in the above regex doesn't seem to
+	 * match 'function' on its own, so we handle that separately: */
+	addCallbackRegex(language,
+		"^[ \t]*function[ \t]+&?[ \t]*([" ALPHA "_][" ALNUM "_]*)[[:space:]]*(\\(.*\\))",
+		NULL, function_cb);
 	addTagRegex(language, "^[ \t]*(\\$|::\\$|\\$this->)([" ALPHA "_][" ALNUM "_]*)[ \t]*=",
 		"\\2", "v,variable,variables", NULL);
 	addTagRegex(language, "^[ \t]*((var|public|protected|private|static)[ \t]+)+\\$([" ALPHA "_][" ALNUM "_]*)[ \t]*[=;]",

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Commits mailing list