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 |
|
}
|