Author: peter
Date: 2008-02-24 20:57:14 +0000 (Sun, 24 Feb 2008)
New Revision: 26640
Added:
squeeze/trunk/libsqueeze/command-queue.c
squeeze/trunk/libsqueeze/command-queue.h
Modified:
squeeze/trunk/libsqueeze/Makefile.am
squeeze/trunk/libsqueeze/scanf-parser.c
Log:
added command queue
it compiles but isn't used yet
Modified: squeeze/trunk/libsqueeze/Makefile.am
===================================================================
--- squeeze/trunk/libsqueeze/Makefile.am 2008-02-24 12:38:37 UTC (rev
26639)
+++ squeeze/trunk/libsqueeze/Makefile.am 2008-02-24 20:57:14 UTC (rev
26640)
@@ -7,6 +7,7 @@
parser-context.c parser-context.h \
parser.c parser.h \
scanf-parser.c scanf-parser.h \
+ command-queue.c command-queue.h \
slist.c slist.h \
archive-iter-pool.c archive-iter-pool.h \
archive-iter.c archive-iter.h \
Added: squeeze/trunk/libsqueeze/command-queue.c
===================================================================
--- squeeze/trunk/libsqueeze/command-queue.c (rev 0)
+++ squeeze/trunk/libsqueeze/command-queue.c 2008-02-24 20:57:14 UTC (rev
26640)
@@ -0,0 +1,372 @@
+/*
+ * 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <signal.h>
+
+#include <thunar-vfs/thunar-vfs.h>
+#include "libsqueeze.h"
+
+#include "command-queue.h"
+
+typedef struct _LSQCommandEntry LSQCommandEntry;
+
+struct _LSQCommandEntry
+{
+ LSQCommandEntry *next;
+ gchar *command;
+ GSList *args;
+ gchar *redirect_in;
+ gchar *redirect_out;
+};
+
+struct _LSQCommandQueue
+{
+ GObject parent;
+
+ LSQCommandEntry *queue;
+};
+
+struct _LSQCommandQueueClass
+{
+ GObjectClass parent;
+};
+
+static void build_queue(LSQCommandQueue *queue, const gchar *commant_string);
+
+G_DEFINE_TYPE(LSQCommandQueue, lsq_command_queue, G_TYPE_OBJECT);
+
+static void
+lsq_command_queue_init(LSQCommandQueue *self)
+{
+}
+
+static void
+lsq_command_queue_class_init(LSQCommandQueueClass *klass)
+{
+}
+
+LSQCommandQueue *lsq_command_queue_new(const gchar *command_string)
+{
+ LSQCommandQueue *queue;
+
+ queue = g_object_new(LSQ_TYPE_COMMAND_QUEUE, NULL);
+
+ build_queue(queue, command_string);
+
+ return LSQ_COMMAND_QUEUE(queue);
+}
+
+static gchar* strdup_escaped(const gchar *str, guint lng)/*{{{*/
+{
+ guint i;
+ gchar *new_str;
+ gchar ch;
+ guint size = 0;
+
+ for(i = 0; i < lng; i++)
+ {
+ switch(str[i])
+ {
+ case '\\':
+ i++;
+ switch(str[i])
+ {
+ case 'x':
+ if(g_ascii_isxdigit(str[i+1]))
+ {
+ i++;
+ if(g_ascii_isxdigit(str[i+1]))
+ {
+ i++;
+ }
+ }
+ break;
+ default:
+ ch = str[i+1];
+ if(ch>='0' && ch < '8')
+ {
+ i++;
+ ch = str[i+1];
+ if(ch>='0' && ch < '8')
+ {
+ ch = str[i];
+ i++;
+ if(ch < '4')
+ {
+ ch = str[i+1];
+ if(str[i+1]>='0' && str[i+1] < '8')
+ {
+ i++;
+ }
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ size++;
+ }
+
+ new_str = g_new(gchar, size+1);
+ new_str[size] = '\0';
+
+ size = 0;
+ for(i = 0; i < lng; i++)
+ {
+ switch(ch = str[i])
+ {
+ case '\\':
+ i++;
+ switch(ch = str[i])
+ {
+ case 'a':
+ ch = '\a';
+ break;
+ case 'b':
+ ch = '\b';
+ break;
+ case 'f':
+ ch = '\f';
+ break;
+ case 'n':
+ ch = '\n';
+ break;
+ case 'r':
+ ch = '\r';
+ break;
+ case 't':
+ ch = '\t';
+ break;
+ case 'v':
+ ch = '\v';
+ break;
+ case 'x':
+ if(g_ascii_isxdigit(str[i+1]))
+ {
+ i++;
+ ch = g_ascii_xdigit_value(str[i]);
+ if(g_ascii_isxdigit(str[i+1]))
+ {
+ i++;
+ ch = (ch*0x10) + g_ascii_xdigit_value(str[i]);
+ }
+ }
+ break;
+ default:
+ if(str[i+1]>='0' && str[i+1] < '8')
+ {
+ i++;
+ ch = str[i]-'0';
+ if(str[i+1]>='0' && str[i+1] < '8')
+ {
+ i++;
+ if((ch = (ch*010) + (str[i]-'0')) < 040)
+ {
+ if(str[i+1]>='0' && str[i+1] < '8')
+ {
+ i++;
+ ch = (ch*010) + (str[i]-'0');
+ }
+ }
+ }
+ }
+ break;
+ }
+ break;
+ }
+ new_str[size++] = ch;
+ }
+
+ return new_str;
+}/*}}}*/
+
+static void build_queue(LSQCommandQueue *queue, const gchar *command_string)
+{
+ const gchar *ptr;
+ const gchar *cur;
+ gchar ch;
+ enum {
+ STATE_COMMAND,
+ STATE_ARGS,
+ STATE_REDIRECT,
+ STATE_FINISH
+ } state = STATE_COMMAND;
+
+ LSQCommandEntry *command = g_new0(LSQCommandEntry, 1);
+ LSQCommandEntry *commands = command;
+ LSQCommandEntry *prev_cmd = NULL;
+
+ gchar **direct_to = NULL;
+
+ cur = ptr = command_string;
+
+ while((ch = *ptr++))
+ {
+ switch(ch)
+ {
+ case '\\':
+ if(*ptr)
+ ptr++;
+ break;
+ case ';':
+ if(cur+1 != ptr)
+ {
+ switch(state)
+ {
+ case STATE_COMMAND:
+ command->command = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_ARGS;
+ break;
+ case STATE_ARGS:
+ command->args = g_slist_append(command->args,
strdup_escaped(cur, (ptr-cur)-1));
+ break;
+ case STATE_REDIRECT:
+ g_return_if_fail(cur[0] == '%');
+ *direct_to = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_FINISH;
+ break;
+ case STATE_FINISH:
+ g_return_if_reached();
+ break;
+ }
+ }
+ cur = ptr;
+ g_return_if_fail(state == STATE_ARGS || state == STATE_FINISH);
+ prev_cmd = command;
+ prev_cmd->next = command = g_new0(LSQCommandEntry, 1);
+ direct_to = NULL;
+ state = STATE_COMMAND;
+ break;
+ case '>':
+ if(cur+1 != ptr)
+ {
+ switch(state)
+ {
+ case STATE_COMMAND:
+ command->command = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_ARGS;
+ break;
+ case STATE_ARGS:
+ command->args = g_slist_append(command->args,
strdup_escaped(cur, (ptr-cur)-1));
+ break;
+ case STATE_REDIRECT:
+ g_return_if_fail(cur[0] == '%');
+ *direct_to = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_FINISH;
+ break;
+ case STATE_FINISH:
+ g_return_if_reached();
+ break;
+ }
+ }
+ cur = ptr;
+ g_return_if_fail(state == STATE_ARGS || state == STATE_FINISH);
+ direct_to = &command->redirect_out;
+ state = STATE_REDIRECT;
+ break;
+ break;
+ case '<':
+ if(cur+1 != ptr)
+ {
+ switch(state)
+ {
+ case STATE_COMMAND:
+ command->command = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_ARGS;
+ break;
+ case STATE_ARGS:
+ command->args = g_slist_append(command->args,
strdup_escaped(cur, (ptr-cur)-1));
+ break;
+ case STATE_REDIRECT:
+ g_return_if_fail(cur[0] == '%');
+ *direct_to = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_FINISH;
+ break;
+ case STATE_FINISH:
+ g_return_if_reached();
+ break;
+ }
+ }
+ cur = ptr;
+ g_return_if_fail(state == STATE_ARGS || state == STATE_FINISH);
+ direct_to = &command->redirect_in;
+ state = STATE_REDIRECT;
+ break;
+ case ' ':
+ case '\t':
+ if(cur+1 != ptr)
+ {
+ switch(state)
+ {
+ case STATE_COMMAND:
+ command->command = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_ARGS;
+ break;
+ case STATE_ARGS:
+ command->args = g_slist_append(command->args,
strdup_escaped(cur, (ptr-cur)-1));
+ break;
+ case STATE_REDIRECT:
+ g_return_if_fail(cur[0] == '%');
+ *direct_to = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_FINISH;
+ break;
+ case STATE_FINISH:
+ g_return_if_reached();
+ break;
+ }
+ }
+ cur = ptr;
+ break;
+ }
+ }
+
+ if(cur+1 != ptr)
+ {
+ switch(state)
+ {
+ case STATE_COMMAND:
+ command->command = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_ARGS;
+ break;
+ case STATE_ARGS:
+ command->args = g_slist_append(command->args, strdup_escaped(cur,
(ptr-cur)-1));
+ break;
+ case STATE_REDIRECT:
+ g_return_if_fail(cur[0] == '%');
+ *direct_to = strdup_escaped(cur, (ptr-cur)-1);
+ state = STATE_FINISH;
+ break;
+ case STATE_FINISH:
+ g_return_if_reached();
+ break;
+ }
+ }
+ g_return_if_fail(state == STATE_ARGS || state == STATE_FINISH);
+
+ if(!command->command)
+ {
+ g_return_if_fail(prev_cmd);
+ prev_cmd->next = NULL;
+ g_free(command);
+ }
+
+ queue->queue = commands;
+}
+
Added: squeeze/trunk/libsqueeze/command-queue.h
===================================================================
--- squeeze/trunk/libsqueeze/command-queue.h (rev 0)
+++ squeeze/trunk/libsqueeze/command-queue.h 2008-02-24 20:57:14 UTC (rev
26640)
@@ -0,0 +1,59 @@
+/*
+ * 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __LIBSQUEEZE_COMMAND_QUEUE_H__
+#define __LIBSQUEEZE_COMMAND_QUEUE_H__
+
+G_BEGIN_DECLS
+
+#define LSQ_TYPE_COMMAND_QUEUE lsq_command_queue_get_type()
+
+#define LSQ_COMMAND_QUEUE(obj) ( \
+ G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ LSQ_TYPE_COMMAND_QUEUE, \
+ LSQCommandQueue))
+
+#define LSQ_IS_COMMAND_QUEUE(obj) ( \
+ G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+ LSQ_TYPE_COMMAND_QUEUE))
+
+#define LSQ_COMMAND_QUEUE_CLASS(class) ( \
+ G_TYPE_CHECK_CLASS_CAST ((class), \
+ LSQ_TYPE_COMMAND_QUEUE, \
+ LSQCommandQueueClass))
+
+#define LSQ_IS_COMMAND_QUEUE_CLASS(class) ( \
+ G_TYPE_CHECK_CLASS_TYPE ((class), \
+ LSQ_TYPE_COMMAND_QUEUE))
+
+#define LSQ_COMMAND_QUEUE_GET_CLASS(obj) ( \
+ G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ LSQ_TYPE_COMMAND_QUEUE, \
+ LSQCommandQueueClass))
+
+
+typedef struct _LSQCommandQueue LSQCommandQueue;
+
+
+typedef struct _LSQCommandQueueClass LSQCommandQueueClass;
+
+
+GType lsq_command_queue_get_type(void);
+
+
+G_END_DECLS
+
+#endif /* __LIBSQUEEZE_COMMAND_QUEUE_H__ */
+
Modified: squeeze/trunk/libsqueeze/scanf-parser.c
===================================================================
--- squeeze/trunk/libsqueeze/scanf-parser.c 2008-02-24 12:38:37 UTC (rev
26639)
+++ squeeze/trunk/libsqueeze/scanf-parser.c 2008-02-24 20:57:14 UTC (rev
26640)
@@ -514,7 +514,7 @@
}
/*}}}*/
-gchar* strdup_escaped(const gchar *str, guint lng)/*{{{*/
+static gchar* strdup_escaped(const gchar *str, guint lng)/*{{{*/
{
guint i;
gchar *new_str;
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits