Index: ossp-pkg/var/var.c RCS File: /v/ossp/cvs/ossp-pkg/var/var.c,v rcsdiff -q -kk '-r1.3' '-r1.4' -u '/v/ossp/cvs/ossp-pkg/var/var.c,v' 2>/dev/null --- var.c 2001/11/13 12:45:49 1.3 +++ var.c 2001/11/13 13:25:18 1.4 @@ -364,10 +364,26 @@ case '7': case '8': case '9': - if ((rc = expand_octal(&src, &dst, end)) != 0) - return rc; - break; + if (!unescape_all) + { + if (end - src >= 3 && isdigit(src[1]) && isdigit(src[2])) + { + if ((rc = expand_octal(&src, &dst, end)) != 0) + return rc; + break; + } + } + else + { + if ((rc = expand_octal(&src, &dst, end)) != 0) + return rc; + break; + } default: + if (!unescape_all) + { + *dst++ = '\\'; + } *dst++ = *src; } ++src; Index: ossp-pkg/var/var_test.c RCS File: /v/ossp/cvs/ossp-pkg/var/var_test.c,v rcsdiff -q -kk '-r1.2' '-r1.3' -u '/v/ossp/cvs/ossp-pkg/var/var_test.c,v' 2>/dev/null --- var_test.c 2001/11/13 12:46:50 1.2 +++ var_test.c 2001/11/13 13:25:18 1.3 @@ -79,7 +79,8 @@ { "${FOO:p/15/../r}", ".............os" }, { "${FOO:p/15/12345/r}", "1234512345123os" }, { "${FOO:p/15/../c}", "......os......." }, - { "${FOO:p/15/12345/c}", "123451os1234512" } + { "${FOO:p/15/12345/c}", "123451os1234512" }, + { "${FOO:s/os/\\x{4F}\\123/g}", "OS" } }; /* { "${HOME:s/g(res)s/x\\\\1x/g}","/homE/rEgrEssion-tEsts" } @@ -89,6 +90,7 @@ size_t tmp_len; var_rc_t rc; size_t i; + char buffer[1024]; if (setenv("HOME", "/home/regression-tests", 1) != 0 || setenv("OSTYPE", "regression-os", 1) != 0 || @@ -104,8 +106,15 @@ for (i = 0; i < sizeof(tests) / sizeof(struct test_case); ++i) { - rc = var_expand(tests[i].input, strlen(tests[i].input), - &tmp, &tmp_len, + printf("Test case #%02d: Original input is '%s'.\n", i, tests[i].input); + rc = var_unescape(tests[i].input, strlen(tests[i].input), buffer, 0); + if (rc != VAR_OK) + { + printf("Test case #%d: First var_unescape() failed with return code %d.\n", i, rc); + return 1; + } + printf("Test case #%02d: Unescaped input is '%s'.\n", i, buffer); + rc = var_expand(buffer, strlen(buffer), &tmp, &tmp_len, &env_lookup, NULL, NULL, 0); if (rc != VAR_OK) @@ -113,12 +122,19 @@ printf("Test case #%d: var_expand() failed with return code %d.\n", i, rc); return 1; } + printf("Test case #%02d: Expanded output is '%s'.\n", i, tmp); if (tmp_len != strlen(tests[i].expected) || tmp == NULL || memcmp(tests[i].expected, tmp, tmp_len) != 0) { printf("Test case #%d: Expected result '%s' but got '%s'.\n", i, tests[i].expected, tmp); return 1; } - printf("Test case #%02d: '%s' --> '%s'.\n", i, tests[i].input, tmp); + rc = var_unescape(tests[i].input, strlen(tests[i].input), buffer, 1); + if (rc != VAR_OK) + { + printf("Test case #%d: Second var_unescape() failed with return code %d.\n", i, rc); + return 1; + } + printf("Test case #%02d: Unescaped output is '%s'.\n\n", i, tmp); free(tmp); }