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