Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
buffer concept implementation
[simgrid.git] / win32_test_app / src / TBuffer.c
1 #include <TBuffer.h>
2
3 /* struct s_Buffer connected functions. */
4
5 /* Constructs an new buffer.
6  * If successful, the function returns a pointer to 
7  * the new buffer. Otherwise, the function returns
8  * NULL. 
9  */
10 Buffer_t Buffer_new(void)
11 {
12         Buffer_t buffer = (Buffer_t)calloc(1,sizeof(s_Buffer_t));
13         
14         if(NULL == buffer)
15         {
16                 setErrno(E_BUFFER_ALLOCATION_FAILED);
17                 return NULL;
18         }
19         
20         buffer->data = (char*)calloc(1,DEFAULT_Buffer_CAPACITY);
21         
22         
23         if(NULL == buffer->data)
24         {
25                 Buffer_free(buffer);
26                 setErrno(E_BUFFER_DATA_ALLOCATION_FAILED);
27                 return NULL;
28         }
29         
30         buffer->capacity = DEFAULT_Buffer_CAPACITY;
31         Buffer_clear(buffer);
32         return buffer;
33 }
34
35 /* Clears the buffer (this function don't destroy it,
36  * see Buffer_free function.). 
37  */ 
38 void Buffer_clear(Buffer_t buffer)
39 {
40         /* must be a valid buffer. */
41         ASSERT_VALID_Buffer(buffer);
42         
43         buffer->size = 0;
44         buffer->data[0]='\n';
45         buffer->data[1]='\0';
46 }
47
48 /* Appends a string in the buffer. If successful, 
49  * the function returns true. Otherwise the function
50  * returns false.
51  */
52 bool Buffer_append(Buffer_t buffer,char* str)
53 {
54         size_t len= strlen(str);
55         size_t capacity_needed = buffer->size + len + 1;
56         size_t capacity_available = buffer->capacity - buffer->size;
57         
58         /* must be a valid buffer. */
59         ASSERT_VALID_Buffer(buffer);
60         /* must be a valid string. */
61         ASSERT_NOT_NULL(str);
62         
63         if(capacity_available < capacity_needed) 
64         {
65                 buffer->data = (char*)realloc(buffer->data, capacity_needed);
66                 
67                 if(NULL == buffer->data)
68                 {
69                         setErrno(E_Buffer_DATA_REALLOCATION_FAILED);
70                         return false;           
71                 }
72                 
73                 buffer->capacity = capacity_needed;
74         }
75         
76         strcpy(buffer->data + buffer->size,str);
77         buffer->size += len;/*  + 1*/ ;  
78         
79         return true;
80 }
81
82 /* 
83  * Removes all the linefeed from the buffer. 
84  */
85 void Buffer_chomp(Buffer_t buffer)
86 {
87         /* must be a valid buffer. */
88         ASSERT_VALID_Buffer(buffer);
89         
90         while ((buffer->data[buffer->size-1] == '\n') || (buffer->data[buffer->size-1] == '\r'))
91         {
92                 buffer->data[buffer->size-1] = '\0';
93                 
94                 if(buffer->size)
95                         (buffer->size)--;
96         }
97 }
98
99 /* 
100  * Destroy the buffer. 
101  */
102 void Buffer_free(Buffer_t buffer)
103 {
104         if(NULL == buffer)
105                 return;
106                 
107         if(NULL != buffer->data)
108                 free(buffer->data);
109         
110         if(NULL != buffer)
111                 free(buffer);
112 }
113
114 /* 
115  * This function returns true is the buffer is empty.
116  * Otherwrise the function returns false.
117  */
118 bool Buffer_empty(Buffer_t buffer) 
119 {
120         /* must be a valid buffer. */
121         ASSERT_VALID_Buffer(buffer);
122         return (buffer->size) == 0;
123 }