Author: peter
Date: 2007-12-27 13:11:55 +0000 (Thu, 27 Dec 2007)
New Revision: 26509

Modified:
   squeeze/trunk/libsqueeze/archive-iter.h
   squeeze/trunk/libsqueeze/parser-context.c
   squeeze/trunk/libsqueeze/parser-context.h
   squeeze/trunk/libsqueeze/parser.c
   squeeze/trunk/libsqueeze/parser.h
   squeeze/trunk/libsqueeze/scanf-parser.c
   squeeze/trunk/libsqueeze/scanf-parser.h
   squeeze/trunk/src/main_window.c
Log:
scanf parser update


Modified: squeeze/trunk/libsqueeze/archive-iter.h
===================================================================
--- squeeze/trunk/libsqueeze/archive-iter.h     2007-12-27 00:49:02 UTC (rev 
26508)
+++ squeeze/trunk/libsqueeze/archive-iter.h     2007-12-27 13:11:55 UTC (rev 
26509)
@@ -45,6 +45,7 @@
 LSQArchiveIter *lsq_archive_iter_ref(LSQArchiveIter *iter);
 void                   lsq_archive_iter_unref(LSQArchiveIter *iter);
 
+LSQArchiveIter *lsq_archive_add_file(LSQArchive *archive, const gchar *path);
 
 G_END_DECLS
 

Modified: squeeze/trunk/libsqueeze/parser-context.c
===================================================================
--- squeeze/trunk/libsqueeze/parser-context.c   2007-12-27 00:49:02 UTC (rev 
26508)
+++ squeeze/trunk/libsqueeze/parser-context.c   2007-12-27 13:11:55 UTC (rev 
26509)
@@ -84,7 +84,7 @@
        
        g_return_val_if_fail(LSQ_IS_ARCHIVE(archive), NULL);
 
-       ctx = g_object_new(LSQ_PARSER_CONTEXT_TYPE, "archive", archive);
+       ctx = g_object_new(LSQ_TYPE_PARSER_CONTEXT, "archive", archive);
 
        return ctx;
 }

Modified: squeeze/trunk/libsqueeze/parser-context.h
===================================================================
--- squeeze/trunk/libsqueeze/parser-context.h   2007-12-27 00:49:02 UTC (rev 
26508)
+++ squeeze/trunk/libsqueeze/parser-context.h   2007-12-27 13:11:55 UTC (rev 
26509)
@@ -18,25 +18,25 @@
 
 G_BEGIN_DECLS
 
-#define LSQ_PARSER_CONTEXT_TYPE lsq_parser_context_get_type()
+#define LSQ_TYPE_PARSER_CONTEXT lsq_parser_context_get_type()
 
 #define LSQ_PARSER_CONTEXT(obj) (                         \
                G_TYPE_CHECK_INSTANCE_CAST ((obj),  \
-                       LSQ_PARSER_CONTEXT_TYPE,                                
  \
+                       LSQ_TYPE_PARSER_CONTEXT,                                
  \
                        LSQParserContext))
 
 #define LSQ_IS_PARSER_CONTEXT(obj) (                   \
                G_TYPE_CHECK_INSTANCE_TYPE ((obj),  \
-                       LSQ_PARSER_CONTEXT_TYPE))
+                       LSQ_TYPE_PARSER_CONTEXT))
 
 #define LSQ_PARSER_CONTEXT_CLASS(class) (        \
                G_TYPE_CHECK_CLASS_CAST ((class),  \
-                       LSQ_PARSER_CONTEXT_TYPE,                                
 \
+                       LSQ_TYPE_PARSER_CONTEXT,                                
 \
                        LSQParserContextClass))
 
 #define LSQ_IS_PARSER_CONTEXT_CLASS(class) (   \
                G_TYPE_CHECK_CLASS_TYPE ((class),  \
-                       LSQ_PARSER_CONTEXT_TYPE))
+                       LSQ_TYPE_PARSER_CONTEXT))
 
 typedef struct _LSQParserContext LSQParserContext;
 

Modified: squeeze/trunk/libsqueeze/parser.c
===================================================================
--- squeeze/trunk/libsqueeze/parser.c   2007-12-27 00:49:02 UTC (rev 26508)
+++ squeeze/trunk/libsqueeze/parser.c   2007-12-27 13:11:55 UTC (rev 26509)
@@ -48,3 +48,13 @@
        return klass->get_context(self, archive);
 }
 
+void
+lsq_parser_parse(LSQParser *self, LSQParserContext *ctx)
+{
+       LSQParserClass *klass = LSQ_PARSER_GET_CLASS(self);
+
+       g_return_if_fail(klass->parse);
+
+       klass->parse(self, ctx);
+}
+

Modified: squeeze/trunk/libsqueeze/parser.h
===================================================================
--- squeeze/trunk/libsqueeze/parser.h   2007-12-27 00:49:02 UTC (rev 26508)
+++ squeeze/trunk/libsqueeze/parser.h   2007-12-27 13:11:55 UTC (rev 26509)
@@ -59,6 +59,7 @@
        GObjectClass parent;
 
        LSQParserContext*(*get_context)(LSQParser *, LSQArchive *);
+  void(*parse)(LSQParser *, LSQParserContext *);
 };
 
 
@@ -66,6 +67,8 @@
 
 LSQParserContext* lsq_parser_get_context(LSQParser *, LSQArchive *);
 
+void              lsq_parser_parse(LSQParser *, LSQParserContext *);
+
 G_END_DECLS
 
 #endif /* __LIBSQUEEZE_PARSER_H__ */

