Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Don't enable supernvae by default, now we often use gcc >= 4.6
[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     setErrno(E_BUFFER_ALLOCATION_FAILED);
16     return NULL;
17   }
18
19   buffer->data = (char *) calloc(1, DEFAULT_Buffer_CAPACITY);
20
21
22   if (NULL == buffer->data) {
23     Buffer_free(buffer);
24     setErrno(E_BUFFER_DATA_ALLOCATION_FAILED);
25     return NULL;
26   }
27
28   buffer->capacity = DEFAULT_Buffer_CAPACITY;
29   Buffer_clear(buffer);
30   return buffer;
31 }
32
33 /* Clears the buffer (this function don't destroy it,
34  * see Buffer_free function.). 
35  */
36 void Buffer_clear(Buffer_t buffer)
37 {
38   /* must be a valid buffer. */
39   ASSERT_VALID_Buffer(buffer);
40
41   buffer->size = 0;
42   buffer->data[0] = '\n';
43   buffer->data[1] = '\0';
44 }
45
46 /* Appends a string in the buffer. If successful, 
47  * the function returns true. Otherwise the function
48  * returns false.
49  */
50 bool Buffer_append(Buffer_t buffer, char *str)
51 {
52   size_t len = strlen(str);
53   size_t capacity_needed = buffer->size + len + 1;
54   size_t capacity_available = buffer->capacity - buffer->size;
55
56   /* must be a valid buffer. */
57   ASSERT_VALID_Buffer(buffer);
58   /* must be a valid string. */
59   ASSERT_NOT_NULL(str);
60
61   if (capacity_available < capacity_needed) {
62     buffer->data = (char *) realloc(buffer->data, capacity_needed);
63
64     if (NULL == buffer->data) {
65       setErrno(E_Buffer_DATA_REALLOCATION_FAILED);
66       return false;
67     }
68
69     buffer->capacity = capacity_needed;
70   }
71
72   strcpy(buffer->data + buffer->size, str);
73   buffer->size += len; /*  + 1 */ ;
74
75   return true;
76 }
77
78 /* 
79  * Removes all the linefeed from the buffer. 
80  */
81 void Buffer_chomp(Buffer_t buffer)
82 {
83   /* must be a valid buffer. */
84   ASSERT_VALID_Buffer(buffer);
85
86   while ((buffer->data[buffer->size - 1] == '\n')
87          || (buffer->data[buffer->size - 1] == '\r')) {
88     buffer->data[buffer->size - 1] = '\0';
89
90     if (buffer->size)
91       (buffer->size)--;
92   }
93 }
94
95 /* 
96  * Destroy the buffer. 
97  */
98 void Buffer_free(Buffer_t buffer)
99 {
100   if (NULL == buffer)
101     return;
102
103   free(buffer->data);
104
105   free(buffer);
106 }
107
108 /* 
109  * This function returns true is the buffer is empty.
110  * Otherwrise the function returns false.
111  */
112 bool Buffer_empty(Buffer_t buffer)
113 {
114   /* must be a valid buffer. */
115   ASSERT_VALID_Buffer(buffer);
116   return (buffer->size) == 0;
117 }