|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 11752 (0x2de8) Types: TextFile Names: »tjoin2.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Tools/tables/tjoin/tjoin2.c«
/* tjoin2.c: */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Tools/tables/tjoin/RCS/tjoin2.c,v 5.0 90/09/20 16:32:32 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Tools/tables/tjoin/RCS/tjoin2.c,v 5.0 90/09/20 16:32:32 pp Exp Locker: pp $ * * $Log: tjoin2.c,v $ * Revision 5.0 90/09/20 16:32:32 pp * rcsforce : 5.0 public release * */ #include <stdio.h> #include "tjoin.h" extern char *av0; extern int Debug, PrintRoute, DirectFirst, ComplexOutput; extern MTA *MtaTree; extern CHAN *ValidChanList; extern char *FastInChanList(), *malloc(), *strcpy(); static MTST *MtaStore = NULL; static CHST *ChanStore = NULL; static char *MailRoute(); static void DoDomainOutput(), PrintOutList(), PrintThing(), FreePrintList(); static int HighestCost(), CountAts(); PRINT *DoChanOrder(), *InsertPrint(), *DeleteItem(); /* ------------------------ Begin Routines ------------------------------- */ WalkTree (tree, func) register MTA *tree; int (*func)(); { if (tree == NULL) return; if (tree -> mta_left != NULL) WalkTree (tree -> mta_left, func); (*func) (tree); if (tree -> mta_right != NULL) WalkTree (tree -> mta_right, func); } DebugTree (tree, indent) register MTA *tree; int indent; { int i; if (tree == NULL) return; if (tree -> mta_left != NULL) DebugTree (tree -> mta_left, indent - 3); for (i=0; i < indent; i++) printf (" "); printf ("%s\n", tree -> mta_name ? tree -> mta_name : "null"); fflush (stdout); if (tree -> mta_right != NULL) DebugTree (tree -> mta_right, indent + 3); } PrintNode (node) register MTA *node; { register PRINT *print, *list2, *p2, *p3; register int cost, i; if (node == NULL) return; if (Debug == 1) printf ("PrintNode - %s\n", node -> mta_name ? node -> mta_name : "null"); if (node -> mta_domain != NULL) { DoDomainOutput (node); return; } if ((print = DoChanOrder (node)) == NULL) return; if (DirectFirst != 0) { /* Sort List2 by cost (Hop Count) */ list2 = NULL; cost = HighestCost (print); for (i = 0; i <= cost; i++) for (p2 = print; p2 != NULL; p2 = p3) { p3 = p2 -> pr_next; if (p2 -> pr_cost == i) { print = DeleteItem (print, p2); list2 = InsertPrint (list2, p2); } } print = list2; } PrintOutList (print, node -> mta_name); FreePrintList (print); } MTA *InsertMta (tree, mta) register MTA *tree, *mta; { register int x; if (tree == NULL) return (mta); if (Debug == 1) printf ("InsertMTA - %s %s\n", tree -> mta_name ? tree -> mta_name : "null", mta -> mta_name ? mta -> mta_name : "null"); if ((x = strcmp (mta -> mta_name, tree -> mta_name)) == 0) { /* --- Found the same node - should not happen --- */ fprintf (stderr, "%s: InsertMta - Fatal Error\n", av0); exit (1); } if (x < 0) tree -> mta_left = InsertMta (tree -> mta_left, mta); else tree -> mta_right = InsertMta (tree -> mta_right, mta); return (tree); } MTA *NameToMta (name) char *name; { register MTA *mta; register int x; if (Debug == 1) printf ("NameToMTA - %s\n", name ? name : "null"); mta = MtaTree; while (mta != NULL) { if ((x = strcmp (name, mta -> mta_name)) == 0) break; if (x < 0) mta = mta -> mta_left; else mta = mta -> mta_right; } return (mta); } CHAN *GetChan() { register CHST *chst; register CHAN *chan; if (ChanStore == NULL) { /* Starting up */ if ((ChanStore = (CHST *) malloc (sizeof (CHST))) == NULL) { fprintf (stderr, "%s: GetChan - No Memory [1]\n", av0); exit (1); } if (Debug == 1) printf ("GetChan Start - Malloc %x\n", ChanStore); bzero ((char *)ChanStore, sizeof(*ChanStore)); } if (ChanStore -> chs_index >= CHANSTORESIZE) { /* Get another bunch */ if ((chst = (CHST *) malloc (sizeof (CHST))) == NULL) { fprintf (stderr, "%s: GetChan - No Memory [2]\n", av0); exit (1); } if (Debug == 1) printf ("GetChan GetBuff - Malloc %x\n", chst); bzero ((char *)chst, sizeof(*chst)); chst -> chs_next = ChanStore; ChanStore = chst; } chan = &ChanStore -> chs_buffer [ChanStore -> chs_index++]; chan -> ch_next = NULL; chan -> ch.name = NULL; return (chan); } SBUFF *InitStringStore() { register SBUFF *str; if ((str = (SBUFF *) malloc (sizeof (SBUFF))) == NULL) { fprintf (stderr, "%s: InitStringStore - No Memory\n", av0); exit (1); } if (Debug == 1) printf ("InitStringStore - Malloc %x\n", str); bzero ((char *)str, sizeof(*str)); return (str); } char *StoreStr (store, string) register SBUFF *store; char *string; { register int length; char *ptr; if (Debug == 1) printf ("StoreStr - %s\n", string ? string : "null"); if (string == NULL || *string == '\0') return ((char *)0); length = strlen (string) + 1; if (length > STRINGSTORESIZE) { /* This is FATAL */ fprintf (stderr, "%s: StoreStr - Can't store %s - Ignored\n", av0, string); exit (1); } while (length > STRINGSTORESIZE - store -> str_index) { if (store -> str_next != NULL) { store = store -> str_next; continue; } store -> str_next = (SBUFF *) malloc (sizeof (SBUFF)); if (store -> str_next == NULL) { fprintf (stderr, "%s: StoreStr - No Memory\n", av0); exit (1); } if (Debug == 1) printf ("Malloc %x - StoreStr\n", store -> str_next); store = store -> str_next; bzero ((char *)store, sizeof(*store)); break; } ptr = &store -> str_buffer [store -> str_index]; (void) strcpy (ptr, string); store -> str_index += length; return (ptr); } MTA *GetMta() { register MTST *mtst; register MTA *mta; if (MtaStore == NULL) { /* Starting up */ if ((MtaStore = (MTST *) malloc (sizeof (MTST))) == NULL) { fprintf (stderr, "%s: GetMta - No Memory [1]\n", av0); exit (1); } if (Debug == 1) printf ("GetMta Start - Malloc %x \n", MtaStore); bzero ((char *)MtaStore, sizeof(*MtaStore)); } if (MtaStore -> mts_index >= MTASTORESIZE) { /* Get another bunch */ if ((mtst = (MTST *) malloc (sizeof (MTST))) == NULL) { fprintf (stderr, "%s: GetMta - No Memory [2]\n", av0); exit (1); } if (Debug == 1) printf ("GetMta GetBuffer - Malloc %x \n", mtst); bzero ((char *)mtst, sizeof(*mtst)); mtst -> mts_next = MtaStore; MtaStore = mtst; } mta = &MtaStore -> mts_buffer [MtaStore -> mts_index++]; mta -> mta_left = NULL; mta -> mta_right = NULL; mta -> mta_chan = NULL; mta -> mta_arlist = NULL; mta -> mta_domain = NULL; mta -> mta_name = NULL; return (mta); } FreeStringStore (str) register SBUFF *str; { register SBUFF *startstr = str, *s2; if (Debug == 1) printf ("FreeStringStore - %x\n", str); for (; str != NULL; str = s2) { s2 = str -> str_next; if (str) free ((char *)str); } startstr = NULL; } /* ------------------------ Static Routines ------------------------------- */ static void DoDomainOutput (node) register MTA *node; { register CHAN *chan; register int flag = 0; if (Debug == 1) printf ("DoDomainOutput - %s\n", node -> mta_name ? node -> mta_name : "null"); printf ("%s:", node -> mta_name); if (ComplexOutput != 0) printf ("("); for (chan = ValidChanList; chan != NULL; chan = chan -> ch_next) if (FastInChanList (node->mta_domain, chan->ch.name) != NULL) { if (flag == 1) printf (","); if (ComplexOutput == 0) printf ("(%s)", chan -> ch.name); else printf ("%s", chan -> ch.name); flag = 1; } if (ComplexOutput != 0) printf (")"); printf ("\n"); } static int HighestCost (print) register PRINT *print; { register int cost; cost = 0; for (; print != NULL; print = print -> pr_next) if (print -> pr_cost > cost) cost = print -> pr_cost; return (cost); } static void PrintOutList (print, mtaname) register PRINT *print; register char *mtaname; { register char *last; if (Debug == 1) printf ("PrintOutList - %s\n", mtaname ? mtaname : "null"); printf ("%s:", mtaname); last = ""; for (; print != NULL; print = print -> pr_next) { if (PrintRoute == 0) { PrintThing (print -> pr_nexthop, last); if (ComplexOutput != 0) last = print -> pr_nexthop; } else { PrintThing (&print -> pr_relay [0], last); if (ComplexOutput != 0) last = &print -> pr_relay [0]; } printf ("%s", print -> pr_chan); if (print -> pr_next == NULL) if (ComplexOutput == 0) printf (")\n"); else printf (")\n"); else if (ComplexOutput == 0) printf ("),"); } } static void PrintThing (host, last) register char *host, *last; { if (Debug == 1) printf ("PrintThing - %s\n", host ? host : "null"); if (ComplexOutput == 0) printf ("%s(", host); else if (*last == '\00') printf ("%s(", host); else if (strcmp (last, host) != 0) printf ("),%s(", host); else printf (","); } static void FreePrintList (print) register PRINT *print; { register PRINT *startprint = print, *p2; for (; print != NULL; print = p2) { p2 = print -> pr_next; if (print) free ((char *)print); } startprint = NULL; } static PRINT *DoChanOrder (node) register MTA *node; { register CHAN *chan; char *ptr, buff [LOADS]; PRINT *print, *p2; int space; if (Debug == 1) printf ("DoChanOrder - %s\n", node -> mta_name ? node -> mta_name : "null"); print = NULL; for (chan = ValidChanList; chan != NULL; chan = chan -> ch_next) { space = sizeof(buff); if ((ptr = MailRoute (node, chan, &buff [0], &space)) != NULL) { if ((p2 = (PRINT *) malloc (sizeof (PRINT))) == NULL) { fprintf (stderr, "%s: DoChanOrder - No ", av0); fprintf (stderr, "memory\n"); exit (1); } bzero ((char *)p2, sizeof(*p2)); (void) strcpy (&p2 -> pr_relay [0], &buff [1]); p2 -> pr_nexthop = ptr; p2 -> pr_chan = chan -> ch.name; p2 -> pr_cost = CountAts (&buff [1]); print = InsertPrint (print, p2); } } return (print); } static int CountAts (str) register char *str; { register int count; if (str == NULL) return (0); count = 0; for (; *str != '\00'; str++) if (*str == '@') count++; return (count); } static PRINT *DeleteItem (list, item) register PRINT *list, *item; { register PRINT *p1; if (Debug == 1) printf ("DeleteItem\n"); if (list == NULL) { fprintf (stderr, "%s: DeleteItem - List is NULL\n", av0); return (NULL); } if (list == item) { p1 = list -> pr_next; list -> pr_next = NULL; return (p1); } for (p1 = list; p1 -> pr_next != NULL; p1 = p1 -> pr_next) if (item == p1 -> pr_next) { p1 -> pr_next = item -> pr_next; item -> pr_next = NULL; return (list); } fprintf (stderr, "%s: DeleteItem - Item not in List\n", av0); return (list); } static PRINT *InsertPrint (list, item) register PRINT *list, *item; { register PRINT *p1; if (Debug == 1) printf ("InsertPrint\n"); if (list == NULL) return (item); for (p1 = list; p1 -> pr_next != NULL; p1 = p1 -> pr_next) continue; p1 -> pr_next = item; return (list); } static char *MailRoute (mta, chan, str, space) register MTA *mta; register CHAN *chan; register char *str; int *space; { register CHAN *c1; register MTA *m1; register char *ptr; if (Debug == 1) printf ("MailRoute\n"); if ((*space -= (strlen(mta -> mta_name) + 1)) < 1) { fprintf(stderr, "Possible AR loop detected containing mta '%s' (buffer overrun)\n", mta->mta_name); return (NULL); } (void) sprintf (str, "@%s", mta -> mta_name); if (FastInChanList (mta -> mta_chan, chan -> ch.name) != NULL) return (mta -> mta_name); for (c1 = mta -> mta_arlist; c1 != NULL; c1 = c1 -> ch_next) { if ((m1 = c1 -> ch.mta) == NULL) continue; if ((ptr = MailRoute (m1, chan, &str [strlen (str)], space)) != NULL) return (ptr); } return (NULL); }