The following commit has been merged in the master branch: commit 161164c55640a6e034c8e00ebd1fb504e5357c1d Author: Patrick Winnertz <win...@debian.org> Date: Fri Feb 6 14:50:22 2009 +0100
Reworked shell_unescape function in order to make use of glib. This commit will replace some *ptr = c; stuff with g_string_append_c(str,c); in order to use glib here. Signed-off-by: Patrick Winnertz <win...@debian.org> diff --git a/src/util.c b/src/util.c index 96396c0..2046f10 100644 --- a/src/util.c +++ b/src/util.c @@ -1562,7 +1562,7 @@ shell_escape(const char* src) return strdup(""); str = g_string_new(""); - + /* look for the first char to escape */ while (1) { @@ -1594,21 +1594,28 @@ shell_escape(const char* src) string for unescaping \returns - return unescaped string + return unescaped string (which needs to be freed) */ char* -shell_unescape(char* text) +shell_unescape(const char* text) { + GString *str; + char *result = NULL; + if (!text) return NULL; + /* look for the first \ - that's quick skipover if there's nothing to escape */ - char* readptr = text; + const char* readptr = text; while ((*readptr) && ((*readptr)!='\\')) readptr++; - if (!(*readptr)) return text; + if (!(*readptr)) { + result = g_strdup(text); + return result; + } + str = g_string_new(""); /* if we're here, we're standing on the first '\' */ - char* writeptr = readptr; char c; while ((c = *readptr)) { @@ -1617,9 +1624,9 @@ shell_unescape(char* text) readptr++; switch ((c = *readptr)) { - case 'n': (*writeptr) = '\n'; writeptr++; break; - case 'r': (*writeptr) = '\r'; writeptr++; break; - case 't': (*writeptr) = '\t'; writeptr++; break; + case 'n': g_string_append_c(str,'\n'); break; + case 'r': g_string_append_c(str,'\r'); break; + case 't': g_string_append_c(str,'\t'); break; case ' ': case '\\': @@ -1644,20 +1651,21 @@ shell_unescape(char* text) case '\0': /* end of string! malformed escape string */ goto out; default: - (*writeptr) = c; writeptr++; break; + g_string_append_c(str,c); break; } } else /* got a normal character */ { - (*writeptr) = *readptr; - writeptr++; + g_string_append_c(str,c); } readptr++; } out: - *writeptr = 0; + g_string_append_c(str,'\0'); - return text; + result = str->str; + g_string_free(str,FALSE); + return result; } /** Check if char in pointer contain escape'd chars diff --git a/src/util.h b/src/util.h index e5daccb..1ac88dd 100644 --- a/src/util.h +++ b/src/util.h @@ -259,7 +259,7 @@ const char *Q_ (const char *s); gboolean shell_is_char_escaped ( const char * ); -char *shell_unescape( char * ); +char *shell_unescape( const char * ); char *shell_escape( const char * ); #define str_dup_range(s_start, s_bound) (g_strndup(s_start, s_bound - s_start)) -- Midnight Commander Development _______________________________________________ Mc-devel mailing list http://mail.gnome.org/mailman/listinfo/mc-devel