Moved input stuff to arch subdirs, as in d1x.
[btb/d2x.git] / arch / dos / comm / dzqueue.c
1 /*
2  * This file is part of DZComm.
3  * Version : 0.6
4  * General purpose FIFO queue functions set.
5  * Copyright (c) 1997 Dim Zegebart, Moscow Russia.
6  * zager@post.comstar.ru
7  * http://www.geocities.com/siliconvalley/pines/7817
8  * file : queue.c
9  */
10
11 #include <stdlib.h> /* NULL */
12 #include "dzcomm.h"
13 #include "internal.h"
14
15 typedef unsigned int uint;
16 typedef unsigned short int usint;
17 typedef unsigned char byte;
18
19 #define QH(q) q->queue+q->head
20 #define QT(q) q->queue+q->tail
21
22 //------------------------- FIFO QUEUE -----------------------------
23 // 'first in first out' queue functions
24
25 inline void queue_reset(fifo_queue *q)
26 { q->tail=0;
27   q->head=0;
28 }
29 END_OF_FUNCTION(queue_reset);
30
31
32 int queue_resize(fifo_queue *q,uint new_size)
33 { int *tmp;
34   if ((tmp=(int*)realloc(q->queue,sizeof(int)*new_size))==NULL) return(0);
35
36   if (new_size>q->size) q->resize_counter++;
37   else if (new_size<=q->initial_size) q->resize_counter=0;
38   else q->resize_counter--;
39
40   q->queue=tmp;
41   q->size=new_size;
42   q->fill_level=3*(q->size>>2); // 3/4
43   return(1);
44 }
45
46 //-------------------- QUEUE_DELETE --------------------------
47
48 void queue_delete(fifo_queue *q)
49 { if (q==NULL) return;
50   free(q->queue);
51   free(q);
52 }
53
54 //--------------------- QUEUE_PUT ------------------------------
55
56 inline int queue_put(fifo_queue *q,int c)
57 { return(queue_put_(q,&c));
58 }
59 END_OF_FUNCTION(queue_put);
60
61 int queue_put_(fifo_queue *q,void *c)
62 { int n=0;
63
64   if (!q) return(0);
65
66   DISABLE();
67   memcpy(QT(q),c,q->dsize);
68   q->tail+=q->dsize;
69   if (q->tail==q->head)
70    { q->head+=q->dsize;
71      if (q->head>(q->size-q->dsize)) q->head=0;
72    }
73
74   if(q->tail>(q->size-q->dsize)) q->tail=0;
75
76   n=0;
77   if (q->head<q->tail) {if ((q->tail-q->head)>=q->fill_level) n=1;}
78   else
79    if ((q->head-q->tail)<=q->size-q->fill_level) n=1;
80
81   ENABLE();
82
83   return(n);
84 }
85 END_OF_FUNCTION(queue_put_);
86
87 //---------------------- QUEUE GET ---------------------------
88
89 inline int queue_get(fifo_queue *q)
90 { int c;
91   queue_get_(q,&c);
92   return(c);
93 }
94 END_OF_FUNCTION(queue_get);
95
96 int queue_get_(fifo_queue *q,void *c)
97 {
98   int n;
99
100   DISABLE();
101   memcpy(c,QH(q),q->dsize);
102   q->head+=q->dsize;
103
104   if (q->head>(q->size-q->dsize)) q->head=0;
105   if (q->head==q->tail) queue_reset(q);
106
107   n=0;
108   if (q->head<q->tail) {if ((q->tail-q->head)>=q->fill_level) n=1;}
109   else
110    if ((q->head-q->tail)<=q->size-q->fill_level) n=1;
111
112   ENABLE();
113   return(n);
114 }
115 END_OF_FUNCTION(queue_get_);
116 //---------------------- QUEUE EMPTY ---------------------------
117
118 inline int queue_empty(fifo_queue *q)
119 { if (q==NULL) return(1);
120   if (q->head==q->tail)
121    { if (q->empty_handler!=NULL) return(-1);
122      return(1);
123    }
124   return(0);
125 }
126 END_OF_FUNCTION(queue_empty);
127
128
129 //------------------------------- QUEUE NEW --------------------------
130
131 fifo_queue* queue_new(uint size)
132 {
133   return(queue_new_(size,4));
134 }
135
136 //------------------------- QUEUE_NEW_ --------------------------
137
138 fifo_queue* queue_new_(uint size,uint dsize)
139 { fifo_queue *q=NULL;
140
141   if (dsize<=0||dsize>4) return(NULL);
142   if ((q=(fifo_queue*)malloc(sizeof(fifo_queue)))==NULL) return(NULL);
143
144   if (!size) size=1024; //if illegal size, turn it to default size
145   if ((q->queue=malloc(sizeof(int)*size*dsize))==NULL) return(NULL);
146
147   q->dsize=dsize;
148   q->size=size*dsize;
149   q->initial_size=size*dsize;//size;
150   q->resize_counter=0;
151   q->fill_level=3*q->size/4; // 3/4
152   q->empty_handler=NULL;
153   queue_reset(q);
154   _go32_dpmi_lock_data(q->queue,sizeof(int)*size*dsize);
155   _go32_dpmi_lock_data(q,sizeof(fifo_queue));
156
157   return(q);
158 }
159
160 void lock_queue_functions(void)
161 {
162   LOCK_FUNCTION(queue_empty);
163   LOCK_FUNCTION(queue_put);
164   LOCK_FUNCTION(queue_get);
165   LOCK_FUNCTION(queue_put_);
166   LOCK_FUNCTION(queue_get_);
167   LOCK_FUNCTION(queue_reset);
168 }