Modified: squeeze/trunk/libsqueeze/scanf-parser.c
===================================================================
--- squeeze/trunk/libsqueeze/scanf-parser.c     2007-12-27 00:49:02 UTC (rev 
26508)
+++ squeeze/trunk/libsqueeze/scanf-parser.c     2007-12-27 13:11:55 UTC (rev 
26509)
@@ -30,316 +30,399 @@
 
 typedef struct _parse_part parse_part;
 typedef struct _LSQScanfParserContext LSQScanfParserContext;
+typedef struct _LSQScanfParserContextClass LSQScanfParserContextClass;
 
 typedef guint (*LSQParseFunc)(gchar*, guint, parse_part*, 
LSQScanfParserContext*);
 
 struct _parse_part
 {
-       gchar *delimiter;
-       LSQParseFunc function;
-       guint index;
-       guint width;
+  parse_part *next;
+  gchar *delimiter;
+  LSQParseFunc function;
+  guint index;
+  guint width;
 };
 
 struct _LSQScanfParserContext
 {
+  LSQParserContext parent;
   gchar *filename;
-  LSQParserContext parser;
-  union {
-       gchar   c;
-       gint    i;
-       guint   u;
-       glong   l;
-       gulong  ul;
-       gint64  ll;
-       guint64 ull;
-       gfloat  f;
-       gdouble d;
+  union _data_store {
+    gchar   c;
+    gint    i;
+    guint   u;
+    glong   l;
+    gulong  ul;
+    gint64  ll;
+    guint64 ull;
+    gfloat  f;
+    gdouble d;
   } *data_store;
   gpointer *props_store;
+  parse_part *parse_loc;
+  guint parse_line;
 };
 
+struct _LSQScanfParserContextClass
+{
+  LSQParserContextClass parent;
+};
+
+struct _LSQScanfParser
+{
+  LSQParser parent;
+
+  guint   num_props;
+  gchar **prop_names;
+  GType  *prop_types;
+  parse_part *parser;
+
+};
+
+struct _LSQScanfParserClass
+{
+  LSQParserClass parent;
+};
+
+G_DEFINE_TYPE(LSQScanfParserContext, lsq_scanf_parser_context, 
LSQ_TYPE_PARSER_CONTEXT);
+
+static void
+lsq_scanf_parser_context_init(LSQScanfParserContext *self)
+{
+}
+
+static void
+lsq_scanf_parser_context_class_init(LSQScanfParserContextClass *klass)
+{
+}
+
+static LSQParserContext *lsq_scanf_parser_context_new(LSQScanfParser *parser, 
LSQArchive *archive)
+{
+  LSQScanfParserContext *ctx;
+
+       ctx = g_object_new(lsq_scanf_parser_context_get_type(), "archive", 
archive);
+
+  ctx->data_store = g_new0(union _data_store, parser->num_props);
+  ctx->props_store = g_new0(gpointer, parser->num_props);
+
+  lsq_archive_set_properties(archive, parser->num_props, parser->prop_names, 
parser->prop_types);
+
+  return LSQ_PARSER_CONTEXT(ctx);
+}
+
+static void build_parser(LSQScanfParser *, const gchar *, const gchar *);
+
+static void lsq_scanf_parser_parse(LSQScanfParser *, LSQScanfParserContext *);
+
+static LSQParserContext *lsq_scanf_parser_get_context(LSQScanfParser *, 
LSQArchive *);
+
+G_DEFINE_TYPE(LSQScanfParser, lsq_scanf_parser, LSQ_TYPE_PARSER);
+
+static void
+lsq_scanf_parser_init(LSQScanfParser *self)
+{
+}
+
+static void
+lsq_scanf_parser_class_init(LSQScanfParserClass *klass)
+{
+  LSQParserClass *parser_class = LSQ_PARSER_CLASS(klass);
+  parser_class->get_context = 
(LSQParserContext*(*)(LSQParser*,LSQArchive*))lsq_scanf_parser_context_new;
+  parser_class->parse = 
(void(*)(LSQParser*,LSQParserContext*))lsq_scanf_parser_parse;
+}
+
+LSQParser *lsq_scanf_parser_new(const gchar *names_string, const gchar 
*parser_string)
+{
+  LSQScanfParser *parser;
+
+  parser = g_object_new(LSQ_TYPE_SCANF_PARSER, NULL);
+
+  build_parser(parser, names_string, parser_string);
+
+  return LSQ_PARSER(parser);
+}
+
 /*{{{ skip functions*/
 guint skip_byte(gchar *str, guint lng, parse_part *part, LSQScanfParserContext 
*ctx)
 {
-       if(lng < 1)
-               return 0;
-       
-       return 1;
+  if(lng < 1)
+    return 0;
+  
+  return 1;
 }
 
 guint skip_word(gchar *str, guint lng, parse_part *part, LSQScanfParserContext 
*ctx)
 {
-       if(lng < 2)
-               return 0;
-       
-       return 2;
+  if(lng < 2)
+    return 0;
+  
+  return 2;
 }
 
 guint skip_dword(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       if(lng < 4)
-               return 0;
-       
-       return 4;
+  if(lng < 4)
+    return 0;
+  
+  return 4;
 }
 
 guint skip_qword(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       if(lng < 8)
-               return 0;
-       
-       return 8;
+  if(lng < 8)
+    return 0;
+  
+  return 8;
 }
 
 guint skip_char(gchar *str, guint lng, parse_part *part, LSQScanfParserContext 
*ctx)
 {
-       const gchar *ptr;
+  const gchar *ptr;
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-               return 1;
+  if(!part->delimiter[0])
+    return 1;
 
-       //for(ptr = str; g_ascii_isspace(*ptr); ptr++);
+  //for(ptr = str; g_ascii_isspace(*ptr); ptr++);
 
-       ptr = g_strstr_len(str, lng, part->delimiter);
-       
-       return ptr - str;
+  ptr = g_strstr_len(str, lng, part->delimiter);
+  
+  return ptr - str;
 }
 
 guint skip_decimal(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
+  gchar *ptr;
 #ifdef DO_EXSTENSIVE_CHECKING
-       gchar *ptr2;
+  gchar *ptr2;
 #endif
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-       {
-               g_ascii_strtoll(str, &ptr, 10);
-               return ptr - str;
-       }
+  if(!part->delimiter[0])
+  {
+    g_ascii_strtoll(str, &ptr, 10);
+    return ptr - str;
+  }
 
-       for(ptr = str; g_ascii_isspace(*ptr); ptr++);
+  for(ptr = str; g_ascii_isspace(*ptr); ptr++);
 
-       ptr = g_strstr_len(ptr, lng, part->delimiter);
+  ptr = g_strstr_len(ptr, lng, part->delimiter);
 #ifdef DO_EXSTENSIVE_CHECKING
-       g_ascii_strtoll(str, &ptr2, 10);
-       if(ptr > ptr2)
-               return 0;
+  g_ascii_strtoll(str, &ptr2, 10);
+  if(ptr > ptr2)
+    return 0;
 #endif
-       
-       return ptr - str;
+  
+  return ptr - str;
 }
 
 guint skip_floatingpoint(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
+  gchar *ptr;
 #ifdef DO_EXSTENSIVE_CHECKING
-       gchar *ptr2;
+  gchar *ptr2;
 #endif
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-       {
-               g_ascii_strtod(str, &ptr);
-               return ptr - str;
-       }
+  if(!part->delimiter[0])
+  {
+    g_ascii_strtod(str, &ptr);
+    return ptr - str;
+  }
 
-       for(ptr = str; g_ascii_isspace(*ptr); ptr++);
+  for(ptr = str; g_ascii_isspace(*ptr); ptr++);
 
-       ptr = g_strstr_len(ptr, lng, part->delimiter);
+  ptr = g_strstr_len(ptr, lng, part->delimiter);
 #ifdef DO_EXSTENSIVE_CHECKING
-       g_ascii_strtod(str, &ptr2);
-       if(ptr > ptr2)
-               return 0;
+  g_ascii_strtod(str, &ptr2);
+  if(ptr > ptr2)
+    return 0;
 #endif
-       
-       return ptr - str;
+  
+  return ptr - str;
 }
 
 guint skip_octal(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
+  gchar *ptr;
 #ifdef DO_EXSTENSIVE_CHECKING
-       gchar *ptr2;
+  gchar *ptr2;
 #endif
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-       {
-               g_ascii_strtoll(str, &ptr, 010);
-               return ptr - str;
-       }
+  if(!part->delimiter[0])
+  {
+    g_ascii_strtoll(str, &ptr, 010);
+    return ptr - str;
+  }
 
-       for(ptr = str; g_ascii_isspace(*ptr); ptr++);
+  for(ptr = str; g_ascii_isspace(*ptr); ptr++);
 
-       ptr = g_strstr_len(ptr, lng, part->delimiter);
+  ptr = g_strstr_len(ptr, lng, part->delimiter);
 #ifdef DO_EXSTENSIVE_CHECKING
-       g_ascii_strtoll(str, &ptr2, 010);
-       if(ptr > ptr2)
-               return 0;
+  g_ascii_strtoll(str, &ptr2, 010);
+  if(ptr > ptr2)
+    return 0;
 #endif
-       
-       return ptr - str;
+  
+  return ptr - str;
 }
 
 guint skip_string(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
+  gchar *ptr;
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-               return 0;
+  if(!part->delimiter[0])
+    return 0;
 
-       for(ptr = str; g_ascii_isspace(*ptr); ptr++);
+  for(ptr = str; g_ascii_isspace(*ptr); ptr++);
 
-       ptr = g_strstr_len(ptr, lng, part->delimiter);
-       
-       return ptr - str;
+  ptr = g_strstr_len(ptr, lng, part->delimiter);
+  
+  return ptr - str;
 }
 
 guint skip_unsigned(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
+  gchar *ptr;
 #ifdef DO_EXSTENSIVE_CHECKING
-       gchar *ptr2;
+  gchar *ptr2;
 #endif
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-       {
-               g_ascii_strtoull(str, &ptr, 10);
-               return ptr - str;
-       }
+  if(!part->delimiter[0])
+  {
+    g_ascii_strtoull(str, &ptr, 10);
+    return ptr - str;
+  }
 
-       ptr = g_strstr_len(str, lng, part->delimiter);
+  ptr = g_strstr_len(str, lng, part->delimiter);
 #ifdef DO_EXSTENSIVE_CHECKING
-       g_ascii_strtoull(str, &ptr2, 10);
-       if(ptr > ptr2)
-               return 0;
+  g_ascii_strtoull(str, &ptr2, 10);
+  if(ptr > ptr2)
+    return 0;
 #endif
-       
-       return ptr - str;
+  
+  return ptr - str;
 }
 
 guint skip_hexadecimal(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
+  gchar *ptr;
 #ifdef DO_EXSTENSIVE_CHECKING
-       gchar *ptr2;
+  gchar *ptr2;
 #endif
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-       {
-               g_ascii_strtoll(str, &ptr, 0x10);
-               return ptr - str;
-       }
+  if(!part->delimiter[0])
+  {
+    g_ascii_strtoll(str, &ptr, 0x10);
+    return ptr - str;
+  }
 
-       ptr = g_strstr_len(str, lng, part->delimiter);
+  ptr = g_strstr_len(str, lng, part->delimiter);
 #ifdef DO_EXSTENSIVE_CHECKING
-       g_ascii_strtoll(str, &ptr2, 0x10);
-       if(ptr > ptr2)
-               return 0;
+  g_ascii_strtoll(str, &ptr2, 0x10);
+  if(ptr > ptr2)
+    return 0;
 #endif
-       
-       return ptr - str;
+  
+  return ptr - str;
 }
 /*}}}*/
 
 /*{{{ parse functions*/
 #define DEF_PARSE_BIN(func, bytes, type, ptype, pname)  \
 guint parse_##func(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx) { \
-  type  val;   \
+  type  val;  \
   ptype *pval;  \
-       if(lng < bytes) return 0; \
+  if(lng < bytes) return 0; \
   val = *((type*)str);  \
-       pval = &ctx->data_store[part->index].pname; \
+  pval = &ctx->data_store[part->index].pname; \
   *pval = val;  \
   ctx->props_store[part->index] = pval; \
-       return bytes; \
+  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;   \
+  gchar *ptr;   \
+  gchar *ptr2;  \
+  type  val;  \
   ptype *pval;  \
-       if(!lng) return 0;  \
-       pval = &ctx->data_store[part->index].pname; \
+  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);  \
+  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; \
+  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;   \
+  gchar *ptr;   \
+  gchar *ptr2;  \
+  type  val;  \
   type  *pval;  \
