|
Packit |
9741aa |
/* lineout.c -
|
|
Packit |
9741aa |
Implements line-oriented output format.
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
Written by James Clark (jjc@jclark.com).
|
|
Packit |
9741aa |
*/
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#include "config.h"
|
|
Packit |
9741aa |
#include "std.h"
|
|
Packit |
9741aa |
#include "entity.h" /* Templates for entity control blocks. */
|
|
Packit |
9741aa |
#include "adl.h" /* Definitions for attribute list processing. */
|
|
Packit |
9741aa |
#include "sgmlmain.h" /* Main interface to SGML services. */
|
|
Packit |
9741aa |
#include "lineout.h"
|
|
Packit |
9741aa |
#include "appl.h"
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID flush_data P((void));
|
|
Packit |
9741aa |
static VOID define_external_entity P((PNE));
|
|
Packit |
9741aa |
static VOID define_entity P((UNCH *));
|
|
Packit |
9741aa |
static VOID handle_attributes P((UNCH *, struct ad *));
|
|
Packit |
9741aa |
static VOID handle_token_list P((UNCH *, struct ad *, int));
|
|
Packit |
9741aa |
static VOID handle_single_token P((UNCH *, struct ad *, int));
|
|
Packit |
9741aa |
static VOID output_notation P((UNCH *, UNCH *, UNCH *));
|
|
Packit |
9741aa |
static VOID output_internal_entity P((UNCH *, int, UNCH *));
|
|
Packit |
9741aa |
static VOID output_external_entity P((UNCH *, int, UNIV, UNCH *, UNCH *,
|
|
Packit |
9741aa |
UNCH *));
|
|
Packit |
9741aa |
static VOID output_subdoc P((UNCH *, UNIV, UNCH *, UNCH *));
|
|
Packit |
9741aa |
#ifdef SUPPORT_SUBDOC
|
|
Packit |
9741aa |
static VOID process_subdoc P((UNCH *, UNIV));
|
|
Packit |
9741aa |
#endif /* SUPPORT_SUBDOC */
|
|
Packit |
9741aa |
static VOID output_record_end P((void));
|
|
Packit |
9741aa |
static VOID output_pcdata P((UNS, UNCH *));
|
|
Packit |
9741aa |
static VOID output_cdata P((UNS, UNCH *));
|
|
Packit |
9741aa |
static VOID output_sdata P((UNS, UNCH *));
|
|
Packit |
9741aa |
static VOID output_entity_reference P((UNCH *));
|
|
Packit |
9741aa |
static VOID output_start_tag P((UNCH *));
|
|
Packit |
9741aa |
static VOID output_end_tag P((UNCH *));
|
|
Packit |
9741aa |
static VOID output_processing_instruction P((UNS, UNCH *));
|
|
Packit |
9741aa |
static VOID output_implied_attribute P((UNCH *, UNCH *));
|
|
Packit |
9741aa |
static char *attribute_type_string P((int));
|
|
Packit |
9741aa |
static VOID output_begin_attribute P((UNCH *, UNCH *, int));
|
|
Packit |
9741aa |
static VOID output_attribute_token P((UNS, UNCH *));
|
|
Packit |
9741aa |
static VOID output_end_attribute P((void));
|
|
Packit |
9741aa |
static VOID print_data P((UNS, UNCH *, int));
|
|
Packit |
9741aa |
static VOID print_string P((UNS, UNCH *, int));
|
|
Packit |
9741aa |
static VOID print_id P((UNIV, UNCH *, UNCH *));
|
|
Packit |
9741aa |
static VOID print_filename P((char *));
|
|
Packit |
9741aa |
static VOID output_location P((void));
|
|
Packit |
9741aa |
static VOID output_appinfo P((UNS, UNCH *));
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static int have_data = 0;
|
|
Packit |
9741aa |
static char *current_filename = 0;
|
|
Packit |
9741aa |
static unsigned long current_lineno = 0;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
VOID process_document(subdocsw)
|
|
Packit |
9741aa |
int subdocsw;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
enum sgmlevent rc;
|
|
Packit |
9741aa |
struct rcbtag rcbtag;
|
|
Packit |
9741aa |
struct rcbdata rcbdaf;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
while ((rc = sgmlnext(&rcbdaf, &rcbtag)) != SGMLEOD) {
|
|
Packit |
9741aa |
#ifdef SUPPORT_SUBDOC
|
|
Packit |
9741aa |
if (rc == SGMLDAF && !CONTERSW(rcbdaf) && NDESW(rcbdaf)
|
|
Packit |
9741aa |
&& NEXTYPE(NEPTR(rcbdaf)) == ESNSUB) {
|
|
Packit |
9741aa |
if (!suppsw && !sgmlment(NEENAME(NEPTR(rcbdaf))))
|
|
Packit |
9741aa |
define_external_entity(NEPTR(rcbdaf));
|
|
Packit |
9741aa |
process_subdoc(NEENAME(NEPTR(rcbdaf)) + 1,
|
|
Packit |
9741aa |
NEID(NEPTR(rcbdaf)));
|
|
Packit |
9741aa |
continue;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
#endif /* SUPPORT_SUBDOC */
|
|
Packit |
9741aa |
if (!suppsw)
|
|
Packit |
9741aa |
switch (rc) {
|
|
Packit |
9741aa |
case SGMLDAF:
|
|
Packit |
9741aa |
if (CONTERSW(rcbdaf))
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
if (CDESW(rcbdaf))
|
|
Packit |
9741aa |
output_cdata(CDATALEN(rcbdaf), CDATA(rcbdaf));
|
|
Packit |
9741aa |
else if (SDESW(rcbdaf))
|
|
Packit |
9741aa |
output_sdata(CDATALEN(rcbdaf), CDATA(rcbdaf));
|
|
Packit |
9741aa |
else if (NDESW(rcbdaf)) {
|
|
Packit |
9741aa |
assert(NEXTYPE(NEPTR(rcbdaf)) != ESNSUB);
|
|
Packit |
9741aa |
if (!sgmlment(NEENAME(NEPTR(rcbdaf))))
|
|
Packit |
9741aa |
define_external_entity(NEPTR(rcbdaf));
|
|
Packit |
9741aa |
output_entity_reference(NEENAME(NEPTR(rcbdaf)) + 1);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
output_pcdata(CDATALEN(rcbdaf), CDATA(rcbdaf));
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case SGMLSTG:
|
|
Packit |
9741aa |
if (CONTERSW(rcbtag))
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
if (ALPTR(rcbtag))
|
|
Packit |
9741aa |
handle_attributes((UNCH *)NULL, ALPTR(rcbtag));
|
|
Packit |
9741aa |
output_start_tag(CURGI(rcbtag));
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case SGMLETG:
|
|
Packit |
9741aa |
if (CONTERSW(rcbtag))
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
output_end_tag(CURGI(rcbtag));
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case SGMLPIS:
|
|
Packit |
9741aa |
if (CONTERSW(rcbdaf))
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
output_processing_instruction(PDATALEN(rcbdaf),
|
|
Packit |
9741aa |
PDATA(rcbdaf));
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case SGMLREF:
|
|
Packit |
9741aa |
if (CONTERSW(rcbdaf))
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
output_record_end();
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case SGMLAPP:
|
|
Packit |
9741aa |
if (CONTERSW(rcbdaf))
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
if (!subdocsw)
|
|
Packit |
9741aa |
output_appinfo(ADATALEN(rcbdaf), ADATA(rcbdaf));
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
default:
|
|
Packit |
9741aa |
abort();
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
/* Output an indication that the document was conforming. */
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
VOID output_conforming()
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
if (!suppsw)
|
|
Packit |
9741aa |
printf("%c\n", CONFORMING_CODE);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID define_external_entity(p)
|
|
Packit |
9741aa |
PNE p;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
if (NEXTYPE(p) == ESNSUB)
|
|
Packit |
9741aa |
output_subdoc(NEENAME(p) + 1, NEID(p), NEPUBID(p), NESYSID(p));
|
|
Packit |
9741aa |
else {
|
|
Packit |
9741aa |
if (!NEDCNMARK(p))
|
|
Packit |
9741aa |
output_notation(NEDCN(p) + 1, NEDCNPUBID(p), NEDCNSYSID(p));
|
|
Packit |
9741aa |
output_external_entity(NEENAME(p) + 1, NEXTYPE(p), NEID(p),
|
|
Packit |
9741aa |
NEPUBID(p), NESYSID(p), NEDCN(p) + 1);
|
|
Packit |
9741aa |
if (NEAL(p))
|
|
Packit |
9741aa |
handle_attributes(NEENAME(p) + 1, NEAL(p));
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID define_entity(ename)
|
|
Packit |
9741aa |
UNCH *ename;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
int rc;
|
|
Packit |
9741aa |
PNE np;
|
|
Packit |
9741aa |
UNCH *tp;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
if (sgmlment(ename)) /* already defined it */
|
|
Packit |
9741aa |
return;
|
|
Packit |
9741aa |
rc = sgmlgent(ename, &np, &tp);
|
|
Packit |
9741aa |
switch (rc) {
|
|
Packit |
9741aa |
case 1:
|
|
Packit |
9741aa |
define_external_entity(np);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case 2:
|
|
Packit |
9741aa |
case 3:
|
|
Packit |
9741aa |
output_internal_entity(ename + 1, rc == 3, tp);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
/* ENT is the name of the entity with which these attributes are associated;
|
|
Packit |
9741aa |
if it's NULL, they're associated with the next start tag. */
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID handle_attributes(ent, al)
|
|
Packit |
9741aa |
UNCH *ent;
|
|
Packit |
9741aa |
struct ad *al;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
int aln;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
for (aln = 1; aln <= ADN(al); aln++) {
|
|
Packit |
9741aa |
if (GET(ADFLAGS(al, aln), AERROR))
|
|
Packit |
9741aa |
;
|
|
Packit |
9741aa |
else if (GET(ADFLAGS(al, aln), AINVALID))
|
|
Packit |
9741aa |
;
|
|
Packit |
9741aa |
else if (ADVAL(al, aln) == NULL)
|
|
Packit |
9741aa |
output_implied_attribute(ent, ADNAME(al, aln));
|
|
Packit |
9741aa |
else if (ADTYPE(al, aln) >= ATKNLIST)
|
|
Packit |
9741aa |
handle_token_list(ent, al, aln);
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
handle_single_token(ent, al, aln);
|
|
Packit |
9741aa |
if (BITON(ADFLAGS(al, aln), AGROUP))
|
|
Packit |
9741aa |
aln += ADNUM(al, aln);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID handle_token_list(ent, al, aln)
|
|
Packit |
9741aa |
UNCH *ent;
|
|
Packit |
9741aa |
struct ad *al;
|
|
Packit |
9741aa |
int aln;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
UNCH *ptr;
|
|
Packit |
9741aa |
int i;
|
|
Packit |
9741aa |
if (ADTYPE(al, aln) == AENTITYS) {
|
|
Packit |
9741aa |
ptr = ADVAL(al, aln);
|
|
Packit |
9741aa |
for (i = 0; i < ADNUM(al, aln); i++) {
|
|
Packit |
9741aa |
/* Temporarily make token look like normal
|
|
Packit |
9741aa |
name with length and EOS. */
|
|
Packit |
9741aa |
UNCH c = ptr[*ptr + 1];
|
|
Packit |
9741aa |
ptr[*ptr + 1] = '\0';
|
|
Packit |
9741aa |
*ptr += 2;
|
|
Packit |
9741aa |
define_entity(ptr);
|
|
Packit |
9741aa |
*ptr -= 2;
|
|
Packit |
9741aa |
ptr += *ptr + 1;
|
|
Packit |
9741aa |
*ptr = c;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
output_begin_attribute(ent, ADNAME(al, aln), ADTYPE(al, aln));
|
|
Packit |
9741aa |
ptr = ADVAL(al, aln);
|
|
Packit |
9741aa |
for (i = 0; i < ADNUM(al, aln); i++) {
|
|
Packit |
9741aa |
/* The first byte is a length NOT including the length
|
|
Packit |
9741aa |
byte; the tokens are not EOS terminated. */
|
|
Packit |
9741aa |
output_attribute_token(*ptr, ptr + 1);
|
|
Packit |
9741aa |
ptr += *ptr + 1;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
output_end_attribute();
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID handle_single_token(ent, al, aln)
|
|
Packit |
9741aa |
UNCH *ent;
|
|
Packit |
9741aa |
struct ad *al;
|
|
Packit |
9741aa |
int aln;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
if (ADTYPE(al, aln) == ANOTEGRP && !DCNMARK(ADDATA(al, aln).x))
|
|
Packit |
9741aa |
output_notation(ADVAL(al, aln) + 1,
|
|
Packit |
9741aa |
ADDATA(al, aln).x->pubid,
|
|
Packit |
9741aa |
ADDATA(al, aln).x->sysid);
|
|
Packit |
9741aa |
else if (ADTYPE(al, aln) == AENTITY)
|
|
Packit |
9741aa |
define_entity(ADVAL(al, aln));
|
|
Packit |
9741aa |
output_begin_attribute(ent, ADNAME(al, aln), ADTYPE(al, aln));
|
|
Packit |
9741aa |
if (ADTYPE(al, aln) == ACHARS)
|
|
Packit |
9741aa |
output_attribute_token(ustrlen(ADVAL(al, aln)), ADVAL(al, aln));
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
output_attribute_token(*ADVAL(al, aln) - 2, ADVAL(al, aln) + 1);
|
|
Packit |
9741aa |
output_end_attribute();
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_notation(name, pubid, sysid)
|
|
Packit |
9741aa |
UNCH *name;
|
|
Packit |
9741aa |
UNCH *pubid, *sysid;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
print_id((UNIV)0, pubid, sysid);
|
|
Packit |
9741aa |
printf("%c%s\n", DEFINE_NOTATION_CODE, name);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_internal_entity(ename, is_sdata, text)
|
|
Packit |
9741aa |
UNCH *ename;
|
|
Packit |
9741aa |
int is_sdata;
|
|
Packit |
9741aa |
UNCH *text;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
printf("%c%s %s ", DEFINE_INTERNAL_ENTITY_CODE, ename,
|
|
Packit |
9741aa |
is_sdata ? "SDATA" : "CDATA");
|
|
Packit |
9741aa |
print_string(text ? ustrlen(text) : 0, text, 0);
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_subdoc(nm, id, pubid, sysid)
|
|
Packit |
9741aa |
UNCH *nm;
|
|
Packit |
9741aa |
UNIV id;
|
|
Packit |
9741aa |
UNCH *pubid, *sysid;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
print_id(id, pubid, sysid);
|
|
Packit |
9741aa |
printf("%c%s\n", DEFINE_SUBDOC_ENTITY_CODE, nm);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#ifdef SUPPORT_SUBDOC
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID process_subdoc(nm, id)
|
|
Packit |
9741aa |
UNCH *nm;
|
|
Packit |
9741aa |
UNIV id;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
if (!suppsw) {
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
output_location();
|
|
Packit |
9741aa |
printf("%c%s\n", START_SUBDOC_CODE, nm);
|
|
Packit |
9741aa |
fflush(stdout);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
fflush(stderr);
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
if (id) {
|
|
Packit |
9741aa |
char **argv;
|
|
Packit |
9741aa |
int ret;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
argv = make_argv(id);
|
|
Packit |
9741aa |
ret = run_process(argv);
|
|
Packit |
9741aa |
if (ret != 0)
|
|
Packit |
9741aa |
suberr++;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
current_filename = 0;
|
|
Packit |
9741aa |
free(argv);
|
|
Packit |
9741aa |
if (ret == 0)
|
|
Packit |
9741aa |
get_subcaps();
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
else {
|
|
Packit |
9741aa |
suberr++;
|
|
Packit |
9741aa |
appl_error(E_SUBDOC, nm);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
if (!suppsw)
|
|
Packit |
9741aa |
printf("%c%s\n", END_SUBDOC_CODE, nm);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
#endif /* SUPPORT_SUBDOC */
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_external_entity(nm, xtype, id, pubid, sysid, dcn)
|
|
Packit |
9741aa |
UNCH *nm, *dcn;
|
|
Packit |
9741aa |
UNIV id;
|
|
Packit |
9741aa |
UNCH *pubid, *sysid;
|
|
Packit |
9741aa |
int xtype;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
char *type;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
print_id(id, pubid, sysid);
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
switch (xtype) {
|
|
Packit |
9741aa |
case ESNCDATA:
|
|
Packit |
9741aa |
type = "CDATA";
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case ESNNDATA:
|
|
Packit |
9741aa |
type = "NDATA";
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case ESNSDATA:
|
|
Packit |
9741aa |
type = "SDATA";
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
default:
|
|
Packit |
9741aa |
return;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
printf("%c%s %s %s\n", DEFINE_EXTERNAL_ENTITY_CODE, nm, type, dcn);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_record_end()
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
static UNCH re = RECHAR;
|
|
Packit |
9741aa |
print_data(1, &re, 0);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_pcdata(n, s)
|
|
Packit |
9741aa |
UNS n;
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
print_data(n, s, 0);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_cdata(n, s)
|
|
Packit |
9741aa |
UNS n;
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
print_data(n, s, 0);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_sdata(n, s)
|
|
Packit |
9741aa |
UNS n;
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
print_data(n, s, 1);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_entity_reference(s)
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
output_location();
|
|
Packit |
9741aa |
printf("%c%s\n", REFERENCE_ENTITY_CODE, s);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_start_tag(s)
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
output_location();
|
|
Packit |
9741aa |
printf("%c%s\n", START_CODE, s);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_end_tag(s)
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
printf("%c%s\n", END_CODE, s);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_processing_instruction(n, s)
|
|
Packit |
9741aa |
UNS n;
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
output_location();
|
|
Packit |
9741aa |
putchar(PI_CODE);
|
|
Packit |
9741aa |
print_string(n, s, 0);
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_appinfo(n, s)
|
|
Packit |
9741aa |
UNS n;
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
output_location();
|
|
Packit |
9741aa |
putchar(APPINFO_CODE);
|
|
Packit |
9741aa |
print_string(n, s, 0);
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_implied_attribute(ent, aname)
|
|
Packit |
9741aa |
UNCH *ent, *aname;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
if (ent)
|
|
Packit |
9741aa |
printf("%c%s %s IMPLIED\n", DATA_ATTRIBUTE_CODE, ent, aname);
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
printf("%c%s IMPLIED\n", ATTRIBUTE_CODE, aname);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static char *attribute_type_string(type)
|
|
Packit |
9741aa |
int type;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
switch (type) {
|
|
Packit |
9741aa |
case ANMTGRP:
|
|
Packit |
9741aa |
case ANAME:
|
|
Packit |
9741aa |
case ANMTOKE:
|
|
Packit |
9741aa |
case ANUTOKE:
|
|
Packit |
9741aa |
case ANUMBER:
|
|
Packit |
9741aa |
case ANAMES:
|
|
Packit |
9741aa |
case ANMTOKES:
|
|
Packit |
9741aa |
case ANUTOKES:
|
|
Packit |
9741aa |
case ANUMBERS:
|
|
Packit |
9741aa |
case AID:
|
|
Packit |
9741aa |
case AIDREF:
|
|
Packit |
9741aa |
case AIDREFS:
|
|
Packit |
9741aa |
return "TOKEN";
|
|
Packit |
9741aa |
case ANOTEGRP:
|
|
Packit |
9741aa |
return "NOTATION";
|
|
Packit |
9741aa |
case ACHARS:
|
|
Packit |
9741aa |
return "CDATA";
|
|
Packit |
9741aa |
case AENTITY:
|
|
Packit |
9741aa |
case AENTITYS:
|
|
Packit |
9741aa |
return "ENTITY";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
#if 0
|
|
Packit |
9741aa |
fatal("invalid attribute type %d", type);
|
|
Packit |
9741aa |
#endif
|
|
Packit |
9741aa |
return "INVALID";
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_begin_attribute(ent, aname, type)
|
|
Packit |
9741aa |
UNCH *ent, *aname;
|
|
Packit |
9741aa |
int type;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
if (ent)
|
|
Packit |
9741aa |
printf("%c%s %s %s", DATA_ATTRIBUTE_CODE, ent, aname,
|
|
Packit |
9741aa |
attribute_type_string(type));
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
printf("%c%s %s", ATTRIBUTE_CODE, aname,
|
|
Packit |
9741aa |
attribute_type_string(type));
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_attribute_token(vallen, val)
|
|
Packit |
9741aa |
UNS vallen;
|
|
Packit |
9741aa |
UNCH *val;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
putchar(' ');
|
|
Packit |
9741aa |
print_string(vallen, val, 0);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_end_attribute()
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID print_data(n, s, is_sdata)
|
|
Packit |
9741aa |
UNS n;
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
int is_sdata;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
if (n > 0 || is_sdata) {
|
|
Packit |
9741aa |
if (n == 1 && *s == RECHAR)
|
|
Packit |
9741aa |
current_lineno++;
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
output_location();
|
|
Packit |
9741aa |
if (!have_data)
|
|
Packit |
9741aa |
putchar(DATA_CODE);
|
|
Packit |
9741aa |
print_string(n, s, is_sdata);
|
|
Packit |
9741aa |
have_data = 1;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID flush_data()
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
if (have_data) {
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
have_data = 0;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID output_location()
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
char *filename;
|
|
Packit |
9741aa |
unsigned long lineno;
|
|
Packit |
9741aa |
int filename_changed = 0;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
if (!locsw)
|
|
Packit |
9741aa |
return;
|
|
Packit |
9741aa |
if (!sgmlloc(&lineno, &filename))
|
|
Packit |
9741aa |
return;
|
|
Packit |
9741aa |
if (!current_filename || strcmp(filename, current_filename) != 0)
|
|
Packit |
9741aa |
filename_changed = 1;
|
|
Packit |
9741aa |
else if (lineno == current_lineno)
|
|
Packit |
9741aa |
return;
|
|
Packit |
9741aa |
flush_data();
|
|
Packit |
9741aa |
printf("%c%lu", LOCATION_CODE, lineno);
|
|
Packit |
9741aa |
current_lineno = lineno;
|
|
Packit |
9741aa |
if (filename_changed) {
|
|
Packit |
9741aa |
putchar(' ');
|
|
Packit |
9741aa |
print_filename(filename);
|
|
Packit |
9741aa |
current_filename = filename;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID print_string(slen, s, is_sdata)
|
|
Packit |
9741aa |
UNS slen;
|
|
Packit |
9741aa |
UNCH *s;
|
|
Packit |
9741aa |
int is_sdata;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
if (is_sdata)
|
|
Packit |
9741aa |
fputs("\\|", stdout);
|
|
Packit |
9741aa |
while (slen > 0) {
|
|
Packit |
9741aa |
UNCH ch = *s++;
|
|
Packit |
9741aa |
slen--;
|
|
Packit |
9741aa |
if (ch == DELSDATA) {
|
|
Packit |
9741aa |
if (is_sdata)
|
|
Packit |
9741aa |
; /* I don't think this should happen */
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
fputs("\\|", stdout);
|
|
Packit |
9741aa |
;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
else if (ch == DELCDATA)
|
|
Packit |
9741aa |
;
|
|
Packit |
9741aa |
else {
|
|
Packit |
9741aa |
if (ch == DELNONCH) {
|
|
Packit |
9741aa |
if (!slen)
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
ch = UNSHIFTNON(*s);
|
|
Packit |
9741aa |
s++;
|
|
Packit |
9741aa |
slen--;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
switch (ch) {
|
|
Packit |
9741aa |
case RECHAR:
|
|
Packit |
9741aa |
fputs("\\n", stdout);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case '\\':
|
|
Packit |
9741aa |
fputs("\\\\", stdout);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
default:
|
|
Packit |
9741aa |
if (ISASCII(ch) && isprint(ch))
|
|
Packit |
9741aa |
putchar(ch);
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
printf("\\%03o", ch);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
if (is_sdata)
|
|
Packit |
9741aa |
fputs("\\|", stdout);
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID print_id(id, pubid, sysid)
|
|
Packit |
9741aa |
UNIV id;
|
|
Packit |
9741aa |
UNCH *pubid;
|
|
Packit |
9741aa |
UNCH *sysid;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
if (pubid) {
|
|
Packit |
9741aa |
putchar(PUBID_CODE);
|
|
Packit |
9741aa |
print_string(ustrlen(pubid), pubid, 0);
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
if (sysid) {
|
|
Packit |
9741aa |
putchar(SYSID_CODE);
|
|
Packit |
9741aa |
print_string(ustrlen(sysid), sysid, 0);
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
if (id) {
|
|
Packit |
9741aa |
char *p;
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
for (p = id; *p != '\0'; p++) {
|
|
Packit |
9741aa |
putchar(FILE_CODE);
|
|
Packit |
9741aa |
do {
|
|
Packit |
9741aa |
switch (*p) {
|
|
Packit |
9741aa |
case '\\':
|
|
Packit |
9741aa |
fputs("\\\\", stdout);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case '\n':
|
|
Packit |
9741aa |
fputs("\\n", stdout);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
default:
|
|
Packit |
9741aa |
if (ISASCII(*p) && isprint((UNCH)*p))
|
|
Packit |
9741aa |
putchar(*p);
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
printf("\\%03o", (UNCH)*p);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
} while (*++p);
|
|
Packit |
9741aa |
putchar('\n');
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
static VOID print_filename(s)
|
|
Packit |
9741aa |
char *s;
|
|
Packit |
9741aa |
{
|
|
Packit |
9741aa |
for (; *s; s++)
|
|
Packit |
9741aa |
switch (*s) {
|
|
Packit |
9741aa |
case '\\':
|
|
Packit |
9741aa |
fputs("\\\\", stdout);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
case '\n':
|
|
Packit |
9741aa |
fputs("\\n", stdout);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
default:
|
|
Packit |
9741aa |
if (ISASCII(*s) && isprint((UNCH)*s))
|
|
Packit |
9741aa |
putchar(*s);
|
|
Packit |
9741aa |
else
|
|
Packit |
9741aa |
printf("\\%03o", (UNCH)*s);
|
|
Packit |
9741aa |
break;
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
}
|
|
Packit |
9741aa |
|
|
Packit |
9741aa |
/*
|
|
Packit |
9741aa |
Local Variables:
|
|
Packit |
9741aa |
c-indent-level: 5
|
|
Packit |
9741aa |
c-continued-statement-offset: 5
|
|
Packit |
9741aa |
c-brace-offset: -5
|
|
Packit |
9741aa |
c-argdecl-indent: 0
|
|
Packit |
9741aa |
c-label-offset: -5
|
|
Packit |
9741aa |
End:
|
|
Packit |
9741aa |
*/
|