GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/yacc/warshall.c Lines: 35 35 100.0 %
Date: 2016-12-06 Branches: 14 14 100.0 %

Line Branch Exec Source
1
/* $OpenBSD: warshall.c,v 1.11 2014/03/13 01:18:22 tedu Exp $	 */
2
/* $NetBSD: warshall.c,v 1.4 1996/03/19 03:21:51 jtc Exp $	 */
3
4
/*
5
 * Copyright (c) 1989 The Regents of the University of California.
6
 * All rights reserved.
7
 *
8
 * This code is derived from software contributed to Berkeley by
9
 * Robert Paul Corbett.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
14
 * 1. Redistributions of source code must retain the above copyright
15
 *    notice, this list of conditions and the following disclaimer.
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in the
18
 *    documentation and/or other materials provided with the distribution.
19
 * 3. Neither the name of the University nor the names of its contributors
20
 *    may be used to endorse or promote products derived from this software
21
 *    without specific prior written permission.
22
 *
23
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33
 * SUCH DAMAGE.
34
 */
35
36
#include "defs.h"
37
38
void transitive_closure(unsigned int *, int);
39
40
void
41
transitive_closure(unsigned int *R, int n)
42
21
{
43
	int rowsize;
44
	unsigned int i;
45
	unsigned int *rowj, *rp, *rend, *ccol, *relend, *cword, *rowi;
46
47
21
	rowsize = WORDSIZE(n);
48
21
	relend = R + n * rowsize;
49
50
21
	cword = R;
51
21
	i = 0;
52
21
	rowi = R;
53
929
	while (rowi < relend) {
54
887
		ccol = cword;
55
887
		rowj = R;
56
57
52691
		while (rowj < relend) {
58
50917
			if (*ccol & (1 << i)) {
59
671
				rp = rowi;
60
671
				rend = rowj + rowsize;
61
2839
				while (rowj < rend)
62
1497
					*rowj++ |= *rp++;
63
			} else {
64
50246
				rowj += rowsize;
65
			}
66
67
50917
			ccol += rowsize;
68
		}
69
70
887
		if (++i >= BITS_PER_WORD) {
71
15
			i = 0;
72
15
			cword++;
73
		}
74
887
		rowi += rowsize;
75
	}
76
21
}
77
78
void
79
reflexive_transitive_closure(unsigned int *R, int n)
80
21
{
81
	int rowsize;
82
	unsigned int i;
83
	unsigned int *rp, *relend;
84
85
21
	transitive_closure(R, n);
86
87
21
	rowsize = WORDSIZE(n);
88
21
	relend = R + n * rowsize;
89
90
21
	i = 0;
91
21
	rp = R;
92
929
	while (rp < relend) {
93
887
		*rp |= (1 << i);
94
887
		if (++i >= BITS_PER_WORD) {
95
15
			i = 0;
96
15
			rp++;
97
		}
98
887
		rp += rowsize;
99
	}
100
21
}