Mercurial > libpst
diff src/vbuf.c @ 70:b12f4e50e2e8
Patch from Joachim Metz <joachim.metz@gmail.com> for 64 bit compile.
Signed/unsigned cleanup from 'CFLAGS=-Wextra ./configure'
Reindent vbuf.c to make it readable.
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Sun, 11 May 2008 10:04:33 -0700 |
parents | f6db1f060a95 |
children | 3cb02cb1e6cd |
line wrap: on
line diff
--- a/src/vbuf.c Sat May 10 12:45:23 2008 -0700 +++ b/src/vbuf.c Sun May 11 10:04:33 2008 -0700 @@ -1,9 +1,8 @@ -// {{{ includes #include <ctype.h> -//#include "defines.h" #include <errno.h> #include <iconv.h> +#include <limits.h> #include <malloc.h> #include <signal.h> #include <stdarg.h> @@ -17,916 +16,991 @@ #include <dmalloc.h> #endif -// }}} -int skip_nl( char *s ) // {{{ returns the width of the newline at s[0] +int skip_nl(char *s) { - if( s[0] == '\n' ) return 1; - if( s[0] == '\r' && s[1] == '\n' ) return 2; - if( s[0] == '\0' ) return 0; - return -1; -} // }}} -int find_nl( vstr *vs ) // {{{ find newline of type type in b + if (s[0] == '\n') + return 1; + if (s[0] == '\r' && s[1] == '\n') + return 2; + if (s[0] == '\0') + return 0; + return -1; +} + + +int find_nl(vstr * vs) { - char *nextr, *nextn; - - nextr = memchr( vs->b, '\r', vs->dlen ); - nextn = memchr( vs->b, '\n', vs->dlen ); + char *nextr, *nextn; - //case 1: UNIX, we find \n first - if( nextn && (nextr == NULL || nextr > nextn ) ) { - return nextn - vs->b; - } + nextr = memchr(vs->b, '\r', vs->dlen); + nextn = memchr(vs->b, '\n', vs->dlen); - //case 2: DOS, we find \r\n - if( NULL != nextr && NULL != nextn && 1 == (char*)nextn - (char*)nextr ) { - return nextr - vs->b; - } + //case 1: UNIX, we find \n first + if (nextn && (nextr == NULL || nextr > nextn)) { + return nextn - vs->b; + } + //case 2: DOS, we find \r\n + if (NULL != nextr && NULL != nextn && 1 == (char *) nextn - (char *) nextr) { + return nextr - vs->b; + } + //case 3: we find nothing - //case 3: we find nothing + return -1; +} - return -1; -} // }}} -// {{{ UTF8 <-> UTF16 <-> ISO8859 Character set conversion functions and (ack) their globals +// UTF8 <-> UTF16 <-> ISO8859 Character set conversion functions and (ack) their globals //TODO: the following should not be -char *wwbuf=NULL; -size_t nwwbuf=0; -static int unicode_up=0; +char *wwbuf = NULL; +size_t nwwbuf = 0; +static int unicode_up = 0; iconv_t i16to8, i8to16, i8859_1to8, i8toi8859_1; -void unicode_init() // {{{ -{ - char *wipe = ""; - char dump[4]; - - if( unicode_up ) unicode_close(); - - if( (iconv_t)-1 == (i16to8 = iconv_open( "UTF-8", "UTF-16" ) ) ) { - fprintf(stderr, "doexport(): Couldn't open iconv descriptor for UTF-16 to UTF-8.\n"); - exit( 1 ); - } - - if( (iconv_t)-1 == (i8to16 = iconv_open( "UTF-16", "UTF-8" ) ) ) { - fprintf(stderr, "doexport(): Couldn't open iconv descriptor for UTF-8 to UTF-16.\n"); - exit( 2 ); - } - - //iconv will prefix output with an FF FE (utf-16 start seq), the following dumps that. - memset( dump, 'x', 4 ); - ASSERT( 0 == utf8to16( wipe, 1, dump, 4 ), "unicode_init(): attempt to dump FF FE failed." ); - - if( (iconv_t)-1 == (i8859_1to8 = iconv_open( "UTF-8", "ISO_8859-1" ) ) ) { - fprintf(stderr, "doexport(): Couldn't open iconv descriptor for ASCII to UTF-8.\n"); - exit( 1 ); - } - - if( (iconv_t)-1 == (i8toi8859_1 = iconv_open( "ISO_8859-1", "UTF-8" ) ) ) { - fprintf(stderr, "doexport(): Couldn't open iconv descriptor for UTF-8 to ASCII.\n"); - exit( 1 ); - } - - unicode_up = 1; -} -// }}} -void unicode_close() // {{{ +void unicode_init() { - unicode_up = 0; - iconv_close( i8to16 ); - iconv_close( i16to8 ); - iconv_close( i8859_1to8 ); - iconv_close( i8toi8859_1 ); + char *wipe = ""; + char dump[4]; + + if (unicode_up) + unicode_close(); + + if ((iconv_t) - 1 == (i16to8 = iconv_open("UTF-8", "UTF-16"))) { + fprintf(stderr, "doexport(): Couldn't open iconv descriptor for UTF-16 to UTF-8.\n"); + exit(1); + } + + if ((iconv_t) - 1 == (i8to16 = iconv_open("UTF-16", "UTF-8"))) { + fprintf(stderr, "doexport(): Couldn't open iconv descriptor for UTF-8 to UTF-16.\n"); + exit(2); + } + //iconv will prefix output with an FF FE (utf-16 start seq), the following dumps that. + memset(dump, 'x', 4); + ASSERT(0 == utf8to16(wipe, 1, dump, 4), "unicode_init(): attempt to dump FF FE failed."); + + if ((iconv_t) - 1 == (i8859_1to8 = iconv_open("UTF-8", "ISO_8859-1"))) { + fprintf(stderr, "doexport(): Couldn't open iconv descriptor for ASCII to UTF-8.\n"); + exit(1); + } + + if ((iconv_t) - 1 == (i8toi8859_1 = iconv_open("ISO_8859-1", "UTF-8"))) { + fprintf(stderr, "doexport(): Couldn't open iconv descriptor for UTF-8 to ASCII.\n"); + exit(1); + } + + unicode_up = 1; } -// }}} + -//int utf16_write( FILE* stream, const void *buf, size_t count ) // {{{ write utf-8 or iso_8869-1 to stream after converting it to utf-16 +void unicode_close() +{ + unicode_up = 0; + iconv_close(i8to16); + iconv_close(i16to8); + iconv_close(i8859_1to8); + iconv_close(i8toi8859_1); +} + + +//int utf16_write( FILE* stream, const void *buf, size_t count ) // write utf-8 or iso_8869-1 to stream after converting it to utf-16 //{ // -// //TODO: if anything big comes through here we are sunk, should do it -// //bit-by-bit, not one-big-gulp -// -// size_t inbytesleft, outbytesleft; -// char *inbuf, *outbuf; -// size_t icresult; -// size_t rl; +// //TODO: if anything big comes through here we are sunk, should do it +// //bit-by-bit, not one-big-gulp // -// //do we have enough buffer space? -// if( !wwbuf || nwwbuf < (count * 2 + 2) ) { -// wwbuf = F_REALLOC( wwbuf, count * 2 +2 ); +// size_t inbytesleft, outbytesleft; +// char *inbuf, *outbuf; +// size_t icresult; +// size_t rl; // -// nwwbuf = count * 2 + 2; -// } +// //do we have enough buffer space? +// if( !wwbuf || nwwbuf < (count * 2 + 2) ) { +// wwbuf = F_REALLOC( wwbuf, count * 2 +2 ); +// +// nwwbuf = count * 2 + 2; +// } // -// inbytesleft = count; outbytesleft = nwwbuf; -// inbuf = (char*)buf; outbuf = wwbuf; +// inbytesleft = count; outbytesleft = nwwbuf; +// inbuf = (char*)buf; outbuf = wwbuf; // -//// fprintf(stderr, "X%s, %dX", (char*)buf, strlen( buf )); -//// fflush(stderr); +//// fprintf(stderr, "X%s, %dX", (char*)buf, strlen( buf )); +//// fflush(stderr); // -// if( (rl = strlen( buf ) + 1) != count ) { -// fprintf(stderr, "utf16_write(): reported buffer size (%d) does not match string length (%d)\n", -// count, -// rl); +// if( (rl = strlen( buf ) + 1) != count ) { +// fprintf(stderr, "utf16_write(): reported buffer size (%d) does not match string length (%d)\n", +// count, +// rl); // -// //hexdump( (char*)buf, 0, count, 1 ); +// //hexdump( (char*)buf, 0, count, 1 ); // -// raise( SIGSEGV ); -// inbytesleft = rl; -// } +// raise( SIGSEGV ); +// inbytesleft = rl; +// } // -//// fprintf(stderr, " attempting to convert:\n"); -//// hexdump( (char*)inbuf, 0, count, 1 ); +//// fprintf(stderr, " attempting to convert:\n"); +//// hexdump( (char*)inbuf, 0, count, 1 ); // -// icresult = iconv( i8to16, &inbuf, &inbytesleft, &outbuf, &outbytesleft ); +// icresult = iconv( i8to16, &inbuf, &inbytesleft, &outbuf, &outbytesleft ); // -//// fprintf(stderr, " converted:\n"); -//// hexdump( (char*)buf, 0, count, 1 ); +//// fprintf(stderr, " converted:\n"); +//// hexdump( (char*)buf, 0, count, 1 ); // -//// fprintf(stderr, " to:\n"); -//// hexdump( (char*)wwbuf, 0, nwwbuf, 1 ); +//// fprintf(stderr, " to:\n"); +//// hexdump( (char*)wwbuf, 0, nwwbuf, 1 ); // -// if( (size_t)-1 == icresult ) { -// fprintf(stderr, "utf16_write(): iconv failure(%d): %s\n", errno, strerror( errno ) ); -// fprintf(stderr, " attempted to convert:\n"); -// hexdump( (char*)inbuf, 0, count, 1 ); +// if( (size_t)-1 == icresult ) { +// fprintf(stderr, "utf16_write(): iconv failure(%d): %s\n", errno, strerror( errno ) ); +// fprintf(stderr, " attempted to convert:\n"); +// hexdump( (char*)inbuf, 0, count, 1 ); // -// fprintf(stderr, " result:\n"); -// hexdump( (char*)outbuf, 0, count, 1 ); +// fprintf(stderr, " result:\n"); +// hexdump( (char*)outbuf, 0, count, 1 ); // -// fprintf(stderr, "I'm going to segfault now.\n"); -// raise( SIGSEGV ); -// exit(1); -// } +// fprintf(stderr, "I'm going to segfault now.\n"); +// raise( SIGSEGV ); +// exit(1); +// } // -// if( inbytesleft > 0 ) { -// fprintf(stderr, "utf16_write(): iconv returned a short count.\n"); -// exit(1); -// } +// if( inbytesleft > 0 ) { +// fprintf(stderr, "utf16_write(): iconv returned a short count.\n"); +// exit(1); +// } // -// return fwrite( wwbuf, nwwbuf - outbytesleft - 2, 1, stream ); +// return fwrite( wwbuf, nwwbuf - outbytesleft - 2, 1, stream ); //} -// }}} //char *utf16buf = NULL; //int utf16buf_len = 0; // -//int utf16_fprintf( FILE* stream, const char *fmt, ... ) // {{{ +//int utf16_fprintf( FILE* stream, const char *fmt, ... ) //{ -// int result=0; -// va_list ap; +// int result=0; +// va_list ap; // -// if( utf16buf == NULL ) { -// utf16buf = (char*)F_MALLOC( SZ_MAX + 1 ); +// if( utf16buf == NULL ) { +// utf16buf = (char*)F_MALLOC( SZ_MAX + 1 ); // -// utf16buf_len = SZ_MAX + 1; -// } +// utf16buf_len = SZ_MAX + 1; +// } // -// va_start( ap, fmt ); +// va_start( ap, fmt ); // -// result = vsnprintf( utf16buf, utf16buf_len, fmt, ap ); +// result = vsnprintf( utf16buf, utf16buf_len, fmt, ap ); // -// if( result + 1 > utf16buf_len ) { //didn't have space, realloc() and try again -// fprintf(stderr, "utf16_fprintf(): buffer too small (%d), F_MALLOC(%d)\n", utf16buf_len, result); -// free( utf16buf ); -// utf16buf_len = result + 1; -// utf16buf = (char*)F_MALLOC( utf16buf_len ); +// if( result + 1 > utf16buf_len ) { //didn't have space, realloc() and try again +// fprintf(stderr, "utf16_fprintf(): buffer too small (%d), F_MALLOC(%d)\n", utf16buf_len, result); +// free( utf16buf ); +// utf16buf_len = result + 1; +// utf16buf = (char*)F_MALLOC( utf16buf_len ); // -// result = vsnprintf( utf16buf, utf16buf_len, fmt, ap ); -// } +// result = vsnprintf( utf16buf, utf16buf_len, fmt, ap ); +// } // // -// //didn't have space...again...something weird is going on... -// ASSERT( result + 1 <= utf16buf_len, "utf16_fprintf(): Unpossible error!\n"); +// //didn't have space...again...something weird is going on... +// ASSERT( result + 1 <= utf16buf_len, "utf16_fprintf(): Unpossible error!\n"); // -// if( 1 != utf16_write( stream, utf16buf, result + 1 ) ) -// DIE( "Write error? -> %s or %s\n", strerror( errno ), uerr_str( uerr_get() ) ); +// if( 1 != utf16_write( stream, utf16buf, result + 1 ) ) +// DIE( "Write error? -> %s or %s\n", strerror( errno ), uerr_str( uerr_get() ) ); // -// return result; +// return result; //} -//// }}} -//int utf16to8( char *inbuf_o, char *outbuf_o, int length ) // {{{ +// +//int utf16to8( char *inbuf_o, char *outbuf_o, int length ) //{ -// int inbytesleft = length; -// int outbytesleft = length; -// char *inbuf = inbuf_o; -// char *outbuf = outbuf_o; -// int rlen = -1, tlen; -// int icresult = -1; +// int inbytesleft = length; +// int outbytesleft = length; +// char *inbuf = inbuf_o; +// char *outbuf = outbuf_o; +// int rlen = -1, tlen; +// int icresult = -1; +// +// int i, strlen=-1; // -// int i, strlen=-1; -// -// DEBUG( -// fprintf(stderr, " utf16to8(): attempting to convert:\n"); -// //hexdump( (char*)inbuf_o, 0, length, 1 ); -// fflush(stderr); -// ); +// DEBUG( +// fprintf(stderr, " utf16to8(): attempting to convert:\n"); +// //hexdump( (char*)inbuf_o, 0, length, 1 ); +// fflush(stderr); +// ); // -// for( i=0; i<length ; i+=2 ) { -// if( inbuf_o[i] == 0 && inbuf_o[i + 1] == 0 ) { -// //fprintf(stderr, "End of string found at: %d\n", i ); -// strlen = i; -// } -// } +// for( i=0; i<length ; i+=2 ) { +// if( inbuf_o[i] == 0 && inbuf_o[i + 1] == 0 ) { +// //fprintf(stderr, "End of string found at: %d\n", i ); +// strlen = i; +// } +// } // -// //hexdump( (char*)inbuf_o, 0, strlen, 1 ); +// //hexdump( (char*)inbuf_o, 0, strlen, 1 ); // -// if( -1 == strlen ) WARN("String is not zero-terminated."); +// if( -1 == strlen ) WARN("String is not zero-terminated."); // -// //iconv does not like it when the inbytesleft > actual string length -// //enum: zero terminated, length valid -// // zero terminated, length short //we won't go beyond length ever, so this is same as NZT case -// // zero terminated, length long -// // not zero terminated -// // TODO: MEMORY BUG HERE! -// for( tlen = 0; tlen <= inbytesleft - 2; tlen+=2 ) { -// if( inbuf_o[tlen] == 0 && inbuf_o[tlen+1] == 0 ){ -// rlen = tlen + 2; -// tlen = rlen; -// break; -// } -// if( tlen == inbytesleft )fprintf(stderr, "Space allocated for string > actual string length. Go windows!\n"); -// } +// //iconv does not like it when the inbytesleft > actual string length +// //enum: zero terminated, length valid +// // zero terminated, length short //we won't go beyond length ever, so this is same as NZT case +// // zero terminated, length long +// // not zero terminated +// // TODO: MEMORY BUG HERE! +// for( tlen = 0; tlen <= inbytesleft - 2; tlen+=2 ) { +// if( inbuf_o[tlen] == 0 && inbuf_o[tlen+1] == 0 ){ +// rlen = tlen + 2; +// tlen = rlen; +// break; +// } +// if( tlen == inbytesleft )fprintf(stderr, "Space allocated for string > actual string length. Go windows!\n"); +// } // -// if( rlen >= 0 ) -// icresult = iconv( i16to8, &inbuf, &rlen, &outbuf, &outbytesleft ); +// if( rlen >= 0 ) +// icresult = iconv( i16to8, &inbuf, &rlen, &outbuf, &outbytesleft ); // -// if( icresult == (size_t)-1 ) { -// fprintf(stderr, "utf16to8(): iconv failure(%d): %s\n", errno, strerror( errno ) ); -// fprintf(stderr, " attempted to convert:\n"); -// hexdump( (char*)inbuf_o, 0, length, 1 ); -// fprintf(stderr, " result:\n"); -// hexdump( (char*)outbuf_o, 0, length, 1 ); -// fprintf(stderr, " MyDirtyOut:\n"); -// for( i=0; i<length; i++) { -// if( inbuf_o[i] != '\0' ) fprintf(stderr, "%c", inbuf_o[i] ); -// } +// if( icresult == (size_t)-1 ) { +// fprintf(stderr, "utf16to8(): iconv failure(%d): %s\n", errno, strerror( errno ) ); +// fprintf(stderr, " attempted to convert:\n"); +// hexdump( (char*)inbuf_o, 0, length, 1 ); +// fprintf(stderr, " result:\n"); +// hexdump( (char*)outbuf_o, 0, length, 1 ); +// fprintf(stderr, " MyDirtyOut:\n"); +// for( i=0; i<length; i++) { +// if( inbuf_o[i] != '\0' ) fprintf(stderr, "%c", inbuf_o[i] ); +// } // -// fprintf( stderr, "\n" ); -// raise( SIGSEGV ); -// exit(1); -// } +// fprintf( stderr, "\n" ); +// raise( SIGSEGV ); +// exit(1); +// } // -// DEBUG( -// fprintf(stderr, " result:\n"); -// hexdump( (char*)outbuf_o, 0, length, 1 ); -// ) +// DEBUG( +// fprintf(stderr, " result:\n"); +// hexdump( (char*)outbuf_o, 0, length, 1 ); +// ) // -// //fprintf(stderr, "utf16to8() returning %s\n", outbuf ); +// //fprintf(stderr, "utf16to8() returning %s\n", outbuf ); // -// return icresult; +// return icresult; //} -//// }}} -int utf16_is_terminated( char *str, int length ) // {{{ +// + + +int utf16_is_terminated(char *str, int length) { - VSTR_STATIC( errbuf, 100 ); - int len = -1; - int i; - for( i=0; i<length ; i+=2 ) { - if( str[i] == 0 && str[i + 1] == 0 ) { - //fprintf(stderr, "End of string found at: %d\n", i ); - len = i; - } - } + VSTR_STATIC(errbuf, 100); + int len = -1; + int i; + for (i = 0; i < length; i += 2) { + if (str[i] == 0 && str[i + 1] == 0) { + len = i; + } + } - //hexdump( (char*)inbuf_o, 0, len, 1 ); + if (-1 == len) { + vshexdump(errbuf, str, 0, length, 1); + WARN("String is not zero terminated (probably broken data from registry) %s.", errbuf->b); + } - if( -1 == len ) { - vshexdump( errbuf, str, 0, length, 1 ); - WARN("String is not zero terminated (probably broken data from registry) %s.", errbuf->b); - } + return (-1 == len) ? 0 : 1; +} - return (-1 == len )?0:1; -} // }}} -int vb_utf16to8( vbuf *dest, char *buf, int len ) // {{{ + +int vb_utf16to8(vbuf * dest, char *buf, int len) { - int inbytesleft = len; - char *inbuf = buf; - //int rlen = -1, tlen; - int icresult = -1; - VBUF_STATIC( dumpster, 100 ); + size_t inbytesleft = len; + char *inbuf = buf; + size_t icresult = (size_t)-1; + VBUF_STATIC(dumpster, 100); - //int i; //, strlen=-1; - int outbytesleft; - char *outbuf; + size_t outbytesleft = 0; + char *outbuf = NULL; + + ASSERT(unicode_up, "vb_utf16to8() called before unicode started."); - ASSERT( unicode_up, "vb_utf16to8() called before unicode started." ); + if (2 > dest->blen) + vbresize(dest, 2); + dest->dlen = 0; - if( 2 > dest->blen ) vbresize( dest, 2 ); - dest->dlen = 0; - - //Bad Things can happen if a non-zero-terminated utf16 string comes through here - if( !utf16_is_terminated( buf, len ) ) return -1; + //Bad Things can happen if a non-zero-terminated utf16 string comes through here + if (!utf16_is_terminated(buf, len)) + return -1; - do { - outbytesleft = dest->blen - dest->dlen; - outbuf = dest->b + dest->dlen; - icresult = iconv( i16to8, &inbuf, &inbytesleft, &outbuf, &outbytesleft ); - dest->dlen = outbuf - dest->b; - vbgrow( dest, inbytesleft); - } while( (size_t)-1 == icresult && E2BIG == errno ); + do { + outbytesleft = dest->blen - dest->dlen; + outbuf = dest->b + dest->dlen; + icresult = iconv(i16to8, &inbuf, &inbytesleft, &outbuf, &outbytesleft); + dest->dlen = outbuf - dest->b; + vbgrow(dest, inbytesleft); + } while ((size_t)-1 == icresult && E2BIG == errno); - if( 0 != vb_utf8to16T( dumpster, dest->b, dest->dlen ) ) - DIE("Reverse conversion failed."); + if (0 != vb_utf8to16T(dumpster, dest->b, dest->dlen)) + DIE("Reverse conversion failed."); - if( icresult == (size_t)-1 ) { - //TODO: error - //ERR_UNIX( errno, "vb_utf16to8():iconv failure: %s", strerror( errno ) ); - unicode_init(); - return -1; - /* - fprintf(stderr, " attempted to convert:\n"); - hexdump( (char*)cin, 0, inlen, 1 ); - fprintf(stderr, " result:\n"); - hexdump( (char*)bout->b, 0, bout->dlen, 1 ); - fprintf(stderr, " MyDirtyOut:\n"); - for( i=0; i<inlen; i++) { - if( inbuf[i] != '\0' ) fprintf(stderr, "%c", inbuf[i] ); - } + if (icresult == (size_t)-1) { + //TODO: error + //ERR_UNIX( errno, "vb_utf16to8():iconv failure: %s", strerror( errno ) ); + unicode_init(); + return -1; + /* + fprintf(stderr, " attempted to convert:\n"); + hexdump( (char*)cin, 0, inlen, 1 ); + fprintf(stderr, " result:\n"); + hexdump( (char*)bout->b, 0, bout->dlen, 1 ); + fprintf(stderr, " MyDirtyOut:\n"); + for( i=0; i<inlen; i++) { + if( inbuf[i] != '\0' ) fprintf(stderr, "%c", inbuf[i] ); + } - fprintf( stderr, "\n" ); - raise( SIGSEGV ); - exit(1); - */ - } + fprintf( stderr, "\n" ); + raise( SIGSEGV ); + exit(1); + */ + } - if( icresult ) { - //ERR_UNIX( EILSEQ, "Uhhhh...vb_utf16to8() returning icresult == %d", icresult ); - return -1; - } - return icresult; + if (icresult) { + //ERR_UNIX( EILSEQ, "Uhhhh...vb_utf16to8() returning icresult == %d", icresult ); + return -1; + } + return icresult; } -// }}} + -int utf8to16( char *inbuf_o, int iblen, char *outbuf_o, int oblen) // {{{ iblen, oblen: bytes including \0 +int utf8to16(char *inbuf_o, int iblen, char *outbuf_o, int oblen) // iblen, oblen: bytes including \0 { - //TODO: this is *only* used to dump the utf16 preamble now... - //TODO: This (and 8to16) are the most horrible things I have ever seen... - int inbytesleft; - int outbytesleft = oblen; - char *inbuf = inbuf_o; - char *outbuf = outbuf_o; - //int rlen = -1, tlen; - int icresult = -1; - - char *stend; + //TODO: this is *only* used to dump the utf16 preamble now... + //TODO: This (and 8to16) are the most horrible things I have ever seen... + size_t inbytesleft = 0; + size_t outbytesleft = oblen; + char *inbuf = inbuf_o; + char *outbuf = outbuf_o; + size_t icresult = (size_t)-1; + char *stend; - //int i; //, strlen=-1; - - DEBUG( - fprintf(stderr, " utf8to16(): attempting to convert:\n"); - //hexdump( (char*)inbuf_o, 0, length, 1 ); - fflush(stderr); - ); + DEBUG(fprintf(stderr, " utf8to16(): attempting to convert:\n"); + //hexdump( (char*)inbuf_o, 0, length, 1 ); + fflush(stderr);); - stend = memchr( inbuf_o, '\0', iblen ); - ASSERT( NULL != stend, "utf8to16(): in string not zero terminated." ); + stend = memchr(inbuf_o, '\0', iblen); + ASSERT(NULL != stend, "utf8to16(): in string not zero terminated."); + + inbytesleft = (stend - inbuf_o + 1 < iblen) ? stend - inbuf_o + 1 : iblen; - inbytesleft = ( stend - inbuf_o + 1 < iblen )? stend - inbuf_o + 1: iblen; + //iconv does not like it when the inbytesleft > actual string length + //enum: zero terminated, length valid + // zero terminated, length short //we won't go beyond length ever, so this is same as NZT case + // zero terminated, length long + // not zero terminated + // TODO: MEMORY BUG HERE! + // + /* + for( tlen = 0; tlen <= inbytesleft - 2; tlen+=2 ) { + if( inbuf_o[tlen] == 0 && inbuf_o[tlen+1] == 0 ){ + rlen = tlen + 2; + tlen = rlen; + break; + } + if( tlen == inbytesleft )fprintf(stderr, "Space allocated for string > actual string length. Go windows!\n"); + } + */ - //iconv does not like it when the inbytesleft > actual string length - //enum: zero terminated, length valid - // zero terminated, length short //we won't go beyond length ever, so this is same as NZT case - // zero terminated, length long - // not zero terminated - // TODO: MEMORY BUG HERE! - // - /* - for( tlen = 0; tlen <= inbytesleft - 2; tlen+=2 ) { - if( inbuf_o[tlen] == 0 && inbuf_o[tlen+1] == 0 ){ - rlen = tlen + 2; - tlen = rlen; - break; - } - if( tlen == inbytesleft )fprintf(stderr, "Space allocated for string > actual string length. Go windows!\n"); - } - */ - - //if( rlen >= 0 ) - icresult = iconv( i8to16, &inbuf, &inbytesleft, &outbuf, &outbytesleft ); + //if( rlen >= 0 ) + icresult = iconv(i8to16, &inbuf, &inbytesleft, &outbuf, &outbytesleft); - if( icresult == (size_t)-1 ) { - DIE("iconv failure(%d): %s\n", errno, strerror( errno ) ); - //fprintf(stderr, " attempted to convert:\n"); - //hexdump( (char*)inbuf_o, 0, iblen, 1 ); - //fprintf(stderr, " result:\n"); - //hexdump( (char*)outbuf_o, 0, oblen, 1 ); - //fprintf(stderr, " MyDirtyOut:\n"); -// for( i=0; i<iblen; i++) { -// if( inbuf_o[i] != '\0' ) fprintf(stderr, "%c", inbuf_o[i] ); -// } + if (icresult == (size_t)-1) { + DIE("iconv failure(%d): %s\n", errno, strerror(errno)); + //fprintf(stderr, " attempted to convert:\n"); + //hexdump( (char*)inbuf_o, 0, iblen, 1 ); + //fprintf(stderr, " result:\n"); + //hexdump( (char*)outbuf_o, 0, oblen, 1 ); + //fprintf(stderr, " MyDirtyOut:\n"); +// for( i=0; i<iblen; i++) { +// if( inbuf_o[i] != '\0' ) fprintf(stderr, "%c", inbuf_o[i] ); +// } // -// fprintf( stderr, "\n" ); -// raise( SIGSEGV ); -// exit(1); - } +// fprintf( stderr, "\n" ); +// raise( SIGSEGV ); +// exit(1); + } +// DEBUG( +// fprintf(stderr, " result:\n"); +// hexdump( (char*)outbuf_o, 0, oblen, 1 ); +// ) + + //fprintf(stderr, "utf8to16() returning %s\n", outbuf ); -// DEBUG( -// fprintf(stderr, " result:\n"); -// hexdump( (char*)outbuf_o, 0, oblen, 1 ); -// ) - - //fprintf(stderr, "utf8to16() returning %s\n", outbuf ); + //TODO: error + DEBUG( + if (icresult) + printf("Uhhhh...utf8to16() returning icresult == %d\n", icresult); + ); - //TODO: error - if( icresult ) printf("Uhhhh...utf8to16() returning icresult == %d\n", icresult ); - return icresult; + if (icresult > (size_t)INT_MAX) { + return (-1); + } + return (int) icresult; } -// }}} + -int vb_utf8to16T( vbuf *bout, char *cin, int inlen ) // {{{ +int vb_utf8to16T(vbuf * bout, char *cin, int inlen) { - //TODO: This (and 8to16) are the most horrible things I have ever seen... - int inbytesleft = inlen; - char *inbuf = cin; - //int rlen = -1, tlen; - int icresult = -1; + //TODO: This (and 8to16) are the most horrible things I have ever seen... + size_t inbytesleft = inlen; + char *inbuf = cin; + //int rlen = -1, tlen; + size_t icresult = (size_t)-1; + size_t outbytesleft = 0; + char *outbuf = NULL; - //int i; //, strlen=-1; - - //if( rlen >= 0 ) - int outbytesleft; - char *outbuf; - if( 2 > bout->blen ) vbresize( bout, 2 ); - bout->dlen = 0; + if (2 > bout->blen) + vbresize(bout, 2); + bout->dlen = 0; - do { - outbytesleft = bout->blen - bout->dlen; - outbuf = bout->b + bout->dlen; - icresult = iconv( i8to16, &inbuf, &inbytesleft, &outbuf, &outbytesleft ); - bout->dlen = outbuf - bout->b; - vbgrow( bout, 20 ); - } while( (size_t)-1 == icresult && E2BIG == errno ); + do { + outbytesleft = bout->blen - bout->dlen; + outbuf = bout->b + bout->dlen; + icresult = iconv(i8to16, &inbuf, &inbytesleft, &outbuf, &outbytesleft); + bout->dlen = outbuf - bout->b; + vbgrow(bout, 20); + } while ((size_t)-1 == icresult && E2BIG == errno); - if( icresult == (size_t)-1 ) { - WARN("iconv failure: %s", strerror( errno ) ); - //ERR_UNIX( errno, "vb_utf8to16():iconv failure: %s", strerror( errno ) ); - unicode_init(); - return -1; - /* - fprintf(stderr, "vb_utf8to16(): iconv failure(%d == %d?): %s\n", errno, E2BIG, strerror( errno ) ); - fprintf(stderr, " attempted to convert:\n"); - hexdump( (char*)cin, 0, inlen, 1 ); - fprintf(stderr, " result:\n"); - hexdump( (char*)bout->b, 0, bout->dlen, 1 ); - fprintf(stderr, " MyDirtyOut:\n"); - for( i=0; i<inlen; i++) { - if( inbuf[i] != '\0' ) fprintf(stderr, "%c", inbuf[i] ); - } + if (icresult == (size_t)-1) { + WARN("iconv failure: %s", strerror(errno)); + //ERR_UNIX( errno, "vb_utf8to16():iconv failure: %s", strerror( errno ) ); + unicode_init(); + return -1; + /* + fprintf(stderr, "vb_utf8to16(): iconv failure(%d == %d?): %s\n", errno, E2BIG, strerror( errno ) ); + fprintf(stderr, " attempted to convert:\n"); + hexdump( (char*)cin, 0, inlen, 1 ); + fprintf(stderr, " result:\n"); + hexdump( (char*)bout->b, 0, bout->dlen, 1 ); + fprintf(stderr, " MyDirtyOut:\n"); + for( i=0; i<inlen; i++) { + if( inbuf[i] != '\0' ) fprintf(stderr, "%c", inbuf[i] ); + } - fprintf( stderr, "\n" ); - raise( SIGSEGV ); - exit(1); - */ - } + fprintf( stderr, "\n" ); + raise( SIGSEGV ); + exit(1); + */ + } + DEBUG( + if (icresult) + printf("Uhhhh...vb_utf8to16() returning icresult == %d\n", icresult); + ); - //TODO: error - if( icresult ) printf("Uhhhh...vb_utf8to16() returning icresult == %d\n", icresult ); - return icresult; + if (icresult > (size_t) INT_MAX) { + return (-1); + } + return icresult; } -// }}} -#if 1 -void cheap_uni2ascii(char *src, char *dest, int l) /* {{{ Quick and dirty UNICODE to std. ascii */ + + +/* Quick and dirty UNICODE to std. ascii */ +void cheap_uni2ascii(char *src, char *dest, int l) { - for (; l > 0; l -=2) { - *dest = *src; - dest++; src +=2; - } - *dest = 0; + for (; l > 0; l -= 2) { + *dest = *src; + dest++; + src += 2; + } + *dest = 0; } -// }}} -#endif + -void cheap_ascii2uni(char *src, char *dest, int l) /* {{{ Quick and dirty ascii to unicode */ +/* Quick and dirty ascii to unicode */ +void cheap_ascii2uni(char *src, char *dest, int l) { - for (; l > 0; l--) { - *dest++ = *src++; - *dest++ = 0; + for (; l > 0; l--) { + *dest++ = *src++; + *dest++ = 0; - } + } } -// }}} + -// }}} -// {{{ VARBUF Functions -vbuf *vballoc( size_t len ) // {{{ +vbuf *vballoc(size_t len) { - struct varbuf *result; + struct varbuf *result; + + result = F_MALLOC(sizeof(struct varbuf)); - result = F_MALLOC( sizeof( struct varbuf ) ); + result->dlen = 0; + result->blen = 0; + result->buf = NULL; - result->dlen = 0; - result->blen = 0; - result->buf = NULL; + vbresize(result, len); + + return result; - vbresize( result, len ); +} - return result; -} // }}} -void vbcheck( vbuf *vb ) // {{{ +void vbcheck(vbuf * vb) { - ASSERT( vb->b - vb->buf <= vb->blen, "vbcheck(): vb->b outside of buffer range."); - ASSERT( vb->dlen <= vb->blen, "vbcheck(): data length > buffer length."); + ASSERT(vb->b >= vb->buf, "vbcheck(): data not inside buffer"); + ASSERT((size_t)(vb->b - vb->buf) <= vb->blen, "vbcheck(): vb->b outside of buffer range."); + ASSERT(vb->dlen <= vb->blen, "vbcheck(): data length > buffer length."); + ASSERT(vb->blen < 1024 * 1024, "vbcheck(): blen is a bit large...hmmm."); +} - ASSERT( vb->blen < 1024*1024, "vbcheck(): blen is a bit large...hmmm."); -} // }}} -void vbfree( vbuf *vb ) // {{{ + +void vbfree(vbuf * vb) { - free( vb->buf ); - free( vb ); -} // }}} -void vbclear( struct varbuf *vb ) // {{{ditch the data, keep the buffer + free(vb->buf); + free(vb); +} + + +void vbclear(struct varbuf *vb) // ditch the data, keep the buffer { - vbresize( vb, 0 ); -} // }}} -void vbresize( struct varbuf *vb, size_t len ) // {{{ DESTRUCTIVELY grow or shrink buffer + vbresize(vb, 0); +} + + +void vbresize(struct varbuf *vb, size_t len) // DESTRUCTIVELY grow or shrink buffer { - vb->dlen = 0; + vb->dlen = 0; - if( vb->blen >= len ) { - vb->b = vb->buf; - return; - } + if (vb->blen >= len) { + vb->b = vb->buf; + return; + } - vb->buf = F_REALLOC( vb->buf, len ); - vb->b = vb->buf; - vb->blen = len; -} // }}} -int vbavail( vbuf *vb ) // {{{ + vb->buf = F_REALLOC(vb->buf, len); + vb->b = vb->buf; + vb->blen = len; +} + + +size_t vbavail(vbuf * vb) { - return vb->blen - ((char*)vb->b - (char*)vb->buf + vb->dlen); -} // }}} -//void vbdump( vbuf *vb ) // {{{ TODO: to stdout? Yuck + return vb->blen - vb->dlen - (size_t)(vb->b - vb->buf); +} + + +//void vbdump( vbuf *vb ) // TODO: to stdout? Yuck //{ -// printf("vb dump-------------\n"); +// printf("vb dump-------------\n"); // printf("dlen: %d\n", vb->dlen ); -// printf("blen: %d\n", vb->blen ); -// printf("b - buf: %d\n", vb->b - vb->buf ); -// printf("buf:\n"); -// hexdump( vb->buf, 0, vb->blen, 1 ); -// printf("b:\n"); -// hexdump( vb->b, 0, vb->dlen, 1 ); -// printf("^^^^^^^^^^^^^^^^^^^^\n"); -//} // }}} -void vbgrow( struct varbuf *vb, size_t len ) // {{{ out: vbavail(vb) >= len, data are preserved +// printf("blen: %d\n", vb->blen ); +// printf("b - buf: %d\n", vb->b - vb->buf ); +// printf("buf:\n"); +// hexdump( vb->buf, 0, vb->blen, 1 ); +// printf("b:\n"); +// hexdump( vb->b, 0, vb->dlen, 1 ); +// printf("^^^^^^^^^^^^^^^^^^^^\n"); +//} + + +void vbgrow(struct varbuf *vb, size_t len) // out: vbavail(vb) >= len, data are preserved { - if( 0 == len ) return; + if (0 == len) + return; - if( 0 == vb->blen ) { - vbresize( vb, len ); - return; - } + if (0 == vb->blen) { + vbresize(vb, len); + return; + } - if( vb->dlen + len > vb->blen ) { - if( vb->dlen + len < vb->blen * 1.5 ) len = vb->blen * 1.5; - char *nb = F_MALLOC( vb->blen + len ); - //printf("vbgrow() got %p back from malloc(%d)\n", nb, vb->blen + len); - vb->blen = vb->blen + len; - memcpy( nb, vb->b, vb->dlen ); + if (vb->dlen + len > vb->blen) { + if (vb->dlen + len < vb->blen * 1.5) + len = vb->blen * 1.5; + char *nb = F_MALLOC(vb->blen + len); + //printf("vbgrow() got %p back from malloc(%d)\n", nb, vb->blen + len); + vb->blen = vb->blen + len; + memcpy(nb, vb->b, vb->dlen); - //printf("vbgrow() I am going to free %p\n", vb->buf ); - free( vb->buf ); - vb->buf = nb; - vb->b = vb->buf; - } else { - if( vb->b != vb->buf ) - memcpy( vb->buf, vb->b, vb->dlen ); - } + //printf("vbgrow() I am going to free %p\n", vb->buf ); + free(vb->buf); + vb->buf = nb; + vb->b = vb->buf; + } else { + if (vb->b != vb->buf) + memcpy(vb->buf, vb->b, vb->dlen); + } - vb->b = vb->buf; + vb->b = vb->buf; + + ASSERT(vbavail(vb) >= len, "vbgrow(): I have failed in my mission."); +} + - ASSERT( vbavail( vb ) >= len, "vbgrow(): I have failed in my mission." ); -} // }}} -void vbset( vbuf *vb, void *b, size_t len ) // {{{ set vbuf b size=len, resize if necessary, relen = how much to over-allocate -{ - vbresize( vb, len ); - - memcpy( vb->b, b, len ); - vb->dlen = len; -} // }}} -void vsskipws( vstr *vs ) // {{{ +void vbset(vbuf * vb, void *b, size_t len) // set vbuf b size=len, resize if necessary, relen = how much to over-allocate { - char *p = vs->b; - while( p - vs->b < vs->dlen && isspace( p[0] ) ) p++; + vbresize(vb, len); - vbskip( (vbuf*)vs, p - vs->b ); -} // }}} -void vbappend( struct varbuf *vb, void *b, size_t len ) // {{{ append len bytes of b to vbuf, resize if necessary + memcpy(vb->b, b, len); + vb->dlen = len; +} + + +void vsskipws(vstr * vs) { - if( 0 == vb->dlen ) { - vbset( vb, b, len ); - return; - } + char *p = vs->b; + while ((size_t)(p - vs->b) < vs->dlen && isspace(p[0])) + p++; - vbgrow( vb, len ); + vbskip((vbuf *) vs, p - vs->b); +} + - memcpy( vb->b + vb->dlen, b, len ); - vb->dlen += len; - - //printf("vbappend() end: >%s/%d<\n", vbuf->b, vbuf->dlen ); -} // }}} -void vbskip( struct varbuf *vb, size_t skip ) // {{{ dumps the first skip bytes from vbuf +// append len bytes of b to vbuf, resize if necessary +void vbappend(struct varbuf *vb, void *b, size_t len) { - ASSERT( skip <= vb->dlen, "vbskip(): Attempt to seek past end of buffer." ); - //memmove( vbuf->b, vbuf->b + skip, vbuf->dlen - skip ); - vb->b += skip; - vb->dlen -= skip; -} // }}} -void vboverwrite( struct varbuf *vbdest, struct varbuf *vbsrc ) // {{{ overwrite vbdest with vbsrc + if (0 == vb->dlen) { + vbset(vb, b, len); + return; + } + vbgrow(vb, len); + memcpy(vb->b + vb->dlen, b, len); + vb->dlen += len; +} + + +// dumps the first skip bytes from vbuf +void vbskip(struct varbuf *vb, size_t skip) { - vbresize( vbdest, vbsrc->blen ); - memcpy( vbdest->b, vbsrc->b, vbsrc->dlen ); - vbdest->blen = vbsrc->blen; - vbdest->dlen = vbsrc->dlen; -} // }}} -// }}} -// {{{ VARSTR Functions -vstr *vsalloc( size_t len ) // {{{ + ASSERT(skip <= vb->dlen, "vbskip(): Attempt to seek past end of buffer."); + vb->b += skip; + vb->dlen -= skip; +} + + +// overwrite vbdest with vbsrc +void vboverwrite(struct varbuf *vbdest, struct varbuf *vbsrc) { - vstr *result = (vstr*)vballoc( len + 1 ); - vsset( result, "" ); - return result; -} // }}} -char *vsstr( vstr *vs ) // {{{ + vbresize(vbdest, vbsrc->blen); + memcpy(vbdest->b, vbsrc->b, vbsrc->dlen); + vbdest->blen = vbsrc->blen; + vbdest->dlen = vbsrc->dlen; +} + + +vstr *vsalloc(size_t len) +{ + vstr *result = (vstr *) vballoc(len + 1); + vsset(result, ""); + return result; +} + + +char *vsstr(vstr * vs) { - return vs->b; -} // }}} -size_t vslen( vstr *vs ) // {{{ + return vs->b; +} + + +size_t vslen(vstr * vs) { - return strlen( vsstr( vs )); -} // }}} -void vsfree( vstr *vs ) // {{{ -{ - vbfree( (vbuf*)vs ); -} // }}} -void vscharcat( vstr *vb, int ch ) // {{{ + return strlen(vsstr(vs)); +} + + +void vsfree(vstr * vs) { - vbgrow( (vbuf*)vb, 1); - vb->b[vb->dlen-1] = ch; - vb->b[vb->dlen] = '\0'; - vb->dlen++; -} // }}} -void vsnprepend( vstr *vb, char *str, size_t len ) // {{{ prependappend string str to vbuf, vbuf must already contain a valid string + vbfree((vbuf *) vs); +} + + +void vscharcat(vstr * vb, int ch) { - ASSERT( vb->b[vb->dlen-1] == '\0', "vsncat(): attempt to append string to non-string."); - int sl = strlen( str ); - int n = (sl<len)?sl:len; - //string append - vbgrow( (vbuf*)vb, n + 1 ); - memmove( vb->b + n, vb->b, vb->dlen - 1 ); - memcpy( vb->b, str, n ); - //strncat( vb->b, str, n ); + vbgrow((vbuf *) vb, 1); + vb->b[vb->dlen - 1] = ch; + vb->b[vb->dlen] = '\0'; + vb->dlen++; +} + - vb->dlen += n; - vb->b[ vb->dlen - 1 ] = '\0'; -} // }}} -void vsskip( vstr *vs, size_t len ) // {{{ len < dlen-1 -> skip len chars, else DIE +// prependappend string str to vbuf, vbuf must already contain a valid string +void vsnprepend(vstr * vb, char *str, size_t len) { - ASSERT( len < vs->dlen - 1, "Attempt to skip past end of string" ); - vbskip( (vbuf*)vs, len ); -} // }}} -int vsskipline( vstr *vs ) // {{{ in: vb->b == "stuff\nmore_stuff"; out: vb->b == "more_stuff" -{ - int nloff = find_nl( vs ); - int nll = skip_nl( vs->b + nloff ); + ASSERT(vb->b[vb->dlen - 1] == '\0', "vsncat(): attempt to append string to non-string."); + size_t sl = strlen(str); + size_t n = (sl < len) ? sl : len; + vbgrow((vbuf *) vb, n + 1); + memmove(vb->b + n, vb->b, vb->dlen - 1); + memcpy(vb->b, str, n); + vb->dlen += n; + vb->b[vb->dlen - 1] = '\0'; +} + - if( nloff < 0 ) { - //TODO: error - printf("vb_skipline(): there seems to be no newline here.\n"); - return -1; - } - if( skip_nl < 0 ) { - //TODO: error - printf("vb_skipline(): there seems to be no newline here...except there should be. :P\n"); - return -1; - } +// len < dlen-1 -> skip len chars, else DIE +void vsskip(vstr * vs, size_t len) +{ + ASSERT(len < vs->dlen - 1, "Attempt to skip past end of string"); + vbskip((vbuf *) vs, len); +} + - memmove( vs->b, vs->b + nloff + nll, vs->dlen - nloff - nll ); +// in: vb->b == "stuff\nmore_stuff"; out: vb->b == "more_stuff" +int vsskipline(vstr * vs) +{ + int nloff = find_nl(vs); + int nll = skip_nl(vs->b + nloff); - vs->dlen -= nloff + nll; + if (nloff < 0) { + //TODO: error + printf("vb_skipline(): there seems to be no newline here.\n"); + return -1; + } + if (nll < 0) { + //TODO: error + printf("vb_skipline(): there seems to be no newline here...except there should be. :P\n"); + return -1; + } + + memmove(vs->b, vs->b + nloff + nll, vs->dlen - nloff - nll); - return 0; -} // }}} -int vscatprintf( vstr *vs, char *fmt, ... ) // {{{ + vs->dlen -= nloff + nll; + + return 0; +} + + +int vscatprintf(vstr * vs, char *fmt, ...) { - int size; - va_list ap; + int size; + va_list ap; - /* Guess we need no more than 100 bytes. */ - //vsresize( vb, 100 ); - if(!vs->b || vs->dlen == 0) { - vsset( vs, "" ); - } + /* Guess we need no more than 100 bytes. */ + //vsresize( vb, 100 ); + if (!vs->b || vs->dlen == 0) { + vsset(vs, ""); + } - while (1) { - /* Try to print in the allocated space. */ - va_start(ap, fmt); - size = vsnprintf (vs->b + vs->dlen - 1, vs->blen - vs->dlen, fmt, ap); - va_end(ap); + while (1) { + /* Try to print in the allocated space. */ + va_start(ap, fmt); + size = vsnprintf(vs->b + vs->dlen - 1, vs->blen - vs->dlen, fmt, ap); + va_end(ap); - /* If that worked, return the string. */ - if (size > -1 && size < vs->blen - vs->dlen ) { - vs->dlen += size; - return size; - } - /* Else try again with more space. */ - if ( size >= 0 ) /* glibc 2.1 */ - vbgrow( (vbuf*)vs, size+1 ); /* precisely what is needed */ - else /* glibc 2.0 */ - vbgrow( (vbuf*)vs, vs->blen); - } -} // }}} -int vslast( vstr *vs ) // {{{ returns the last character stored in a vstr + /* If that worked, return the string. */ + if ((size > -1) && ((size_t)size < vs->blen - vs->dlen)) { + vs->dlen += size; + return size; + } + /* Else try again with more space. */ + if (size >= 0) /* glibc 2.1 */ + vbgrow((vbuf *) vs, size + 1); /* precisely what is needed */ + else /* glibc 2.0 */ + vbgrow((vbuf *) vs, vs->blen); + } +} + + +// returns the last character stored in a vstr +int vslast(vstr * vs) { - if( vs->dlen < 1 ) return -1; - if( vs->b[vs->dlen-1] != '\0' ) return -1; - if( vs->dlen == 1 ) return '\0'; - return vs->b[vs->dlen-2]; -} // }}} -void vs_printf( vstr *vs, char *fmt, ... ) // {{{ print over vb + if (vs->dlen < 1) + return -1; + if (vs->b[vs->dlen - 1] != '\0') + return -1; + if (vs->dlen == 1) + return '\0'; + return vs->b[vs->dlen - 2]; +} + + +// print over vb +void vs_printf(vstr * vs, char *fmt, ...) { - int size; - va_list ap; + int size; + va_list ap; - /* Guess we need no more than 100 bytes. */ - vbresize( (vbuf*)vs, 100 ); + /* Guess we need no more than 100 bytes. */ + vbresize((vbuf *) vs, 100); - while (1) { - /* Try to print in the allocated space. */ - va_start(ap, fmt); - size = vsnprintf (vs->b, vs->blen, fmt, ap); - va_end(ap); + while (1) { + /* Try to print in the allocated space. */ + va_start(ap, fmt); + size = vsnprintf(vs->b, vs->blen, fmt, ap); + va_end(ap); - /* If that worked, return the string. */ - if (size > -1 && size < vs->blen) { - vs->dlen = size + 1; - return; - } - /* Else try again with more space. */ - if ( size >= 0 ) /* glibc 2.1 */ - vbresize( (vbuf*)vs, size+1 ); /* precisely what is needed */ - else /* glibc 2.0 */ - vbresize( (vbuf*)vs, vs->blen*2); - } -} // }}} -void vs_printfa( vstr *vs, char *fmt, ... ) // {{{ printf append to vs + /* If that worked, return the string. */ + if ((size > -1) && ((size_t)size < vs->blen)) { + vs->dlen = size + 1; + return; + } + /* Else try again with more space. */ + if (size >= 0) /* glibc 2.1 */ + vbresize((vbuf *) vs, size + 1); /* precisely what is needed */ + else /* glibc 2.0 */ + vbresize((vbuf *) vs, vs->blen * 2); + } +} + + +// printf append to vs +void vs_printfa(vstr * vs, char *fmt, ...) { - int size; - va_list ap; + int size; + va_list ap; - if( vs->blen - vs->dlen < 50 ) - vbgrow( (vbuf*)vs, 100 ); + if (vs->blen - vs->dlen < 50) + vbgrow((vbuf *) vs, 100); - while (1) { - /* Try to print in the allocated space. */ - va_start(ap, fmt); - size = vsnprintf (vs->b + vs->dlen - 1, vs->blen - vs->dlen + 1, fmt, ap); - va_end(ap); + while (1) { + /* Try to print in the allocated space. */ + va_start(ap, fmt); + size = vsnprintf(vs->b + vs->dlen - 1, vs->blen - vs->dlen + 1, fmt, ap); + va_end(ap); - /* If that worked, return the string. */ - if (size > -1 && size < vs->blen) { - vs->dlen += size; - return; - } - /* Else try again with more space. */ - if ( size >= 0 ) /* glibc 2.1 */ - vbgrow( (vbuf*)vs, size+1 - vs->dlen ); /* precisely what is needed */ - else /* glibc 2.0 */ - vbgrow( (vbuf*)vs, size ); - } -} // }}} -void vshexdump( vstr *vs, char *b, size_t start, size_t stop, int ascii ) // {{{ + /* If that worked, return the string. */ + if ((size > -1) && ((size_t)size < vs->blen)) { + vs->dlen += size; + return; + } + /* Else try again with more space. */ + if (size >= 0) /* glibc 2.1 */ + vbgrow((vbuf *) vs, size + 1 - vs->dlen); /* precisely what is needed */ + else /* glibc 2.0 */ + vbgrow((vbuf *) vs, size); + } +} + + +void vshexdump(vstr * vs, char *b, size_t start, size_t stop, int ascii) { - char c; - int diff,i; + char c; + int diff, i; - while (start < stop ) { - diff = stop - start; - if (diff > 16) diff = 16; + while (start < stop) { + diff = stop - start; + if (diff > 16) + diff = 16; - vs_printfa(vs, ":%08X ",start); + vs_printfa(vs, ":%08X ", start); - for (i = 0; i < diff; i++) { - if( 8 == i ) vs_printfa( vs, " " ); - vs_printfa(vs, "%02X ",(unsigned char)*(b+start+i)); - } - if (ascii) { - for (i = diff; i < 16; i++) vs_printfa(vs, " "); - for (i = 0; i < diff; i++) { - c = *(b+start+i); - vs_printfa(vs, "%c", isprint(c) ? c : '.'); - } - } - vs_printfa(vs, "\n"); - start += 16; - } -} // }}} -void vsset( vstr *vs, char *s ) // {{{ Store string s in vs + for (i = 0; i < diff; i++) { + if (8 == i) + vs_printfa(vs, " "); + vs_printfa(vs, "%02X ", (unsigned char) *(b + start + i)); + } + if (ascii) { + for (i = diff; i < 16; i++) + vs_printfa(vs, " "); + for (i = 0; i < diff; i++) { + c = *(b + start + i); + vs_printfa(vs, "%c", isprint(c) ? c : '.'); + } + } + vs_printfa(vs, "\n"); + start += 16; + } +} + + +void vsset(vstr * vs, char *s) // Store string s in vs { - vsnset( vs, s, strlen( s ) ); -} // }}} -void vsnset( vstr *vs, char *s, size_t n ) // {{{ Store string s in vs -{ - vbresize( (vbuf*)vs, n + 1 ); - memcpy( vs->b, s, n); - vs->b[n] = '\0'; - vs->dlen = n+1; -} // }}} -void vsgrow( vstr *vs, size_t len ) // {{{ grow buffer by len bytes, data are preserved + vsnset(vs, s, strlen(s)); +} + + +void vsnset(vstr * vs, char *s, size_t n) // Store string s in vs { - vbgrow( (vbuf*)vs, len ); -} // }}} -size_t vsavail( vstr *vs ) // {{{ + vbresize((vbuf *) vs, n + 1); + memcpy(vs->b, s, n); + vs->b[n] = '\0'; + vs->dlen = n + 1; +} + + +void vsgrow(vstr * vs, size_t len) // grow buffer by len bytes, data are preserved { - return vbavail( (vbuf*)vs ); -} // }}} -void vsnset16( vstr *vs, char *s, size_t len ) // {{{ Like vbstrnset, but for UTF16 + vbgrow((vbuf *) vs, len); +} + + +size_t vsavail(vstr * vs) { - vbresize( (vbuf*)vs, len+1 ); - memcpy( vs->b, s, len ); - - vs->b[len] = '\0'; - vs->dlen = len+1; - vs->b[len] = '\0'; -} // }}} -void vscat( vstr *vs, char *str ) // {{{ + return vbavail((vbuf *) vs); +} + + +void vsnset16(vstr * vs, char *s, size_t len) // Like vbstrnset, but for UTF16 { - vsncat( vs, str, strlen(str ) ); -} // }}} -int vscmp( vstr *vs, char *str ) // {{{ -{ - return strcmp( vs->b, str ); -} // }}} -void vsncat( vstr *vs, char *str, size_t len ) // {{{ append string str to vstr, vstr must already contain a valid string + vbresize((vbuf *) vs, len + 1); + memcpy(vs->b, s, len); + + vs->b[len] = '\0'; + vs->dlen = len + 1; + vs->b[len] = '\0'; +} + + +void vscat(vstr * vs, char *str) { - ASSERT( vs->b[vs->dlen-1] == '\0', "vsncat(): attempt to append string to non-string."); - int sl = strlen( str ); - int n = (sl<len)?sl:len; - //string append - vbgrow( (vbuf*)vs, n + 1 ); - memcpy( vs->b + vs->dlen - 1, str, n ); - //strncat( vs->b, str, n ); + vsncat(vs, str, strlen(str)); +} + - vs->dlen += n; - vs->b[ vs->dlen - 1 ] = '\0'; -} // }}} -void vstrunc( vstr *v, int off ) // {{{ Drop chars [off..dlen] +int vscmp(vstr * vs, char *str) +{ + return strcmp(vs->b, str); +} + + +void vsncat(vstr * vs, char *str, size_t len) // append string str to vstr, vstr must already contain a valid string { - if( off >= v->dlen - 1 ) return; //nothing to do - v->b[off] = '\0'; - v->dlen = off + 1; + ASSERT(vs->b[vs->dlen - 1] == '\0', "vsncat(): attempt to append string to non-string."); + size_t sl = strlen(str); + size_t n = (sl < len) ? sl : len; + //string append + vbgrow((vbuf *) vs, n + 1); + memcpy(vs->b + vs->dlen - 1, str, n); + vs->dlen += n; + vs->b[vs->dlen - 1] = '\0'; } -// }}} -// }}} -// {{{ User input + + +void vstrunc(vstr * v, size_t off) // Drop chars [off..dlen] +{ + if (off >= v->dlen - 1) + return; //nothing to do + v->b[off] = '\0'; + v->dlen = off + 1; +} + + // TODO: not sure how useful this stuff is here -int fmyinput(char *prmpt, char *ibuf, int maxlen) /* {{{ get user input */ -{ - printf("%s",prmpt); +int fmyinput(char *prmpt, char *ibuf, int maxlen) +{ /* get user input */ + printf("%s", prmpt); - fgets(ibuf,maxlen+1,stdin); - - ibuf[strlen(ibuf)-1] = 0; + fgets(ibuf, maxlen + 1, stdin); - return(strlen(ibuf)); + ibuf[strlen(ibuf) - 1] = 0; + + return (strlen(ibuf)); } -// }}} -//}}} -// -// -//{{{ String formatting and output to FILE *stream or just stdout, etc + + +// String formatting and output to FILE *stream or just stdout, etc // TODO: a lot of old, unused stuff in here -void vswinhex8(vstr *vs, unsigned char *hbuf, int start, int stop, int loff ) // {{{ Produce regedit-style hex output */ +void vswinhex8(vstr * vs, unsigned char *hbuf, int start, int stop, int loff) // Produce regedit-style hex output */ { - int i; - int lineflag=0; + int i; + int lineflag = 0; - for( i=start; i<stop; i++) - { - loff += vscatprintf( vs, "%02x", hbuf[i] ); - if( i < stop - 1 ) { - loff+=vscatprintf( vs, "," ); - switch( lineflag ) { - case 0: - if( loff >= 77) { - lineflag=1; - loff=0; - vscatprintf( vs, "\\%s ", STUPID_CR ); - } - break; - case 1: - if( loff >= 75 ) { - loff=0; - vscatprintf( vs, "\\%s ", STUPID_CR ); - } - break; - } - // if( 24 < i || 0 == (i - 17) % 25 ) fprintf( stream, "\\\n " ); - } - } - - // fprintf( stream, "\n" ); -} // }}} + for (i = start; i < stop; i++) { + loff += vscatprintf(vs, "%02x", hbuf[i]); + if (i < stop - 1) { + loff += vscatprintf(vs, ","); + switch (lineflag) { + case 0: + if (loff >= 77) { + lineflag = 1; + loff = 0; + vscatprintf(vs, "\\%s ", STUPID_CR); + } + break; + case 1: + if (loff >= 75) { + loff = 0; + vscatprintf(vs, "\\%s ", STUPID_CR); + } + break; + } + } + } +}