11 int attr_compare(
const void *a,
const void *b);
12 void print_tree(Parser p, XBit bit);
13 void print_bit(Parser p, XBit bit);
14 void print_attrs(ElementDefinition e, Attribute a);
15 void print_text(Char *text);
16 void print_text_bit(Char *text);
17 void dtd_cb(XBit bit,
void *arg);
18 InputSource entity_open(Entity ent,
void *arg);
20 int verbose = 0, expand = 0, bits = 0, silent = 0, nsgml = 0,
21 attr_defaults = 0, merge = 0, strict_xml = 0, tree = 0;
23 CharacterEncoding encoding = CE_unknown;
24 InputSource source = 0;
26 int main(
int argc,
char **argv)
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)
151 fprintf(stderr,
"unknown encoding %s\n", enc_name);
158 encoding = source->entity->encoding;
160 SetFileEncoding(Stdout, encoding);
163 fprintf(stderr,
"Input encoding %s, output encoding %s\n",
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)
226 void print_tree(Parser p, XBit bit)
232 if(bit->type == XBIT_start)
234 for(i=0; i<bit->nchildren; i++)
235 print_tree(p, bit->children[i]);
236 endbit.type = XBIT_end;
237 endbit.element_definition = bit->element_definition;
238 print_bit(p, &endbit);
242 void print_bit(Parser p, XBit bit)
244 const char *sys, *pub;
246 if(silent && bit->type != XBIT_error)
251 Printf(
"At %d: ", bit->byte_offset);
258 ParserPerror(p, bit);
261 sys = pub =
"<none>";
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);
305 fprintf(stderr,
"***%s\n", XBitTypeName[bit->type]);
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)
376 fprintf(stderr,
"\n***%s\n", XBitTypeName[bit->type]);
383 int attr_compare(
const void *a,
const void *b)
385 return Strcmp((*(Attribute *)a)->definition->name,
386 (*(Attribute *)b)->definition->name);
389 void print_attrs(ElementDefinition e, Attribute a)
395 for(b=a; b; b=b->next)
401 aa = malloc(n *
sizeof(*aa));
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);
419 void 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);
429 void dtd_cb(XBit bit,
void *arg)
435 void 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);
484 InputSource entity_open(Entity ent,
void *arg)
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);