diff options
Diffstat (limited to 'usr.bin/sgmls/sgmls/md2.c')
-rw-r--r-- | usr.bin/sgmls/sgmls/md2.c | 792 |
1 files changed, 0 insertions, 792 deletions
diff --git a/usr.bin/sgmls/sgmls/md2.c b/usr.bin/sgmls/sgmls/md2.c deleted file mode 100644 index df7e57e..0000000 --- a/usr.bin/sgmls/sgmls/md2.c +++ /dev/null @@ -1,792 +0,0 @@ -#include "sgmlincl.h" /* #INCLUDE statements for SGML parser. */ -/* MDENTITY: Process ENTITY declaration. -*/ -VOID mdentity(tbuf) -UNCH *tbuf; /* Work area for tokenization[LITLEN+2]. */ -{ - struct fpi fpicb; /* Formal public identifier structure. */ - struct fpi *fpis = &fpicb; /* Ptr to current or #DEFAULT fpi. */ - union etext etx; /* Ptr to entity text. */ - UNCH estore = ESM; /* Entity storage class. */ - struct entity *ecb; /* Ptr to entity control block. */ - int parmsw = 0; /* 1=parameter entity declaration; 0 = not. */ - int defltsw = 0; /* 1=#DEFAULT declaration; 0=not. */ - PNE pne = 0; /* Ptr to N/C/SDATA entity control block. */ - - mdname = key[KENTITY]; /* Declaration name for messages. */ - subdcl = NULL; /* No subject as yet. */ - parmno = 0; /* No parameters as yet. */ - mdessv = es; /* Save es for checking entity nesting. */ - /* PARAMETER 1: Entity name. - */ - pcbmd.newstate = 0; - parsemd(nmbuf, ENTCASE, &pcblitp, NAMELEN); - TRACEMD("1: entity nm"); - switch (pcbmd.action) { - case PEN: - parsemd(nmbuf + 1, ENTCASE, &pcblitp, NAMELEN); - if (pcbmd.action!=NAS) {mderr(120, (UNCH *)0, (UNCH *)0); return;} - if (nmbuf[1] == NAMELEN + 2) { - /* It was too long. */ - nmbuf[0] = NAMELEN + 2; - nmbuf[NAMELEN + 1] = '\0'; - mderr(65, (UNCH *)0, (UNCH *)0); - } - else - nmbuf[0] = nmbuf[1] + 1; /* Increment length for PERO. */ - nmbuf[1] = lex.d.pero; /* Prefix PERO to name. */ - parmsw = 1; /* Indicate parameter entity. */ - case NAS: - break; - case RNS: /* Reserved name started. */ - if (ustrcmp(nmbuf+1, key[KDEFAULT])) { - mderr(118, nmbuf+1, key[KDEFAULT]); - return; - } - memcpy(nmbuf, indefent, *indefent);/* Copy #DEFAULT to name buffer. */ - fpis = &fpidf; /* Use #DEFAULT fpi if external. */ - defltsw = 1; /* Indicate #DEFAULT is being defined.*/ - break; - default: - mderr(122, (UNCH *)0, (UNCH *)0); - return; - } - subdcl = nmbuf+1; /* Subject name for error messages. */ - /* PARAMETER 2: Entity text keyword (optional). - */ - parsemd(tbuf, NAMECASE, &pcblitp, LITLEN); - TRACEMD("2: keyword"); - switch (pcbmd.action) { - case NAS: - if ((estore = (UNCH)mapsrch(enttab, tbuf+1))==0) { - estore = parmsw ? ESP : ESF; - pne = (PNE)rmalloc(NESZ); - if (mdextid(tbuf, fpis, nmbuf+1+parmsw, &estore, pne)==0) - return; - if (defltsw) etx.x = NULL; - else if ((etx.x = entgen(&fpicb))==0) { - if (parmsw) - mderr(148, nmbuf+2, (UNCH *)0); - else - mderr(147, nmbuf+1, (UNCH *)0); - } - goto parm4; - } - if (parmsw && (estore==ESX || estore==ESC)) { - mderr(38, tbuf+1, (UNCH *)0); - estore = ESM; - } - parsemd(tbuf, NAMECASE, &pcblitp, LITLEN); - break; - default: - estore = ESM; - break; - } - /* PARAMETER 3: Parameter literal. - */ - TRACEMD("3: literal"); - switch (pcbmd.action) { - case LITE: - case LIT: - switch (estore) { - case ESM: /* LITERAL: parameter literal required. */ - case ESC: /* CDATA: parameter literal required. */ - case ESX: /* SDATA: parameter literal required. */ - case ESI: /* PI: parameter literal required. */ - etx.c = savestr(tbuf); - break; - case ESMD: /* MD: parameter literal required. */ - etx.c = sandwich(tbuf, lex.m.mdo, lex.m.mdc); - goto bcheck; - case ESMS: /* MS: parameter literal required. */ - etx.c = sandwich(tbuf, lex.m.mss, lex.m.mse); - goto bcheck; - case ESS: /* STARTTAG: parameter literal required. */ - etx.c = sandwich(tbuf, lex.m.stag, lex.m.tagc); - goto bcheck; - case ESE: /* ENDTAG: parameter literal required. */ - etx.c = sandwich(tbuf, lex.m.etag, lex.m.tagc); - bcheck: - if (etx.c == 0) { - mderr(225, (UNCH *)0, (UNCH *)0); - return; - } - break; - } - break; - default: - mderr(123, (UNCH *)0, (UNCH *)0); - return; - } - /* PARAMETER 4: End of declaration. - */ - parsemd(tbuf, NAMECASE, &pcblitp, LITLEN); - parm4: - TRACEMD(emd); - if (pcbmd.action!=EMD) mderr(126, (UNCH *)0, (UNCH *)0); - if (es!=mdessv) synerr(37, &pcbmd); - - /* EXECUTE: If the entity already exists, ignore the new definition. - If it is a new entity, store the definition. - */ - if ((ecb = entfind(nmbuf))!=0 && ecb->estore) { - if (ecb->dflt) { - mderr(228, nmbuf + 1, (UNCH *)0); - hout((THASH)etab, nmbuf, hash(nmbuf, ENTHASH)); - if (ecb->estore == ESN) { - frem((UNIV)NEID(ecb->etx.n)); - frem((UNIV)ecb->etx.n); - } - else if (ecb->estore >= ESFM) - frem((UNIV)ecb->etx.x); - frem((UNIV)ecb); - } - else { - /* Duplicate definition: not an error. */ - if (sw.swdupent) mderr(68, nmbuf+1, (UNCH *)0); - if (estore<ESFM) frem((UNIV)etx.c); - return; - } - } - ++ds.ecbcnt; /* Do capacity before NOTATION. */ - ds.ecbtext += estore<ESFM ? ustrlen(etx.c) : entlen; - ecb = entdef(nmbuf, estore, &etx); /* Define the entity. */ - if (estore==ESN) { /* If entity is external: */ - NEENAME(pne) = ecb->ename; /* Store entity name in ne. */ - NEID(pne) = etx.x; /* Store system fileid in ne. */ - NESYSID(pne) = fpis->fpisysis ? savestr(fpis->fpisysis) : 0; - NEPUBID(pne) = fpis->fpipubis ? savestr(fpis->fpipubis) : 0; - ecb->etx.n = pne; /* Store ne control block in etx. */ - TRACEESN(pne); - } - else if (pne) - frem((UNIV)pne); - if (defltsw) { - ecbdeflt = ecb; /* If #DEFAULT save ecb. */ - if (fpidf.fpipubis) - fpidf.fpipubis = savestr(fpidf.fpipubis); - if (fpidf.fpisysis) - fpidf.fpisysis = savestr(fpidf.fpisysis); - } -} -/* SANDWICH: Catenate a prefix and suffix to a string. - The result has an EOS but no length. - Return 0 if the result if longer than LITLEN. -*/ -UNCH *sandwich(s, pref, suff) -UNCH *s; /* String, with EOS. */ -UNCH *pref; /* Prefix, with length and EOS. */ -UNCH *suff; /* Suffix, with length and EOS. */ -{ - UNCH *pt; - UNS slen, tlen; - - slen = ustrlen(s); - tlen = slen + (*pref - 2) + (*suff - 2); - if (tlen > LITLEN) - return 0; - pt = (UNCH *)rmalloc(tlen + 1); - memcpy(pt, pref + 1, *pref - 2); - memcpy(pt + (*pref - 2), s, slen); - memcpy(pt + (*pref - 2) + slen, suff + 1, *suff - 1); - return pt; -} -/* MDEXTID: Process external identifier parameter of a markup declaration. - On entry, tbuf contains SYSTEM or PUBLIC if all is well. - NULL is returned if an error, otherwise fpis. If it is a - valid external data entity, the caller's estore is set to ESN - and its nxetype is set to the code for the external entity type. - The event that terminated the parse is preserved in pcb.action, - so the caller should process it before further parsing. -*/ -struct fpi *mdextid(tbuf, fpis, ename, estore, pne) -UNCH *tbuf; /* Work area for tokenization[2*(LITLEN+2)]. */ -struct fpi *fpis; /* FPI structure. */ -UNCH *ename; /* Entity or notation name, with EOS, no length.*/ - /* NOTE: No PERO on parameter entity name. */ -UNCH *estore; /* DTD, general or parameter entity, DCN. */ -PNE pne; /* Caller's external entity ptr. */ -{ - PDCB dcb; /* Ptr to DCN control block. */ - int exidtype; /* External ID type: 0=none 1=system 2=public. */ - int exetype; /* External entity type. */ - - MEMZERO((UNIV)fpis, (UNS)FPISZ); /* Initialize fpi structure. */ - /* Move entity name into fpi (any PERO was stripped by caller). */ - fpis->fpinm = ename; - entlen = 0; /* Initialize external ID length. */ - - /* PARAMETER 1: External identifier keyword or error. - */ - TRACEMD("1: extid keyword"); - if ((exidtype = mapsrch(exttab, tbuf+1))==0) { - mderr(29, (UNCH *)0, (UNCH *)0); - return (struct fpi *)0; - } - if (exidtype==EDSYSTEM) goto parm3; - - /* PARAMETER 2: Public ID literal. - */ - /* The length of a minimum literal cannot exceed the value of LITLEN - in the reference quantity set. */ - parsemd(pubibuf, NAMECASE, &pcblitv, REFLITLEN); - TRACEMD("2: pub ID literal"); - switch (pcbmd.action) { - case LITE: /* Use alternative literal delimiter. */ - case LIT: /* Save literal as public ID string. */ - entlen = ustrlen(pubibuf); - fpis->fpipubis = pubibuf; - break; - default: - mderr(117, (UNCH *)0, (UNCH *)0); - return (struct fpi *)0; /* Signal error to caller. */ - } - /* PARAMETER 3: System ID literal. - */ - parm3: - parsemd(sysibuf, NAMECASE, &pcblitc, LITLEN); - TRACEMD("3: sys ID literal"); - if (pcbmd.action==LIT || pcbmd.action==LITE) { - entlen += ustrlen(sysibuf); - fpis->fpisysis = sysibuf; - parsemd(tbuf, NAMECASE, &pcblitp, LITLEN); - } - else memcpy(tbuf, sysibuf, *sysibuf); - if (*estore!=ESF || pcbmd.action!=NAS) goto genfpi; - - /* PARAMETER 4: Entity type keyword. - */ - TRACEMD("4: Entity type"); - if ((exetype = mapsrch(extettab, tbuf+1))==0) { - mderr(24, tbuf+1, (UNCH *)0); - return (struct fpi *)0; - } - if (exetype==ESNSUB && SUBDOC == NO) { - mderr(90, tbuf+1, (UNCH *)0); - return (struct fpi *)0; - } - - NEXTYPE(pne) = (UNCH)exetype; /* Save entity type in caller's ne. */ - *estore = ESN; /* Signal that entity is a data entity. */ - - if (exetype==ESNSUB) { - pne->nedcn = 0; - parsemd(tbuf, NAMECASE, &pcblitp, LITLEN); - goto genfpi; - } - /* PARAMETER 5: Notation name. - */ - parsemd(lbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD("5: notation"); - if (pcbmd.action!=NAS) {mderr(119, tbuf+1, (UNCH *)0); return (struct fpi *)0;} - /* Locate the data content notation. */ - pne->nedcn = dcb = dcndef(lbuf); - /* Note that we have defined an entity with this notation. - If attributes are later defined for this notation, we'll - have to fix up this entity. */ - dcb->entsw = 1; - - /* PARAMETER 6: Data attribute specification. - */ - parsemd(lbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD("6: [att list]"); - if (pcbmd.action!=MDS) { /* No attributes specified. */ - if (dcb->adl == 0) - NEAL(pne) = 0; - else { - initatt(dcb->adl); - adlval((int)ADN(al), (struct etd *)0); - storedatt(pne); - } - goto genfpi; - } - if (dcb->adl==0) { /* Atts specified, but none defined. */ - mderr(22, (UNCH *)0, (UNCH *)0); - return (struct fpi *)0; - } - pcbstag.newstate = pcbstan; /* First separator is optional. */ - if ((parseatt(dcb->adl, tbuf))==0)/* Empty list. */ - mderr(91, (UNCH *)0, (UNCH *)0); - else { - adlval((int)ADN(al), (struct etd *)0); - storedatt(pne); - } - parse(&pcbeal); /* Parse the list ending. */ - parsemd(tbuf, NAMECASE, &pcblitp, LITLEN); - - /* GENFPI: Builds a formal public identifier structure, including the - entity name, offsets of the components of the public ID, and - other data a system might use to identify the actual file. - */ - genfpi: - TRACEMD("7: generate fpi"); - fpis->fpistore = *estore - ESFM + 1; /* External entity type: 1-6. */ - if (*estore == ESN) { - if (NEXTYPE(pne) == ESNSUB) - fpis->fpinedcn = 0; - else - fpis->fpinedcn = NEDCN(pne) + 1; - } - /* Analyze public ID and make structure entries. */ - if (exidtype==EDPUBLIC) { - if (parsefpi(fpis)>0) { - if (FORMAL==YES) - mderr(88, fpis->fpipubis, (UNCH *)0); - fpis->fpiversw = -1; /* Signal bad formal public ID. */ - } - } - return fpis; -} - -/* Store a data attribute. */ - -VOID storedatt(pne) -PNE pne; -{ - int i; - - NEAL(pne) = (struct ad *)rmalloc((1+ADN(al))*ADSZ); - memcpy((UNIV)NEAL(pne), (UNIV)al, (1+ADN(al))*ADSZ); - for (i = 1; i <= (int)ADN(al); i++) { - if (GET(ADFLAGS(al, i), ASPEC)) - ds.attdef += ADLEN(al, i); - if (NEAL(pne)[i].addef != 0) - NEAL(pne)[i].addef = savestr(NEAL(pne)[i].addef); - } - ds.attcnt += AN(al); /* Number of attributes defined. */ -#if 0 - /* I can't see any reason to increase AVGRPCNT here. */ - ds.attgcnt += ADN(al) - AN(al); /* Number of att grp members. */ -#endif -} - -/* PARSEFPI: Parses a formal public identifier and builds a control block. - PARSEFPI returns a positive error code (1-10), or 0 if no errors. - It set fpiversw if no version was specified in the ID and the - public text is in a class that permits display versions. - Note: An empty version ("//") can be specified (usually it is - the non-device-specific form, such as a definitional entity set). -*/ -int parsefpi(f) -PFPI f; /* Ptr to formal public identifier structure. */ -{ - UNCH *l; /* Pointer to EOS of public identifier. */ - UNCH *p, *q; /* Ptrs to current field in public identifier. */ - UNS len; /* Field length */ - - p = f->fpipubis; /* Point to start of identifier. */ - l = p + ustrlen(p); /* Point to EOS of identifier. */ - if ((*p=='+' || *p=='-') - && p[1] == '/' && p[2] == '/') { /* If owner registered, - unregistered. */ - f->fpiot = *p; /* Save owner type. */ - p += 3; - } - else f->fpiot = '!'; /* Indicate ISO owner identifier. */ - if ((q = pubfield(p, l, '/', &len))==0) /* Find end of owner ID field. */ - return 2; - f->fpiol = len; /* Save owner ID length. */ - f->fpio = p - f->fpipubis; /* Save offset in pubis to owner ID. */ - - if ((p = pubfield(q, l, ' ', &len))==0) /* Find end of text class field. */ - return 3; - *(--p) = EOS; /* Temporarily make class a string. */ - f->fpic = mapsrch(pubcltab, q); /* Check for valid uc class name.*/ - *p++ = ' '; /* Restore the SPACE delimiter. */ - if (f->fpic==0) return 4; /* Error if not valid uc class name.*/ - - /* The public text class in a notation identifier must be NOTATION. */ - if (f->fpistore == ESK - ESFM + 1 && f->fpic != FPINOT) return 10; - - if (*p=='-' && p[1] == '/' && p[2] == '/') { /* If text is unavailable - public text.*/ - f->fpitt = *p; /* Save text type. */ - p += 3; - } - else f->fpitt = '+'; /* Indicate available public text. */ - if ((q = pubfield(p, l, '/', &len))==0) /* Find end of text description. */ - return 6; - f->fpitl = len; /* Save text description length. */ - f->fpit = p - f->fpipubis; /* Save ptr to description.*/ - - p = pubfield(q, l, '/', &len); /* Bound language field. */ - if (f->fpic != FPICHARS) { - int i; - /* Language must be all upper-case letters. */ - /* The standard only says that it *should* be two letters, so - don't enforce that. */ - /* Language must be a name, which means it can't be empty. */ - if (len == 0) - return 7; - for (i = 0; i < len; i++) { - /* Don't assume ASCII. */ - if (!strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", q[i])) - return 7; - } - } - f->fpill = len; - f->fpil = q - f->fpipubis; - if (p!=0) { /* If there is a version field: */ - if (f->fpic<FPICMINV) /* Error if class prohibits versions. */ - return 8; - if ((pubfield(p, l, '/', &len))!=0) /* Bound version field. */ - return 9; /* Error if yet another field. */ - f->fpivl = len; /* Save version length. */ - f->fpiv = p - f->fpipubis; /* Save ptr (in pubis) to version. */ - } - else if (f->fpic>=FPICMINV) f->fpiversw = 1;/* No version: get the best. */ - return(0); -} -/* PUBFIELD: Returns ptr to next field, or NULL if ID has ended. -*/ -#ifdef USE_PROTOTYPES -UNCH *pubfield(UNCH *p, UNCH *l, UNCH d, UNS *lenp) -#else -UNCH *pubfield(p, l, d, lenp) -UNCH *p; /* Public identifier field (no length or EOS). */ -UNCH *l; /* Pointer to EOS of public identifier. */ -UNCH d; /* Field delimiter: ' ' or '/'. */ -UNS *lenp; /* Gets field length */ -#endif -{ - UNCH *psv = p+1; /* Save starting value of p. */ - - while (p<l) { - if (*p++==d) { /* Test for delimiter character. */ - *lenp = p - psv; /* Save field length (no len or EOS). */ - if (d=='/' && *p++!=d) /* Solidus requires a second one. */ - continue; - return(p); /* Return ptr to next field. */ - } - } - *lenp = p - --psv; /* Save field length (no len or EOS). */ - return NULL; -} -/* MDMS: Process marked section start. - If already in special parse, bump the level counters and return - without parsing the declaration. -*/ -struct parse *mdms(tbuf, pcb) -UNCH *tbuf; /* Work area for tokenization [NAMELEN+2]. */ -struct parse *pcb; /* Parse control block for this parse. */ -{ - int key; /* Index of keyword in mslist. */ - int ptype; /* Parameter token type. */ - int pcbcode = 0; /* Parse code: 0=same; 2-4 per defines. */ - - if (++mslevel>TAGLVL) { - --mslevel; - sgmlerr(27, (struct parse *)0, ntoa(TAGLVL), (UNCH *)0); - } - - /* If already in IGNORE mode, return without parsing parameters. */ - if (msplevel) {++msplevel; return(pcb);} - - parmno = 0; /* No parameters as yet. */ - mdessv = es; /* Save es for checking entity nesting. */ - pcbmd.newstate = pcbmdtk; /* First separator is optional. */ - - /* PARAMETERS: TEMP, RCDATA, CDATA, IGNORE, INCLUDE, or MDS. */ - while ((ptype = parsemd(tbuf, NAMECASE, &pcblitp, NAMELEN))==NAS){ - if ((key = mapsrch(mstab, tbuf+1))==0) { - sgmlerr(64, (struct parse *)0, ntoa(parmno), tbuf+1); - continue; - } - if (key==MSTEMP) continue; /* TEMP: for documentation. */ - msplevel = 1; /* Special parse required. */ - if (key>pcbcode) pcbcode = key; /* Update if higher priority. */ - } - if (ptype!=MDS) { - NEWCC; /* Syntax error did REPEATCC. */ - sgmlerr(97, (struct parse *)0, lex.m.dso, (UNCH *)0); - REPEATCC; /* 1st char of marked section. */ - } - if (es!=mdessv) synerr(37, pcb); - TRACEMS(1, pcbcode, mslevel, msplevel); - if (pcbcode==MSIGNORE) pcb = &pcbmsi; - else if (pcbcode) { - pcb = pcbcode==MSCDATA ? &pcbmsc : (rcessv = es, &pcbmsrc); - } - return(pcb); /* Tell caller whether to change the parse. */ -} -/* MDMSE: Process marked section end. - Issue an error if no marked section had started. -*/ -int mdmse() -{ - int retcode = 0; /* Return code: 0=same parse; 1=cancel special. */ - - if (mslevel) --mslevel; - else sgmlerr(26, (struct parse *)0, (UNCH *)0, (UNCH *)0); - - if (msplevel) if (--msplevel==0) retcode = 1; - TRACEMS(0, retcode, mslevel, msplevel); - return retcode; -} -/* MDNOT: Process NOTATION declaration. -*/ -VOID mdnot(tbuf) -UNCH *tbuf; /* Work area for tokenization[LITLEN+2]. */ -{ - struct fpi fpicb; /* Formal public identifier structure. */ - PDCB dcb; /* Ptr to notation entity in dcntab. */ - UNCH estore = ESK; /* Entity storage class. */ - - mdname = key[KNOTATION]; /* Identify declaration for messages. */ - subdcl = NULL; /* No subject as yet. */ - parmno = 0; /* No parameters as yet. */ - mdessv = es; /* Save es for checking entity nesting. */ - - /* PARAMETER 1: Notation name. - */ - pcbmd.newstate = 0; - parsemd(lbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD("1: name"); - if (pcbmd.action!=NAS) {mderr(120, (UNCH *)0, (UNCH *)0); return;} - subdcl = lbuf+1; /* Save notation name for error msgs. */ - - /* PARAMETER 2: External identifier keyword. - */ - parsemd(tbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD("2: extid"); - if (pcbmd.action!=NAS) {mderr(29, (UNCH *)0, (UNCH *)0); return;} - if (mdextid(tbuf, &fpicb, lbuf+1, &estore, (PNE)0)==0) return; - - /* PARAMETER 3: End of declaration. - Token was parsed by MDEXTID. - */ - TRACEMD(emd); - if (pcbmd.action!=EMD) mderr(126, (UNCH *)0, (UNCH *)0); - if (es!=mdessv) synerr(37, &pcbmd); - - /* EXECUTE: Store notation name. - */ - if ((dcb = dcnfind(lbuf)) != 0 && dcb->defined) { - mderr(56, lbuf+1, (UNCH *)0); - return; - } - /* else */ - dcb = dcndef(lbuf); - dcb->defined = 1; - dcb->sysid = fpicb.fpisysis ? savestr(fpicb.fpisysis) : 0; - dcb->pubid = fpicb.fpipubis ? savestr(fpicb.fpipubis) : 0; - ++ds.dcncnt; - ds.dcntext += entlen; - TRACEDCN(dcb); - return; -} -/* DCNDEF: Define a notation and return its DCNCB. - If caller does not care if it already exists, - he should specify NULL for the notation text - so we don't clobber the existing text (if any). -*/ -struct dcncb *dcndef(nname) -UNCH *nname; /* Notation name (with length and EOS). */ -{ - return((PDCB)hin((THASH)dcntab, nname, 0, DCBSZ)); -} -/* DCNFIND: If a notation was declared, return its DCNCB. - Return NULL if it is not defined. -*/ -struct dcncb *dcnfind(nname) -UNCH *nname; /* Notation name (with length and EOS). */ -{ - return((PDCB)hfind((THASH)dcntab, nname, 0)); -} -#define SRM(i) (srhptr->srhsrm[i]) /* Current entry in SHORTREF map. */ -/* MDSRMDEF: Process short reference mapping declaration. -*/ -VOID mdsrmdef(tbuf) -UNCH *tbuf; /* Work area for tokenization[LITLEN+2]. */ -{ - struct entity *entcb; /* Ptr to defined entity. */ - PSRH srhptr; /* Ptr to short reference map hdr (in srhtab).*/ - int srn; /* Short reference delimiter number in srdeltab.*/ - int mapused = 0; /* Has map already been used? */ - - mdname = key[KSHORTREF]; /* Identify declaration for messages. */ - subdcl = NULL; /* No subject as yet. */ - parmno = 0; /* No parameters as yet. */ - if (!sd.shortref) {mderr(198, (UNCH *)0, (UNCH *)0); return;} - mdessv = es; /* Save es for checking entity nesting. */ - /* PARAMETER 1: SHORTREF map name. - */ - pcbmd.newstate = 0; - parsemd(tbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD("1: map nm"); - if (pcbmd.action!=NAS) {mderr(120, (UNCH *)0, (UNCH *)0); return;} - if ((srhptr = srhfind(tbuf))!=0) { - mapused = 1; - /* Error if map was declared (not just used). */ - if (SRM(0)) {mderr(56, tbuf+1, (UNCH *)0); return;} - } - else srhptr = srhdef(tbuf); /* Create map with SRs mapped to NULL.*/ - SRM(0) = (PECB)srhptr; /* Indicate map was actually declared.*/ - subdcl = srhptr->ename+1; /* Save map name for error msgs. */ - - while (parsemd(tbuf, NAMECASE, &pcblitp, SRMAXLEN) == LIT - || pcbmd.action==LITE ) { - /* PARAMETER 2: Delimiter string. - */ - TRACEMD("2: SR string"); - if ((srn = mapsrch(lex.s.dtb, tbuf))==0) { - mderr(124, tbuf, (UNCH *)0); - goto cleanup; - } - /* PARAMETER 3: Entity name. - */ - parsemd(tbuf, ENTCASE, &pcblitp, NAMELEN); - TRACEMD("3: entity"); - if (pcbmd.action!=NAS) {mderr(120, (UNCH *)0, (UNCH *)0); goto cleanup;} - if ((entcb = entfind(tbuf))==0) { - union etext etx; - etx.x = 0; - entcb = entdef(tbuf, '\0', &etx); - } - if (SRM(srn)) { - mderr(56, (srn<lex.s.prtmin ? (UNCH *)lex.s.pdtb[srn] - : lex.s.dtb[srn].mapnm), (UNCH *)0); - continue; - } - SRM(srn) = entcb; - if (srn>=lex.s.fce && srn!=lex.s.hyp && srn!=lex.s.hyp2 - && srn!=lex.s.lbr && srn!=lex.s.rbr) - lexcnm[*lex.s.dtb[srn].mapnm] = lex.l.fce; - else if (srn==lex.s.spc) lexcnm[' '] = lex.l.spcr; - } - /* PARAMETER 4: End of declaration. - */ - TRACEMD(emd); - if (parmno==2) - {mderr((UNS)(pcbmd.action==EMD ? 28:123), (UNCH *)0, (UNCH *)0); goto cleanup;} - if (pcbmd.action!=EMD) mderr(126, (UNCH *)0, (UNCH *)0); - if (es!=mdessv) synerr(37, &pcbmd); - ++ds.srcnt; - TRACESRM("SHORTREF", srhptr->srhsrm, (UNCH *)0); - return; - - cleanup: - /* Don't free the map if the map was in use (because of a USEMAP - declaration) before this declaration. */ - if (mapused) - MEMZERO((UNIV)srhptr->srhsrm, sizeof(PECB)*(lex.s.dtb[0].mapdata+1)); - else { - frem((UNIV)srhptr->srhsrm); - hout((THASH)srhtab, srhptr->ename, 0); - frem((UNIV)srhptr); - } -} -/* MDSRMUSE: Activate a short reference map. -*/ -VOID mdsrmuse(tbuf) -UNCH *tbuf; /* Work area for tokenization[LITLEN+2]. */ -{ - PSRH srhptr; /* Ptr to short reference map hdr (in srhtab).*/ - TECB srmptr; /* Ptr to short reference map (in header). */ - int i; /* Loop counter; temporary variable. */ - - mdname = key[KUSEMAP]; /* Identify declaration for messages. */ - subdcl = NULL; /* No subject as yet. */ - parmno = 0; /* No parameters as yet. */ - mdessv = es; /* Save es for checking entity nesting. */ - /* PARAMETER 1: SHORTREF map name or "#EMPTY". - */ - pcbmd.newstate = 0; - parsemd(lbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD("1: map nm"); - subdcl = lbuf+1; /* Subject name for error messages. */ - switch (pcbmd.action) { - case RNS: /* Empty SHORTREF map requested. */ - if (ustrcmp(lbuf+1, key[KEMPTY])) { - mderr(118, lbuf+1, key[KEMPTY]); - return; - } - srmptr = SRMNULL; - break; - case NAS: /* Map name specified; save if undefined. */ - if ((srhptr = srhfind(lbuf))==0) { - if (!indtdsw) {mderr(125, (UNCH *)0, (UNCH *)0); return;} - srmptr = NULL; - } - else - srmptr = srhptr->srhsrm; - break; - default: - mderr(120, (UNCH *)0, (UNCH *)0); - return; - } - /* PARAMETER 2: Element name or a group of them. (In DTD only.) - */ - parsemd(tbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD("2: GI or grp"); - switch (pcbmd.action) { - case NAS: - if (!indtdsw) {mderr(142, (UNCH *)0, (UNCH *)0); return;} - nmgrp[0] = etddef(tbuf); - nmgrp[1] = (PETD)NULL; - break; - case GRPS: - if (!indtdsw) {mderr(142, (UNCH *)0, (UNCH *)0); return;} - parsegrp(nmgrp, &pcbgrnm, tbuf); - break; - case EMD: - if (indtdsw) {mderr(28, (UNCH *)0, (UNCH *)0); return;} - if (docelsw) {mderr(233, (UNCH *)0, (UNCH *)0); return;} - tags[ts].tsrm = srmptr; - TRACESRM("USEMAP", tags[ts].tsrm, tags[ts].tetd->etdgi+1); - goto realemd; - default: - mderr(indtdsw ? 121 : 126, (UNCH *)0, (UNCH *)0); - return; - } - /* PARAMETER 3: End of declaration. - */ - parsemd(tbuf, NAMECASE, &pcblitp, NAMELEN); - TRACEMD(emd); - if (pcbmd.action!=EMD) mderr(126, (UNCH *)0, (UNCH *)0); - /* If map has not yet been defined, do it and get map pointer. */ - if (!srmptr) srmptr = (srhdef(lbuf))->srhsrm; - - /* Store the map pointer for each element name specified. - */ - TRACEGRP(nmgrp); - for (i = -1; nmgrp[++i];) { - if (!nmgrp[i]->etdsrm) nmgrp[i]->etdsrm = srmptr; - else if (sw.swdupent) mderr(68, nmgrp[i]->etdgi+1, (UNCH *)0); - } - realemd: - if (es!=mdessv) synerr(37, &pcbmd); -} -/* SRHDEF: Define a SHORTREF map and return ptr to its header. - All entries in map are mapped to NULL. - Caller must determine whether it already exists. -*/ -PSRH srhdef(sname) -UNCH *sname; /* SHORTREF map name (with length and EOS). */ -{ - PSRH srh; /* Ptr to SHORTREF map hdr in srhtab. */ - - (srh = (PSRH)hin((THASH)srhtab, sname, 0, SRHSZ))->srhsrm = - (TECB)rmalloc((UNS)(lex.s.dtb[0].mapdata+1)*sizeof(PECB)); - return(srh); -} -/* SRHFIND: If a SHORTREF map was declared, return the ptr to its header. - Return NULL if it is not defined. -*/ -PSRH srhfind(sname) -UNCH *sname; /* SHORTREF map name (with length and EOS). */ -{ - return((PSRH)hfind((THASH)srhtab, sname, 0)); -} -#undef SRM - -/* -Local Variables: -c-indent-level: 5 -c-continued-statement-offset: 5 -c-brace-offset: -5 -c-argdecl-indent: 0 -c-label-offset: -5 -comment-column: 30 -End: -*/ |