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

⟦14612fe4f⟧ TextFile

    Length: 1993 (0x7c9)
    Types: TextFile
    Names: »pe_fragment.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Lib/util/pe_fragment.c« 

TextFile

/* pe_fragment.c: break up big pe_strings into smaller ones */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/util/RCS/pe_fragment.c,v 5.0 90/09/20 16:17:39 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Lib/util/RCS/pe_fragment.c,v 5.0 90/09/20 16:17:39 pp Exp Locker: pp $
 *
 * $Log:	pe_fragment.c,v $
 * Revision 5.0  90/09/20  16:17:39  pp
 * rcsforce : 5.0 public release
 * 
 */



#include <isode/psap.h>

static int pe_frag_aux ();

int pe_fragment (pe, maxsize)
PE	pe;
int	maxsize;
{
	PE	p;

	switch (pe -> pe_form) {
	    case PE_FORM_ICONS:
		return OK;

	    case PE_FORM_CONS:
		switch (pe -> pe_id) {	/* dont refragment yet... */
		    case PE_PRIM_OCTS:
		    case PE_PRIM_BITS:
		    case PE_DEFN_IA5S:
			return OK;
		}

		for (p = pe -> pe_cons; p; p = p -> pe_next)
			if (pe_fragment (p, maxsize) == NOTOK)
				return NOTOK;

		return OK;

	    case PE_FORM_PRIM:
		return pe_frag_aux (pe, maxsize);

	}
	return OK;
}

static int pe_frag_aux (pe, maxsize)
PE	pe;
int	maxsize;
{
	char	*cp;
	PE	last, p;
	int	size, n;

	if (pe -> pe_len == PE_LEN_INDF)
		return OK;
	if (pe -> pe_len < maxsize)
		return OK;

	switch (pe -> pe_id) {
	    case PE_PRIM_OCTS:
	    case PE_DEFN_IA5S:
		cp = (char *) pe -> pe_prim;
		pe -> pe_form = PE_FORM_CONS;
		last = NULLPE;
		size = pe->pe_len;
		pe -> pe_len = 0;
		pe -> pe_prim = NULLPED;
		while (size > 0) {
			n = size > maxsize ? maxsize : size;
			p = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM,
				      PE_PRIM_OCTS);
			if (pe == NULLPE)
				return NOTOK;
			if ((p -> pe_prim = PEDalloc (n)) == NULLPED) {
				pe_free(p);
				return NOTOK;
			}
			p -> pe_len = n;
			PEDcpy (cp, p -> pe_prim, n);
			if (last == NULLPE) {
				if (seq_add (pe, p, -1) == NOTOK)
					return NOTOK;
			}
			else {
				if (seq_addon (pe, last, p) == NOTOK)
					return NOTOK;
			}
			cp += n;
			size -= n;
			last = p;
		}
		break;

	    default:
		break;
	}
	return OK;
}