aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2007-01-19 02:02:46 +1000
committerGravatar axel <axel@liljencrantz.se>2007-01-19 02:02:46 +1000
commit9e7094adfcbb2cfb63f1ea6ac587354dd3463e48 (patch)
treecba6404824bea5b839233770ec396b475db3cb54
parent19e8d6017994dd3585ff1da8a4ecd37c8f2a1f8c (diff)
Fix bug in code for unescapiong strings - when not in unescape_special mode, quotes would not get properly removed. This patch also adds the ability to check that quotes match up when unescaping. This functionality is on by default and can be disabled using a special flag.
darcs-hash:20070118160246-ac50b-b230c3fcd8440025b5243d76de2a9fd400f7ea32.gz
-rw-r--r--common.c21
-rw-r--r--common.h4
2 files changed, 23 insertions, 2 deletions
diff --git a/common.c b/common.c
index 431d4e1a..a28bff46 100644
--- a/common.c
+++ b/common.c
@@ -791,7 +791,7 @@ wchar_t *escape( const wchar_t *in,
}
-wchar_t *unescape( const wchar_t * orig, int unescape_special )
+wchar_t *unescape( const wchar_t * orig, int flags )
{
int mode = 0;
@@ -800,7 +800,9 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
int bracket_count=0;
wchar_t prev=0;
wchar_t *in;
-
+ int unescape_special = flags & UNESCAPE_SPECIAL;
+ int allow_incomplete = flags & UNESCAPE_INCOMPLETE;
+
CHECK( orig, 0 );
len = wcslen( orig );
@@ -1153,6 +1155,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
mode = 1;
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
+ else
+ out_pos--;
break;
}
@@ -1161,6 +1165,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
mode = 2;
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
+ else
+ out_pos--;
break;
}
@@ -1209,6 +1215,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
{
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
+ else
+ out_pos--;
mode = 0;
}
else
@@ -1231,6 +1239,8 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
mode = 0;
if( unescape_special )
in[out_pos] = INTERNAL_SEPARATOR;
+ else
+ out_pos--;
break;
}
@@ -1287,6 +1297,13 @@ wchar_t *unescape( const wchar_t * orig, int unescape_special )
}
}
}
+
+ if( !allow_incomplete && mode )
+ {
+ free( in );
+ return 0;
+ }
+
in[out_pos]=L'\0';
return in;
}
diff --git a/common.h b/common.h
index d6559cd0..af3a723e 100644
--- a/common.h
+++ b/common.h
@@ -40,6 +40,10 @@
*/
#define BYTE_MAX 0xffu
+#define UNESCAPE_SPECIAL 1
+#define UNESCAPE_INCOMPLETE 2
+
+
/**
Save the shell mode on startup so we can restore them on exit
*/