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