Author: peter
Date: 2007-10-28 14:22:44 +0000 (Sun, 28 Oct 2007)
New Revision: 26206
Modified:
squeeze/trunk/libsqueeze/parser-context.c
squeeze/trunk/libsqueeze/parser-context.h
squeeze/trunk/libsqueeze/parser.h
squeeze/trunk/libsqueeze/scanf-parser.c
Log:
added parse functions
Modified: squeeze/trunk/libsqueeze/parser-context.c
===================================================================
--- squeeze/trunk/libsqueeze/parser-context.c 2007-10-28 09:45:09 UTC (rev
26205)
+++ squeeze/trunk/libsqueeze/parser-context.c 2007-10-28 14:22:44 UTC (rev
26206)
@@ -38,6 +38,8 @@
lsq_parser_context_init(LSQParserContext *self)
{
self->archive = NULL;
+ self->channel = NULL;
+ self->last_stat = G_IO_STATUS_AGAIN;
}
static void
@@ -87,10 +89,28 @@
return ctx;
}
+void
+lsq_parser_context_set_channel(LSQParserContext *ctx, GIOChannel *channel)
+{
+ ctx->channel = channel;
+ ctx->last_stat = G_IO_STATUS_AGAIN;
+}
+
gboolean
lsq_parser_context_get_line(LSQParserContext *ctx, gchar **line, gsize *length)
{
GIOStatus stat;
- /*stat = g_io_channel_read_line;*/
+ stat = g_io_channel_read_line(ctx->channel, line, length, NULL, NULL);
+
+ ctx->last_stat = stat;
+
+ return stat == G_IO_STATUS_NORMAL;
}
+
+gboolean
+lsq_parser_context_is_good(LSQParserContext *ctx)
+{
+ return ctx->last_stat == G_IO_STATUS_NORMAL || ctx->last_stat ==
G_IO_STATUS_AGAIN;
+}
+
Modified: squeeze/trunk/libsqueeze/parser-context.h
===================================================================
--- squeeze/trunk/libsqueeze/parser-context.h 2007-10-28 09:45:09 UTC (rev
26205)
+++ squeeze/trunk/libsqueeze/parser-context.h 2007-10-28 14:22:44 UTC (rev
26206)
@@ -45,6 +45,9 @@
GObject parent;
LSQArchive *archive;
+
+ GIOChannel *channel;
+ GIOStatus last_stat;
};
typedef struct _LSQParserContextClass LSQParserContextClass;
Modified: squeeze/trunk/libsqueeze/parser.h
===================================================================
--- squeeze/trunk/libsqueeze/parser.h 2007-10-28 09:45:09 UTC (rev 26205)
+++ squeeze/trunk/libsqueeze/parser.h 2007-10-28 14:22:44 UTC (rev 26206)
@@ -38,7 +38,12 @@
G_TYPE_CHECK_CLASS_TYPE ((class), \
LSQ_TYPE_PARSER))
+#define LSQ_PARSER_GET_CLASS(obj) ( \
+ G_TYPE_INSTANCE_GET_CLASS ((obj), \
+ LSQ_TYPE_PARSER, \
+ LSQParserClass))
+
typedef struct _LSQParser LSQParser;
struct _LSQParser
Modified: squeeze/trunk/libsqueeze/scanf-parser.c
===================================================================
--- squeeze/trunk/libsqueeze/scanf-parser.c 2007-10-28 09:45:09 UTC (rev
26205)
+++ squeeze/trunk/libsqueeze/scanf-parser.c 2007-10-28 14:22:44 UTC (rev
26206)
@@ -23,12 +23,15 @@
#include <thunar-vfs/thunar-vfs.h>
#include "libsqueeze.h"
#include "archive-iter.h"
+#include "parser-context.h"
+#include "parser.h"
#include "scanf-parser.h"
#include "archive.h"
typedef struct _parse_part parse_part;
+typedef struct _LSQScanfParserContext LSQScanfParserContext;
-typedef guint (*LSQParseFunc)(gchar*, guint, parse_part*);
+typedef guint (*LSQParseFunc)(gchar*, guint, parse_part*,
LSQScanfParserContext*);
struct _parse_part
{
@@ -36,11 +39,28 @@
LSQParseFunc function;
guint index;
guint width;
- //gtype
};
+struct _LSQScanfParserContext
+{
+ gchar *filename;
+ LSQParserContext parser;
+ union {
+ gchar c;
+ gint i;
+ guint u;
+ glong l;
+ gulong ul;
+ gint64 ll;
+ guint64 ull;
+ gfloat f;
+ gdouble d;
+ } *data_store;
+ gpointer *props_store;
+};
+
/*{{{ skip functions*/
-guint skip_byte(gchar *str, guint lng, parse_part *part)
+guint skip_byte(gchar *str, guint lng, parse_part *part, LSQScanfParserContext
*ctx)
{
if(lng < 1)
return 0;
@@ -48,7 +68,7 @@
return 1;
}
-guint skip_word(gchar *str, guint lng, parse_part *part)
+guint skip_word(gchar *str, guint lng, parse_part *part, LSQScanfParserContext
*ctx)
{
if(lng < 2)
return 0;
@@ -56,7 +76,7 @@
return 2;
}
-guint skip_dword(gchar *str, guint lng, parse_part *part)
+guint skip_dword(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
if(lng < 4)
return 0;
@@ -64,7 +84,7 @@
return 4;
}
-guint skip_qword(gchar *str, guint lng, parse_part *part)
+guint skip_qword(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
if(lng < 8)
return 0;
@@ -72,7 +92,7 @@
return 8;
}
-guint skip_char(gchar *str, guint lng, parse_part *part)
+guint skip_char(gchar *str, guint lng, parse_part *part, LSQScanfParserContext
*ctx)
{
const gchar *ptr;
@@ -89,7 +109,7 @@
return ptr - str;
}
-guint skip_decimal(gchar *str, guint lng, parse_part *part)
+guint skip_decimal(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
gchar *ptr;
#ifdef DO_EXSTENSIVE_CHECKING
@@ -117,7 +137,7 @@
return ptr - str;
}
-guint skip_floatingpoint(gchar *str, guint lng, parse_part *part)
+guint skip_floatingpoint(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
gchar *ptr;
#ifdef DO_EXSTENSIVE_CHECKING
@@ -145,7 +165,7 @@
return ptr - str;
}
-guint skip_octal(gchar *str, guint lng, parse_part *part)
+guint skip_octal(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
gchar *ptr;
#ifdef DO_EXSTENSIVE_CHECKING
@@ -173,7 +193,7 @@
return ptr - str;
}
-guint skip_string(gchar *str, guint lng, parse_part *part)
+guint skip_string(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
gchar *ptr;
@@ -190,7 +210,7 @@
return ptr - str;
}
-guint skip_unsigned(gchar *str, guint lng, parse_part *part)
+guint skip_unsigned(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
gchar *ptr;
#ifdef DO_EXSTENSIVE_CHECKING
@@ -216,7 +236,7 @@
return ptr - str;
}
-guint skip_hexadecimal(gchar *str, guint lng, parse_part *part)
+guint skip_hexadecimal(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
gchar *ptr;
#ifdef DO_EXSTENSIVE_CHECKING
@@ -244,15 +264,178 @@
/*}}}*/
/*{{{ parse functions*/
-guint parse_byte(gchar *str, guint lng, parse_part *part)
+#define DEF_PARSE_BIN(func, bytes, type, ptype, pname) \
+guint parse_##func(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx) { \
+ type val; \
+ ptype *pval; \
+ if(lng < bytes) return 0; \
+ val = *((type*)str); \
+ pval = &ctx->data_store[part->index].pname; \
+ *pval = val; \
+ ctx->props_store[part->index] = pval; \
+ return bytes; \
+}
+
+#define DEF_PARSE_NUM(func, base, type, ptype, pname) \
+guint parse_##func(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx) { \
+ gchar *ptr; \
+ gchar *ptr2; \
+ type val; \
+ ptype *pval; \
+ if(!lng) return 0; \
+ pval = &ctx->data_store[part->index].pname; \
+ ctx->props_store[part->index] = pval; \
+ if(!part->delimiter[0]) { \
+ val = g_ascii_strtoll(str, &ptr, base); \
+ *pval = val; \
+ return ptr - str; \
+ } \
+ for(ptr = str; g_ascii_isspace(*ptr); ptr++); \
+ ptr = g_strstr_len(ptr, lng, part->delimiter); \
+ val = g_ascii_strtoll(str, &ptr2, base); \
+ *pval = val; \
+ if(ptr > ptr2) return 0; \
+ return ptr - str; \
+}
+
+#define DEF_PARSE_FLOAT(func, type, pname) \
+guint parse_##func(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx) { \
+ gchar *ptr; \
+ gchar *ptr2; \
+ type val; \
+ type *pval; \
+ if(!lng) return 0; \
+ pval = &ctx->data_store[part->index].pname; \
+ ctx->props_store[part->index] = pval; \
+ if(!part->delimiter[0]) { \
+ val = g_ascii_strtod(str, &ptr); \
+ *pval = val; \
+ return ptr - str; \
+ } \
+ for(ptr = str; g_ascii_isspace(*ptr); ptr++); \
+ ptr = g_strstr_len(ptr, lng, part->delimiter); \
+ val = g_ascii_strtod(str, &ptr2); \
+ *pval = val; \
+ if(ptr > ptr2) return 0; \
+ return ptr - str; \
+}
+
+#define DEF_PARSE_UNS(func, base, type, ptype, pname) \
+guint parse_##func(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx) { \
+ gchar *ptr; \
+ gchar *ptr2; \
+ type val; \
+ ptype *pval; \
+ if(!lng) return 0; \
+ pval = &ctx->data_store[part->index].pname; \
+ ctx->props_store[part->index] = pval; \
+ if(!part->delimiter[0]) { \
+ val = g_ascii_strtoull(str, &ptr, base); \
+ *pval = val; \
+ return ptr - str; \
+ } \
+ for(ptr = str; g_ascii_isspace(*ptr); ptr++); \
+ ptr = g_strstr_len(ptr, lng, part->delimiter); \
+ val = g_ascii_strtoull(str, &ptr2, base); \
+ *pval = val; \
+ if(ptr > ptr2) return 0; \
+ return ptr - str; \
+}
+
+DEF_PARSE_BIN(byte, 1, gchar, guint, u)
+DEF_PARSE_BIN(word, 2, gushort, guint, u)
+DEF_PARSE_BIN(dword, 4, gulong, gulong, ul)
+DEF_PARSE_BIN(qword, 8, guint64, guint64, ull)
+
+guint parse_char(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
{
- if(lng < 1)
+ const gchar *ptr;
+ gchar val;
+ gchar *pval;
+
+ if(!lng)
return 0;
+
+ pval = &ctx->data_store[part->index].c;
+ ctx->props_store[part->index] = pval;
+
+ if(!part->delimiter[0])
+ {
+ val = *str;
+ *pval = val;
+ return 1;
+ }
+
+ //for(ptr = str; g_ascii_isspace(*ptr); ptr++);
+
+ ptr = g_strstr_len(str, lng, part->delimiter);
+
+ //FIXME?
+ val = *(ptr-1);
+ *pval = val;
- /*part->*/
+ return ptr - str;
+}
- return 1;
+DEF_PARSE_NUM(decimal, 10, gint, gint, i)
+DEF_PARSE_NUM(decimal16, 10, gshort, gint, i)
+DEF_PARSE_NUM(decimal32, 10, glong, glong, l)
+DEF_PARSE_NUM(decimal64, 10, gint64, gint64, ll)
+
+DEF_PARSE_FLOAT(floatingpoint, gfloat, f)
+DEF_PARSE_FLOAT(double, gdouble, d)
+
+DEF_PARSE_UNS(octal, 010, guint, guint, u)
+DEF_PARSE_UNS(octal16, 010, gushort, guint, u)
+DEF_PARSE_UNS(octal32, 010, gulong, gulong, ul)
+DEF_PARSE_UNS(octal64, 010, guint64, guint64, ull)
+
+guint parse_string(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
+{
+ gchar *ptr;
+ gchar *cur;
+
+ if(!lng)
+ return 0;
+
+ if(!part->delimiter[0])
+ return 0;
+
+ for(cur = str; g_ascii_isspace(*cur); cur++);
+
+ ptr = g_strstr_len(cur, lng, part->delimiter);
+
+ ctx->props_store[part->index] = g_strndup(cur, ptr-cur);
+
+ return ptr - str;
}
+
+DEF_PARSE_UNS(unsigned, 10, guint, guint, u)
+DEF_PARSE_UNS(unsigned16, 10, gushort, guint, u)
+DEF_PARSE_UNS(unsigned32, 10, gulong, gulong, ul)
+DEF_PARSE_UNS(unsigned64, 10, guint64, guint64, ull)
+
+DEF_PARSE_UNS(hexadecimal, 0x10, guint, guint, u)
+DEF_PARSE_UNS(hexadecimal16, 0x10, gushort, guint, u)
+DEF_PARSE_UNS(hexadecimal32, 0x10, gulong, gulong, ul)
+DEF_PARSE_UNS(hexadecimal64, 0x10, guint64, guint64, ull)
+
+guint parse_filename(gchar *str, guint lng, parse_part *part,
LSQScanfParserContext *ctx)
+{
+ gchar *ptr;
+
+ if(!lng)
+ return 0;
+
+ if(!part->delimiter[0])
+ return 0;
+
+ ptr = g_strstr_len(str, lng, part->delimiter);
+
+ ctx->filename = g_strndup(str, ptr-str);
+
+ return ptr - str;
+}
/*}}}*/
gchar* strdup_escaped(const gchar *str, guint lng)/*{{{*/
@@ -387,11 +570,11 @@
return new_str;
}/*}}}*/
-build_parser(LSQArchive *archive, const gchar *parse_string)
+void build_parser(LSQArchive *archive, const gchar *parser_string)
{
const gchar *ptr;
const gchar *cur;
- const gchar *pos;
+ gchar *pos;
gchar ch;
enum {
SIZE_NORMAL = FALSE,
@@ -408,7 +591,7 @@
GSList *parts = g_slist_prepend(NULL, part);
guint part_count = 0;
- cur = ptr = parse_string;
+ cur = ptr = parser_string;
while((ch = *ptr++))
{
@@ -417,7 +600,8 @@
part->delimiter = strdup_escaped(cur, ptr-cur);
part = g_new0(parse_part, 1);
parts = g_slist_prepend(parts, part);
- cur = ptr++;
+ cur = ++ptr;
+ continue;
}
if(ch == '%')
{
@@ -426,7 +610,8 @@
width_flag = 0;
index = part_count;
- ch = *ptr++;
+ if(!(ch = *ptr++))
+ break;
if(ch == '%')
continue;
@@ -436,12 +621,13 @@
/*{{{ check differend index %.$*/
if(g_ascii_isdigit(ch))
{
- index_flag = strtoul(ptr-1, &pos, 10);
+ index_flag = g_ascii_strtoull(ptr-1, &pos, 10);
if(*pos == '$')
{
ptr = pos+1;
index = index_flag-1;
- ch = *ptr;
+ if(!(ch = *ptr++))
+ break;
}
}
/*}}}*/
@@ -450,7 +636,8 @@
if(ch == '*')
{
skip_flag = TRUE;
- ch = *ptr++;
+ if(!(ch = *ptr++))
+ break;
}
/*}}}*/
@@ -459,7 +646,8 @@
if(g_ascii_isdigit(ch))
{
width_flag = strtoul(ptr-1, &ptr, 10);
- ch = *ptr;
+ if(!(ch = *ptr++))
+ break;
}
/*}}}*/
@@ -480,6 +668,8 @@
ch = *ptr++;
break;
}
+ if(!ch)
+ break;
/*}}}*/
switch(ch)
@@ -518,23 +708,20 @@
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_SHORT:
- /* TODO: write parse_word func */
- /*
part->function = parse_word; */
+ part->function
= parse_word;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_LONG:
- /* TODO: write parse_dword func */
- /*
part->function = parse_dword; */
+ part->function
= parse_dword;
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
break;
case SIZE_LONGLONG:
- /* TODO: write parse_qword func */
- /*
part->function = parse_qword; */
+ part->function
= parse_qword;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
break;
}
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ character %c*/
@@ -550,11 +737,10 @@
{
part_count++;
part->index = index;
- /* TODO: write parse_char func */
- /* part->function = parse_char;
*/
+ part->function = parse_char;
lsq_archive_set_property_type(archive, index, G_TYPE_CHAR);
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ decimal %d*/
@@ -573,28 +759,24 @@
switch(size_flag)
{
case SIZE_NORMAL:
- /* TODO: write parse_decimal func */
- /*
part->function = parse_decimal; */
+ part->function
= parse_decimal;
lsq_archive_set_property_type(archive, index, G_TYPE_INT);
break;
case SIZE_SHORT:
- /* TODO: write parse_decimal16 func */
- /*
part->function = parse_decimal16; */
+ part->function
= parse_decimal16;
lsq_archive_set_property_type(archive, index, G_TYPE_INT);
break;
case SIZE_LONG:
- /* TODO: write parse_decimal32 func */
- /*
part->function = parse_decimal32; */
+ part->function
= parse_decimal32;
lsq_archive_set_property_type(archive, index, G_TYPE_LONG);
break;
case SIZE_LONGLONG:
- /* TODO: write parse_decimal64 func */
- /*
part->function = parse_decimal64; */
+ part->function
= parse_decimal64;
lsq_archive_set_property_type(archive, index, G_TYPE_INT64);
break;
}
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ floating point %d*/
@@ -614,18 +796,16 @@
switch(size_flag)
{
case SIZE_NORMAL:
- /* TODO: write parse_floatingpoint func */
- /*
part->function = parse_floatingpoint; */
+ part->function
= parse_floatingpoint;
lsq_archive_set_property_type(archive, index, G_TYPE_FLOAT);
break;
case SIZE_LONGLONG:
- /* TODO: write parse_double func */
- /*
part->function = parse_double; */
+ part->function
= parse_double;
lsq_archive_set_property_type(archive, index, G_TYPE_DOUBLE);
break;
}
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ octal %o*/
@@ -643,28 +823,24 @@
switch(size_flag)
{
case SIZE_NORMAL:
- /* TODO: write parse_octal func */
- /*
part->function = parse_octal; */
+ part->function
= parse_octal;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_SHORT:
- /* TODO: write parse_octal16 func */
- /*
part->function = parse_octal16; */
+ part->function
= parse_octal16;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_LONG:
- /* TODO: write parse_octal32 func */
- /*
part->function = parse_octal32; */
+ part->function
= parse_octal32;
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
break;
case SIZE_LONGLONG:
- /* TODO: write parse_octal64 func */
- /*
part->function = parse_octal64; */
+ part->function
= parse_octal64;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
break;
}
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ string %s*/
@@ -681,11 +857,10 @@
{
part_count++;
part->index = index;
- /* TODO: write parse_string func */
- /* part->function =
parse_string; */
+ part->function = parse_string;
lsq_archive_set_property_type(archive, index, G_TYPE_STRING);
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ unsigned decimal %u*/
@@ -703,28 +878,24 @@
switch(size_flag)
{
case SIZE_NORMAL:
- /* TODO: write parse_unsigned func */
- /*
part->function = parse_unsigned; */
+ part->function
= parse_unsigned;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_SHORT:
- /* TODO: write parse_unsigned16 func */
- /*
part->function = parse_unsigned16; */
+ part->function
= parse_unsigned16;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_LONG:
- /* TODO: write parse_unsigned32 func */
- /*
part->function = parse_unsigned32; */
+ part->function
= parse_unsigned32;
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
break;
case SIZE_LONGLONG:
- /* TODO: write parse_unsigned64 func */
- /*
part->function = parse_unsigned64; */
+ part->function
= parse_unsigned64;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
break;
}
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ hexadecimal %x %X*/
@@ -743,28 +914,24 @@
switch(size_flag)
{
case SIZE_NORMAL:
- /* TODO: write parse_hexadecimal func */
- /*
part->function = parse_hexadecimal; */
+ part->function
= parse_hexadecimal;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_SHORT:
- /* TODO: write parse_hexadecimal16 func */
- /*
part->function = parse_hexadecimal16; */
+ part->function
= parse_hexadecimal16;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
break;
case SIZE_LONG:
- /* TODO: write parse_hexadecimal32 func */
- /*
part->function = parse_hexadecimal32; */
+ part->function
= parse_hexadecimal32;
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
break;
case SIZE_LONGLONG:
- /* TODO: write parse_hexadecimal64 func */
- /*
part->function = parse_hexadecimal64; */
+ part->function
= parse_hexadecimal64;
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
break;
}
}
- g_slist_prepend(parts, part);
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
/*{{{ filename %F*/
@@ -772,9 +939,8 @@
if(skip_flag || size_flag || width_flag)
return;
part = g_new0(parse_part, 1);
- /* TODO: write parse_filename func */
- /*part->function = parse_filename; */
- g_slist_prepend(parts, part);
+ part->function = parse_filename;
+ parts = g_slist_prepend(parts, part);
break;
/*}}}*/
default:
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits