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 */