Pull up CVS idents from FreeBSD to match our current version.
[dragonfly.git] / usr.bin / yacc / warshall.c
blobdf365cf28cdfc141b8dc986068d0b1f577ee94ac
1 /*
2 * Copyright (c) 1989 The Regents of the University of California.
3 * All rights reserved.
5 * This code is derived from software contributed to Berkeley by
6 * Robert Paul Corbett.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
36 * $FreeBSD: src/usr.bin/yacc/warshall.c,v 1.6 1999/08/28 01:08:04 peter Exp $
37 * $DragonFly: src/usr.bin/yacc/warshall.c,v 1.4 2004/04/07 20:43:24 cpressey Exp $
39 * @(#)warshall.c 5.4 (Berkeley) 5/24/93
42 #include "defs.h"
44 static void transitive_closure(unsigned *, int);
46 static void
47 transitive_closure(unsigned *R, int n)
49 int rowsize;
50 unsigned i;
51 unsigned *rowj;
52 unsigned *rp;
53 unsigned *rend;
54 unsigned *ccol;
55 unsigned *relend;
56 unsigned *cword;
57 unsigned *rowi;
59 rowsize = WORDSIZE(n);
60 relend = R + n*rowsize;
62 cword = R;
63 i = 0;
64 rowi = R;
65 while (rowi < relend)
67 ccol = cword;
68 rowj = R;
70 while (rowj < relend)
72 if (*ccol & (1 << i))
74 rp = rowi;
75 rend = rowj + rowsize;
76 while (rowj < rend)
77 *rowj++ |= *rp++;
79 else
81 rowj += rowsize;
84 ccol += rowsize;
87 if (++i >= BITS_PER_WORD)
89 i = 0;
90 cword++;
93 rowi += rowsize;
97 void
98 reflexive_transitive_closure(unsigned *R, int n)
100 int rowsize;
101 unsigned i;
102 unsigned *rp;
103 unsigned *relend;
105 transitive_closure(R, n);
107 rowsize = WORDSIZE(n);
108 relend = R + n*rowsize;
110 i = 0;
111 rp = R;
112 while (rp < relend)
114 *rp |= (1 << i);
115 if (++i >= BITS_PER_WORD)
117 i = 0;
118 rp++;
121 rp += rowsize;