From Harald Welte:
[obnox/wireshark/wip.git] / epan / dtd_preparse.l
index 979d8625fffde8ff8e0624d4c970a9129b97cae5..2857296e6f8abb8c3b8b8c40eb3180b48ca7575e 100644 (file)
@@ -1,66 +1,99 @@
-%option noyywrap
+/*
+ * We don't use unput, so don't generate code for it.
+ */
 %option nounput
-%option prefix="Dtd_PreParse_"
+
+/*
+ * We don't read from the terminal.
+ */
 %option never-interactive
+
+/*
+ * The language we're scanning is case-insensitive.
+ */
 %option caseless
+
+/*
+ * Prefix scanner routines with "Dtd_PreParse_" rather than "yy", so this
+ * scanner can coexist with other scanners.
+ */
+%option prefix="Dtd_PreParse_"
+
 %option outfile="dtd_preparse.c"
 
 %{
        /*
         * dtd_preparser.l
         *
-        * an XML dissector for ethereal 
+        * an XML dissector for wireshark
         *
         * DTD Preparser -  import a dtd file into a GString
         *                                      including files, removing comments
         *                  and resolving %entities;
-        * 
-        * Copyright 2004, Luis E. Garcia Ontanon <luis.ontanon@gmail.com>
+        *
+        * Copyright 2004, Luis E. Garcia Ontanon <luis@ontanon.org>
         *
         * $Id$
         *
-        * Ethereal - Network traffic analyzer
-        * By Gerald Combs <gerald@ethereal.com>
+        * Wireshark - Network traffic analyzer
+        * By Gerald Combs <gerald@wireshark.org>
         * Copyright 1998 Gerald Combs
         *
         * This program is free software; you can redistribute it and/or
         * modify it under the terms of the GNU General Public License
         * as published by the Free Software Foundation; either version 2
         * of the License, or (at your option) any later version.
-        * 
+        *
         * This program is distributed in the hope that it will be useful,
         * but WITHOUT ANY WARRANTY; without even the implied warranty of
         * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
         * GNU General Public License for more details.
-        * 
+        *
         * You should have received a copy of the GNU General Public License
         * along with this program; if not, write to the Free Software
-        * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+        * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
         */
-                       
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <glib.h>
 #include <string.h>
 #include <errno.h>
 #include <stdio.h>
 #include "dtd.h"
+#include "dtd_preparse_lex.h"
+#include <wsutil/file_util.h>
 
 #define ECHO g_string_append(current,yytext);
 
-GString* current;
-GString* output;
-GHashTable* entities;
-gchar* entity_name;
-GString* error;
+static GString* current;
+static GString* output;
+static GHashTable* entities;
+static gchar* entity_name;
+static GString* error;
 
-const gchar* dtd_dirname;
-const gchar* filename;
-guint linenum;
-
-GString* textstr;
+static const gchar* dtd_dirname;
+static const gchar* filename;
+static guint linenum;
 
 static gchar* replace_entity(gchar* s);
 static const gchar* location(void);
 
+/*
+ * Flex (v 2.5.35) uses this symbol to "exclude" unistd.h
+ */
+#ifdef _WIN32
+#define YY_NO_UNISTD_H
+#endif
+
+#ifdef _WIN32
+/* disable Windows VC compiler warning "signed/unsigned mismatch" associated  */
+/* with YY_INPUT code generated by flex versions such as 2.5.35.              */
+#pragma warning (disable:4018)
+#endif
+
 %}
 xmlpi_start "<?"
 xmlpi_stop  "?>"
@@ -93,7 +126,7 @@ newline    \n
 %%
 
 
-{entity}                                               if (current) g_string_sprintfa(current,"%s\n%s\n",replace_entity(yytext),location());
+{entity}                                               if (current) g_string_append_printf(current,"%s\n%s\n",replace_entity(yytext),location());
 
 {whitespace}                                   if (current) g_string_append(current," ");
 
@@ -106,10 +139,10 @@ newline    \n
 <IN_COMMENT>[^-]?                              |
 <IN_COMMENT>[-]                                        ;
 <IN_COMMENT>{comment_stop}             { current = output; BEGIN OUTSIDE; }
-       
+
 {newline}                                              {
        linenum++;
-       if (current) g_string_sprintfa(current,"%s\n",location());
+       if (current) g_string_append_printf(current,"%s\n",location());
 }
 
 
@@ -121,7 +154,7 @@ newline    \n
 <IN_QUOTE>{non_quote}                  |
 <IN_QUOTE>{escaped_quote}              g_string_append(current,yytext);
 <NAMED_ENTITY>{system}                 {
-    g_string_sprintfa(error,"at %s:%u: file inclusion is not supported!", filename, linenum);
+    g_string_append_printf(error,"at %s:%u: file inclusion is not supported!", filename, linenum);
     yyterminate();
 }
 <ENTITY_DONE>{special_stop}            { current = output; g_string_append(current,"\n"); BEGIN OUTSIDE; }
@@ -130,27 +163,27 @@ newline    \n
 
 static gchar* replace_entity(gchar* entity) {
        GString* replacement;
-       
+
        *entity = '%';
-       
+
        replacement = g_hash_table_lookup(entities,entity);
-       
+
        if (replacement) {
                return replacement->str;
        } else {
-               g_string_sprintfa(error,"dtd_preparse: in file '%s': entity %s does not exists\n", filename, entity);
+               g_string_append_printf(error,"dtd_preparse: in file '%s': entity %s does not exists\n", filename, entity);
                return "";
        }
-       
+
 }
 
 static const gchar* location(void) {
        static gchar* loc = NULL;
-    
+
        if (loc) g_free(loc);
-    
-       loc = g_strdup_printf("<? ethereal:location %s:%u ?>", filename, linenum);
-       
+
+       loc = g_strdup_printf("<? wireshark:location %s:%u ?>", filename, linenum);
+
        return loc;
 }
 
@@ -162,29 +195,31 @@ static gboolean free_gstring_hash_items(gpointer k,gpointer v,gpointer p _U_) {
 
 extern GString* dtd_preparse(const gchar* dname,const  gchar* fname, GString* err) {
        gchar* fullname = g_strdup_printf("%s%c%s",dname,G_DIR_SEPARATOR,fname);
-    
+
        dtd_dirname = dname;
        filename = fname;
        linenum = 1;
 
-       yyin = fopen(fullname,"r");
-       
+       yyin = ws_fopen(fullname,"r");
+
        if (!yyin) {
                if (err)
-                       g_string_sprintfa(err, "Could not open file: '%s', error: %s",fullname,strerror(errno));
-                       
+                       g_string_append_printf(err, "Could not open file: '%s', error: %s",fullname,g_strerror(errno));
+
                return NULL;
        }
-       
+
        error = err;
-       
+
        entities = g_hash_table_new(g_str_hash,g_str_equal);
        current = output = g_string_new(location());
-       
+
        BEGIN OUTSIDE;
 
        yylex();
-               
+
+       fclose(yyin);
+
        yyrestart(NULL);
 
        g_hash_table_foreach_remove(entities,free_gstring_hash_items,NULL);
@@ -194,3 +229,14 @@ extern GString* dtd_preparse(const gchar* dname,const  gchar* fname, GString* er
 
        return output;
 }
+
+/*
+ * We want to stop processing when we get to the end of the input.
+ * (%option noyywrap is not used because if used then
+ * some flex versions (eg: 2.5.35) generate code which causes
+ * warnings by the Windows VC compiler).
+ */
+
+int yywrap(void) {
+    return 1;
+}