On Friday 31 October 2014 18:18:14 mzatko(a)redhat.com wrote:
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <memory.h>
memory.h is not needed here.
+#include <c-ctype.h>
Prefer the "..." form for it (comes with gnulib).
+#include "rl.h"
+
+static char program_name[] = "fish";
This is provided by including guestfs-internal-frontend.h, and you'll
need guestfs.h prior including the former; so:
#include "guestfs.h"
#include "guestfs-internal-frontend.h"
+int
+hexdigit (char d)
+{
+ switch (d) {
+ case '0'...'9': return d - '0';
+ case 'a'...'f': return d - 'a' + 10;
+ case 'A'...'F': return d - 'A' + 10;
+ default: return -1;
+ }
+}
+
+// backslash unescape for readline
Prefer comments in the /* ... */ format, so:
/* Backslash unescape for readline. */
+char *
+bs_unescape_filename (char *str)
If "str" is not changed, just make it const, so callers know that.
+{
+ char *p = calloc(strlen(str) + 1, 1);
+ strcpy(p, str);
Sounds like strdup? It is POSIX.1-2007, and available also earlier;
in case not, gnulib has a strdup module.
+ error:
+ fprintf (stderr, ("%s: invalid escape sequence in string
(starting at offset %d)\n"),
+ program_name, (int) (p - start));
The message above needs gettext, so _(...).
+// backslash scape
Ditto (for comment style).
+char *
+bs_escape_filename (char *p)
Ditto (for constness of parameter).
+{
+ char *start = p;
+ // four times original length - if all chars are unprintable
+ // new string would be \xXY\xWZ
Ditto (for comment style).
+ char *n = calloc(strlen(p) * 4 + 1, 1);
I'm not sure calloc'ing the whole buffer is needed here; just create
it as usual with malloc, write on it, and make sure to set the last
character as '\0'.
+ char *nstart = n;
+ if (strlen(p) == 0) {
+ n[0] = '\0';
+ return n;
+ }
This optimization for empty strings would be better to be done before
allocating the resulting buffer, something like:
if (p[0] == '\0')
return strdup ("");
+ switch (*p) {
+ case '\\': break;
Shouldn't \ be escaped as well?
+ case '\a': *(n++) = '\\'; *n = 'a';
break;
+ case '\b': *(n++) = '\\'; *n = 'b'; break;
+ case '\f': *(n++) = '\\'; *n = 'f'; break;
+ case '\n': *(n++) = '\\'; *n = 'n'; break;
+ case '\r': *(n++) = '\\'; *n = 'r'; break;
+ case '\t': *(n++) = '\\'; *n = 't'; break;
+ case '\v': *(n++) = '\\'; *n = 'v'; break;
+ case '"': *(n++) = '\\'; *n = '"'; break;
+ case '\'': *(n++) = '\\'; *n = '\''; break;
+ case '?': *(n++) = '\\'; *n = '?'; break;
+ case ' ': *(n++) = '\\'; *n = ' '; break;
+
+ default:
+ // Hexadecimal escape unprintable character. This violates identity
+ // after composition of bsquote_filename after debsquote_filename
+ // (i.e. can escape some characters differently).
Ditto (for comment style).
Also, the names mentioned here don't seem the one used for the functions.
+ if (!c_isprint(*p)) {
+ n += sprintf(n, "\\x%x", (int) (*p & 0xff)) - 1;
Check the return of sprintf here.
> + } else {
> + *n = *p;
> + }
> + break;
+ error:
+ fprintf (stderr, ("%s: invalid escape sequence in string
(starting at offset %d)\n"),
+ program_name, (int) (p - start));
Ditto (for gettext).
+ nstart = realloc(nstart, strlen(nstart));
This is done to shrink the nstart buffer? I don't think it's needed,
especially if it is properly '\0'-ended.
+#ifndef _RL_H
This include guard seems a bit generic, please use something a bit more
specific like FISH_RL_H.
+#ifdef __cplusplus
+extern "C" {
+#endif
There is no C++ code in libguestfs, so this is not needed.
--
Pino Toscano