9 inline void* safe_malloc( int size ) {
10 void* ptr = (void*) malloc( size );
12 perror("safe_malloc(): Out of Memory" );
15 memset( ptr, 0, size );
19 /* utility method for profiling */
20 double get_timestamp_millis() {
24 (int)t.time + ( ((double)t.millitm) / 1000 ) );
29 // ---------------------------------------------------------------------------------
30 // Flesh out a ubiqitous growing string buffer
31 // ---------------------------------------------------------------------------------
33 growing_buffer* buffer_init(int num_initial_bytes) {
35 if( num_initial_bytes > BUFFER_MAX_SIZE ) {
40 size_t len = sizeof(growing_buffer);
42 growing_buffer* gb = (growing_buffer*) safe_malloc(len);
44 gb->n_used = 0;/* nothing stored so far */
45 gb->size = num_initial_bytes;
46 gb->buf = (char *) safe_malloc(gb->size + 1);
51 int buffer_fadd(growing_buffer* gb, const char* format, ... ) {
53 if(!gb || !format) return 0;
57 int len = strlen(format) + 1024;
61 va_start(args, format);
62 vsnprintf(buf, len - 1, format, args);
65 return buffer_add(gb, buf);
70 int buffer_add(growing_buffer* gb, char* data) {
73 if( ! gb || ! data ) { return 0; }
74 int data_len = strlen( data );
76 if( data_len == 0 ) { return 0; }
77 int total_len = data_len + gb->n_used;
79 while( total_len >= gb->size ) {
83 if( gb->size > BUFFER_MAX_SIZE ) {
84 fprintf(stderr, "Buffer reached MAX_SIZE of %d", BUFFER_MAX_SIZE );
89 char* new_data = (char*) safe_malloc( gb->size );
91 strcpy( new_data, gb->buf );
95 strcat( gb->buf, data );
96 gb->n_used = total_len;
101 int buffer_reset( growing_buffer *gb){
102 if( gb == NULL ) { return 0; }
103 if( gb->buf == NULL ) { return 0; }
104 memset( gb->buf, 0, gb->size );
109 int buffer_free( growing_buffer* gb ) {
117 char* buffer_data( growing_buffer *gb) {
118 return strdup( gb->buf );
122 int buffer_add_char(growing_buffer* gb, char c) {
132 char* uescape( const char* string, int size, int full_escape ) {
134 growing_buffer* buf = buffer_init(size + 64);
136 long unsigned int c = 0;
138 while (string[idx]) {
142 if ((string[idx] & 0xF0) == 0xF0) {
145 if( size - idx < 4 ) return NULL;
148 c |= (string[idx] & 0x3F)<<12;
151 c |= (string[idx] & 0x3F)<<6;
154 c |= (string[idx] & 0x3F);
158 buffer_fadd(buf, "\\u%0.4x", c);
160 } else if ((string[idx] & 0xE0) == 0xE0) {
162 if( size - idx < 3 ) return NULL;
165 c |= (string[idx] & 0x3F)<<6;
168 c |= (string[idx] & 0x3F);
172 buffer_fadd(buf, "\\u%0.4x", c);
174 } else if ((string[idx] & 0xC0) == 0xC0) {
177 if( size - idx < 2 ) return NULL;
180 c |= (string[idx] & 0x3F);
184 buffer_fadd(buf, "\\u%0.4x", c);
189 /* escape the usual suspects */
193 buffer_add_char(buf, '\\');
194 buffer_add_char(buf, '"');
198 buffer_add_char(buf, '\\');
199 buffer_add_char(buf, 'b');
203 buffer_add_char(buf, '\\');
204 buffer_add_char(buf, 'f');
208 buffer_add_char(buf, '\\');
209 buffer_add_char(buf, 't');
213 buffer_add_char(buf, '\\');
214 buffer_add_char(buf, 'n');
218 buffer_add_char(buf, '\\');
219 buffer_add_char(buf, 'r');
223 buffer_add_char(buf, c);
227 buffer_add_char(buf, c);
234 char* d = buffer_data(buf);