Jelajahi Sumber

Qdevice: Quote str func compatible with simple_lex

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 9 tahun lalu
induk
melakukan
3b3d562fc8
3 mengubah file dengan 192 tambahan dan 118 penghapusan
  1. 37 0
      qdevices/dynar-str.c
  2. 4 0
      qdevices/dynar-str.h
  3. 151 118
      qdevices/test-dynar-simple-lex.c

+ 37 - 0
qdevices/dynar-str.c

@@ -126,3 +126,40 @@ dynar_str_catf(struct dynar *dest, const char *format, ...)
 
 	return (res);
 }
+
+int
+dynar_str_quote_cat(struct dynar *dest, const char *str)
+{
+	size_t zi;
+
+	if (dynar_str_cat(dest, "\"") != 0) {
+		return (-1);
+	}
+
+	for (zi = 0; zi < strlen(str); zi++) {
+		if (str[zi] == '"' || str[zi] == '\\') {
+			if (dynar_str_cat(dest, "\\") != 0) {
+				return (-1);
+			}
+		}
+
+		if (dynar_cat(dest, &str[zi], sizeof(str[zi])) != 0) {
+			return (-1);
+		}
+	}
+
+	if (dynar_str_cat(dest, "\"") != 0) {
+		return (-1);
+	}
+
+	return (0);
+}
+
+int
+dynar_str_quote_cpy(struct dynar *dest, const char *str)
+{
+
+	dynar_clean(dest);
+
+	return (dynar_str_quote_cat(dest, str));
+}

+ 4 - 0
qdevices/dynar-str.h

@@ -53,6 +53,10 @@ extern int		dynar_str_vcatf(struct dynar *dest, const char *format, va_list ap)
 
 extern int		dynar_str_prepend(struct dynar *dest, const char *str);
 
+extern int		dynar_str_quote_cat(struct dynar *dest, const char *str);
+
+extern int		dynar_str_quote_cpy(struct dynar *dest, const char *str);
+
 #ifdef __cplusplus
 }
 #endif

+ 151 - 118
qdevices/test-dynar-simple-lex.c

@@ -45,165 +45,198 @@ main(void)
 {
 	struct dynar input_str;
 	struct dynar_simple_lex lex;
-	struct dynar *output_str;
+	struct dynar *output_str_ptr;
+	struct dynar output_str;
+	const char *cstr;
 
 	dynar_init(&input_str, 128);
 
-	dynar_str_catf(&input_str, "token1 token2");
+	assert(dynar_str_catf(&input_str, "token1 token2") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_PLAIN);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "token1") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "token2") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "token1") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "token2") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "	 token1			   token2		");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "	 token1			   token2		") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_PLAIN);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "token1") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "token2") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "token1") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "token2") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "      token1		 	token2	 	\ntoken3");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "      token1		 	token2	 	\ntoken3") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_PLAIN);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "token1") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "token2") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "token1") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "token2") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "\\ab\\cd e\\fg\\ h i\\");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "\\ab\\cd e\\fg\\ h i\\") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_PLAIN);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "\\ab\\cd") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "e\\fg\\") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "h") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "i\\") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "\\ab\\cd") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "e\\fg\\") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "h") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "i\\") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, " a b\rc");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, " a b\rc") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_PLAIN);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "a") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "b") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "a") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "b") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "\\ab\\\\cd e\\fg\\ h i\\");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "\\ab\\\\cd e\\fg\\ h i\\") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_BACKSLASH);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "ab\\cd") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "efg h") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "i") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "ab\\cd") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "efg h") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "i") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "ab\\\\cd e\\fg\\ h ij\\\na");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "ab\\\\cd e\\fg\\ h ij\\\na") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_BACKSLASH);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "ab\\cd") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "efg h") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "ij") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "ab\\cd") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "efg h") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "ij") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, " a b\\\rc");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, " a b\\\rc") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_BACKSLASH);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "a") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "b") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "a") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "b") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "abc def \"ghi\" jkl \"m n	o\"");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "abc def \"ghi\" jkl \"m n	o\"") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_QUOTE);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "abc") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "def") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "ghi") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "jkl") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "m n	o") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "abc") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "def") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "ghi") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "jkl") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "m n	o") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "a\\bc \"d\\e \\\"f\\\\  \\\"  \"g hij");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "a\\bc \"d\\e \\\"f\\\\  \\\"  \"g hij") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_QUOTE);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "abc") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "d\\e \"f\\  \"  g") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "hij") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "abc") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "d\\e \"f\\  \"  g") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "hij") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "abc \"d e  \r\n");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "abc \"d e  \r\n") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_QUOTE);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "abc") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "d e  ") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "abc") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "d e  ") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
-	dynar_str_cpy(&input_str, "");
-	dynar_str_catf(&input_str, "abc \"d e  \\\"\\\r\n");
+	assert(dynar_str_cpy(&input_str, "") == 0);
+	assert(dynar_str_catf(&input_str, "abc \"d e  \\\"\\\r\n") != -1);
 	dynar_simple_lex_init(&lex, &input_str, DYNAR_SIMPLE_LEX_TYPE_QUOTE);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "abc") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "d e  \"") == 0);
-	assert((output_str = dynar_simple_lex_token_next(&lex)) != NULL);
-	assert(strcmp(dynar_data(output_str), "") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "abc") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "d e  \"") == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
 	dynar_simple_lex_destroy(&lex);
 
+	dynar_init(&output_str, 128);
+	assert(dynar_str_quote_cpy(&output_str, "abcd") == 0);
+	assert(dynar_size(&output_str) == 6);
+	assert(memcmp(dynar_data(&output_str), "\"abcd\"", dynar_size(&output_str)) == 0);
+	assert(dynar_str_cat(&output_str, " ") == 0);
+	assert(dynar_str_quote_cat(&output_str, "abcd") == 0);
+	assert(dynar_size(&output_str) == 13);
+	assert(memcmp(dynar_data(&output_str), "\"abcd\" \"abcd\"", dynar_size(&output_str)) == 0);
+
+	assert(dynar_str_quote_cpy(&output_str, "ab\\cd") == 0);
+	assert(dynar_size(&output_str) == 8);
+	assert(memcmp(dynar_data(&output_str), "\"ab\\\\cd\"", dynar_size(&output_str)) == 0);
+
+	assert(dynar_str_quote_cpy(&output_str, "ab\\\\cd") == 0);
+	assert(dynar_size(&output_str) == 10);
+	assert(memcmp(dynar_data(&output_str), "\"ab\\\\\\\\cd\"", dynar_size(&output_str)) == 0);
+
+	assert(dynar_str_quote_cpy(&output_str, "ab cd \\\"e") == 0);
+	assert(dynar_size(&output_str) == 13);
+	assert(memcmp(dynar_data(&output_str), "\"ab cd \\\\\\\"e\"", dynar_size(&output_str)) == 0);
+
+	cstr = "ab cd \\ ef\\g h\"i";
+	assert(dynar_str_quote_cpy(&output_str, cstr) == 0);
+	dynar_simple_lex_init(&lex, &output_str, DYNAR_SIMPLE_LEX_TYPE_QUOTE);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strlen(cstr) == dynar_size(output_str_ptr) - 1);
+	assert(memcmp(cstr, dynar_data(output_str_ptr), strlen(cstr)) == 0);
+	assert((output_str_ptr = dynar_simple_lex_token_next(&lex)) != NULL);
+	assert(strcmp(dynar_data(output_str_ptr), "") == 0);
+	dynar_simple_lex_destroy(&lex);
 
 	dynar_destroy(&input_str);
+	dynar_destroy(&output_str);
 
 	return (0);
 }