Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/dsslib/ip_t/ptintersect.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 2000-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* Phong Vo <[email protected]> *
19
* *
20
***********************************************************************/
21
#pragma prototyped
22
23
#include "ptlib.h"
24
25
/*
26
* return the table intersection of a and b
27
*/
28
29
Pt_t*
30
ptintersect(Pt_t* a, Pt_t* b)
31
{
32
Pt_t* t;
33
Ptprefix_t* ap;
34
Ptprefix_t* bp;
35
36
if (!(t = ptopen(a->disc)))
37
return 0;
38
ap = (Ptprefix_t*)dtfirst(a->dict);
39
bp = (Ptprefix_t*)dtfirst(b->dict);
40
while (ap && bp)
41
{
42
if (ap->max < bp->min)
43
ap = (Ptprefix_t*)dtnext(a->dict, ap);
44
else if (ap->min > bp->max)
45
bp = (Ptprefix_t*)dtnext(b->dict, bp);
46
else
47
{
48
if (!ptinsert(t, (ap->min > bp->min) ? ap->min : bp->min, (ap->max < bp->max) ? ap->max : bp->max))
49
break;
50
if (ap->max < bp->max)
51
ap = (Ptprefix_t*)dtnext(a->dict, ap);
52
else if (ap->max > bp->max)
53
bp = (Ptprefix_t*)dtnext(b->dict, bp);
54
else
55
{
56
ap = (Ptprefix_t*)dtnext(a->dict, ap);
57
bp = (Ptprefix_t*)dtnext(b->dict, bp);
58
}
59
}
60
}
61
return t;
62
}
63
64