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: P T

⟦4014d8b72⟧ TextFile

    Length: 24802 (0x60e2)
    Types: TextFile
    Names: »P1_out.py«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Chans/x40084/P1_out.py« 

TextFile

-- P1: P1 MHS definitions


-- @(#) $Header: /cs/research/pp/hubris/pp-beta/Chans/x40084/RCS/P1_out.py,v 5.0 90/09/20 15:56:50 pp Exp Locker: pp $
--
-- $Log:	P1_out.py,v $
-- Revision 5.0  90/09/20  15:56:50  pp
-- rcsforce : 5.0 public release
-- 
--



P1 DEFINITIONS ::=

%{
#ifndef lint
static char Rcsid [] = "@(#)$Header";
#endif  lint

#include "head.h"
#include "q.h"
#include "or.h"
#include "dr.h"
#include "rtsparams.h" 
#include <isode/cmd_srch.h>


#define PPSTRUCT		"/usr/pp/pp/logs/x400out84.pdus"


extern void			reverse_trace();
extern char             	*body_string;
extern char             	*cont_p2;
extern int			trace_type;
extern int              	body_len;
extern Q_struct			*PPQuePtr;
extern DRmpdu			*DRptr;
extern ADDR			*ad_list;


static int			aninteger;
struct botheit {
        EncodedIT       *eit;
        LIST_BPT        *bp;
};



/* -- local routines -- */
int				testdebug();
static int			get_content_type();
static int			or_print_struct();
static int			pmf2int();
static int			same_trace();
static void			compress_trace();
static void			compress_trace_admd_style();
static void			compress_trace_localinternal_style();
static void			convert2printablestring();




/* ----------------------  Begin Routines ----------------------------------- */





#ifdef  DEBUG
int     testdebug (pe, s)
register PE     pe;
register char   *s;
{
    register PS ps;
    static int debug = OK;
    static FILE *fptrace;

    switch (debug) {
        case NOTOK:
            return;

        case OK:
            if ((pp_log_norm -> ll_events & LLOG_PDUS) == 0) {
                debug = NOTOK;
                break;
            }
            debug = 1;
            fflush (stdout);
            if (access (PPSTRUCT, 02) == NOTOK) {
                debug = NOTOK;
                break;
            }

            fptrace = fopen (PPSTRUCT, "a");
            if (fptrace == NULL) {
                debug = NOTOK;
                break;
            }
            fprintf (fptrace, "testdebug made with %s\n", pepyid);
            /* and fall... */

        default:
            fflush (stdout);
            fprintf (fptrace, "%s\n", s);

            if ((ps = ps_alloc (std_open)) == NULLPS)
                break;
            if (std_setup (ps, fptrace) != NOTOK)
                (void) pe2pl (ps, pe);
            fprintf (fptrace, "--------\n");
            (void) fflush (fptrace);
            ps_free (ps);
            break;
    }
}

#endif  /* DEBUG */

%}




BEGIN

ENCODER build


-- P1 makes use of types defined in the following module:
-- Sa: Recommendation S.a [14]
-- T73: T.73, Section 5

MPDU ::=
        CHOICE << PPQuePtr->msgtype == MT_UMPDU ? 1 : 2 >> {
            [0]
                IMPLICIT UserMPDU [[p PPQuePtr]],

                -- service mpdus are sent as ordinary messages

                ServiceMPDU [[p PPQuePtr]]
        }



ServiceMPDU [[P Q_struct *]] ::=
        CHOICE << parm->msgtype == MT_DMPDU ? 1 : 2 >> {
            [1]
                IMPLICIT DeliveryReportMPDU [[p parm]],

            [2]
                IMPLICIT ProbeMPDU [[p parm]]
        }



UserMPDU [[P Q_struct *]] ::=
        SEQUENCE {
            envelope
                UMPDUEnvelope [[p parm]],

            content
                UMPDUContent [[o body_string $ body_len]]
        }




UMPDUEnvelope [[P Q_struct *]]
        %{
                char            *cp;
                ADDR            *ap;
                struct botheit  b;
        %} ::=


        %{
		/* --- *** ---
		Unable to handle content return request - This should be 
		be dealt with post PP 5.0.
		--- *** --- */
		
		parm -> content_return_request = FALSE;
	%}



        SET {
            mpduID
                MPDUIdentifier [[p &parm->msgid]],

            originator %{
                cp = parm->Oaddress->ad_r400adr;
                if (cp == NULLCP)
                        cp = parm->Oaddress->ad_value;
                %}
                ORName [[p cp]],


            original %{
                b.eit = &parm->orig_encodedinfo;
                b.bp = ad_list -> ad_eit;
                %} EncodedInformationTypes [[p &b]],


            ContentType [[i get_content_type (ad_list, parm)]],

            UAContentId [[p parm->ua_id]] OPTIONAL
                        <<parm->ua_id != NULLCP >>,

            Priority [[i parm->priority]] DEFAULT normal,

            PerMessageFlag [[p parm]]
			DEFAULT {} <<parm-> disclose_recips ||
				parm -> implicit_conversion ||
				parm -> alternate_recip_allowed ||
				parm -> content_return_request >>,

            deferredDelivery [0]
                IMPLICIT Time
                        [[p parm->defertime]] OPTIONAL
                        <<parm->defertime != NULLUTC>>,

            [1]
                IMPLICIT SEQUENCE OF
                        PerDomainBilateralInfo OPTIONAL,

            [2]
                IMPLICIT SEQUENCE OF
                        <<ap=ad_list; ap!=NULLADDR; ap=ap->ad_next>>
                        RecipientInfo [[p ap]],

            TraceInformation [[p &parm->trace]]

        }



UMPDUContent ::=
        OCTETSTRING [[o body_string $ body_len]]



-- time

Time [[P UTC]]
        %{
                char *str;
        %} ::=
        %{ str= utct2str (parm); %}
        UniversalTime [[s str]]



-- various envelope information

MPDUIdentifier [[P MPDUid *]]
        %{
                char tbuf[LINESIZE];
        %} ::=
        [APPLICATION 4] IMPLICIT SEQUENCE {
            GlobalDomainIdentifier
                [[p &parm->mpduid_DomId]],

        dummy %{
	    bzero (tbuf, LINESIZE);		
            strncpy (tbuf, parm -> mpduid_string, 32);
        %}
            IA5String [[s tbuf]]
        }



ContentType ::=
        [APPLICATION 6]
            IMPLICIT INTEGER {
                p2 (2)
            }



UAContentId [[P char *]]
        %{
                char tbuf[LINESIZE];
        %} ::=
        %{
		bzero (tbuf, LINESIZE);		
                strncpy (tbuf, parm, 16);
        %}
        [APPLICATION 10]
            IMPLICIT PrintableString [[s tbuf]]


Priority ::=
        [APPLICATION 7]
            IMPLICIT INTEGER {
                normal (0),
                nonUrgent (1),
                urgent (2)
            }



PerMessageFlag [[P Q_struct *]] ::=
        [APPLICATION 8] 
            IMPLICIT BITSTRING [[x int2strb(pmf2int(parm),4) $ 4 ]] {
                discloseRecipients (0),
                conversionProhibited (1),
                alternateRecipientAllowed (2),
                contentReturnRequest (3)
            } 



-- per-domain bilateral information

PerDomainBilateralInfo ::=
        SEQUENCE {
            country
                CountryName,
                AdministrationDomainName,
                BilateralInfo
        }



BilateralInfo ::=
        ANY



-- recipient information

RecipientInfo [[P ADDR *]]
        %{
                char            *cp;
        %} ::=
        SET {
            recipient %{
                cp = parm->ad_r400adr;
                if (cp == NULLCP)
                        cp = parm->ad_value;
                %}
                ORName [[p cp]],

            [0]
                IMPLICIT ExtensionIdentifier [[i parm->ad_extension]],

            [1]
                %{
                        aninteger = mem2prf (parm->ad_resp, parm->ad_mtarreq,
                                        parm->ad_usrreq);
                %}
                IMPLICIT PerRecipientFlag [[x int2strb (aninteger, 5) $ 5 ]],

            [2]
                IMPLICIT ExplicitConversion
                        [[i parm->ad_explicitconversion]] DEFAULT {}
        }



ExtensionIdentifier ::=
        INTEGER


PerRecipientFlag ::=
        BITSTRING -- See Figure 23/X.411


ExplicitConversion ::=
        INTEGER {
            iA5TextTeletex (0),
            teletexTelex (1)
        }



-- trace information

TraceInformation [[P Trace **]]
        %{
                Trace   *tp;
        %} ::=


	%{
		compress_trace (parm);
	%}


        [APPLICATION 9]
            IMPLICIT SEQUENCE OF
                <<tp = *parm; tp; tp = tp->trace_next>>
                        SEQUENCE {
                                domainid
                                        GlobalDomainIdentifier
                                                [[p &tp->trace_DomId]],
                                domaininfo
                                        DomainSuppliedInfo
                                                [[p &tp->trace_DomSinfo]]
            }



DomainSuppliedInfo [[P DomSupInfo *]]
        %{
                struct botheit b;
        %} ::=
        SET {
            arrival [0]
                IMPLICIT Time [[p parm->dsi_time]],

            deferred [1]
                IMPLICIT Time [[p parm->dsi_deferred]] OPTIONAL
                        <<parm->dsi_deferred != NULLUTC>>,

            action [2]
                IMPLICIT INTEGER [[i parm->dsi_action]] {
                    relayed (0),
                    rerouted (1)
                },

            converted %{
                b.eit = &parm->dsi_converted;
                b.bp = NULL;
            %} EncodedInformationTypes
                    [[p &b]] OPTIONAL
                        <<parm->dsi_converted.eit_types != 0>>,

            previous
                GlobalDomainIdentifier
                    [[p &parm->dsi_attempted_md]] OPTIONAL
                        <<parm->dsi_attempted_md.global_Country != NULLCP>>
        }



-- global domain identifier

GlobalDomainIdentifier [[P GlobalDomId *]] ::=
        [APPLICATION 3]
            IMPLICIT SEQUENCE {
                CountryName [[p parm->global_Country]],
                AdministrationDomainName [[p parm->global_Admin]],
                PrivateDomainIdentifier [[p parm->global_Private]] OPTIONAL
                        <<parm->global_Private != NULLCP>>
            }


CountryName [[P char *]] ::=
        [APPLICATION 1]
            CHOICE << 2 >> {
                NumericString [[s parm ? parm : "" ]],
                PrintableString [[s parm ? parm : "" ]]
            }



AdministrationDomainName [[P char *]] ::=
        [APPLICATION 2]
            CHOICE << 2 >> {
                NumericString [[s parm ? parm : ""]],
                PrintableString [[s parm ? parm : ""]]
            }



PrivateDomainIdentifier [[P char *]] ::=
        CHOICE << 2 >> {
            NumericString [[s parm ? parm : ""]],
            PrintableString [[s parm ? parm : ""]]
        }




-- O/R name

ORName [[P char *]]
        %{
                OR_ptr  or;
                PE      peptr = NULLPE; 

                or = or_std2or (parm);
                if (or == NULLOR)
                        adios (NULLCP, "x400out84: Bad ORName %s", parm);

                or_print_struct (or, 0);

                if (build_OR_ORName (&peptr, 1, 0, NULLCP, or) == NOTOK)
                        if (peptr) {
                                pe_free (peptr);
                                peptr= NULLPE;
                        }
                or_free (or);
        {
        %} ::=
        ANY [[a peptr]]
        %{
        }
        %}



-- encoded information types

EncodedInformationTypes [[P struct botheit *]] ::=
        %{
                if (parm->bp)
                        aninteger = mem2enctypes (parm->bp);
                else
                        aninteger = mem2enctypes (parm->eit->eit_types);
        %}

        [APPLICATION 5] IMPLICIT SET {
            [0]
                IMPLICIT BITSTRING  [[x int2strb (aninteger, 10) $ 10]]
                {
                        undefined(0),
                        tLX(1),
                        iA5Text(2),
                        g3Fax(3),
                        tIF0(4),
                        tTX(5),
                        videotex(6),
                        voice(7),
                        sFD(8),
                        tIF1(9)
                },


            [1]
                IMPLICIT G3NonBasicParams
                        [[x int2strb (parm->eit->eit_g3parms, 30) $ 30]] OPTIONAL
                                <<list_bpt_find (parm->eit->eit_types,
                                                "P2.g3fax")>>,
            [2]
                IMPLICIT TeletexNonBasicParams OPTIONAL,

            [3]
                IMPLICIT PresentationCapabilities OPTIONAL

        -- other non-basic parameters are for further study

        }



G3NonBasicParams ::=
        BITSTRING {
            twoDimensional(8),
            fineResolution(9),
            unlimitedLength(20),
            b4Length(21),
            a3Width(22),
            b4Width(23),
            uncompressed(30)
        }



TeletexNonBasicParams ::=
        SET {
            graphicCharacterSets [0]
                IMPLICIT T61String OPTIONAL,

            controlCharacterSets [1]
                IMPLICIT T61String OPTIONAL,

            pageFormats [2]
                IMPLICIT OCTETSTRING OPTIONAL,

            miscTerminalCapabilities [3]
                IMPLICIT T61String OPTIONAL,

            privateUse [4]
                IMPLICIT OCTETSTRING OPTIONAL
        }



PresentationCapabilities ::=
        T73PresentationCapabilities



T73PresentationCapabilities ::=
        SET { --unimportant-- }




-- Delivery Report MPDU

DeliveryReportMPDU [[P Q_struct *]]::=
        SEQUENCE {
            envelope
                DeliveryReportEnvelope [[p parm]],

            content
                DeliveryReportContent [[p parm]]
        }




DeliveryReportEnvelope [[P Q_struct *]]
        ::=
-- Should be reversed from RFC822 to X.400 style
	%{
		(void) reverse_trace (&DRptr->dr_trace);
	%} 
        SET {
            report
                MPDUIdentifier [[p DRptr-> dr_mpduid]],

            originator
                ORName [[p parm->Oaddress->ad_r400adr]],

            TraceInformation [[p &DRptr->dr_trace]]
        }



DeliveryReportContent [[P Q_struct *]]
        %{
                Rrinfo   *rq;
        %} ::=
        SET {
            original
                MPDUIdentifier [[p &parm->msgid]],

            intermediate
                TraceInformation [[p &DRptr-> dr_subject_intermediate_trace]]
                OPTIONAL << DRptr -> dr_subject_intermediate_trace>>,

            UAContentId [[p parm->ua_id]] OPTIONAL
                        <<parm->ua_id != NULLCP>>,

            [0]
                IMPLICIT SEQUENCE OF
                        <<rq = DRptr->dr_recip_list; rq;
                          rq = rq->rr_next>>
                ReportedRecipientInfo [[p rq]],

            returned [1]
                IMPLICIT UMPDUContent OPTIONAL,

            billingInformation [2]
                ANY OPTIONAL
        }



ReportedRecipientInfo [[P Rrinfo *]]
        %{
                ADDR    *ap;
        %} ::= %{
                for (ap = PPQuePtr -> Raddress; ap; ap = ap -> ad_next)
                        if (ap -> ad_no == parm -> rr_recip)
                                break;
                if (ap == NULLADDR) {
                        PP_OPER (NULLCP, ("NO match for recip %d terminating",
                                          parm -> rr_recip));
                        exit (3);
                }
        %}
        SET
        {
            recipient [0]
                IMPLICIT ORName [[p ap->ad_r400adr]] %{
		$$ -> pe_class = PE_CLASS_CONT;
		$$ -> pe_id = 0;
		%},

            [1]
                IMPLICIT ExtensionIdentifier [[i ap->ad_extension]],

            [2]
                %{
                        aninteger = mem2prf (ap->ad_resp,
                                         ap->ad_mtarreq,
                                         ap->ad_usrreq);
                %}
                IMPLICIT PerRecipientFlag [[x int2strb (aninteger, 5) $ 5 ]],

            [3] IMPLICIT LastTraceInformation [[p parm]],

            intendedRecipient [4]
                IMPLICIT 
			ORName [[p parm->rr_originally_intended_recip->fn_addr]]
				%{
					$$ -> pe_class = PE_CLASS_CONT;
					$$ -> pe_id = 4;
				%} OPTIONAL
				<<parm->rr_originally_intended_recip &&
                           	parm->rr_originally_intended_recip->fn_addr>> ,

            [5]
                %{
			convert2printablestring (parm -> rr_supplementary);
		%} 
                IMPLICIT SupplementaryInformation
                        	[[o parm -> rr_supplementary $ 
                        	min (strlen(parm->rr_supplementary), 64)]] 
			OPTIONAL
			<<parm->rr_supplementary != NULLCP>>
        }



-- last trace information

LastTraceInformation [[P Rrinfo *]]
        %{
                struct botheit b;
        %} ::=
        SET {
            arrival [0]
                IMPLICIT Time [[p parm->rr_arrival]],

            converted %{
                b.eit = parm->rr_converted;
                b.bp = NULL;
            %} EncodedInformationTypes [[p &b]] OPTIONAL
                        <<parm->rr_converted != 0>>,

            [1]
                Report [[p &parm->rr_report]]
        }



Report [[P Report *]] ::=
        CHOICE <<parm->rep_type == DR_REP_SUCCESS ? 1 : 2 >> {
            [0]
                IMPLICIT DeliveredInfo [[p &parm->rep.rep_dinfo]],

            [1]
                IMPLICIT NonDeliveredInfo [[p &parm->rep.rep_ndinfo]]
        }



DeliveredInfo [[P Delinfo *]] ::=
        SET {
            delivery [0]
                IMPLICIT Time [[p parm->del_time]],

            typeOfUA [1]
                IMPLICIT INTEGER [[i parm->del_type]] {
                    public (0),
                    private (1)
                } DEFAULT public <<parm->del_type != 0>>
        }



NonDeliveredInfo [[P NonDelinfo *]] ::=
        SET {
            [0]
                %{
                        if (parm->nd_rcode > 2)
                                parm->nd_rcode = 0;
                %}
                IMPLICIT ReasonCode [[i parm->nd_rcode]],

            [1]
                %{
                        if (parm->nd_dcode > 11)
                                parm->nd_dcode = 11;
                %}
                IMPLICIT DiagnosticCode [[i parm->nd_dcode]] OPTIONAL
                        <<parm->nd_dcode >= 0>>
        }



ReasonCode ::=
        INTEGER {
            transferFailure (0),

            unableToTransfer (1),

            conversionNotPerformed (2)

        }



DiagnosticCode  ::=
        INTEGER {
            unrecognizedORName (0),

            ambiguousORName (1),

            mtaCongestion (2),

            loopDetected (3),

            uaUnavailable (4),

            maximumTimeExpired (5),

            encodedInformationTypesUnsupported (6),

            contentTooLong (7),

            conversionImpractical (8),

            conversionProhibited (9),

            implicitConversionNotResgistered (10),

            invalidParameters (11)
        }



-- supplementary information

SupplementaryInformation ::=
        PrintableString -- length limited and for further study




-- Probe MPDU

ProbeMPDU [[P Q_struct *]]::=
        ProbeEnvelope [[p parm]]



ProbeEnvelope [[P Q_struct *]]
        %{
                char    *cp;
                ADDR    *ap;
                struct botheit b;
        %} ::=

        SET {
            probe
                MPDUIdentifier [[p &parm->msgid]],


            originator %{
                cp = parm->Oaddress->ad_r400adr;
                if (cp == NULLCP)
                        cp = parm->Oaddress->ad_value;
                %}
                ORName [[p cp]],


            ContentType [[i get_content_type (ad_list, parm)]],

            UAContentId [[p parm->ua_id]] OPTIONAL
                        <<parm->ua_id != NULLCP>>,

            original %{
                b.eit = &parm->orig_encodedinfo;
                b.bp = NULL;
            %} EncodedInformationTypes
                         [[p &b]] OPTIONAL
                                <<parm->orig_encodedinfo.eit_types != 0>>,

            TraceInformation [[p &parm->trace]],

            PerMessageFlag [[p parm]]
		DEFAULT {} << parm -> implicit_conversion ||
			parm -> alternate_recip_allowed >>,

            contentLength [0]
                IMPLICIT INTEGER [[i parm->msgsize]] OPTIONAL
			<<parm->msgsize > 0>>,

            [1]
                IMPLICIT SEQUENCE OF PerDomainBilateralInfo
                OPTIONAL,

            [2]
                IMPLICIT SEQUENCE OF
                        <<ap=parm->Raddress; ap!=NULLADDR; ap=ap->ad_next>>
                        RecipientInfo [[p ap]]
}

END




%{


static int get_content_type (ad, qp)
ADDR            *ad;
Q_struct        *qp;
{
        char    *p;

        if (isstr(ad -> ad_content))
                p = ad -> ad_content;
        else    p = qp -> cont_type;

        if (lexequ (p, cont_p2) != 0)
                adios (NULLCP, "Bad content type %s", p);

        return 2;
}



static int pmf2int (parm)  /* --- PerMessageFlag Params -> integer --- */
Q_struct        *parm;
{

	aninteger = 0;

	switch (parm -> msgtype) {
	case MT_PMPDU: 
		/* --- *** --- 
		only the conversionProhibited and alternateRecipientAllowed
		flags affect the deliverability of the message as tested by 
		Probe. - See X.411 page 164.
		--- *** --- */
		
        	if (parm -> implicit_conversion) 
                	aninteger |= (1 << 1);
        	if (parm -> alternate_recip_allowed) 
                	aninteger |= (1 << 2);
		break;

	default:
        	if (parm -> disclose_recips) 
                	aninteger |= (1 << 0);
        	if (parm -> implicit_conversion) 
                	aninteger |= (1 << 1);
        	if (parm -> alternate_recip_allowed) 
                	aninteger |= (1 << 2);
        	if (parm -> content_return_request) 
                	aninteger |= (1 << 3);
		break;
	}

        return aninteger;
}



/* --- *** ---  
This routine is necessary because sometimes the supplementary
information field has return characeters which is not valid X.409
--- *** --- */

static void convert2printablestring (ptr)
char	*ptr;
{
	char	*cp;

	for (cp = ptr; isstr(cp); cp++)
		switch (*cp) {
		case '\n':
		case '\t':
			*cp = ' ';
			break;
		default:
			break;
		}
}




static void compress_trace (tpp)
Trace		**tpp;
{

	switch (trace_type) {
	case RTSP_TRACE_ADMD:
		compress_trace_admd_style (tpp);
		break;
	case RTSP_TRACE_LOCALINT:
		compress_trace_localinternal_style (tpp);
		break;
	}
	
	return;
}




static void compress_trace_admd_style (tpp)
Trace		**tpp;
{
	Trace	*tlast,
		*tlast_butone = (Trace *)0,
		*tp = *tpp; 


	/* --- *** --- 
	Keep the first and last. Get rid of intermediate. If the ADMD is 
	the same in the first and last trace, then keep only the first. 
	--- *** --- */

	for (tlast = tp; tlast && tlast -> trace_next;
                tlast = tlast -> trace_next) {
                        tlast_butone = tlast;
                        continue;
        }

        if (tlast != tp && same_trace (tlast, tp)) {
                /* -- keep only the first trace -- */
                trace_free (tp -> trace_next);
                tp -> trace_next = (Trace *)0;
        }
        else if (tlast != tp) {
                /* -- keep first and last, remove intermediates -- */
                tlast_butone -> trace_next = (Trace *)0;
                trace_free (tp -> trace_next);
                tp -> trace_next = tlast;
        }

	*tpp = tp;
	return;
}




static void compress_trace_localinternal_style (tpp)
Trace		**tpp;
{
	Trace	*tnew,	
		*tprev = (Trace *)0,
		*tptr,
		*tp = *tpp;

	/* -- *** -- 
	Throw away ALL trace that is not of the local PRMD 
	-- *** -- */

	tnew = trace_new();

	for (tptr = tp; tptr; tptr = tptr -> trace_next) {
		if (!same_trace (tnew, tptr))
			break;
		tprev = tptr;
	}
	
	if (tprev)
		tprev -> trace_next = (Trace *)0;

	trace_free (tptr);
	trace_free (tnew);

	*tpp = tp;

	return;
}




static int same_trace (tp1, tp2)
Trace	*tp1;
Trace	*tp2;
{
	GlobalDomId	*d1 = &tp1 -> trace_DomId;
	GlobalDomId	*d2 = &tp2 -> trace_DomId;


	if (d1 -> global_Country && d2 -> global_Country &&
	    lexequ (d1 -> global_Country, d2 -> global_Country) == 0 &&
	    d1 -> global_Admin && d2 -> global_Admin &&
	    lexequ (d1 -> global_Admin, d2 -> global_Admin) == 0) {

			if (d1 -> global_Private == NULL &&
		    		d2 -> global_Private == NULL)
					return TRUE;

			if (d1 -> global_Private && d2 -> global_Private &&
		    		lexequ (d1 -> global_Private,
					d2 -> global_Private) == 0)
					return TRUE;
	}

	return FALSE;
}




static int or_print_struct (or, indent)
OR_ptr  or;
int	indent;
{
	char	buf[BUFSIZ];
	int	i;

#ifdef  DEBUG
	if (or == NULLOR) return;

	for (i = 0; i < indent; i++)
		buf[i] = ' ';
	buf[i] = '\0';

	PP_TRACE (("%s%s = %s", buf, or_type2name(or->or_type), or->or_value));

	or_print_struct (or -> or_next, indent + 3);
#endif  DEBUG
}


%}