Lines Matching full:buffer
22 /* String buffer.
26 // Declare buffer and initialize it.
27 kmp_str_buf_t buffer;
28 __kmp_str_buf_init( & buffer );
30 // Print to buffer.
31 __kmp_str_buf_print(& buffer, "Error in file \"%s\" line %d\n", "foo.c", 12);
32 __kmp_str_buf_print(& buffer, " <%s>\n", line);
34 // Use buffer contents. buffer.str is a pointer to data, buffer.used is a
36 write( fd, buffer.str, buffer.used );
38 // Free buffer.
39 __kmp_str_buf_free( & buffer );
41 // Alternatively, you can detach allocated memory from buffer:
42 __kmp_str_buf_detach( & buffer );
43 return buffer.str; // That memory should be freed eventually.
47 * Buffer users may use buffer.str and buffer.used. Users should not change
48 any fields of buffer directly.
49 * buffer.str is never NULL. If buffer is empty, buffer.str points to empty
51 * For performance reasons, buffer uses stack memory (buffer.bulk) first. If
52 stack memory is exhausted, buffer allocates memory on heap by malloc(), and
54 * Buffer doubles amount of allocated memory each time it is exhausted.
71 void __kmp_str_buf_clear(kmp_str_buf_t *buffer) { in __kmp_str_buf_clear() argument
72 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_clear()
73 if (buffer->used > 0) { in __kmp_str_buf_clear()
74 buffer->used = 0; in __kmp_str_buf_clear()
75 buffer->str[0] = 0; in __kmp_str_buf_clear()
77 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_clear()
80 void __kmp_str_buf_reserve(kmp_str_buf_t *buffer, size_t size) { in __kmp_str_buf_reserve() argument
81 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_reserve()
84 if (buffer->size < (unsigned int)size) { in __kmp_str_buf_reserve()
85 // Calculate buffer size. in __kmp_str_buf_reserve()
87 buffer->size *= 2; in __kmp_str_buf_reserve()
88 } while (buffer->size < (unsigned int)size); in __kmp_str_buf_reserve()
90 // Enlarge buffer. in __kmp_str_buf_reserve()
91 if (buffer->str == &buffer->bulk[0]) { in __kmp_str_buf_reserve()
92 buffer->str = (char *)KMP_INTERNAL_MALLOC(buffer->size); in __kmp_str_buf_reserve()
93 if (buffer->str == NULL) { in __kmp_str_buf_reserve()
96 KMP_MEMCPY_S(buffer->str, buffer->size, buffer->bulk, buffer->used + 1); in __kmp_str_buf_reserve()
98 buffer->str = (char *)KMP_INTERNAL_REALLOC(buffer->str, buffer->size); in __kmp_str_buf_reserve()
99 if (buffer->str == NULL) { in __kmp_str_buf_reserve()
105 KMP_DEBUG_ASSERT(buffer->size > 0); in __kmp_str_buf_reserve()
106 KMP_DEBUG_ASSERT(buffer->size >= (unsigned)size); in __kmp_str_buf_reserve()
107 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_reserve()
110 void __kmp_str_buf_detach(kmp_str_buf_t *buffer) { in __kmp_str_buf_detach() argument
111 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_detach()
114 if (buffer->size <= sizeof(buffer->bulk)) { in __kmp_str_buf_detach()
115 buffer->str = (char *)KMP_INTERNAL_MALLOC(buffer->size); in __kmp_str_buf_detach()
116 if (buffer->str == NULL) { in __kmp_str_buf_detach()
119 KMP_MEMCPY_S(buffer->str, buffer->size, buffer->bulk, buffer->used + 1); in __kmp_str_buf_detach()
123 void __kmp_str_buf_free(kmp_str_buf_t *buffer) { in __kmp_str_buf_free() argument
124 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_free()
125 if (buffer->size > sizeof(buffer->bulk)) { in __kmp_str_buf_free()
126 KMP_INTERNAL_FREE(buffer->str); in __kmp_str_buf_free()
128 buffer->str = buffer->bulk; in __kmp_str_buf_free()
129 buffer->size = sizeof(buffer->bulk); in __kmp_str_buf_free()
130 buffer->used = 0; in __kmp_str_buf_free()
131 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_free()
134 void __kmp_str_buf_cat(kmp_str_buf_t *buffer, char const *str, size_t len) { in __kmp_str_buf_cat() argument
135 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_cat()
139 __kmp_str_buf_reserve(buffer, buffer->used + len + 1); in __kmp_str_buf_cat()
140 buffer->str[buffer->used] = '\0'; in __kmp_str_buf_cat()
141 KMP_STRNCAT_S(buffer->str + buffer->used, len + 1, str, len); in __kmp_str_buf_cat()
142 __kmp_type_convert(buffer->used + len, &(buffer->used)); in __kmp_str_buf_cat()
143 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_cat()
161 int __kmp_str_buf_vprint(kmp_str_buf_t *buffer, char const *format, in __kmp_str_buf_vprint() argument
164 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_vprint()
167 int const free = buffer->size - buffer->used; in __kmp_str_buf_vprint()
187 rc = KMP_VSNPRINTF(buffer->str + buffer->used, free, format, args); in __kmp_str_buf_vprint()
196 buffer->used += rc; in __kmp_str_buf_vprint()
200 // Error occurred, buffer is too small. in __kmp_str_buf_vprint()
202 // C99-conforming implementation of vsnprintf returns required buffer size in __kmp_str_buf_vprint()
203 size = buffer->used + rc + 1; in __kmp_str_buf_vprint()
205 // Older implementations just return -1. Double buffer size. in __kmp_str_buf_vprint()
206 size = buffer->size * 2; in __kmp_str_buf_vprint()
209 // Enlarge buffer. in __kmp_str_buf_vprint()
210 __kmp_str_buf_reserve(buffer, size); in __kmp_str_buf_vprint()
215 KMP_DEBUG_ASSERT(buffer->size > 0); in __kmp_str_buf_vprint()
216 KMP_STR_BUF_INVARIANT(buffer); in __kmp_str_buf_vprint()
221 int __kmp_str_buf_print(kmp_str_buf_t *buffer, char const *format, ...) { in __kmp_str_buf_print() argument
225 rc = __kmp_str_buf_vprint(buffer, format, args); in __kmp_str_buf_print()
230 /* The function prints specified size to buffer. Size is expressed using biggest
417 /* This function is like sprintf, but it *allocates* new buffer, which must be
420 programmer from buffer allocations and helps to avoid buffer overflows.
423 str = __kmp_str_format("%s", orig); //strdup() doesn't care about buffer size
426 // about buffer size.
434 kmp_str_buf_t instead, since it uses stack-allocated buffer for short
454 char *buffer = NULL; in __kmp_str_format() local
457 // Allocate buffer. in __kmp_str_format()
458 buffer = (char *)KMP_INTERNAL_MALLOC(size); in __kmp_str_format()
459 if (buffer == NULL) { in __kmp_str_format()
466 rc = KMP_VSNPRINTF(buffer, size, format, args); in __kmp_str_format()
474 // Error occurred, buffer is too small. in __kmp_str_format()
476 // C99-conforming implementation of vsnprintf returns required buffer in __kmp_str_format()
484 // Enlarge buffer and try again. in __kmp_str_format()
485 buffer = (char *)KMP_INTERNAL_REALLOC(buffer, size); in __kmp_str_format()
486 if (buffer == NULL) { in __kmp_str_format()
491 return buffer; in __kmp_str_format()
598 char **buf // Internal buffer. in __kmp_str_token()