11int attr_compare(
const void *a,
const void *b);
15void print_text(
Char *text);
16void print_text_bit(
Char *text);
20int verbose = 0, expand = 0, bits = 0, silent = 0, nsgml = 0,
21 attr_defaults = 0, merge = 0, strict_xml = 0, tree = 0;
23CharacterEncoding encoding = CE_unknown;
35 for(i = 1; i <
argc; i++)
39 for(s = &
argv[i][1]; *s; s++)
76 "usage: rxp [-abemnstvx] [-c encoding] [url]\n");
83 ent = NewExternalEntity(0, 0, strdup8(
argv[i]), 0, 0);
85 source = EntityOpen(
ent);
88 source = SourceFromStream(
"<stdin>",
stdin);
94 ParserSetEntityOpener(p, entity_open);
98 ParserSetDtdCallback(p, dtd_cb);
99 ParserSetCallbackArg(p, p);
103 ParserSetFlag(p, ReturnDefaultedAttributes, 1);
107 ParserSetFlag(p, ExpandGeneralEntities, 0);
108 ParserSetFlag(p, ExpandCharacterEntities, 0);
112 ParserSetFlag(p, MergePCData, 1);
116 ParserSetFlag(p, XMLPiEnd, 0);
117 ParserSetFlag(p, XMLEmptyTagEnd, 0);
118 ParserSetFlag(p, XMLPredefinedEntities, 0);
119 ParserSetFlag(p, XMLExternalIDs, 0);
120 ParserSetFlag(p, XMLMiscWFErrors, 0);
121 ParserSetFlag(p, TrustSDD, 0);
122 ParserSetFlag(p, ErrorOnUnquotedAttributeValues, 0);
123 ParserSetFlag(p, ExpandGeneralEntities, 0);
124 ParserSetFlag(p, ExpandCharacterEntities, 0);
130 ParserSetFlag(p, ErrorOnBadCharacterEntities, 1);
131 ParserSetFlag(p, ErrorOnUndefinedEntities, 1);
132 ParserSetFlag(p, XMLStrictWFErrors, 1);
133 ParserSetFlag(p, WarnOnUndefinedElements, 0);
134 ParserSetFlag(p, WarnOnUndefinedAttributes, 0);
135 ParserSetFlag(p, WarnOnRedefinitions, 0);
139 if(ParserPush(p, source) == -1)
141 ParserPerror(p, &p->xbit);
147 encoding = FindEncoding(enc_name);
149 if(encoding == CE_unknown)
158 encoding = source->entity->encoding;
160 SetFileEncoding(Stdout, encoding);
164 CharacterEncodingNameAndByteOrder[source->entity->encoding],
165 CharacterEncodingNameAndByteOrder[encoding]);
167 if(!silent && !strict_xml && source->entity->ml_decl == ML_xml && !bits)
171 if(source->entity->version_decl)
172 Printf(
" version=\"%s\"", source->entity->version_decl);
174 if(encoding == CE_unspecified_ascii_superset)
176 if(source->entity->encoding_decl != CE_unknown)
177 Printf(
" encoding=\"%s\"",
178 CharacterEncodingName[source->entity->encoding_decl]);
181 Printf(
" encoding=\"%s\"",
182 CharacterEncodingName[encoding]);
184 if(source->entity->standalone_decl != SDD_unspecified)
185 Printf(
" standalone=\"%s\"",
186 StandaloneDeclarationName[source->entity->standalone_decl]);
205 if(
bit->type == XBIT_eof)
207 if(!silent && !strict_xml && !bits)
217 if(
bit->type == XBIT_error)
232 if(
bit->type == XBIT_start)
234 for(i=0; i<
bit->nchildren; i++)
235 print_tree(p,
bit->children[i]);
237 endbit.element_definition =
bit->element_definition;
246 if(silent &&
bit->type != XBIT_error)
251 Printf(
"At %d: ",
bit->byte_offset);
258 ParserPerror(p,
bit);
262 if(p->dtd->external_part)
264 if(p->dtd->external_part->publicid)
265 pub = p->dtd->external_part->publicid;
266 if(p->dtd->external_part->systemid)
267 sys = p->dtd->external_part->systemid;
269 Printf(
"doctype: %S pubid %s sysid %s\n", p->dtd->name,
pub,
sys);
272 Printf(
"start: %S ",
bit->element_definition->name);
273 print_attrs(0,
bit->attributes);
277 Printf(
"empty: %S ",
bit->element_definition->name);
278 print_attrs(0,
bit->attributes);
282 Printf(
"end: %S\n",
bit->element_definition->name);
285 Printf(
"pi: %S: ",
bit->pi_name);
286 print_text_bit(
bit->pi_chars);
291 print_text_bit(
bit->cdsect_chars);
296 print_text_bit(
bit->pcdata_chars);
301 print_text_bit(
bit->comment_chars);
317 ParserPerror(p,
bit);
323 Printf(
"<!DOCTYPE %S", p->dtd->name);
324 if(p->dtd->external_part)
326 if(p->dtd->external_part->publicid)
327 Printf(
" PUBLIC \"%s\"", p->dtd->external_part->publicid);
328 else if(p->dtd->external_part->systemid)
330 if(p->dtd->external_part->systemid)
331 Printf(
" \"%s\"", p->dtd->external_part->systemid);
333 if(p->dtd->internal_part)
334 Printf(
" [%S]", p->dtd->internal_part->text);
339 Printf(
"<%S",
bit->element_definition->name);
340 print_attrs(
bit->element_definition,
bit->attributes);
341 if(
bit->type == XBIT_start)
344 Printf(
"></%S>",
bit->element_definition->name);
349 Printf(
"</%S>",
bit->element_definition->name);
353 bit->pi_name,
bit->pi_chars, nsgml ?
">" :
"?>");
354 if(p->state <= PS_prolog2 && !strict_xml)
360 print_text(
bit->cdsect_chars);
362 Printf(
"<![CDATA[%S]]>",
bit->cdsect_chars);
365 print_text(
bit->pcdata_chars);
371 Printf(
"<!--%S-->",
bit->comment_chars);
372 if(p->state <= PS_prolog2)
383int attr_compare(
const void *a,
const void *b)
385 return Strcmp((*(
Attribute *)a)->definition->name,
395 for(b=a; b; b=b->next)
403 for(i=0, b=a; b; i++, b=b->next)
407 qsort((
void *)
aa, n,
sizeof(*
aa), attr_compare);
411 Printf(
" %S=\"",
aa[i]->definition->name);
412 print_text(
aa[i]->value);
419void print_text_bit(
Char *text)
423 for(i=0; i<50 && text[i]; i++)
424 if(text[i] ==
'\n' || text[i] ==
'\r')
426 Printf(
"%.50S", text);
435void print_text(
Char *text)
445 for(
pc = last = text; *
pc;
pc++)
447 if(*
pc ==
'&' || *
pc ==
'<' || *
pc ==
'>' || *
pc ==
'"' ||
448 (strict_xml && (*
pc == 9 || *
pc == 10 || *
pc == 13)))
451 Printf(
"%.*S",
pc - last, last);
481 Printf(
"%.*S",
pc - last, last);
487 strcmp(
ent->publicid,
"-//RMT//DTD just a test//EN") == 0)
492 if((f =
fopen(
"/tmp/mydtd",
"r")))
494 if(!(
f16 = MakeFILE16FromFILE(f,
"r")))
496 SetCloseUnderlying(
f16, 1);
498 return NewInputSource(
ent,
f16);
502 return EntityOpen(
ent);