diff options
-rw-r--r-- | common/miscellaneous.c | 68 | ||||
-rw-r--r-- | common/stringhelp.c | 59 | ||||
-rw-r--r-- | common/stringhelp.h | 3 | ||||
-rw-r--r-- | common/util.h | 1 |
4 files changed, 67 insertions, 64 deletions
diff --git a/common/miscellaneous.c b/common/miscellaneous.c index 8d9a7aa73..1327649c8 100644 --- a/common/miscellaneous.c +++ b/common/miscellaneous.c @@ -246,13 +246,77 @@ print_hexstring (FILE *fp, const void *buffer, size_t length, int reserved) #undef tohex } + +/* Create a string from the buffer P_ARG of length N which is suitable + * for printing. Caller must release the created string using xfree. + * On error ERRNO is set and NULL returned. Errors are only possible + * due to malloc failure. */ char * -make_printable_string (const void *p, size_t n, int delim ) +try_make_printable_string (const void *p_arg, size_t n, int delim) { - return sanitize_buffer (p, n, delim); + const unsigned char *p = p_arg; + size_t save_n, buflen; + const unsigned char *save_p; + char *buffer, *d; + + /* First count length. */ + for (save_n = n, save_p = p, buflen=1 ; n; n--, p++ ) + { + if ( *p < 0x20 || *p == 0x7f || *p == delim || (delim && *p=='\\')) + { + if ( *p=='\n' || *p=='\r' || *p=='\f' + || *p=='\v' || *p=='\b' || !*p ) + buflen += 2; + else + buflen += 5; + } + else + buflen++; + } + p = save_p; + n = save_n; + /* And now make the string */ + d = buffer = xtrymalloc (buflen); + for ( ; n; n--, p++ ) + { + if (*p < 0x20 || *p == 0x7f || *p == delim || (delim && *p=='\\')) { + *d++ = '\\'; + if( *p == '\n' ) + *d++ = 'n'; + else if( *p == '\r' ) + *d++ = 'r'; + else if( *p == '\f' ) + *d++ = 'f'; + else if( *p == '\v' ) + *d++ = 'v'; + else if( *p == '\b' ) + *d++ = 'b'; + else if( !*p ) + *d++ = '0'; + else { + sprintf(d, "x%02x", *p ); + d += 3; + } + } + else + *d++ = *p; + } + *d = 0; + return buffer; } +/* Same as try_make_printable_string but terminates the process on + * memory shortage. */ +char * +make_printable_string (const void *p, size_t n, int delim ) +{ + char *string = try_make_printable_string (p, n, delim); + if (!string) + xoutofcore (); + return string; +} + /* * Check if the file is compressed. diff --git a/common/stringhelp.c b/common/stringhelp.c index 95912e0b2..990fc3577 100644 --- a/common/stringhelp.c +++ b/common/stringhelp.c @@ -687,65 +687,6 @@ hextobyte (const char *s) return c; } - -/* Create a string from the buffer P_ARG of length N which is suitable - for printing. Caller must release the created string using xfree. - This function terminates the process on memory shortage. */ -char * -sanitize_buffer (const void *p_arg, size_t n, int delim) -{ - const unsigned char *p = p_arg; - size_t save_n, buflen; - const unsigned char *save_p; - char *buffer, *d; - - /* First count length. */ - for (save_n = n, save_p = p, buflen=1 ; n; n--, p++ ) - { - if ( *p < 0x20 || *p == 0x7f || *p == delim || (delim && *p=='\\')) - { - if ( *p=='\n' || *p=='\r' || *p=='\f' - || *p=='\v' || *p=='\b' || !*p ) - buflen += 2; - else - buflen += 5; - } - else - buflen++; - } - p = save_p; - n = save_n; - /* And now make the string */ - d = buffer = xmalloc( buflen ); - for ( ; n; n--, p++ ) - { - if (*p < 0x20 || *p == 0x7f || *p == delim || (delim && *p=='\\')) { - *d++ = '\\'; - if( *p == '\n' ) - *d++ = 'n'; - else if( *p == '\r' ) - *d++ = 'r'; - else if( *p == '\f' ) - *d++ = 'f'; - else if( *p == '\v' ) - *d++ = 'v'; - else if( *p == '\b' ) - *d++ = 'b'; - else if( !*p ) - *d++ = '0'; - else { - sprintf(d, "x%02x", *p ); - d += 3; - } - } - else - *d++ = *p; - } - *d = 0; - return buffer; -} - - /* Given a string containing an UTF-8 encoded text, return the number of characters in this string. It differs from strlen in that it only counts complete UTF-8 characters. SIZE is the maximum length diff --git a/common/stringhelp.h b/common/stringhelp.h index b6f4167f7..adf2f2060 100644 --- a/common/stringhelp.h +++ b/common/stringhelp.h @@ -61,9 +61,6 @@ int compare_filenames( const char *a, const char *b ); int hextobyte (const char *s); -char *sanitize_buffer (const void *p, size_t n, int delim); - - size_t utf8_charcount (const char *s, int len); diff --git a/common/util.h b/common/util.h index 3f2d1746e..6680414d7 100644 --- a/common/util.h +++ b/common/util.h @@ -287,6 +287,7 @@ void print_utf8_buffer2 (estream_t fp, const void *p, size_t n, int delim); void print_utf8_buffer (estream_t fp, const void *p, size_t n); void print_hexstring (FILE *fp, const void *buffer, size_t length, int reserved); +char *try_make_printable_string (const void *p, size_t n, int delim); char *make_printable_string (const void *p, size_t n, int delim); int is_file_compressed (const char *s, int *ret_rc); |