[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[RESUBMIT] [PATCH] svn_string expansion.

From: C. Scott Ananian <cananian_at_lesser-magoo.lcs.mit.edu>
Date: 2001-09-05 22:35:50 CEST

2001-09-05 C. Scott Ananian <cananian@alumni.princeton.edu>

        * svn_string.c svn_string.h (svn_string_create, svn_string_ncreate,
        svn_string_create_from_buf, svn_string_createf, svn_string_createv,
        svn_string_isempty, svn_string_dup, svn_string_compare,
        svn_string_first_non_whitespace, svn_string_strip_whitespace,
        svn_string_find_char_backward, scn_stringbuf_create_from_string,
        svn_stringbuf_ncreate, svn_stringbuf_createv):
        Attack the first part of the first "bite-sized task" (string
        cleanup) by adding methods to operate on svn_string_t types.
        These are almost identical to the methods to operate on
        svn_stringbuf_t's, except for a few tweaks here and there --
        and since the string referenced by an svn_string_t is immutable,
        all the mutation methods of svn_stringbuf_t have been omitted.
        Also added methods to create an svn_string_t from an svn_stringbuf_t
        and vice-versa. The old private 'create_string' function has been
        renamed to 'create_stringbuf' to better match its function.

diff -ruHp svn.orig/trunk/subversion/include/svn_string.h svn/trunk/subversion/include/svn_string.h
--- svn.orig/trunk/subversion/include/svn_string.h Wed Sep 5 14:50:51 2001
+++ svn/trunk/subversion/include/svn_string.h Wed Sep 5 15:25:41 2001
@@ -87,6 +87,60 @@ typedef struct
 
 
 
+/* svn_string_t functions. */
+
+/* Create a new bytestring containing a C string (null-terminated), or
+ containing a generic string of bytes (NON-null-terminated) */
+svn_string_t * svn_string_create (const char *cstring,
+ apr_pool_t *pool);
+svn_string_t * svn_string_ncreate (const char *bytes,
+ const apr_size_t size,
+ apr_pool_t *pool);
+
+/* Create a new string with the contents of the given stringbuf */
+svn_string_t * svn_string_create_from_buf (const svn_stringbuf_t *strbuf,
+ apr_pool_t *pool);
+
+/* Create a new bytestring by formatting CSTRING (null-terminated)
+ from varargs, which are as appropriate for apr_psprintf. */
+svn_string_t *svn_string_createf (apr_pool_t *pool,
+ const char *fmt,
+ ...)
+ __attribute__ ((format (printf, 2, 3)));
+
+/* Create a new bytestring by formatting CSTRING (null-terminated)
+ from a va_list (see svn_stringbuf_createf). */
+svn_string_t *svn_string_createv (apr_pool_t *pool,
+ const char *fmt,
+ va_list ap)
+ __attribute__ ((format (printf, 2, 0)));
+
+/* Return true if a bytestring is empty (has length zero). */
+svn_boolean_t svn_string_isempty (const svn_string_t *str);
+
+/* Return a duplicate of ORIGNAL_STRING. */
+svn_string_t *svn_string_dup (const svn_string_t *original_string,
+ apr_pool_t *pool);
+
+/* Return TRUE iff STR1 and STR2 have identical length and data. */
+svn_boolean_t svn_string_compare (const svn_string_t *str1,
+ const svn_string_t *str2);
+
+/** convenience routines **/
+
+/* Return offset of first non-whitespace character in STR, or -1 if none. */
+apr_size_t svn_string_first_non_whitespace (const svn_string_t *str);
+
+/* Strips whitespace from both sides of STR (modified in place). */
+void svn_string_strip_whitespace (svn_string_t *str);
+
+/* Return position of last occurrence of CHAR in STR, or return
+ STR->len if no occurrence. */
+apr_size_t svn_string_find_char_backward (const svn_string_t *str, char ch);
+
+
+/* svn_stringbuf_t functions. */
+
 /* Create a new bytestring containing a C string (null-terminated), or
    containing a generic string of bytes (NON-null-terminated) */
 svn_stringbuf_t * svn_stringbuf_create (const char *cstring,
@@ -94,6 +148,10 @@ svn_stringbuf_t * svn_stringbuf_create (
 svn_stringbuf_t * svn_stringbuf_ncreate (const char *bytes,
                                       const apr_size_t size,
                                       apr_pool_t *pool);
+
+/* Create a new stringbuf with the contents of the given string */
+svn_stringbuf_t * svn_stringbuf_create_from_string (const svn_string_t *str,
+ apr_pool_t *pool);
 
 /* Create a new bytestring by formatting CSTRING (null-terminated)
    from varargs, which are as appropriate for apr_psprintf. */
diff -ruHp svn.orig/trunk/subversion/libsvn_subr/svn_string.c svn/trunk/subversion/libsvn_subr/svn_string.c
--- svn.orig/trunk/subversion/libsvn_subr/svn_string.c Wed Sep 5 14:50:51 2001
+++ svn/trunk/subversion/libsvn_subr/svn_string.c Wed Sep 5 15:25:41 2001
@@ -50,7 +50,177 @@ my__realloc (char *data, const apr_size_
   return new_area;
 }
 
-static svn_stringbuf_t *create_string (char *data, apr_size_t size,
+
+/* svn_string functions */
+
+static svn_string_t *create_string (const char *data, apr_size_t size,
+ apr_pool_t *pool)
+{
+ svn_string_t *new_string;
+
+ new_string = (svn_string_t *) apr_palloc (pool, sizeof (*new_string));
+
+ new_string->data = data;
+ new_string->len = size;
+
+ return new_string;
+}
+
+svn_string_t *
+svn_string_ncreate (const char *bytes, const apr_size_t size,
+ apr_pool_t *pool)
+{
+ char *data;
+
+ data = apr_palloc (pool, size + 1);
+ memcpy (data, bytes, size);
+
+ /* Null termination is the convention -- even if we suspect the data
+ to be binary, it's not up to us to decide, it's the caller's
+ call. Heck, that's why they call it the caller! */
+ data[size] = '\0';
+
+ /* wrap an svn_string_t around the new data */
+ return create_string (data, size, pool);
+}
+
+
+svn_string_t *
+svn_string_create (const char *cstring, apr_pool_t *pool)
+{
+ return svn_string_ncreate (cstring, strlen (cstring), pool);
+}
+
+
+svn_string_t *
+svn_string_create_from_buf (const svn_stringbuf_t *strbuf, apr_pool_t *pool)
+{
+ return svn_string_ncreate (strbuf->data, strbuf->len, pool);
+}
+
+
+svn_string_t *
+svn_string_createv (apr_pool_t *pool, const char *fmt, va_list ap)
+{
+ char *data = apr_pvsprintf (pool, fmt, ap);
+
+ /* wrap an svn_string_t around the new data */
+ return create_string (data, strlen (data), pool);
+}
+
+
+svn_string_t *
+svn_string_createf (apr_pool_t *pool, const char *fmt, ...)
+{
+ svn_string_t *str;
+
+ va_list ap;
+ va_start (ap, fmt);
+ str = svn_string_createv (pool, fmt, ap);
+ va_end (ap);
+
+ return str;
+}
+
+
+svn_boolean_t
+svn_string_isempty (const svn_string_t *str)
+{
+ return (str->len == 0);
+}
+
+
+svn_string_t *
+svn_string_dup (const svn_string_t *original_string, apr_pool_t *pool)
+{
+ return (svn_string_ncreate (original_string->data,
+ original_string->len, pool));
+}
+
+
+
+svn_boolean_t
+svn_string_compare (const svn_string_t *str1, const svn_string_t *str2)
+{
+ /* easy way out :) */
+ if (str1->len != str2->len)
+ return FALSE;
+
+ /* now that we know they have identical lengths... */
+
+ if (memcmp (str1->data, str2->data, str1->len))
+ return FALSE;
+ else
+ return TRUE;
+}
+
+
+
+apr_size_t
+svn_string_first_non_whitespace (const svn_string_t *str)
+{
+ apr_size_t i;
+
+ for (i = 0; i < str->len; i++)
+ {
+ if (! apr_isspace (str->data[i]))
+ {
+ return i;
+ }
+ }
+
+ /* if we get here, then the string must be entirely whitespace */
+ return (-1);
+}
+
+
+void
+svn_string_strip_whitespace (svn_string_t *str)
+{
+ apr_size_t i;
+
+ /* Find first non-whitespace character */
+ apr_size_t offset = svn_string_first_non_whitespace (str);
+
+ /* Go ahead! Waste some RAM, we've got pools! :) */
+ str->data += offset;
+ str->len -= offset;
+
+ /* Now that we've chomped whitespace off the front, search backwards
+ from the end for the first non-whitespace. */
+
+ for (i = (str->len - 1); i >= 0; i--)
+ {
+ if (! apr_isspace (str->data[i]))
+ {
+ break;
+ }
+ }
+
+ /* Mmm, waste some more RAM */
+ str->len = i + 1;
+}
+
+
+apr_size_t
+svn_string_find_char_backward (const svn_string_t *str, char ch)
+{
+ int i; /* signed! */
+
+ for (i = (str->len - 1); i >= 0; i--)
+ {
+ if (str->data[i] == ch)
+ return i;
+ }
+
+ return str->len;
+}
+
+
+
+/* svn_stringbuf functions */
+
+static svn_stringbuf_t *create_stringbuf (char *data, apr_size_t size,
                                     apr_pool_t *pool)
 {
   svn_stringbuf_t *new_string;
@@ -80,7 +250,7 @@ svn_stringbuf_ncreate (const char *bytes
   data[size] = '\0';
 
   /* wrap an svn_stringbuf_t around the new data */
- return create_string (data, size, pool);
+ return create_stringbuf (data, size, pool);
 }
 
 
@@ -92,12 +262,19 @@ svn_stringbuf_create (const char *cstrin
 
 
 svn_stringbuf_t *
+svn_stringbuf_create_from_string (const svn_string_t *str, apr_pool_t *pool)
+{
+ return svn_stringbuf_ncreate (str->data, str->len, pool);
+}
+
+
+svn_stringbuf_t *
 svn_stringbuf_createv (apr_pool_t *pool, const char *fmt, va_list ap)
 {
   char *data = apr_pvsprintf (pool, fmt, ap);
 
   /* wrap an svn_stringbuf_t around the new data */
- return create_string (data, strlen (data), pool);
+ return create_stringbuf (data, strlen (data), pool);
 }
 
 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 21 14:36:40 2006

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.