-       if(!lng) return 0;  \
-       pval = &ctx->data_store[part->index].pname; \
+  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);  \
+  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; \
+  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;   \
+  gchar *ptr;   \
+  gchar *ptr2;  \
+  type  val;  \
   ptype *pval;  \
-       if(!lng) return 0;  \
-       pval = &ctx->data_store[part->index].pname; \
+  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);  \
+  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; \
+  if(ptr > ptr2) return 0;  \
+  return ptr - str; \
 }
 
 DEF_PARSE_BIN(byte, 1, gchar, guint, u)
@@ -349,32 +432,32 @@
 
 guint parse_char(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       const gchar *ptr;
+  const gchar *ptr;
   gchar val;
   gchar *pval;
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       pval = &ctx->data_store[part->index].c;
+  pval = &ctx->data_store[part->index].c;
   ctx->props_store[part->index] = pval;
 
-       if(!part->delimiter[0])
+  if(!part->delimiter[0])
   {
-       val = *str;
-       *pval = val;
-               return 1;
+  val = *str;
+  *pval = val;
+    return 1;
   }
 
-       //for(ptr = str; g_ascii_isspace(*ptr); ptr++);
+  //for(ptr = str; g_ascii_isspace(*ptr); ptr++);
 
-       ptr = g_strstr_len(str, lng, part->delimiter);
+  ptr = g_strstr_len(str, lng, part->delimiter);
 
   //FIXME?
   val = *(ptr-1);
   *pval = val;
-       
-       return ptr - str;
+  
+  return ptr - str;
 }
 
 DEF_PARSE_NUM(decimal, 10, gint, gint, i)
