[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Merge firebug.cl.cam.ac.uk:/local/scratch/smh22/xen-unstable.bk



ChangeSet 1.1405, 2005/05/13 19:28:59+01:00, smh22@xxxxxxxxxxxxxxxxxxxx

        Merge firebug.cl.cam.ac.uk:/local/scratch/smh22/xen-unstable.bk
        into firebug.cl.cam.ac.uk:/local/scratch/smh22/mwray-xend2.bk



 sxpr_parser.c | 1108 ++++++++++++++++++++++++++++++----------------------------
 sxpr_parser.h |   68 ++-
 2 files changed, 626 insertions(+), 550 deletions(-)


diff -Nru a/tools/libxutil/sxpr_parser.c b/tools/libxutil/sxpr_parser.c
--- a/tools/libxutil/sxpr_parser.c      2005-05-13 16:07:55 -04:00
+++ b/tools/libxutil/sxpr_parser.c      2005-05-13 16:07:55 -04:00
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2001 - 2004 Mike Wray <mike.wray@xxxxxx>
+ * Copyright (C) 2001 - 2005 Mike Wray <mike.wray@xxxxxx>
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as
@@ -26,6 +26,8 @@
 #  include <errno.h>
 #endif
 
+#include "sys_net.h"
+
 #include "iostream.h"
 #include "lexis.h"
 #include "sxpr_parser.h"
@@ -42,45 +44,25 @@
  * @author Mike Wray <mike.wray@xxxxxxxxxx>
  */
 
+#ifdef DEBUG
 #define dprintf(fmt, args...) IOStream_print(iostdout, "[DEBUG] %s" fmt, 
__FUNCTION__, ##args)
+#else
+#define dprintf(fmt, args...) do{ }while(0)
+#endif
+
 #undef printf
 #define printf(fmt, args...)   IOStream_print(iostdout, fmt, ##args)
 
-static void reset(Parser *z);
-static int inputchar(Parser *p, char c);
-static int savechar(Parser *p, char c);
-extern void parse_error(Parser *in);
-extern void parse_error_id(Parser *in, ParseErrorId id);
-
-static int begin_start(Parser *p, char c);
 static int state_start(Parser *p, char c);
-static int end_start(Parser *p);
-
-static int begin_comment(Parser *p, char c);
-static int state_comment(Parser *p, char c);
-static int end_comment(Parser *p);
-
-static int begin_string(Parser *p, char c);
-static int state_string(Parser *p, char c);
-static int end_string(Parser *p);
-static int state_escape(Parser *p, char c);
-static int state_octal(Parser *p, char c);
-static int state_hex(Parser *p, char c);
-
-static int begin_atom(Parser *p, char c);
-static int state_atom(Parser *p, char c);
-static int end_atom(Parser *p);
-
-static int state_list(Parser *p, char c);
-static int begin_list(Parser *p, char c);
-static int end_list(Parser *p);
+static int begin_start(Parser *p, char c);
 
+#if 0
 /** Print a parse error.
  *
  * @param in parser
  * @param msg format followed by printf arguments
  */
-void eprintf(Parser *in, char *msg, ...){
+static void eprintf(Parser *in, char *msg, ...){
     va_list args;
     if(in->error_out){
         va_start(args, msg);
@@ -94,7 +76,7 @@
  * @param in parser
  * @param msg format followed by printf arguments
  */
-void wprintf(Parser *in, char *msg, ...){
+static void wprintf(Parser *in, char *msg, ...){
     va_list args;
     if(in->error_out){
         va_start(args, msg);
@@ -102,13 +84,15 @@
         va_end(args);
     }
 }
+#endif
+
 
 
/*============================================================================*/
 
 /** Record defining the message for a parse error. */
 typedef struct {
-  ParseErrorId id;
-  char *message;
+    ParseErrorId id;
+    char *message;
 } ParseError;
 
 /** Format for printing parse error messages. */
@@ -116,156 +100,245 @@
 
 /** Message catalog for the parse error codes. */
 static ParseError catalog[] = {
-  { PARSE_ERR_UNSPECIFIED,            "unspecified error" },
-  { PARSE_ERR_NOMEM,                  "out of memory" },
-  { PARSE_ERR_UNEXPECTED_EOF,         "unexpected end of input" },
-  { PARSE_ERR_TOKEN_TOO_LONG,         "token too long" },
-  { PARSE_ERR_INVALID_SYNTAX,         "syntax error" },
-  { PARSE_ERR_INVALID_ESCAPE,         "invalid escape" },
-  { 0, NULL }
+    { PARSE_ERR_UNSPECIFIED,            "unspecified error" },
+    { PARSE_ERR_NOMEM,                  "out of memory" },
+    { PARSE_ERR_UNEXPECTED_EOF,         "unexpected end of input" },
+    { PARSE_ERR_TOKEN_TOO_LONG,         "token too long" },
+    { PARSE_ERR_INVALID_SYNTAX,         "syntax error" },
+    { PARSE_ERR_INVALID_ESCAPE,         "invalid escape" },
+    { 0, NULL }
 };
 
 /** Number of entries in the message catalog. */
 const static int catalog_n = sizeof(catalog)/sizeof(ParseError);
 
-void ParserState_free(ParserState *z){
-    if(!z) return;
-    objfree(z->val);
-    deallocate(z);
+/** Set the parser error stream.
+ * Parse errors are reported on the the error stream if it is non-null.
+ * 
+ * @param z parser
+ * @param error_out error stream
+ */
+void Parser_set_error_stream(Parser *z, IOStream *error_out){
+    z->error_out = error_out;
 }
 
-int ParserState_new(ParserStateFn *fn, char *name,
-                    ParserState *parent, ParserState **val){
-    int err = 0;
-    ParserState *z;
-    z = ALLOCATE(ParserState);
-    if(z){
-        z->name = name;
-        z->fn = fn;
-        z->parent = parent;
-        z->val = ONULL;
-    } else {
-        err = -ENOMEM;
+/** Get the parser error message for an error code.
+ *
+ * @param id error code
+ * @return error message (empty string if the code is unknown)
+ */
+static char *get_message(ParseErrorId id){
+    int i;
+    for(i = 0; i < catalog_n; i++){
+        if(id == catalog[i].id){
+            return catalog[i].message;
+        }
     }
-    if(!err) *val = z;
-    return err;
+    return "";
 }
 
-/** Free a parser.
- * No-op if the parser is null.
+#if 0
+/** Get the line number.
  *
- * @param z parser 
+ * @param in parser
  */
-void Parser_free(Parser *z){
-    if(!z) return;
-    objfree(z->val);
-    z->val = ONONE;
-    deallocate(z);
+static int get_line(Parser *in){
+    return in->line_no;
 }
 
-/** Create a new parser. The error stream defaults to null.
+/** Get the column number.
+ *
+ * @param in parser
  */
-Parser * Parser_new(void){
-    Parser *z = ALLOCATE(Parser);
-    int err = -ENOMEM;
-  
-    if(!z) goto exit;
-    err = 0;
-    reset(z);
-  exit:
-    if(err){
-        Parser_free(z);
-        z = NULL;
-    }
-    return z;
+static int get_column(Parser *in){
+    return in->char_no;
 }
+#endif
 
-/** Get the next character.
- * Records the character read in the parser,
- * and sets the line and character counts.
+/** Get the line number the current token started on.
+ *
+ * @param in parser
+ */
+static int get_tok_line(Parser *in){
+    return in->tok_begin_line;
+}
+
+/** Get the column number the current token started on.
+ *
+ * @param in parser
+ */
+static int get_tok_column(Parser *in){
+    return in->tok_begin_char;
+}
+
+/** Return the current token.
+ * The return value points at the internal buffer, so
+ * it must not be modified (or freed). Use copy_token() if you need a copy.
  *
  * @param p parser
- * @return error flag: 0 on success, non-zero on error
+ * @return token
  */
-static int inputchar(Parser *p, char c){
-    int err = 0;
-    if(c=='\n'){
-        p->line_no++;
-        p->char_no = 0;
-    } else {
-        p->char_no++;
-    }
-    return err;
+char *peek_token(Parser *p){
+    return p->tok;
 }
 
-static int savechar(Parser *p, char c){
-    int err = 0;
-    if(p->buf_i >= p->buf_n){
-        err = -ENOMEM;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.