WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 2/3] libxl: config parser: make CfgParseContext initi

xlu_cfg_readfile and xlu_cfg_readdata had some somewhat-boilerplate
code for initialisation, parsing, and cleanup.  Make that common.

No functional change.

Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 tools/libxl/libxlu_cfg.c   |   82 ++++++++++++++++++++++++--------------------
 tools/libxl/libxlu_cfg_l.c |   30 ++++++++++++----
 tools/libxl/libxlu_cfg_l.h |   18 ++++++++-
 3 files changed, 83 insertions(+), 47 deletions(-)

diff --git a/tools/libxl/libxlu_cfg.c b/tools/libxl/libxlu_cfg.c
index 1ade7ea..821b8c0 100644
--- a/tools/libxl/libxlu_cfg.c
+++ b/tools/libxl/libxlu_cfg.c
@@ -18,59 +18,68 @@ XLU_Config *xlu_cfg_init(FILE *report, const char 
*report_filename) {
     return cfg;
 }
 
+static int ctx_prep(CfgParseContext *ctx, XLU_Config *cfg) {
+    int e;
+
+    ctx->cfg= cfg;
+    ctx->err= 0;
+    ctx->lexerrlineno= -1;
+    ctx->scanner= 0;
+    
+    e= xlu__cfg_yylex_init_extra(ctx, &ctx->scanner);
+    if (e) {
+        fprintf(cfg->report,"%s: unable to create scanner: %s\n",
+                cfg->filename, strerror(e));
+        return e;
+    }
+    return 0;
+}
+
+static void ctx_dispose(CfgParseContext *ctx) {
+    if (ctx->scanner) xlu__cfg_yylex_destroy(ctx->scanner);
+}
+
+static void parse(CfgParseContext *ctx) {
+    /* On return, ctx.err will be updated with the error status. */
+    int r;
+    r= xlu__cfg_yyparse(ctx);
+    if (r) assert(ctx->err);
+}
+
 int xlu_cfg_readfile(XLU_Config *cfg, const char *real_filename) {
+    FILE *f = 0;
+    int e;
+
     CfgParseContext ctx;
-    FILE *f;
-    int e, r;
+    e = ctx_prep(&ctx, cfg);
+    if (e) { ctx.err= e; goto xe; }
 
-    ctx.cfg= cfg;
-    ctx.err= 0;
-    ctx.lexerrlineno= -1;
-    
     f= fopen(real_filename, "r");
     if (!f) {
-        e= errno;
+        ctx.err = errno;
         fprintf(cfg->report,"%s: unable to open configuration file: %s\n",
                 real_filename, strerror(e));
-        return e;
-    }
-
-    e= xlu__cfg_yylex_init_extra(&ctx, &ctx.scanner);
-    if (e) {
-        fprintf(cfg->report,"%s: unable to create scanner: %s\n",
-                cfg->filename, strerror(e));
-        return e;
+        goto xe;
     }
 
     xlu__cfg_yyrestart(f, ctx.scanner);
 
-    r= xlu__cfg_yyparse(&ctx);
-    if (r) assert(ctx.err);
+    parse(&ctx);
 
-    xlu__cfg_yylex_destroy(ctx.scanner);
-    fclose(f);
+ xe:
+    ctx_dispose(&ctx);
+    if (f) fclose(f);
 
     return ctx.err;
 }
 
 int xlu_cfg_readdata(XLU_Config *cfg, const char *data, int length) {
-    CfgParseContext ctx;
-    int e, r;
+    int e;
     YY_BUFFER_STATE buf= 0;
 
-    ctx.scanner= 0;
-    ctx.cfg= cfg;
-    ctx.err= 0;
-    ctx.lexerrlineno= -1;
-
-    e= xlu__cfg_yylex_init_extra(&ctx, &ctx.scanner);
-    if (e) {
-        fprintf(cfg->report,"%s: unable to create scanner: %s\n",
-                cfg->filename, strerror(e));
-        ctx.err= e;
-        ctx.scanner= 0;
-        goto xe;
-    }
+    CfgParseContext ctx;
+    e= ctx_prep(&ctx, cfg);
+    if (e) { ctx.err= e; goto xe; }
 
     buf = xlu__cfg_yy_scan_bytes(data, length, ctx.scanner);
     if (!buf) {
@@ -80,12 +89,11 @@ int xlu_cfg_readdata(XLU_Config *cfg, const char *data, int 
length) {
         goto xe;
     }
 
-    r= xlu__cfg_yyparse(&ctx);
-    if (r) assert(ctx.err);
+    parse(&ctx);
 
  xe:
     if (buf) xlu__cfg_yy_delete_buffer(buf, ctx.scanner);
-    if (ctx.scanner) xlu__cfg_yylex_destroy(ctx.scanner);
+    ctx_dispose(&ctx);
 
     return ctx.err;
 }
diff --git a/tools/libxl/libxlu_cfg_l.c b/tools/libxl/libxlu_cfg_l.c
index e1078f1..917a156 100644
--- a/tools/libxl/libxlu_cfg_l.c
+++ b/tools/libxl/libxlu_cfg_l.c
@@ -54,7 +54,6 @@ typedef int flex_int32_t;
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -85,6 +84,8 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -158,7 +159,15 @@ typedef void* yyscan_t;
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 /* The state buf must be large enough to hold one state per character in the 
main buffer.
@@ -487,7 +496,7 @@ int xlu__cfg_yyget_column(yyscan_t yyscanner);
 void xlu__cfg_yyset_column(int  column_no, yyscan_t yyscanner);
 
 
-#line 491 "libxlu_cfg_l.c"
+#line 500 "libxlu_cfg_l.c"
 
 #define INITIAL 0
 #define lexerr 1
@@ -623,7 +632,12 @@ static int input (yyscan_t yyscanner );
 
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -631,7 +645,7 @@ static int input (yyscan_t yyscanner );
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO fwrite( yytext, yyleng, 1, yyout )
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -642,7 +656,7 @@ static int input (yyscan_t yyscanner );
        if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
                { \
                int c = '*'; \
-               int n; \
+               size_t n; \
                for ( n = 0; n < max_size && \
                             (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
                        buf[n] = (char) c; \
@@ -730,7 +744,7 @@ YY_DECL
 #line 37 "libxlu_cfg_l.l"
 
 
-#line 734 "libxlu_cfg_l.c"
+#line 748 "libxlu_cfg_l.c"
 
     yylval = yylval_param;
 
@@ -930,7 +944,7 @@ YY_RULE_SETUP
 #line 82 "libxlu_cfg_l.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 934 "libxlu_cfg_l.c"
+#line 948 "libxlu_cfg_l.c"
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(lexerr):
        yyterminate();
@@ -1673,8 +1687,8 @@ YY_BUFFER_STATE xlu__cfg_yy_scan_string (yyconst char * 
yystr , yyscan_t yyscann
 
 /** Setup the input buffer state to scan the given bytes. The next call to 
xlu__cfg_yylex() will
  * scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a 
bytes.
  * @param yyscanner The scanner object.
  * @return the newly allocated buffer state object.
  */
diff --git a/tools/libxl/libxlu_cfg_l.h b/tools/libxl/libxlu_cfg_l.h
index 3dd1215..26f6dd6 100644
--- a/tools/libxl/libxlu_cfg_l.h
+++ b/tools/libxl/libxlu_cfg_l.h
@@ -58,7 +58,6 @@ typedef int flex_int32_t;
 typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
 
 /* Limits of integral types. */
 #ifndef INT8_MIN
@@ -89,6 +88,8 @@ typedef unsigned int flex_uint32_t;
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#endif /* ! C99 */
+
 #endif /* ! FLEXINT_H */
 
 #ifdef __cplusplus
@@ -131,7 +132,15 @@ typedef void* yyscan_t;
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 #ifndef YY_TYPEDEF_YY_BUFFER_STATE
@@ -301,7 +310,12 @@ static int yy_flex_strlen (yyconst char * ,yyscan_t 
yyscanner);
 
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Number of entries by which start-condition stack grows. */
@@ -338,6 +352,6 @@ extern int xlu__cfg_yylex \
 
 #line 82 "libxlu_cfg_l.l"
 
-#line 342 "libxlu_cfg_l.h"
+#line 356 "libxlu_cfg_l.h"
 #undef xlu__cfg_yyIN_HEADER
 #endif /* xlu__cfg_yyHEADER_H */
-- 
1.5.6.5


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