Remove queue.[hc] - use GQueue instead of GeanyQueue.

Beep if there are no more snippet positions.
Limit length of snippet positions queue to 20.



git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@4204 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
Nick Treleaven 2009-09-17 17:37:13 +00:00
parent 8c1743cb3e
commit b25e3e9650
7 changed files with 33 additions and 208 deletions

View File

@ -6,6 +6,11 @@
* src/utils.c, src/utils.h:
Add foreach_dir() API macro.
Update API docs for utils_get_file_list().
* wscript, src/queue.c, src/editor.c, src/Makefile.am, src/queue.h,
po/POTFILES.in:
Remove queue.[hc] - use GQueue instead of GeanyQueue.
Beep if there are no more snippet positions.
Limit length of snippet positions queue to 20.
2009-09-16 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>

View File

@ -26,7 +26,6 @@ src/plugins.c
src/prefs.c
src/printing.c
src/project.c
src/queue.c
src/sciwrappers.c
src/search.c
src/socket.c

View File

@ -36,7 +36,6 @@ SRCS = \
prefs.c prefs.h \
printing.c printing.h \
project.c project.h \
queue.c queue.h \
sciwrappers.c sciwrappers.h \
search.c search.h \
socket.c socket.h \

View File

@ -59,7 +59,6 @@
#include "keybindings.h"
#include "project.h"
#include "projectprivate.h"
#include "queue.h"
/* Note: Avoid using SSM in files not related to scintilla, use sciwrappers.h instead. */
@ -67,7 +66,7 @@
static GHashTable *snippet_hash = NULL;
static GeanyQueue *snippet_queue = NULL;
static GQueue *snippet_offsets = NULL;
static gint snippet_cursor_insert_pos;
/* holds word under the mouse or keyboard cursor */
@ -107,7 +106,7 @@ static void editor_auto_latex(GeanyEditor *editor, gint pos);
void editor_snippets_free(void)
{
g_hash_table_destroy(snippet_hash);
queue_destroy(snippet_queue);
g_queue_free(snippet_offsets);
}
@ -122,7 +121,7 @@ void editor_snippets_init(void)
GKeyFile *userconfig = g_key_file_new();
GHashTable *tmp;
snippet_queue = queue_init();
snippet_offsets = g_queue_new();
sysconfigfile = g_strconcat(app->datadir, G_DIR_SEPARATOR_S, "snippets.conf", NULL);
userconfigfile = g_strconcat(app->configdir, G_DIR_SEPARATOR_S, "snippets.conf", NULL);
@ -2173,11 +2172,11 @@ void editor_goto_next_snippet_cursor(GeanyEditor *editor)
ScintillaObject *sci = editor->sci;
gint current_pos = sci_get_current_position(sci);
if (snippet_queue)
if (snippet_offsets && !g_queue_is_empty(snippet_offsets))
{
gint offset;
snippet_queue = queue_delete(snippet_queue, (gpointer*)&offset, FALSE);
offset = (gint)g_queue_pop_head(snippet_offsets);
if (current_pos > snippet_cursor_insert_pos)
snippet_cursor_insert_pos = offset + current_pos;
else
@ -2185,6 +2184,10 @@ void editor_goto_next_snippet_cursor(GeanyEditor *editor)
sci_set_current_position(sci, snippet_cursor_insert_pos, FALSE);
}
else
{
utils_beep();
}
}
@ -2197,7 +2200,7 @@ static gboolean snippets_complete_constructs(GeanyEditor *editor, gint pos, cons
gssize cur_index = -1;
gint ft_id = FILETYPE_ID(editor->document->file_type);
GHashTable *specials;
GeanyQueue *temp_list;
GList *temp_list = NULL;
const GeanyIndentPrefs *iprefs;
gsize indent_size;
gint cursor_steps, old_cursor = 0;
@ -2212,7 +2215,6 @@ static gboolean snippets_complete_constructs(GeanyEditor *editor, gint pos, cons
return FALSE;
}
temp_list = queue_init();
iprefs = editor_get_indent_prefs(editor);
read_indent(editor, pos);
indent_size = strlen(indent);
@ -2282,7 +2284,7 @@ static gboolean snippets_complete_constructs(GeanyEditor *editor, gint pos, cons
if (i++ > 0)
{
cursor_steps += (nl_count * indent_size);
queue_append(temp_list, GINT_TO_POINTER(cursor_steps - old_cursor));
temp_list = g_list_append(temp_list, GINT_TO_POINTER(cursor_steps - old_cursor));
}
else
{
@ -2295,10 +2297,22 @@ static gboolean snippets_complete_constructs(GeanyEditor *editor, gint pos, cons
utils_string_replace_all(pattern, "%newline%", editor_get_eol_char(editor));
utils_string_replace_all(pattern, "%ws%", whitespace);
g_free(whitespace);
/* We create a new list, where the cursor positions for the most recent
* parsed snipped come first, followed by the remaining positions */
if (temp_list->data)
snippet_queue = queue_concat_copy(temp_list, snippet_queue);
/* We put the cursor positions for the most recent
* parsed snippet first, followed by any remaining positions */
i = 0;
if (temp_list)
{
GList *node;
foreach_list(node, temp_list)
g_queue_push_nth(snippet_offsets, node->data, i++);
/* limit length of queue */
while (g_queue_get_length(snippet_offsets) > 20)
g_queue_pop_tail(snippet_offsets);
g_list_free(temp_list);
}
if (cur_index < 0)
cur_index = pattern->len;

View File

@ -1,144 +0,0 @@
/*
* queue.c - this file is part of Geany, a fast and lightweight IDE
*
* Copyright 2009 kugel. aka Thomas Martitz <thomas47(at)arcor(dot)de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
*/
/* WARNING: Do not use this in new code, use GQueue or GList instead - this code may be
* removed.
*
* This provides a simple single linked list, with some functions to modify it.
* Being a queue, you can append data only to the end of the list, and retrieve
* data from the beginning. Only the first node is directly visible, but with the foreach
* functions you can iterate through the entire list.
*/
#include "geany.h"
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
/* Allocates memory for queue_start, and sets next and data members to NULL */
GeanyQueue *queue_init(void)
{
return g_new0(GeanyQueue, 1);
}
/* Returns true if q_node is the last node in a queue */
static gboolean queue_is_last_node(const GeanyQueue *q_node)
{
return (q_node->next == NULL);
}
/* Appends a data in a new node at the end of the lst */
void queue_append(GeanyQueue *queue_start, gpointer data)
{
GeanyQueue *temp, *next;
if (queue_start == NULL || data == NULL)
return;
if (queue_start->data == NULL)
{
queue_start->data = data;
return;
}
temp = g_new0(GeanyQueue, 1);
temp->data = data;
temp->next = NULL;
next = queue_start;
while (! queue_is_last_node(next))
next = next->next;
next->next = temp;
}
/* Removes and frees the first node in queue_start, and writes the data of the
* removed node into data.
* Returns a pointer to the new first item */
GeanyQueue *queue_delete(GeanyQueue *queue_start, gpointer *data, const gboolean free_data)
{
GeanyQueue *ret;
if (NULL == queue_start)
return NULL;
if (data != NULL)
*data = queue_start->data;
if (free_data)
g_free(queue_start->data);
ret = queue_start->next;
g_free(queue_start);
return ret;
}
/* Removes and frees the entire queue staring at queue_start */
void queue_destroy(GeanyQueue *queue_start)
{
while ((queue_start = queue_delete(queue_start, NULL, FALSE)));
}
typedef void (*ForeachFunc) (GeanyQueue *queue_start, gpointer data);
/* Iterates through param, and calls func with the node queue_start and each node in param */
static void queue_foreach_data_2(GeanyQueue *queue_start, ForeachFunc func, GeanyQueue *param)
{
GeanyQueue *temp = param;
if (! queue_start || ! param)
return;
do
{
(*func) (queue_start, (temp->data));
}
while ((temp = temp->next));
}
/* Copies the data of each node in q1, then the data of each node in q2 to a newly
* created queue, using queue_append. Frees q1 and q2.
* Returns a pointer to the created queue. */
GeanyQueue *queue_concat_copy(GeanyQueue *q1, GeanyQueue *q2)
{
/* q1 + q2 = q3 *
* ->1->2 + ->4->5->6 = 4->5->6->1->2 */
GeanyQueue *ret = queue_init();
queue_foreach_data_2(ret, queue_append, q1);
queue_foreach_data_2(ret, queue_append, q2);
queue_destroy(q1);
queue_destroy(q2);
return ret;
}

View File

@ -1,48 +0,0 @@
/*
* queue.h - this file is part of Geany, a fast and lightweight IDE
*
* Copyright 2009 kugel. aka Thomas Martitz <thomas47(at)arcor(dot)de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
*/
/* WARNING: Do not use this in new code, use GQueue or GList instead - this code may be
* removed. */
#ifndef __QUEUE_H__
#define __QUEUE_H__
typedef struct _GeanyQueue
{
gpointer data;
struct _GeanyQueue *next;
} GeanyQueue;
GeanyQueue *queue_init(void);
void queue_append(GeanyQueue *queue_start, gpointer data);
GeanyQueue *queue_delete(GeanyQueue *queue_start, gpointer *data, const gboolean free_data);
GeanyQueue *queue_concat_copy(GeanyQueue *q1, GeanyQueue *q2);
void queue_destroy(GeanyQueue *queue_start);
#endif /* __QUEUE_H__ */

View File

@ -109,7 +109,7 @@ geany_sources = [
'src/highlighting.c', 'src/interface.c', 'src/keybindings.c',
'src/keyfile.c', 'src/log.c', 'src/main.c', 'src/msgwindow.c', 'src/navqueue.c', 'src/notebook.c',
'src/plugins.c', 'src/pluginutils.c', 'src/prefix.c', 'src/prefs.c', 'src/printing.c', 'src/project.c',
'src/queue.c', 'src/sciwrappers.c', 'src/search.c', 'src/socket.c', 'src/stash.c',
'src/sciwrappers.c', 'src/search.c', 'src/socket.c', 'src/stash.c',
'src/symbols.c',
'src/templates.c', 'src/toolbar.c', 'src/tools.c', 'src/treeviews.c',
'src/ui_utils.c', 'src/utils.c' ]