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