You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2013/01/21 14:28:03 UTC

svn commit: r1436335 - /subversion/trunk/subversion/libsvn_client/patch.c

Author: stsp
Date: Mon Jan 21 13:28:03 2013
New Revision: 1436335

URL: http://svn.apache.org/viewvc?rev=1436335&view=rev
Log:
In the patch code, allow readline() callback implementations to return a
NULL line, rather than forcing them to return an empty stringbuf if no
line could be read.

* subversion/libsvn_client/patch.c
  (readline_prop, readline_file, readline_symlink): Return a NULL line
   if nothing was read, instead of allocating an empty stringbuf.
  (readline): If a NULL line was read, return the static string "".

Modified:
    subversion/trunk/subversion/libsvn_client/patch.c

Modified: subversion/trunk/subversion/libsvn_client/patch.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/patch.c?rev=1436335&r1=1436334&r2=1436335&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/patch.c (original)
+++ subversion/trunk/subversion/libsvn_client/patch.c Mon Jan 21 13:28:03 2013
@@ -517,6 +517,8 @@ typedef struct prop_read_baton_t {
  * the property value runs out in which case *EOF is set to TRUE.
  * The line-terminator is not stored in *STRINGBUF.
  *
+ * If the line is empty or could not be read, *line is set to NULL.
+ *
  * The line-terminator is detected automatically and stored in *EOL
  * if EOL is not NULL. If the end of the property value is reached
  * and does not end with a newline character, and EOL is not NULL,
@@ -530,17 +532,15 @@ readline_prop(void *baton, svn_stringbuf
               apr_pool_t *scratch_pool)
 {
   prop_read_baton_t *b = (prop_read_baton_t *)baton;
-  svn_stringbuf_t *str;
+  svn_stringbuf_t *str = NULL;
   const char *c;
   svn_boolean_t found_eof;
 
-  str = svn_stringbuf_create_ensure(80, result_pool);
-
   if ((apr_uint64_t)b->offset >= (apr_uint64_t)b->value->len)
     {
       *eol_str = NULL;
       *eof = TRUE;
-      *line = str;
+      *line = NULL;
       return SVN_NO_ERROR;
     }
 
@@ -572,7 +572,11 @@ readline_prop(void *baton, svn_stringbuf
             }
         }
       else
-        svn_stringbuf_appendbyte(str, *c);
+        {
+          if (str == NULL)
+            str = svn_stringbuf_create_ensure(80, result_pool);
+          svn_stringbuf_appendbyte(str, *c);
+        }
 
       if (*eol_str)
         break;
@@ -690,6 +694,8 @@ init_prop_target(prop_patch_target_t **p
  * or if EOF is reached in which case *EOF is set to TRUE.
  * The line-terminator is not stored in *STRINGBUF.
  *
+ * If the line is empty or could not be read, *line is set to NULL.
+ *
  * The line-terminator is detected automatically and stored in *EOL
  * if EOL is not NULL. If EOF is reached and FILE does not end
  * with a newline character, and EOL is not NULL, *EOL is set to NULL.
@@ -702,13 +708,11 @@ readline_file(void *baton, svn_stringbuf
               apr_pool_t *scratch_pool)
 {
   apr_file_t *file = (apr_file_t *)baton;
-  svn_stringbuf_t *str;
+  svn_stringbuf_t *str = NULL;
   apr_size_t numbytes;
   char c;
   svn_boolean_t found_eof;
 
-  str = svn_stringbuf_create_ensure(80, result_pool);
-
   /* Read bytes into STR up to and including, but not storing,
    * the next EOL sequence. */
   *eol_str = NULL;
@@ -755,7 +759,11 @@ readline_file(void *baton, svn_stringbuf
             }
         }
       else
-        svn_stringbuf_appendbyte(str, c);
+        {
+          if (str == NULL)
+            str = svn_stringbuf_create_ensure(80, result_pool);
+          svn_stringbuf_appendbyte(str, c);
+        }
 
       if (*eol_str)
         break;
@@ -848,7 +856,7 @@ readline_symlink(void *baton, svn_string
 
   if (sb->at_eof)
     {
-      *line = svn_stringbuf_create("", result_pool); /* Result required :( */
+      *line = NULL;
     }
   else
     {
@@ -1182,13 +1190,18 @@ readline(target_content_t *content,
   if (content->eol_style == svn_subst_eol_style_none)
     content->eol_str = eol_str;
 
-  /* Contract keywords. */
-  SVN_ERR(svn_subst_translate_cstring2(line_raw->data, line,
-                                       NULL, FALSE,
-                                       content->keywords, FALSE,
-                                       result_pool));
+  if (line_raw)
+    {
+      /* Contract keywords. */
+      SVN_ERR(svn_subst_translate_cstring2(line_raw->data, line,
+                                           NULL, FALSE,
+                                           content->keywords, FALSE,
+                                           result_pool));
+    }
+  else
+    *line = "";
 
-  if (line_raw->len > 0 || eol_str)
+  if ((line_raw && line_raw->len > 0) || eol_str)
     content->current_line++;
 
   return SVN_NO_ERROR;