GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/grep/queue.c Lines: 35 36 97.2 %
Date: 2017-11-07 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
18
	q_head = q_tail = NULL;
53
9
}
54
55
static void
56
free_item(queue_t *item)
57
{
58
54
	free(item);
59
27
}
60
61
void
62
enqueue(str_t *x)
63
{
64
	queue_t	*item;
65
66
54
	item = grep_malloc(sizeof *item + x->len);
67
27
	item->data.len = x->len;
68
27
	item->data.line_no = x->line_no;
69
27
	item->data.off = x->off;
70
27
	item->data.dat = (char *)item + sizeof *item;
71
27
	memcpy(item->data.dat, x->dat, x->len);
72
27
	item->data.file = x->file;
73
27
	item->next = NULL;
74
75
27
	if (!q_head) {
76
9
		q_head = q_tail = item;
77
9
	} else {
78
18
		q_tail->next = item;
79
18
		q_tail = item;
80
	}
81
82
27
	if (++count > Bflag)
83
18
		free_item(dequeue());
84
27
}
85
86
static queue_t *
87
dequeue(void)
88
{
89
	queue_t	*item;
90
91
90
	if (q_head == NULL)
92
18
		return NULL;
93
94
27
	--count;
95
27
	item = q_head;
96
27
	q_head = item->next;
97
27
	if (q_head == NULL)
98
9
		q_tail = NULL;
99
27
	return item;
100
45
}
101
102
void
103
printqueue(void)
104
{
105
	queue_t *item;
106
107
45
	while ((item = dequeue()) != NULL) {
108
9
		printline(&item->data, '-', NULL);
109
9
		free_item(item);
110
	}
111
9
}
112
113
void
114
clearqueue(void)
115
{
116
	queue_t	*item;
117
118
27
	while ((item = dequeue()) != NULL)
119
		free_item(item);
120
9
}