You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by "C. Scott Ananian" <ca...@lesser-magoo.lcs.mit.edu> on 2001/09/05 20:35:50 UTC

[RESUBMIT] [PATCH] svn_string expansion.

2001-09-05  C. Scott Ananian  <ca...@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

Re: [RESUBMIT] [PATCH] svn_string expansion.

Posted by cm...@collab.net.
"C. Scott Ananian" <ca...@lesser-magoo.lcs.mit.edu> writes:

> 2001-09-05  C. Scott Ananian  <ca...@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.

Applied.  Thanks again.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org