Statistics
| Revision:

root / logic / trunk / src / init / buf.c @ 20

History | View | Annotate | Download (3.31 KB)

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
}