[geany/geany-plugins] be20de: lineoperations: combined similar code

Sylvan Mostert git-noreply at xxxxx
Tue Jan 3 21:46:05 UTC 2017


Branch:      refs/heads/master
Author:      Sylvan Mostert <smostert.dev at gmail.com>
Committer:   Sylvan Mostert <smostert.dev at gmail.com>
Date:        Fri, 09 Sep 2016 05:43:53 UTC
Commit:      be20ded4e8adbf85833cc8cc6368351189ff5516
             https://github.com/geany/geany-plugins/commit/be20ded4e8adbf85833cc8cc6368351189ff5516

Log Message:
-----------
lineoperations: combined similar code

Repeated variable declarations in each function (in linefunctions.c) are
now passed in.

Repeated code is now in `lineoperations.c` in `action_sci_manip_item()`
and `action_indir_manip_item()`.

The `sortlines()` function is now split into ascending and descending
-- to remove extra gboolean flag parameter.

Added undo action to include `ensure_final_newline()`.


Modified Paths:
--------------
    lineoperations/src/linefunctions.c
    lineoperations/src/linefunctions.h
    lineoperations/src/lineoperations.c

Modified: lineoperations/src/linefunctions.c
47 lines changed, 17 insertions(+), 30 deletions(-)
===================================================================
@@ -284,40 +284,27 @@ void rmwhspln(GeanyDocument *doc) {
 }
 
 
