DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T p

⟦bcd07ee16⟧ TextFile

    Length: 4732 (0x127c)
    Types: TextFile
    Names: »pe2pl.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/psap/pe2pl.c« 

TextFile

/* pe2pl.c - presentation element to presentation list */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/psap/RCS/pe2pl.c,v 7.0 89/11/23 22:12:53 mrose Rel $";
#endif

/* 
 * $Header: /f/osi/psap/RCS/pe2pl.c,v 7.0 89/11/23 22:12:53 mrose Rel $
 *
 *
 * $Log:	pe2pl.c,v $
 * Revision 7.0  89/11/23  22:12:53  mrose
 * Release 6.0
 * 
 */

/*
 *				  NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */


/* Presentation lists are a human-readable, unambiguous way of describing
   a presentation element.

    SYNTAX:		list	::	"(" class code arguments ")"

			class	::	"UNIV" / "APPL" / "CONT" / "PRIV"

			code	::	name / number

			name	::	letter (letter / digit / dash)*

			number	::	"0x" [0-f] [0-f]* /
					"0" [0-7] [0-7]* /
					[1-9] [0-9]* /
					"\"" (IA5 subset)* "\""

			arguments::	primitive / constructor

			primitive::	number number*

			constructor::	list*

   NOTE WELL:	A single "number" must be representable in no more than
		(sizeof (int)) bytes.
 */


/* LINTLIBRARY */

#include <ctype.h>
#include <stdio.h>
#include "psap.h"


#define	bf_write()	\
    if (ps_write (ps, (PElementData) buffer, (PElementLen) strlen (buffer)) == NOTOK) \
	return NOTOK

/* \f

 */

int	pe2pl (ps, pe)
register PS	ps;
register PE	pe;
{
    int     result;

    if ((result = pe2pl_aux (ps, pe, 0)) != NOTOK)
	result = ps_flush (ps);

    return result;
}

/* \f

 */

static int  pe2pl_aux (ps, pe, level)
register PS	ps;
register PE	pe;
int	level;
{
    register int    i,
		    ia5,
		    ia5ok;
    register char  *bp;
    char    buffer[BUFSIZ];
    register PE	    p;
    register PElementID id;
    register PElementData dp,
			  ep,
			  fp,
			  gp;

    (void) sprintf (buffer, "%*s( %s ",
	    level * 4, "", pe_classlist[pe -> pe_class]);
    bf_write ();

    switch (pe -> pe_class) {
	case PE_CLASS_UNIV: 
	    if ((id = pe -> pe_id) < pe_maxuniv && (bp = pe_univlist[id])) {
		if (ps_write (ps, (PElementData) bp, (PElementLen) strlen (bp))
			== NOTOK)
		    return NOTOK;
	    }
	    else
		goto no_code;
	    break;

	case PE_CLASS_APPL: 
	    if ((id = pe -> pe_id) < pe_maxappl && (bp = pe_applist[id])) {
		if (ps_write (ps, (PElementData) bp, (PElementLen) strlen (bp))
			== NOTOK)
		    return NOTOK;
	    }
	    else
		goto no_code;

	case PE_CLASS_PRIV: 
	    if ((id = pe -> pe_id) < pe_maxpriv && (bp = pe_privlist[id])) {
		if (ps_write (ps, (PElementData) bp, (PElementLen) strlen (bp))
			== NOTOK)
		    return NOTOK;
	    }			/* else fall */

	case PE_CLASS_CONT: 
    no_code: ;
	    (void) sprintf (buffer, "0x%x", pe -> pe_id);
	    bf_write ();
	    break;
    }

    level++;
    switch (pe -> pe_form) {
	case PE_FORM_PRIM: 
	case PE_FORM_ICONS: 
	    (void) sprintf (buffer, " 0x%x%c",
			pe -> pe_len, pe -> pe_len ? '\n' : ' ');
	    bf_write ();

	    if (pe -> pe_len) {
		ia5ok = 0;
		if (pe -> pe_form == PE_FORM_PRIM
		        && pe -> pe_class == PE_CLASS_UNIV)
		    switch (pe -> pe_id) {
			case PE_PRIM_OCTS:
			case PE_DEFN_IA5S:
			case PE_DEFN_NUMS: 
			case PE_DEFN_PRTS: 
			case PE_DEFN_T61S:
			case PE_DEFN_VTXS:
			case PE_DEFN_VISS:
			case PE_DEFN_GENT:
			case PE_DEFN_UTCT:
			case PE_DEFN_GFXS:
			case PE_PRIM_ODE:
			case PE_DEFN_GENS:
			    ia5ok = 1;
			    break;

			default:
			    break;
		    }

		for (ep = (dp = pe -> pe_prim) + pe -> pe_len; dp < ep;) {
		    i = min (ep - dp, sizeof (int));
		    if (ia5 = ia5ok) {
			for (gp = (fp = dp) + i; fp < gp; fp++) {
			    switch (*fp) {
				case ' ':
				    continue;
				case '"':
				    break;
				default:
				    if (iscntrl (*fp)
					    || isspace (*fp)
					    || (*fp & 0x80))
					break;
				    continue;
			    }
			    ia5 = 0;
			    break;
			}
		    }
		    (void) sprintf (buffer, ia5 ? "%*s\"" : "%*s0x",
				level * 4, "");
		    bp = buffer + strlen (buffer);
		    while (i-- > 0) {
			(void) sprintf (bp, ia5 ? (i ? "%c" : "%c\"\n")
				    : (i ? "%02x" : "%02x\n"), *dp++);
			bp += strlen (bp);
		    }
		    bf_write ();
		}
	    }
 	    else
		level = 1;
	    break;

	case PE_FORM_CONS: 
	    if (p = pe -> pe_cons) {
		if (ps_write (ps, (PElementData) "\n", (PElementLen) 1)
		    == NOTOK)
		    return NOTOK;
		for (p = pe -> pe_cons; p; p = p -> pe_next)
		    if (pe2pl_aux (ps, p, level) == NOTOK)
			return NOTOK;
	    }
	    else {
		if (ps_write (ps, (PElementData) " ", (PElementLen) 1)
		    == NOTOK)
		    return NOTOK;
		level = 1;
	    }
	    break;
    }
    level--;

    (void) sprintf (buffer, "%*s)\n", level * 4, "");
    bf_write ();

    return OK;
}