diff options
author | hunt <hunt> | 2007-01-31 20:13:02 +0000 |
---|---|---|
committer | hunt <hunt> | 2007-01-31 20:13:02 +0000 |
commit | 1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b (patch) | |
tree | 09dddc7115d2691e05ee392c2316c0793013a709 /runtime/string.c | |
parent | dcc4fec4fbb6caddbc82c758f57c014cfc37d088 (diff) | |
download | systemtap-steved-1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b.tar.gz systemtap-steved-1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b.tar.xz systemtap-steved-1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b.zip |
2007-01-31 Martin Hunt <hunt@redhat.com>
* string.c (_stp_string_init): Deleted.
(_stp_sprintf): Deleted.
(_stp_vsprintf): Deleted.
(_stp_string_cat_cstr): Deleted.
(_stp_string_cat_string): Deleted.
(_stp_string_cat_char): Deleted.
(_stp_string_ptr): Deleted.
(_stp_string_cat): Deleted.
(_stp_snprintf): Moved from vsprintf.c.
(_stp_vscnprintf): Moved from vsprintf.c.
* string.h (STP_STRING_SIZE): Deleted.
(STP_NUM_STRINGS): Deleted.
Remove all references to type "String".
* vsprintf.c (_stp_vscnprintf): Moved to string.c.
(_stp_snprintf): Moved to string.c
* sym.c (_stp_symbol_sprint): Replaced with
_stp_symbol_print, which writes to the print buffer.
(_stp_symbol_sprint_basic): Replaced with
_stp_symbol_snprint.
* runtime.h: Include io.c.
* stat-common.c: Use new _stp_print* functions.
* stat.c: Ditto.
* regs.c: Renamed to regs-ia64.c.
* current.c: Renamed regs.c.
* regs-ia64.c: New file (renamed from regs.c).
* stack.c (_stp_stack_sprint): Renamed _stp_stack_print
and now just prints to the print buffer. Calls
__stp_stack_print instead of __stp_stack_sprint.
(_stp_stack_snprint): New function. Calls _stp_stack_print and
then copies the print buffer into a string.
(_stp_stack_printj): Deleted.
(_stp_ustack_sprint): Deleted.
* stack-*.c: Rewritten to print instead of writing to strings.
Uses new _stp_print* functions.
* print.c (_stp_printf): Create new function instead of macro.
(_stp_print): Ditto.
(_stp_print_char): New function.
* map.c: Use _stp_print() and _stp_print_char()
instead of _stp_print_cstr().
* io.c (_stp_vlog): Use _stp_print() instead
of _stp_string_cat_cstr().
* copy.c (_stp_string_from_user): Deleted.
Diffstat (limited to 'runtime/string.c')
-rw-r--r-- | runtime/string.c | 213 |
1 files changed, 17 insertions, 196 deletions
diff --git a/runtime/string.c b/runtime/string.c index b740c064..6bf89966 100644 --- a/runtime/string.c +++ b/runtime/string.c @@ -1,6 +1,6 @@ /* -*- linux-c -*- * String Functions - * Copyright (C) 2005, 2006 Red Hat Inc. + * Copyright (C) 2005, 2006, 2007 Red Hat Inc. * * This file is part of systemtap, and is free software. You can * redistribute it and/or modify it under the terms of the GNU General @@ -13,217 +13,38 @@ #include "string.h" /** @file string.c - * @brief Implements String type. + * @brief Implements string functions. */ /** @addtogroup string String Functions * * @{ */ -/** Initialize a String for our use. - * This grabs one of the global Strings for our temporary use. +/** Sprintf into a string. + * Like printf, except output goes into a string. * - * @param num Number of the preallocated String to use. - * #STP_NUM_STRINGS are statically allocated for our use. The - * translator (or author) should be sure to grab a free one. - * @returns An empty String. - */ - -String _stp_string_init (int num) -{ - String str; - - if (num >= STP_NUM_STRINGS || num < 0) { - _stp_error ("_stp_string_init internal error: requested string exceeded allocated number or was negative"); - return NULL; - } - str = &_stp_string[num][smp_processor_id()]; - str->len = 0; - str->buf[0] = 0; - return str; -} - - -/** Sprintf into a String. - * Like printf, except output goes into a String. - * Safe because overflowing the buffer is not allowed. - * Size is limited by length of String, #STP_STRING_SIZE. - * - * @param str String + * @param str string * @param fmt A printf-style format string followed by a * variable number of args. */ -void _stp_sprintf (String str, const char *fmt, ...) -{ - int num; - va_list args; - if (str == _stp_stdout) { - _stp_pbuf *pb = per_cpu_ptr(Stp_pbuf, smp_processor_id()); - char *buf = pb->buf + pb->len; - int size = STP_BUFFER_SIZE - pb->len; - va_start(args, fmt); - num = _stp_vsnprintf(buf, size, fmt, args); - va_end(args); - if (unlikely(num >= size)) { - /* overflowed the buffer */ - if (pb->len == 0) { - /* A single print request exceeded the buffer size. */ - /* Should not be possible with Systemtap-generated code. */ - pb->len = STP_BUFFER_SIZE; - _stp_print_flush(); - num = 0; - } else { - /* Need more space. Flush the previous contents */ - _stp_print_flush(); - - /* try again */ - va_start(args, fmt); - num = _stp_vsnprintf(pb->buf, STP_BUFFER_SIZE, fmt, args); - va_end(args); - } - } - pb->len += num; - } else { - va_start(args, fmt); - num = _stp_vscnprintf(str->buf + str->len, STP_STRING_SIZE - str->len, fmt, args); - va_end(args); - if (likely(num > 0)) - str->len += num; - } -} - -/** Vsprintf into a String - * Use this if your function already has a va_list. - * You probably want _stp_sprintf(). - */ -void _stp_vsprintf (String str, const char *fmt, va_list args) -{ - int num; - if (str == _stp_stdout) { - _stp_pbuf *pb = per_cpu_ptr(Stp_pbuf, smp_processor_id()); - char *buf = pb->buf + pb->len; - int size = STP_BUFFER_SIZE - pb->len; - num = _stp_vsnprintf(buf, size, fmt, args); - if (unlikely(num > size)) { - /* overflowed the buffer */ - if (pb->len == 0) { - /* A single print request exceeded the buffer size. */ - /* Should not be possible with Systemtap-generated code. */ - pb->len = STP_BUFFER_SIZE; - _stp_print_flush(); - num = 0; - } else { - /* Need more space. Flush the previous contents */ - _stp_print_flush(); - - /* try again */ - num = _stp_vsnprintf(pb->buf, STP_BUFFER_SIZE, fmt, args); - } - } - pb->len += num; - } else { - num = _stp_vscnprintf(str->buf + str->len, STP_STRING_SIZE - str->len, fmt, args); - if (num > 0) - str->len += num; - } -} - -/** ConCATenate (append) a C string to a String. - * Like strcat(). - * @param str1 String - * @param str2 C string (char *) - * @sa _stp_string_cat - */ -void _stp_string_cat_cstr (String str1, const char *str2) -{ - int num = strlen (str2); - if (str1 == _stp_stdout) { - _stp_pbuf *pb = per_cpu_ptr(Stp_pbuf, smp_processor_id()); - int size = STP_BUFFER_SIZE - pb->len; - if (num > size) { - _stp_print_flush(); - if (num > STP_BUFFER_SIZE) - num = STP_BUFFER_SIZE; - } - memcpy (pb->buf + pb->len, str2, num); - pb->len += num; - } else { - int size = STP_STRING_SIZE - str1->len - 1; - if (num > size) - num = size; - memcpy (str1->buf + str1->len, str2, num); - str1->len += num; - str1->buf[str1->len] = 0; - } -} - -/** ConCATenate (append) a String to a String. - * Like strcat(). - * @param str1 String - * @param str2 String - * @sa _stp_string_cat - */ -void _stp_string_cat_string (String str1, String str2) -{ - if (str2->len) - _stp_string_cat_cstr (str1, str2->buf); -} - -void _stp_string_cat_char (String str1, const char c) +int _stp_snprintf(char *buf, size_t size, const char *fmt, ...) { - if (str1 == _stp_stdout) { - _stp_pbuf *pb = per_cpu_ptr(Stp_pbuf, smp_processor_id()); - int size = STP_BUFFER_SIZE - pb->len; - char *buf; + va_list args; + int i; - if (1 >= size) - _stp_print_flush(); - - buf = pb->buf + pb->len; - buf[0] = c; - pb->len ++; - } else { - int size = STP_STRING_SIZE - str1->len - 1; - if (size > 0) { - char *buf = str1->buf + str1->len; - buf[0] = c; - buf[1] = 0; - str1->len ++; - } - } + va_start(args, fmt); + i = _stp_vsnprintf(buf,size,fmt,args); + va_end(args); + return i; } -/** Get a pointer to String's buffer - * For rare cases when a C string is needed and you have a String. - * One example is when you want to print a String with _stp_printf(). - * @param str String - * @returns A C string (char *) - * @note Readonly. Don't write to this pointer or it will mess up - * the internal String state and probably mess up your output or crash something. - */ -char * _stp_string_ptr (String str) +int _stp_vscnprintf(char *buf, size_t size, const char *fmt, va_list args) { - return str->buf; + int i = _stp_vsnprintf(buf,size,fmt,args); + return (i >= size) ? (size - 1) : i; } -/** ConCATenate (append) a String or C string to a String. - * This macro selects the proper function to call. - * @param str1 A String - * @param str2 A String or C string (char *) - * @sa _stp_string_cat_cstr _stp_string_cat_string - */ -#define _stp_string_cat(str1, str2) \ - ({ \ - if (__builtin_types_compatible_p (typeof (str2), char[])) { \ - char *x = (char *)str2; \ - _stp_string_cat_cstr(str1,x); \ - } else { \ - String x = (String)str2; \ - _stp_string_cat_string(str1,x); \ - } \ - }) - /** Return a printable text string. * @@ -244,8 +65,8 @@ void _stp_text_str(char *outstr, char *in, int len, int quoted, int user) const int length = len; char c, *out = outstr; - if (len == 0 || len > STP_STRING_SIZE-1) - len = STP_STRING_SIZE-1; + if (len == 0 || len > MAXSTRINGLEN-1) + len = MAXSTRINGLEN-1; if (quoted) { len -= 2; *out++ = '\"'; |