-/* Sort Lines Ascending and Descending */
-void sortlines(GeanyDocument *doc, gboolean asc) {
-	gint  total_num_lines;  /* number of lines in the document */
-	gchar **lines;          /* array to hold all lines in the document */
-	gchar *new_file;        /* *final* string to replace current document */
-	gint  i;                /* iterator */
-
-	total_num_lines = sci_get_line_count(doc->editor->sci);
-	lines           = g_malloc(sizeof(gchar *) * (total_num_lines+1));
+/* Sort Lines Ascending */
+void sortlinesasc(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file) {
+	gchar *nf_end = new_file;          /* points to last char of new_file */
+	gint i;
 
-	/* if file is not empty, ensure that the file ends with newline */
-	if(total_num_lines != 1)
-		ensure_final_newline(doc->editor, total_num_lines);
+	qsort(lines, num_lines, sizeof(gchar *), compare_asc);
 
-	/* copy *all* lines into **lines array */
-	for(i = 0; i < total_num_lines; i++)
-		lines[i] = sci_get_line(doc->editor->sci, i);
+	/* join **lines into one string (new_file) */
+	for(i = 0; i < num_lines; i++)
+		nf_end = g_stpcpy(nf_end, lines[i]);
+}
 
-	/* sort **lines array */
-	if(asc)
-		qsort(lines, total_num_lines, sizeof(gchar *), compare_asc);
-	else
-		qsort(lines, total_num_lines, sizeof(gchar *), compare_desc);
 
-	/* join **lines into one string (new_file) */
-	lines[total_num_lines] = NULL;
-	new_file = g_strjoinv("", lines);
+/* Sort Lines Descending */
+void sortlinesdesc(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file) {
+	gchar *nf_end = new_file;          /* points to last char of new_file */
+	gint i;
 
-	/* set new document */
-	sci_set_text(doc->editor->sci, new_file);
+	qsort(lines, num_lines, sizeof(gchar *), compare_desc);
 
-	/* free used memory */
-	for(i = 0; i < total_num_lines; i++)
-		g_free(lines[i]);
-	g_free(lines);
-	g_free(new_file);
+	/* join **lines into one string (new_file) */
+	for(i = 0; i < num_lines; i++)
+		nf_end = g_stpcpy(nf_end, lines[i]);
 }


Modified: lineoperations/src/linefunctions.h
17 lines changed, 10 insertions(+), 7 deletions(-)
===================================================================
@@ -30,26 +30,29 @@
 
 
 /* Remove Duplicate Lines, sorted */
-void rmdupst(GeanyDocument *doc);
+void rmdupst(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file);
 
 
 /* Remove Duplicate Lines, ordered */
-void rmdupln(GeanyDocument *doc);
+void rmdupln(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file);
 
 
 /* Remove Unique Lines */
-void rmunqln(GeanyDocument *doc);
+void rmunqln(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file);
 
 
 /* Remove Empty Lines */
-void rmemtyln(GeanyDocument *doc);
+void rmemtyln(GeanyDocument *doc, gint num_lines);
 
 
 /* Remove Whitespace Lines */
-void rmwhspln(GeanyDocument *doc);
+void rmwhspln(GeanyDocument *doc, gint num_lines);
 
 
-/* Sort Lines Ascending and Descending */
-void sortlines(GeanyDocument *doc, gboolean asc);
+/* Sort Lines Ascending */
+void sortlinesasc(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file);
+
+/* Sort Lines Descending */
+void sortlinesdesc(GeanyDocument *doc, gchar **lines, gint num_lines, gchar *new_file);
 
 #endif


Modified: lineoperations/src/lineoperations.c
94 lines changed, 76 insertions(+), 18 deletions(-)
===================================================================
@@ -29,26 +29,84 @@
 static GtkWidget *main_menu_item = NULL;
 
 
-/* call custom func */
+
+
+/* altered from geany/src/editor.c, ensure new line at file end */
+static void
+ensure_final_newline(GeanyEditor *editor, gint max_lines)
+{
+	gint end_document       = sci_get_position_from_line(editor->sci, max_lines);
+	gboolean append_newline = end_document >
+					sci_get_position_from_line(editor->sci, max_lines - 1);
+
+	if (append_newline)
+	{
+		const gchar *eol = editor_get_eol_char(editor);
+		sci_insert_text(editor->sci, end_document, eol);
+	}
+}
+
+
+/* 
+ * functions with indirect scintilla manipulation 
+ * e.g. requires **lines array, *new_file...
+*/
 static void
-action_func_item(GtkMenuItem *menuitem, gpointer gdata)
+action_indir_manip_item(GtkMenuItem *menuitem, gpointer gdata)
 {
-	void (*func)(GeanyDocument *) = gdata;
-	GeanyDocument *doc = NULL;
-	doc = document_get_current();
+	void (*func)(GeanyDocument *, gchar **, gint, gchar *) = gdata;
+	GeanyDocument *doc = document_get_current();
 
-	if(doc) func(doc);
+	gint  num_chars  = sci_get_length(doc->editor->sci);
+	gint  num_lines  = sci_get_line_count(doc->editor->sci);
+	gchar **lines    = g_malloc(sizeof(gchar *) * num_lines);
+	gchar *new_file  = g_malloc(sizeof(gchar)   * (num_chars+1));
+	gint i           = 0;
+	new_file[0]      = '\0';
+
+	
+	/* copy *all* lines into **lines array */
+	for(i = 0; i < num_lines; i++)
+		lines[i] = sci_get_line(doc->editor->sci, i);
+
+	sci_start_undo_action(doc->editor->sci);
+
+	/* if file is not empty, ensure that the file ends with newline */
+	if(num_lines != 1)
+		ensure_final_newline(doc->editor, num_lines);
+
+	if(doc) func(doc, lines, num_lines, new_file);
+
+	/* set new document */
+	sci_set_text(doc->editor->sci, new_file);
+
+	sci_end_undo_action(doc->editor->sci);
+
+	/* free used memory */
+	for(i = 0; i < num_lines; i++)
+		g_free(lines[i]);
+	g_free(lines);
+	g_free(new_file);
 }
 
 
-/* Sort Lines */
+/* 
+ * functions with direct scintilla manipulation 
+ * e.g. no need for **lines array, *new_file...
+*/
 static void
-action_sort_item(GtkMenuItem *menuitem, gpointer gdata)
+action_sci_manip_item(GtkMenuItem *menuitem, gpointer gdata)
 {
-	GeanyDocument *doc = NULL;
-	doc = document_get_current();
+	void (*func)(GeanyDocument *, gint) = gdata;
+	GeanyDocument *doc = document_get_current();
+
+	gint num_lines  = sci_get_line_count(doc->editor->sci);
+
+	sci_start_undo_action(doc->editor->sci);
+
+	if(doc) func(doc, num_lines);
 
-	if(doc) sortlines(doc, GPOINTER_TO_INT(gdata));
+	sci_end_undo_action(doc->editor->sci);
 }
 
 
@@ -65,21 +123,21 @@ lo_init(GeanyPlugin *plugin, gpointer gdata)
 		gpointer cb_data;
 	} menu_items[] = {
 		{ N_("Remove Duplicate Lines, _Sorted"),
-		  G_CALLBACK(action_func_item), (gpointer) rmdupst },
+		  G_CALLBACK(action_indir_manip_item), (gpointer) rmdupst },
 		{ N_("Remove Duplicate Lines, _Ordered"),
-		  G_CALLBACK(action_func_item), (gpointer) rmdupln },
+		  G_CALLBACK(action_indir_manip_item), (gpointer) rmdupln },
 		{ N_("Remove _Unique Lines"),
-		  G_CALLBACK(action_func_item), (gpointer) rmunqln },
+		  G_CALLBACK(action_indir_manip_item), (gpointer) rmunqln },
 		{ NULL },
 		{ N_("Remove _Empty Lines"),
-		  G_CALLBACK(action_func_item), (gpointer) rmemtyln },
+		  G_CALLBACK(action_sci_manip_item), (gpointer) rmemtyln },
 		{ N_("Remove _Whitespace Lines"),
-		  G_CALLBACK(action_func_item), (gpointer) rmwhspln },
+		  G_CALLBACK(action_sci_manip_item), (gpointer) rmwhspln },
 		{ NULL },
 		{ N_("Sort Lines _Ascending"),
-		  G_CALLBACK(action_sort_item), GINT_TO_POINTER(1) },
+		  G_CALLBACK(action_indir_manip_item), (gpointer) sortlinesasc },
 		{ N_("Sort Lines _Descending"),
-		  G_CALLBACK(action_sort_item), GINT_TO_POINTER(0) }
+		  G_CALLBACK(action_indir_manip_item), (gpointer) sortlinesdesc }
 	};
 
 	main_menu_item = gtk_menu_item_new_with_mnemonic(_("_Line Operations"));



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list