aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dtd_preparse.l
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2005-09-17 17:05:46 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2005-09-17 17:05:46 +0000
commit4c14b12c25291919fc7e409f9cfe95c16cefe678 (patch)
tree432eb53c8e154b0e76f997c778b30c476637985c /epan/dtd_preparse.l
parent8ace2749f38daec92df4da8cf2d1eda298cf36ff (diff)
Because there's more than just text in XML...
DTDs are imported to create fields svn path=/trunk/; revision=15851
Diffstat (limited to 'epan/dtd_preparse.l')
-rw-r--r--epan/dtd_preparse.l85
1 files changed, 10 insertions, 75 deletions
diff --git a/epan/dtd_preparse.l b/epan/dtd_preparse.l
index 660b9b00ca..f6b21a66ea 100644
--- a/epan/dtd_preparse.l
+++ b/epan/dtd_preparse.l
@@ -56,16 +56,14 @@ GHashTable* entities;
gchar* entity_name;
GString* error;
-gchar* dirname;
-gchar* filename;
+const gchar* dirname;
+const gchar* filename;
guint linenum;
-gchar* textstr;
+GString* textstr;
static gchar* replace_entity(gchar* s);
static const gchar* location(void);
-static gchar* load_entity_file(gchar* filename);
- /* [:blank:]+file[:blank:]*=[:blank:]*["] */
%}
xmlpi_start "<?"
@@ -95,7 +93,7 @@ entity [%&][A-Za-z][-A-Za-z0-9_]*;
whitespace [[blank:]]+
newline \n
-%START OUTSIDE IN_COMMENT IN_ENTITY NAMED_ENTITY IN_QUOTE ENTITY_DONE GET_FNAME_OPEN_QUOTE GET_FNAME GET_FNAME_CLOSE_QUOTE XMLPI
+%START OUTSIDE IN_COMMENT IN_ENTITY NAMED_ENTITY IN_QUOTE ENTITY_DONE XMLPI
%%
@@ -126,77 +124,14 @@ newline \n
<IN_QUOTE>{percent} |
<IN_QUOTE>{non_quote} |
<IN_QUOTE>{escaped_quote} g_string_append(current,yytext);
-<NAMED_ENTITY>{system} { BEGIN GET_FNAME_OPEN_QUOTE; }
-<GET_FNAME_OPEN_QUOTE>{quote} { BEGIN GET_FNAME; }
-<GET_FNAME>{filename} {
- if ((textstr = load_entity_file(yytext))) {
- g_hash_table_insert(entities,entity_name,textstr);
- } else {
- yyterminate();
- }
-
- BEGIN GET_FNAME_CLOSE_QUOTE;
+<NAMED_ENTITY>{system} {
+ g_string_sprintfa(error,"at %s:%u: file inclusion is not supported!", filename, linenum);
+ yyterminate();
}
-<GET_FNAME_CLOSE_QUOTE>{quote} { BEGIN ENTITY_DONE; }
<ENTITY_DONE>{special_stop} { current = output; g_string_append(current,"\n"); BEGIN OUTSIDE; }
%%
-static gchar* load_entity_file(gchar* fname) {
- gchar* fullname = g_strdup_printf("%s%s",dirname,fname);
- gchar* save_filename = filename;
- guint save_linenum = linenum;
- FILE* fp = fopen(fullname,"r");
- GString* filetext;
- gchar* retstr;
- gchar c;
-
- g_free(fullname);
-
- if (!fp) {
- g_string_sprintfa(error,"at %s:%u: could not load file %s: %s", filename, linenum, fname, strerror(errno));
- return NULL;
- }
-
- filename = fname;
- linenum = 1;
-
- filetext = g_string_new(location());
-
- while( ! feof(fp)) {
-
- c = fgetc(fp);
-
- if ( ferror(fp) ) {
- g_string_sprintfa(error,"at %s:%u: problem reading file %s: %s", filename, linenum, fname, strerror(errno));
-
- g_string_free(filetext,TRUE);
-
- filename = save_filename;
- save_linenum = linenum;
-
- return NULL;
- }
-
-
- g_string_append_c(filetext,c);
-
- if(c == '\n') {
- g_string_append(filetext,location());
- linenum++;
- }
-
- }
-
- retstr = filetext->str;
- g_string_free(filetext,FALSE);
-
- filename = save_filename;
- save_linenum = linenum;
-
- return retstr;
-}
-
static gchar* replace_entity(gchar* entity) {
GString* replacement;
@@ -207,7 +142,7 @@ static gchar* replace_entity(gchar* entity) {
if (replacement) {
return replacement->str;
} else {
- g_string_sprintfa(error,"dtd_preparse: in file '%s': %s does not exists\n", filename, entity);
+ g_string_sprintfa(error,"dtd_preparse: in file '%s': entity %s does not exists\n", filename, entity);
return "";
}
@@ -244,8 +179,8 @@ static gboolean free_gstring_hash_items(gpointer k,gpointer v,gpointer p _U_) {
return TRUE;
}
-extern GString* dtd_preparse(gchar* dname, gchar* fname, GString* err) {
- gchar* fullname = g_strdup_printf("%s%s",dname,fname);
+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);
dirname = dname;
filename = fname;