summaryrefslogtreecommitdiffstats
path: root/runtime/string.c
diff options
context:
space:
mode:
authorhunt <hunt>2007-01-31 20:13:02 +0000
committerhunt <hunt>2007-01-31 20:13:02 +0000
commit1b276fc2991255d65c28fa2df03b7b9ecc7d4f7b (patch)
tree09dddc7115d2691e05ee392c2316c0793013a709 /runtime/string.c
parentdcc4fec4fbb6caddbc82c758f57c014cfc37d088 (diff)
downloadsystemtap-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.c213
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++ = '\"';