Author: stefan2
Date: Thu May 19 10:37:06 2011
New Revision: 1124677

URL: http://svn.apache.org/viewvc?rev=1124677&view=rev
Log:
Introduce a "conversion" method that will extract a svn_string_t
structure from an existing svn_stringbuf_t instance without the
need to allocate new memory nor modifying the source structure.

* subversion/include/svn_string.h
  (svn_string_from_stringbuf): declare new API function
* subversion/libsvn_subr/svn_string.c
  (svn_string_from_stringbuf): implement
* subversion/libsvn_ra_svn/marshal.c
  (read_string): use the new API instead of a manual cast 

Modified:
    subversion/trunk/subversion/include/svn_string.h
    subversion/trunk/subversion/libsvn_ra_svn/marshal.c
    subversion/trunk/subversion/libsvn_subr/svn_string.c

Modified: subversion/trunk/subversion/include/svn_string.h
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_string.h?rev=1124677&r1=1124676&r2=1124677&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_string.h (original)
+++ subversion/trunk/subversion/include/svn_string.h Thu May 19 10:37:06 2011
@@ -177,6 +177,11 @@ svn_string_first_non_whitespace(const sv
 apr_size_t
 svn_string_find_char_backward(const svn_string_t *str, char ch);
 
+/** Returns the @a svn_string_t information contained in the data and
+ * len members of @a strbuf.
+ */
+const svn_string_t *
+svn_string_from_stringbuf(const svn_stringbuf_t *strbuf);
 /** @} */
 
 

Modified: subversion/trunk/subversion/libsvn_ra_svn/marshal.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_svn/marshal.c?rev=1124677&r1=1124676&r2=1124677&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/trunk/subversion/libsvn_ra_svn/marshal.c Thu May 19 10:37:06 2011
@@ -642,7 +642,7 @@ static svn_error_t *read_string(svn_ra_s
    * data and len members in stringbuf. 
    */
   item->kind = SVN_RA_SVN_STRING;
-  item->u.string = (svn_string_t *)(&stringbuf->data);
+  item->u.string = svn_string_from_stringbuf(stringbuf);
 
   return SVN_NO_ERROR;
 }

Modified: subversion/trunk/subversion/libsvn_subr/svn_string.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/svn_string.c?rev=1124677&r1=1124676&r2=1124677&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/svn_string.c (original)
+++ subversion/trunk/subversion/libsvn_subr/svn_string.c Thu May 19 10:37:06 
2011
@@ -235,6 +235,29 @@ svn_string_find_char_backward(const svn_
   return find_char_backward(str->data, str->len, ch);
 }
 
+const svn_string_t *
+svn_string_from_stringbuf(const svn_stringbuf_t *strbuf)
+{
+  /* Both, svn_string_t and svn_stringbuf_t are public API structures
+   * since a couple of releases now. Thus, we can rely on their precise
+   * layout not to change.
+   *
+   * It just so happens that svn_string_t is structurally equivalent
+   * to the (data, len) sub-set of svn_stringbuf_t. There is also no
+   * difference in alignment and padding. So, we can just re-interpret
+   * that part of STRBUF as a svn_string_t.
+   * 
+   * However, since svn_string_t does not know about the blocksize
+   * member in svn_stringbuf_t, the returned svn_string_t must not
+   * try to re-allocate its data member. It would possibly be inconsistent
+   * with STRBUF's blocksize member. Hence, the result is a const
+   * structure.
+   * 
+   * Modifying the string character content is fine, though.
+   */
+  return (const svn_string_t *)&strbuf->data;
+}
+
 
 
 /* svn_stringbuf functions */


Reply via email to