@@ -392,22 +475,22 @@
 
 guint parse_string(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
-       gchar *cur;
+  gchar *ptr;
+  gchar *cur;
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-               return 0;
+  if(!part->delimiter[0])
+    return 0;
 
-       for(cur = str; g_ascii_isspace(*cur); cur++);
+  for(cur = str; g_ascii_isspace(*cur); cur++);
 
-       ptr = g_strstr_len(cur, lng, part->delimiter);
+  ptr = g_strstr_len(cur, lng, part->delimiter);
 
   ctx->props_store[part->index] = g_strndup(cur, ptr-cur);
 
-       return ptr - str;
+  return ptr - str;
 }
 
 DEF_PARSE_UNS(unsigned, 10, guint, guint, u)
@@ -422,540 +505,634 @@
 
 guint parse_filename(gchar *str, guint lng, parse_part *part, 
LSQScanfParserContext *ctx)
 {
-       gchar *ptr;
+  gchar *ptr;
 
-       if(!lng)
-               return 0;
+  if(!lng)
+    return 0;
 
-       if(!part->delimiter[0])
-               return 0;
+  if(!part->delimiter[0])
+    return 0;
 
-       ptr = g_strstr_len(str, lng, part->delimiter);
+  ptr = g_strstr_len(str, lng, part->delimiter);
 
   ctx->filename = g_strndup(str, ptr-str);
 
-       return ptr - str;
+  return ptr - str;
 }
 /*}}}*/
 
 gchar* strdup_escaped(const gchar *str, guint lng)/*{{{*/
 {
-       guint i;
-       gchar *new_str;
-       gchar ch;
-       guint size = 0;
+  guint i;
+  gchar *new_str;
+  gchar ch;
+  guint size = 0;
 
-       for(i = 0; i < lng; i++)
-       {
-               switch(str[i])
-               {
-                       case '%':
-                               i++;
-                       break;
-                       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++;
-       }
+  for(i = 0; i < lng; i++)
+  {
+    switch(str[i])
+    {
+      case '%':
+        i++;
+      break;
+      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';
+  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++;
-                               ch = str[i];
-                       break;
-                       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;
-       }
+  size = 0;
+  for(i = 0; i < lng; i++)
+  {
+    switch(ch = str[i])
+    {
+      case '%':
+        i++;
+        ch = str[i];
+      break;
+      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;
+  return new_str;
 }/*}}}*/
 
-void build_parser(LSQArchive *archive, const gchar *parser_string)
+static void build_parser(LSQScanfParser *parser, const gchar *names_string, 
const gchar *parser_string)
 {
-       const gchar *ptr;
-       const gchar *cur;
-       gchar *pos;
-       gchar ch;
-       enum {
-               SIZE_NORMAL = FALSE,
-               SIZE_SHORT,
-               SIZE_LONG,
-               SIZE_LONGLONG
-       } size_flag;
-       gboolean skip_flag;
-       guint width_flag;
-       guint index_flag;
-       guint index;
+  const gchar *ptr;
+  const gchar *cur;
+  gchar *pos;
+  gchar ch;
+  enum {
+    SIZE_NORMAL = FALSE,
+    SIZE_SHORT,
+    SIZE_LONG,
+    SIZE_LONGLONG
+  } size_flag;
+  gboolean skip_flag;
+  guint width_flag;
+  guint index_flag;
+  guint index;
 
-       parse_part *part = g_new0(parse_part, 1);
-       GSList *parts = g_slist_prepend(NULL, part);
-       guint part_count = 0;
+  gchar **names = g_strsplit(names_string, "|", -1);
+  g_return_if_fail(names);
+  guint num_props = g_strv_length(names);
+  GType *prop_types = g_new0(GType, num_props);
 
-       cur = ptr = parser_string;
+  parse_part *part = g_new0(parse_part, 1);
+  parse_part *parts = part;
+  guint part_count = 0;
 
-       while((ch = *ptr++))
-       {
-               if(ch == '\\' && *ptr == 'n')
-               {
-                       part->delimiter = strdup_escaped(cur, ptr-cur);
-                       part = g_new0(parse_part, 1);
-                       parts = g_slist_prepend(parts, part);
-                       cur = ++ptr;
-         continue;
-               }
-               if(ch == '%')
-               {
-                       skip_flag = FALSE;
-                       size_flag = SIZE_NORMAL;
-                       width_flag = 0;
-                       index = part_count;
+  cur = ptr = parser_string;
 
-                       if(!(ch = *ptr++))
-               break;
+  while((ch = *ptr++))
+  {
+    if(ch == '\\' && *ptr == 'n')
+    {
+      part->delimiter = strdup_escaped(cur, ptr-cur);
+      part->next = g_new0(parse_part, 1);
+      part = part->next;
+      cur = ++ptr;
+      continue;
+    }
+    if(ch == '%')
+    {
+      skip_flag = FALSE;
+      size_flag = SIZE_NORMAL;
+      width_flag = 0;
+      index = part_count;
 
-                       if(ch == '%')
-                               continue;
+      if(!(ch = *ptr++))
+        break;
 
-                       part->delimiter = strdup_escaped(cur, ptr-cur-1);
+      if(ch == '%')
+        continue;
 
-                       /*{{{ check differend index %.$*/
-                       if(g_ascii_isdigit(ch))
-                       {
-                               index_flag = g_ascii_strtoull(ptr-1, &pos, 10);
-                               if(*pos == '$')
-                               {
-                                       ptr = pos+1;
-                                       index = index_flag-1;
-                 if(!(ch = *ptr++))
-                       break;
-                               }
-                       }
-                       /*}}}*/
+      part->delimiter = strdup_escaped(cur, ptr-cur-1);
 
-                       /*{{{ check skip flag %*.*/
-                       if(ch == '*')
-                       {
-                               skip_flag = TRUE;
-               if(!(ch = *ptr++))
-                 break;
-                       }
-                       /*}}}*/
+      /*{{{ check differend index %.$*/
+      if(g_ascii_isdigit(ch))
+      {
+        index_flag = g_ascii_strtoull(ptr-1, &pos, 10);
+        if(*pos == '$')
+        {
+          ptr = pos+1;
+          index = index_flag-1;
+          if(!(ch = *ptr++))
+            break;
+        }
+      }
+      /*}}}*/
 
-                       /*{{{ check max characters %.*/
-                       //ignored for now
-                       if(g_ascii_isdigit(ch))
-                       {
-                               width_flag = g_ascii_strtoull(ptr-1, (gchar 
**)&ptr, 10);
-               if(!(ch = *ptr++))
-                 break;
-                       }
-                       /*}}}*/
+      //FIXME: should be done neat
+      g_return_if_fail(index < num_props);
 
-                       /*{{{ check size flag %[hlL].*/
-                       switch(ch)
-                       {
-                               case 'h':
-                                       size_flag = SIZE_SHORT;
-                                       ch = *ptr++;
-                               break;
-                               case 'l':
-                                       size_flag = SIZE_LONG;
-                                       ch = *ptr++;
-                                       if(ch != 'l')
-                                               break;
-                               case 'L':
-                                       size_flag = SIZE_LONGLONG;
-                                       ch = *ptr++;
-                               break;
-                       }
-         if(!ch)
-               break;
-                       /*}}}*/
+      /*{{{ check skip flag %*.*/
+      if(ch == '*')
+      {
+        skip_flag = TRUE;
+        if(!(ch = *ptr++))
+          break;
+      }
+      /*}}}*/
 
-                       switch(ch)
-                       {
-                               /*{{{ byte %b*/
-                               case 'b':
-                                       if(width_flag)
-                                               return;
-                                       part = g_new0(parse_part, 1);
-                                       if(skip_flag)
-                                       {
-                                               switch(size_flag)
-                                               {
-                                                       case SIZE_NORMAL:
-                                                               part->function 
= skip_byte;
-                                                       break;
-                                                       case SIZE_SHORT:
-                                                               part->function 
= skip_word;
-                                                       break;
-                                                       case SIZE_LONG:
-                                                               part->function 
= skip_dword;
-                                                       break;
-                                                       case SIZE_LONGLONG:
-                                                               part->function 
= skip_qword;
-                                                       break;
-                                               }
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               switch(size_flag)
-                                               {
-                                                       case SIZE_NORMAL:
-                                                               part->function 
= parse_byte;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_SHORT:
-                                                               part->function 
= parse_word;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_LONG:
-                                                               part->function 
= parse_dword;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
-                                                       break;
-                                                       case SIZE_LONGLONG:
-                                                               part->function 
= parse_qword;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
-                                                       break;
-                                               }
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ character %c*/
-                               case 'c':
-                                       if(size_flag || width_flag)
-                                               return;
-                                       part = g_new0(parse_part, 1);
-                                       if(skip_flag)
-                                       {
-                                               part->function = skip_char;
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               part->function = parse_char;
-                                               
lsq_archive_set_property_type(archive, index, G_TYPE_CHAR);
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ decimal %d*/
-                               case 'd':
-                               //case 'i':
-                                       part = g_new0(parse_part, 1);
-                                       part->width = width_flag;
-                                       if(skip_flag)
-                                       {
-                                               part->function = skip_decimal;
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               switch(size_flag)
-                                               {
-                                                       case SIZE_NORMAL:
-                                                               part->function 
= parse_decimal;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_INT);
-                                                       break;
-                                                       case SIZE_SHORT:
-                                                               part->function 
= parse_decimal16;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_INT);
-                                                       break;
-                                                       case SIZE_LONG:
-                                                               part->function 
= parse_decimal32;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_LONG);
-                                                       break;
-                                                       case SIZE_LONGLONG:
-                                                               part->function 
= parse_decimal64;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_INT64);
-                                                       break;
-                                               }
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ floating point %d*/
-                               case 'f':
-                                       if(size_flag && size_flag != 
SIZE_LONGLONG)
-                                               return;
-                                       part = g_new0(parse_part, 1);
-                                       part->width = width_flag;
-                                       if(skip_flag)
-                                       {
-                                               part->function = 
skip_floatingpoint;
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               switch(size_flag)
-                                               {
-                                                       case SIZE_NORMAL:
-                                                               part->function 
= parse_floatingpoint;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_FLOAT);
-                                                       break;
-                                                       case SIZE_LONGLONG:
-                                                               part->function 
= parse_double;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_DOUBLE);
-                                                       break;
-                                                       default:
-                                                       break;
-                                               }
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ octal %o*/
-                               case 'o':
-                                       part = g_new0(parse_part, 1);
-                                       part->width = width_flag;
-                                       if(skip_flag)
-                                       {
-                                               part->function = skip_octal;
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               switch(size_flag)
-                                               {
-                                                       case SIZE_NORMAL:
-                                                               part->function 
= parse_octal;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_SHORT:
-                                                               part->function 
= parse_octal16;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_LONG:
-                                                               part->function 
= parse_octal32;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
-                                                       break;
-                                                       case SIZE_LONGLONG:
-                                                               part->function 
= parse_octal64;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
-                                                       break;
-                                               }
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ string %s*/
-                               case 's':
-                                       if(size_flag)
-                                               return;
-                                       part = g_new0(parse_part, 1);
-                                       part->width = width_flag;
-                                       if(skip_flag)
-                                       {
-                                               part->function = skip_string;
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               part->function = parse_string;
-                                               
lsq_archive_set_property_type(archive, index, G_TYPE_STRING);
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ unsigned decimal %u*/
-                               case 'u':
-                                       part = g_new0(parse_part, 1);
-                                       part->width = width_flag;
-                                       if(skip_flag)
-                                       {
-                                               part->function = skip_unsigned;
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               switch(size_flag)
-                                               {
-                                                       case SIZE_NORMAL:
-                                                               part->function 
= parse_unsigned;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_SHORT:
-                                                               part->function 
= parse_unsigned16;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_LONG:
-                                                               part->function 
= parse_unsigned32;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
-                                                       break;
-                                                       case SIZE_LONGLONG:
-                                                               part->function 
= parse_unsigned64;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
-                                                       break;
-                                               }
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ hexadecimal %x %X*/
-                               case 'x':
-                               case 'X':
-                                       part = g_new0(parse_part, 1);
-                                       part->width = width_flag;
-                                       if(skip_flag)
-                                       {
-                                               part->function = 
skip_hexadecimal;
-                                       }
-                                       else
-                                       {
-                                               part_count++;
-                                               part->index = index;
-                                               switch(size_flag)
-                                               {
-                                                       case SIZE_NORMAL:
-                                                               part->function 
= parse_hexadecimal;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_SHORT:
-                                                               part->function 
= parse_hexadecimal16;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT);
-                                                       break;
-                                                       case SIZE_LONG:
-                                                               part->function 
= parse_hexadecimal32;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_ULONG);
-                                                       break;
-                                                       case SIZE_LONGLONG:
-                                                               part->function 
= parse_hexadecimal64;
-                                                               
lsq_archive_set_property_type(archive, index, G_TYPE_UINT64);
-                                                       break;
-                                               }
-                                       }
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               /*{{{ filename %F*/
-                               case 'F':
-                                       if(skip_flag || size_flag || width_flag)
-                                               return;
-                                       part = g_new0(parse_part, 1);
-                                       part->function = parse_filename;
-                                       parts = g_slist_prepend(parts, part);
-                               break;
-                               /*}}}*/
-                               default:
-                                       return;
-                       }
-                       cur = ptr;
-               }
-       }
+      /*{{{ check max characters %.*/
+      //ignored for now
+      if(g_ascii_isdigit(ch))
+      {
+        width_flag = g_ascii_strtoull(ptr-1, (gchar **)&ptr, 10);
+        if(!(ch = *ptr++))
+          break;
+      }
+      /*}}}*/
 
+      /*{{{ check size flag %[hlL].*/
+      switch(ch)
+      {
+        case 'h':
+          size_flag = SIZE_SHORT;
+          ch = *ptr++;
+        break;
+        case 'l':
+          size_flag = SIZE_LONG;
+          ch = *ptr++;
+          if(ch != 'l')
+            break;
+        case 'L':
+          size_flag = SIZE_LONGLONG;
+          ch = *ptr++;
+        break;
+      }
+    if(!ch)
+    break;
+      /*}}}*/
+
+      switch(ch)
+      {
+        /*{{{ byte %b*/
+        case 'b':
+          if(width_flag)
+            return;
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          if(skip_flag)
+          {
+            switch(size_flag)
+            {
+              case SIZE_NORMAL:
+                part->function = skip_byte;
+              break;
+              case SIZE_SHORT:
+                part->function = skip_word;
+              break;
+              case SIZE_LONG:
+                part->function = skip_dword;
+              break;
+              case SIZE_LONGLONG:
+                part->function = skip_qword;
+              break;
+            }
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            switch(size_flag)
+            {
+              case SIZE_NORMAL:
+                part->function = parse_byte;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_SHORT:
+                part->function = parse_word;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_LONG:
+                part->function = parse_dword;
+                prop_types[index] = G_TYPE_ULONG;
+              break;
+              case SIZE_LONGLONG:
+                part->function = parse_qword;
+                prop_types[index] = G_TYPE_UINT64;
+              break;
+            }
+          }
+        break;
+        /*}}}*/
+        /*{{{ character %c*/
+        case 'c':
+          if(size_flag || width_flag)
+            return;
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          if(skip_flag)
+          {
+            part->function = skip_char;
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            part->function = parse_char;
+            prop_types[index] = G_TYPE_CHAR;
+          }
+        break;
+        /*}}}*/
+        /*{{{ decimal %d*/
+        case 'd':
+        //case 'i':
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          part->width = width_flag;
+          if(skip_flag)
+          {
+            part->function = skip_decimal;
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            switch(size_flag)
+            {
+              case SIZE_NORMAL:
+                part->function = parse_decimal;
+                prop_types[index] = G_TYPE_INT;
+              break;
+              case SIZE_SHORT:
+                part->function = parse_decimal16;
+                prop_types[index] = G_TYPE_INT;
+              break;
+              case SIZE_LONG:
+                part->function = parse_decimal32;
+                prop_types[index] = G_TYPE_LONG;
+              break;
+              case SIZE_LONGLONG:
+                part->function = parse_decimal64;
+                prop_types[index] = G_TYPE_INT64;
+              break;
+            }
+          }
+        break;
+        /*}}}*/
+        /*{{{ floating point %d*/
+        case 'f':
+          if(size_flag && size_flag != SIZE_LONGLONG)
+            return;
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          part->width = width_flag;
+          if(skip_flag)
+          {
+            part->function = skip_floatingpoint;
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            switch(size_flag)
+            {
+              case SIZE_NORMAL:
+                part->function = parse_floatingpoint;
+                prop_types[index] = G_TYPE_FLOAT;
+              break;
+              case SIZE_LONGLONG:
+                part->function = parse_double;
+                prop_types[index] = G_TYPE_DOUBLE;
+              break;
+              default:
+              break;
+            }
+          }
+        break;
+        /*}}}*/
+        /*{{{ octal %o*/
+        case 'o':
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          part->width = width_flag;
+          if(skip_flag)
+          {
+            part->function = skip_octal;
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            switch(size_flag)
+            {
+              case SIZE_NORMAL:
+                part->function = parse_octal;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_SHORT:
+                part->function = parse_octal16;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_LONG:
+                part->function = parse_octal32;
+                prop_types[index] = G_TYPE_ULONG;
+              break;
+              case SIZE_LONGLONG:
+                part->function = parse_octal64;
+                prop_types[index] = G_TYPE_UINT64;
+              break;
+            }
+          }
+        break;
+        /*}}}*/
+        /*{{{ string %s*/
+        case 's':
+          if(size_flag)
+            return;
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          part->width = width_flag;
+          if(skip_flag)
+          {
+            part->function = skip_string;
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            part->function = parse_string;
+            prop_types[index] = G_TYPE_STRING;
+          }
+        break;
+        /*}}}*/
+        /*{{{ unsigned decimal %u*/
+        case 'u':
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          part->width = width_flag;
+          if(skip_flag)
+          {
+            part->function = skip_unsigned;
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            switch(size_flag)
+            {
+              case SIZE_NORMAL:
+                part->function = parse_unsigned;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_SHORT:
+                part->function = parse_unsigned16;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_LONG:
+                part->function = parse_unsigned32;
+                prop_types[index] = G_TYPE_ULONG;
+              break;
+              case SIZE_LONGLONG:
+                part->function = parse_unsigned64;
+                prop_types[index] = G_TYPE_UINT64;
+              break;
+            }
+          }
+        break;
+        /*}}}*/
+        /*{{{ hexadecimal %x %X*/
+        case 'x':
+        case 'X':
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          part->width = width_flag;
+          if(skip_flag)
+          {
+            part->function = skip_hexadecimal;
+          }
+          else
+          {
+            part_count++;
+            part->index = index;
+            switch(size_flag)
+            {
+              case SIZE_NORMAL:
+                part->function = parse_hexadecimal;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_SHORT:
+                part->function = parse_hexadecimal16;
+                prop_types[index] = G_TYPE_UINT;
+              break;
+              case SIZE_LONG:
+                part->function = parse_hexadecimal32;
+                prop_types[index] = G_TYPE_ULONG;
+              break;
+              case SIZE_LONGLONG:
+                part->function = parse_hexadecimal64;
+                prop_types[index] = G_TYPE_UINT64;
+              break;
+            }
+          }
+        break;
+        /*}}}*/
+        /*{{{ filename %F*/
+        case 'F':
+          if(skip_flag || size_flag || width_flag)
+            return;
+          part->next = g_new0(parse_part, 1);
+          part = part->next;
+          part->function = parse_filename;
+        break;
+        /*}}}*/
+        default:
+          return;
+      }
+      cur = ptr;
+    }
+  }
+
+  //FIXME: should be done neat
+  g_return_if_fail(part_count == num_props);
+
+  parser->parser = parts;
+  parser->num_props = num_props;
+  parser->prop_names = names;
+  parser->prop_types = prop_types;
 }
 
-void parse()
+static void lsq_scanf_parser_parse(LSQScanfParser *parser, 
LSQScanfParserContext *ctx)
 {
+  gchar *line, *ptr;
+  gsize line_length, lng;
+  guint size, line_nr;
+  if(!lsq_parser_context_get_line(LSQ_PARSER_CONTEXT(ctx), &line, 
&line_length))
+    return;
 
+  ptr = line;
+  lng = line_length;
+  line_nr = ctx->parse_line;
+
+  parse_part *part = ctx->parse_loc;
+  while(part)
+  {
+    //parse
+    if(part->function)
+    {
+      size = part->function(ptr, lng, part, ctx);
+      if(!size)
+      {
+        //no match
+        if(line_nr)
+        {
+          ptr = line;
+          lng = line_length;
+          part = parser->parser;
+          line_nr = 0;
+          continue;
+        }
+        ctx->parse_loc = parser->parser;
+        ctx->parse_line = 0;
+        g_free(line);
+        return;
+      }
+      ptr += size;
+      lng -= size;
+    }
+
+    if(!g_str_has_prefix(ptr, part->delimiter))
+    {
+      //no match
+      if(line_nr)
+      {
+        ptr = line;
+        lng = line_length;
+        part = parser->parser;
+        line_nr = 0;
+        continue;
+      }
+      ctx->parse_loc = parser->parser;
+      ctx->parse_line = 0;
+      g_free(line);
+      return;
+    }
+
+    if(g_str_has_suffix(part->delimiter, "\n"))
+    {
+      //next line
+      if(part->next)
+      {
+        ctx->parse_loc = part->next;
+        ctx->parse_line = line_nr+1;
+        g_free(line);
+        return;
+      }
+    }
+    
+    part = part->next;
+  }
+
+  g_free(line);
+
+  if(!part)
+  {
+    LSQArchiveIter *iter = 
lsq_archive_add_file(LSQ_PARSER_CONTEXT(ctx)->archive, ctx->filename);
+    lsq_archive_iter_set_propsv(iter, ctx->props_store);
+    lsq_archive_iter_unref(iter);
+
+    ctx->parse_loc = parser->parser;
+    ctx->parse_line = 0;
+  }
 }
 

Modified: squeeze/trunk/libsqueeze/scanf-parser.h
===================================================================
--- squeeze/trunk/libsqueeze/scanf-parser.h     2007-12-27 00:49:02 UTC (rev 
26508)
+++ squeeze/trunk/libsqueeze/scanf-parser.h     2007-12-27 13:11:55 UTC (rev 
26509)
@@ -18,8 +18,40 @@
 
 G_BEGIN_DECLS
 
+#define LSQ_TYPE_SCANF_PARSER lsq_scanf_parser_get_type()
 
+#define LSQ_SCANF_PARSER(obj) (                           \
+               G_TYPE_CHECK_INSTANCE_CAST ((obj),  \
+                       LSQ_TYPE_SCANF_PARSER,                            \
+                       LSQScanfParser))
 
+#define LSQ_IS_SCANF_PARSER(obj) (                     \
+               G_TYPE_CHECK_INSTANCE_TYPE ((obj),  \
+                       LSQ_TYPE_SCANF_PARSER))
+
+#define LSQ_SCANF_PARSER_CLASS(class) (          \
+               G_TYPE_CHECK_CLASS_CAST ((class),  \
+                       LSQ_TYPE_SCANF_PARSER,                           \
+                       LSQScanfParserClass))
+
+#define LSQ_IS_SCANF_PARSER_CLASS(class) (   \
+               G_TYPE_CHECK_CLASS_TYPE ((class),  \
+                       LSQ_TYPE_SCANF_PARSER))
+
+#define LSQ_SCANF_PARSER_GET_CLASS(obj) (      \
+               G_TYPE_INSTANCE_GET_CLASS ((obj),  \
+                       LSQ_TYPE_SCANF_PARSER,                           \
+         LSQScanfParserClass))
+
+
+typedef struct _LSQScanfParser LSQScanfParser;
+
+typedef struct _LSQScanfParserClass LSQScanfParserClass;
+
+GType             lsq_scanf_parser_get_type(void);
+
+LSQParser *lsq_scanf_parser_new(const gchar *, const gchar *);
+
 G_END_DECLS
 
 #endif /* __LIBSQUEEZE_SCANF_PARSER_H__ */

Modified: squeeze/trunk/src/main_window.c
===================================================================
--- squeeze/trunk/src/main_window.c     2007-12-27 00:49:02 UTC (rev 26508)
+++ squeeze/trunk/src/main_window.c     2007-12-27 13:11:55 UTC (rev 26509)
@@ -117,6 +117,7 @@
 sq_main_window_navigation_style_get_type()
 {
        static GType nav_style_type = 0;
+       guint i = 0;
 
        if(!nav_style_type)
        {
@@ -131,8 +132,12 @@
                        {0, NULL, NULL}
                };
                style_types[0].value_nick = _("Internal Style");
-               style_types[1].value_nick = _("Tool Bar Style");
-               style_types[2].value_nick = _("Path Bar Style");
+#ifdef ENABLE_TOOLBAR
+               style_types[++i].value_nick = _("Tool Bar Style");
+#endif
+#ifdef ENABLE_PATHBAR
+               style_types[++i].value_nick = _("Path Bar Style");
+#endif
 
                nav_style_type = 
g_enum_register_static("SQMainWindowNavigationStyle", style_types);
        }

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to