if(gb && data) {\
__tl = strlen(data) + gb->n_used;\
if( __tl < gb->size ) {\
- strcat(gb->buf, data);\
+ strcpy( gb->buf + gb->n_used, data ); \
gb->n_used = __tl; \
} else { buffer_add(gb, data); }\
}\
};
typedef struct growing_buffer_struct growing_buffer;
+#define buffer_length(x) (x)->n_used
+
growing_buffer* buffer_init( int initial_num_bytes);
// XXX This isn't defined in utils.c!! removing for now...
char* buffer_release( growing_buffer* gb );
int buffer_free( growing_buffer* gb );
int buffer_add_char(growing_buffer* gb, char c);
-int buffer_chomp(growing_buffer* gb); // removes the last character from the buffer
+char buffer_chomp(growing_buffer* gb); // removes the last character from the buffer
/* returns the size needed to fill in the vsnprintf buffer.
* ! this calls va_end on the va_list argument*
#include <opensrf/log.h>
#include <errno.h>
-static const char hex_chars[] = "0123456789abcdef";
-static unsigned char hex_code[7] = "\\u00";
-
inline void* safe_malloc( int size ) {
void* ptr = (void*) malloc( size );
if( ptr == NULL ) {
return strdup( gb->buf );
}
-int buffer_chomp(growing_buffer* gb) {
- if( gb == NULL ) { return -1; }
- if(gb->n_used > 0) {
+char buffer_chomp(growing_buffer* gb) {
+ char c = '\0';
+ if(gb && gb->n_used > 0) {
gb->n_used--;
+ c = gb->buf[gb->n_used];
gb->buf[gb->n_used] = '\0';
}
- return gb->n_used;
+ return c;
}
-/*
-#define OSRF_BUFFER_ADD_CHAR(gb, c)\
- do {\
- if(gb) {\
- if(gb->n_used < gb->size - 1)\
- gb->buf[gb->n_used++] = c;\
- else\
- buffer_add_char(gb, c);\
- }\
- }while(0)
- */
-
int buffer_add_char(growing_buffer* gb, char c ) {
if(gb && gb->buf) {
return buffer_release(buf);
}
-int buffer_append_uescape( growing_buffer* buf, const char* string ) {
-
- if(NULL == string)
- return 0; // Nothing to add? Nothing to do
-
- if( NULL == buf )
- return -1; // Nothing to add to
-
- int idx = 0;
- unsigned long int c;
-
- while (string[idx]) {
-
- c = 0x0;
-
- if ((unsigned char)string[idx] >= 0x80) { // not ASCII
-
- if ((unsigned char)string[idx] >= 0xC0 && (unsigned char)string[idx] <= 0xF4) { // starts a UTF8 string
-
- int clen = 1;
- if (((unsigned char)string[idx] & 0xF0) == 0xF0) {
- clen = 3;
- c = (unsigned char)string[idx] ^ 0xF0;
-
- } else if (((unsigned char)string[idx] & 0xE0) == 0xE0) {
- clen = 2;
- c = (unsigned char)string[idx] ^ 0xE0;
-
- } else if (((unsigned char)string[idx] & 0xC0) == 0xC0) {
- clen = 1;
- c = (unsigned char)string[idx] ^ 0xC0;
- }
-
- for (;clen;clen--) {
-
- idx++; // look at the next byte
- c = (c << 6) | ((unsigned char)string[idx] & 0x3F); // add this byte worth
- }
-
- buffer_fadd(buf, "\\u%04x", c);
-
- } else {
- return idx + 1;
- }
-
- } else if(string[idx] >= ' ' ) { // printable ASCII character
-
- c = string[idx];
- switch(c) {
- case '"':
- case '\\':
- OSRF_BUFFER_ADD_CHAR(buf, '\\');
- OSRF_BUFFER_ADD_CHAR(buf, c);
- break;
-
- default:
- OSRF_BUFFER_ADD_CHAR(buf, c);
- }
-
- } else {
- c = string[idx];
-
- /* escape the usual suspects */
- switch(c) {
- case '\b':
- OSRF_BUFFER_ADD_CHAR(buf, '\\');
- OSRF_BUFFER_ADD_CHAR(buf, 'b');
- break;
-
- case '\f':
- OSRF_BUFFER_ADD_CHAR(buf, '\\');
- OSRF_BUFFER_ADD_CHAR(buf, 'f');
- break;
-
- case '\t':
- OSRF_BUFFER_ADD_CHAR(buf, '\\');
- OSRF_BUFFER_ADD_CHAR(buf, 't');
- break;
-
- case '\n':
- OSRF_BUFFER_ADD_CHAR(buf, '\\');
- OSRF_BUFFER_ADD_CHAR(buf, 'n');
- break;
-
- case '\r':
- OSRF_BUFFER_ADD_CHAR(buf, '\\');
- OSRF_BUFFER_ADD_CHAR(buf, 'r');
- break;
-
- default:
- {
- // Represent as \u followed by four hex characters
- hex_code[ 4 ] = hex_chars[ c >> 4 ]; // high nybble
- hex_code[ 5 ] = hex_chars[ c & 0x0F ]; // low nybble
- hex_code[ 6 ] = '\0';
- OSRF_BUFFER_ADD(buf, (char *) hex_code);
- break;
- }
- }
- }
-
- idx++;
- }
-
- return 0;
-}
// A function to turn a process into a daemon
int daemonize( void ) {