On 2020/05/08 2:46, Daniel Shahaf wrote:
> Yasuhito FUTATSUKI wrote on Thu, 07 May 2020 20:46 +0900:
>> I think it is need to escape characters in char *value when we print
                               ^some (not all)
>> them as Python's str value. The patch below may work for this purpose,
>> but I want someone to write more nice code :)
> 
> How about simply adding the human-readable value in a comment? —

It's very nice. One of the reason I don't like my code is just
readability of the value of "value". (It seems that this patch just
presents a concept but isn't a actual code, though).

> [[[

<snip>

> +          printf("\\x%02x", (unsigned int)(unsigned char)*value++);

<snip>

> ]]]
> 
> Also, I propose to change the cast as above, because I think the
> previous one wouldn't DTRT on platforms where 'char' is signed.

Ah, sure. My code was unsafe. Thank you.

I tweaked a condition to distinct py2 and py3, then make a patch.

Cheers,
-- 
Yasuhito FUTATSUKI <futat...@poem.co.jp>/<futat...@yf.bsdclub.org>
Index: subversion/tests/cmdline/entries-dump.c
===================================================================
--- subversion/tests/cmdline/entries-dump.c     (revision 1877407)
+++ subversion/tests/cmdline/entries-dump.c     (working copy)
@@ -23,6 +23,7 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <assert.h>
 
 #include <apr_pools.h>
 #include <apr_general.h>
@@ -34,6 +35,7 @@
 #include "svn_pools.h"
 #include "svn_wc.h"
 #include "svn_dirent_uri.h"
+#include "svn_xml.h"
 
 #include "private/svn_wc_private.h"
 
@@ -41,12 +43,28 @@
 #include "../../libsvn_wc/lock.h"
 
 static void
-str_value(const char *name, const char *value)
+str_value(const char *name, const char *value, apr_pool_t *pool)
 {
   if (value == NULL)
     printf("e.%s = None\n", name);
   else
-    printf("e.%s = '%s'\n", name, value);
+    {
+      svn_stringbuf_t *escaped_value = NULL;
+      svn_xml_escape_attr_cstring(&escaped_value, value, pool);
+
+      /* Print the human-readable value. */
+      assert(NULL == strchr(escaped_value->data, '\n'));
+      printf("# e.%s = %s\n", name, escaped_value->data);
+
+      /* Print the machine-readable value. */
+      printf("e.%s = (lambda x: x if b'' == '' else "
+             "x.decode('utf-8', 'surrogateescape'))(b'", name);
+      while(*value)
+        {
+          printf("\\x%02x", (unsigned int)(unsigned char)*value++);
+        }      
+      printf("')\n");
+    }
 }
 
 
@@ -130,11 +148,11 @@
       SVN_ERR_ASSERT(strcmp(key, entry->name) == 0);
 
       printf("e = Entry()\n");
-      str_value("name", entry->name);
+      str_value("name", entry->name, pool);
       int_value("revision", entry->revision);
-      str_value("url", entry->url);
-      str_value("repos", entry->repos);
-      str_value("uuid", entry->uuid);
+      str_value("url", entry->url, pool);
+      str_value("repos", entry->repos, pool);
+      str_value("uuid", entry->uuid, pool);
       int_value("kind", entry->kind);
       int_value("schedule", entry->schedule);
       bool_value("copied", entry->copied);
@@ -141,27 +159,27 @@
       bool_value("deleted", entry->deleted);
       bool_value("absent", entry->absent);
       bool_value("incomplete", entry->incomplete);
-      str_value("copyfrom_url", entry->copyfrom_url);
+      str_value("copyfrom_url", entry->copyfrom_url, pool);
       int_value("copyfrom_rev", entry->copyfrom_rev);
-      str_value("conflict_old", entry->conflict_old);
-      str_value("conflict_new", entry->conflict_new);
-      str_value("conflict_wrk", entry->conflict_wrk);
-      str_value("prejfile", entry->prejfile);
+      str_value("conflict_old", entry->conflict_old, pool);
+      str_value("conflict_new", entry->conflict_new, pool);
+      str_value("conflict_wrk", entry->conflict_wrk, pool);
+      str_value("prejfile", entry->prejfile, pool);
       /* skip: text_time */
       /* skip: prop_time */
       /* skip: checksum */
       int_value("cmt_rev", entry->cmt_rev);
       /* skip: cmt_date */
-      str_value("cmt_author", entry->cmt_author);
-      str_value("lock_token", entry->lock_token);
-      str_value("lock_owner", entry->lock_owner);
-      str_value("lock_comment", entry->lock_comment);
+      str_value("cmt_author", entry->cmt_author, pool);
+      str_value("lock_token", entry->lock_token, pool);
+      str_value("lock_owner", entry->lock_owner, pool);
+      str_value("lock_comment", entry->lock_comment, pool);
       /* skip: lock_creation_date */
       /* skip: has_props */
       /* skip: has_prop_mods */
       /* skip: cachable_props */
       /* skip: present_props */
-      str_value("changelist", entry->changelist);
+      str_value("changelist", entry->changelist, pool);
       /* skip: working_size */
       /* skip: keep_local */
       int_value("depth", entry->depth);

Reply via email to