|
1 |
#include "buf.h"
|
|
2 |
#include <stdlib.h>
|
|
3 |
|
|
4 |
d_bufr *init_buf(int buf_size)
|
|
5 |
{
|
|
6 |
printf("-----------------\n");
|
|
7 |
printf("Creating buffer; size %d!\n", buf_size);
|
|
8 |
|
|
9 |
d_bufr *buf;
|
|
10 |
buf = (d_bufr *)malloc(sizeof(d_bufr));
|
|
11 |
//*
|
|
12 |
buf->buffer_size = buf_size;
|
|
13 |
// TODO should allocate (element_t *) type instead of (int *)?
|
|
14 |
// malloc(BUFFER_SIZE * sizeof (element_t));
|
|
15 |
buf->elements = malloc(buf_size * sizeof (element_t));
|
|
16 |
|
|
17 |
buf->start_p = &buf->elements;
|
|
18 |
buf->start_el= &buf->elements;
|
|
19 |
//buf->end_p = buf->start_p+buf->buffer_size-1;
|
|
20 |
buf->end_p = &buf->elements;
|
|
21 |
buf->buffer_load = 0;
|
|
22 |
|
|
23 |
/*
|
|
24 |
// TODO just a bunch of tests for deletion
|
|
25 |
//printf("buf addr: %d\n", buf);
|
|
26 |
printf("buf start_p: %d\n", buf->start_p);
|
|
27 |
//printf("buf &start_p: %d\n", &buf->start_p);
|
|
28 |
//printf("buf *start_p: %d\n", *buf->start_p);
|
|
29 |
printf("buf end_p: %d\n", buf->end_p);
|
|
30 |
//printf("buf elements: %d\n", buf->elements);
|
|
31 |
printf("buf &elements: %d\n", &buf->elements);
|
|
32 |
//printf("buf size: %d\n", buf->buffer_size);
|
|
33 |
//printf("buf load %d\n", buf->buffer_load);
|
|
34 |
|
|
35 |
// TODO possilbe bug in buffer allocation! following sums should be the same
|
|
36 |
// buf start_p + buffer_size - buf start_p should be 4 * buffer_size
|
|
37 |
// in first case it is, but in second it is 2 times bigger!
|
|
38 |
printf("buf start_p+buffer_size: %d\n", buf->start_p+buf_size);
|
|
39 |
printf("&buf->elements+buf->buffer_size: %d\n", &buf->elements+buf->buffer_size);
|
|
40 |
printf("sizeof(buf->elements) %d\n", sizeof(buf->elements));
|
|
41 |
printf("sizeof(element_t) %d\n", sizeof(element_t));
|
|
42 |
/**/
|
|
43 |
return buf;
|
|
44 |
}
|
|
45 |
|
|
46 |
void increase_start_p(d_bufr *buf)
|
|
47 |
{
|
|
48 |
/*
|
|
49 |
printf("pre buf->start_p \t%d\n",buf->start_p);
|
|
50 |
printf("pre buf->end_p \t\t%d\n",buf->end_p);
|
|
51 |
printf("limit address \t\t%d\n", buf->start_el + buf->buffer_size);
|
|
52 |
printf("-\n");
|
|
53 |
/**/
|
|
54 |
if((buf->start_p+1)!=(buf->start_el + buf->buffer_size)) // no loop
|
|
55 |
{
|
|
56 |
//pomakni se endp ce je isti naslov kot startp
|
|
57 |
//printf("no loop\n");
|
|
58 |
if((buf->start_p+1)==(buf->end_p))
|
|
59 |
{
|
|
60 |
//printf("lol fail\n");
|
|
61 |
increase_end_p(buf);
|
|
62 |
}
|
|
63 |
else
|
|
64 |
{
|
|
65 |
//printf("ok zakon\n");
|
|
66 |
buf->buffer_load++;
|
|
67 |
}
|
|
68 |
buf->start_p++;
|
|
69 |
}
|
|
70 |
else //loop
|
|
71 |
{
|
|
72 |
if(buf->end_p==buf->start_el)
|
|
73 |
increase_end_p(buf);
|
|
74 |
else
|
|
75 |
buf->buffer_load++;
|
|
76 |
buf->start_p = buf->start_el;
|
|
77 |
}
|
|
78 |
//printf("after buf->start_p \t%d\n",buf->start_p);
|
|
79 |
}
|
|
80 |
|
|
81 |
int increase_end_p(d_bufr *buf)
|
|
82 |
{
|
|
83 |
//printf("pre buf->end_p \t\t%d\n",buf->end_p);
|
|
84 |
if((buf->end_p+1)!=(buf->start_el + buf->buffer_size)) // no loop
|
|
85 |
{
|
|
86 |
if((buf->end_p+1)==(buf->start_p)) //buffer empty
|
|
87 |
return 0;
|
|
88 |
buf->end_p++;
|
|
89 |
}
|
|
90 |
else //loop
|
|
91 |
{
|
|
92 |
if(buf->start_p==buf->elements) //buffer empty
|
|
93 |
return 0;
|
|
94 |
buf->end_p = buf->elements;
|
|
95 |
}
|
|
96 |
//printf("after buf->end_p \t%d\n",buf->end_p);
|
|
97 |
return 1;
|
|
98 |
}
|
|
99 |
|
|
100 |
void buf_put(element_t element, d_bufr *buf)
|
|
101 |
{
|
|
102 |
*buf->start_p = element;
|
|
103 |
increase_start_p(buf);
|
|
104 |
}
|
|
105 |
|
|
106 |
int buf_get(element_t *element, d_bufr *buf)
|
|
107 |
{
|
|
108 |
*element = *buf->end_p;
|
|
109 |
if(increase_end_p(buf)==1){
|
|
110 |
buf->buffer_load--;
|
|
111 |
return 1;
|
|
112 |
}
|
|
113 |
else //error
|
|
114 |
return 0;
|
|
115 |
}
|
|
116 |
|
|
117 |
int get_buffer_load(d_bufr *buf)
|
|
118 |
{
|
|
119 |
return buf->buffer_load;
|
|
120 |
}
|