GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/grep/queue.c Lines: 35 36 97.2 %
Date: 2017-11-13 Branches: 11 12 91.7 %

Line Branch Exec Source
1
/*	$OpenBSD: queue.c,v 1.7 2015/01/16 06:40:08 deraadt Exp $	*/
2
3
/*-
4
 * Copyright (c) 1999 James Howard and Dag-Erling Coïdan Smørgrav
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 *
16
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
 * SUCH DAMAGE.
27
 */
28
29
/*
30
 * A really poor man's queue.  It does only what it has to and gets out of
31
 * Dodge.
32
 */
33
34
#include <stdlib.h>
35
#include <string.h>
36
37
#include "grep.h"
38
39
typedef struct queue {
40
	struct queue   *next;
41
	str_t		data;
42
} queue_t;
43
44
static queue_t	*q_head, *q_tail;
45
static int	 count;
46
47
static queue_t	*dequeue(void);
48
49
void
50
initqueue(void)
51
{
52
10
	q_head = q_tail = NULL;
53
5
}
54
55
static void
56
free_item(queue_t *item)
57
{
58
30
	free(item);
59
15
}
60
61
void
62
enqueue(str_t *x)
63
{
64
	queue_t	*item;
65
66
30
	item = grep_malloc(sizeof *item + x->len);
67
15
	item->data.len = x->len;
68
15
	item->data.line_no = x->line_no;
69
15
	item->data.off = x->off;
70
15
	item->data.dat = (char *)item + sizeof *item;
71
15
	memcpy(item->data.dat, x->dat, x->len);
72
15
	item->data.file = x->file;
73
15
	item->next = NULL;
74
75
15
	if (!q_head) {
76
5
		q_head = q_tail = item;
77
5
	} else {
78
10
		q_tail->next = item;
79
10
		q_tail = item;
80
	}
81
82
15
	if (++count > Bflag)
83
10
		free_item(dequeue());
84
15
}
85
86
static queue_t *
87
dequeue(void)
88
{
89
	queue_t	*item;
90
91
50
	if (q_head == NULL)
92
10
		return NULL;
93
94
15
	--count;
95
15
	item = q_head;
96
15
	q_head = item->next;
97
15
	if (q_head == NULL)
98
5
		q_tail = NULL;
99
15
	return item;
100
25
}
101
102
void
103
printqueue(void)
104
{
105
	queue_t *item;
106
107
25
	while ((item = dequeue()) != NULL) {
108
5
		printline(&item->data, '-', NULL);
109
5
		free_item(item);
110
	}
111
5
}
112
113
void
114
clearqueue(void)
115
{
116
	queue_t	*item;
117
118
15
	while ((item = dequeue()) != NULL)
119
		free_item(item);
120
5
}