157 lines
5.0 KiB
C
157 lines
5.0 KiB
C
/*
|
|
*
|
|
* Copyright (C) 2006-2007 Peter Johnson
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "util.h"
|
|
#include "libyasm/errwarn.h"
|
|
#include "libyasm/file.h"
|
|
|
|
typedef struct Test_Entry {
|
|
/* input string */
|
|
const char *input;
|
|
|
|
/* input length */
|
|
size_t in_len;
|
|
|
|
/* correct output string */
|
|
const char *result;
|
|
|
|
/* correct output length */
|
|
size_t result_len;
|
|
|
|
/* expected warning, if any */
|
|
const char *warn;
|
|
} Test_Entry;
|
|
|
|
static Test_Entry tests[] = {
|
|
{"noescape", 8, "noescape", 8, NULL},
|
|
{"noescape2", 10, "noescape2", 10, NULL}, /* includes trailing zero */
|
|
{"\\\\\\b\\f\\n\\r\\t\\\"", 14, "\\\b\f\n\r\t\"", 7, NULL},
|
|
{"\\a", 2, "a", 1, NULL},
|
|
/* hex tests */
|
|
{"\\x", 2, "\x00", 1, NULL},
|
|
{"\\x12", 4, "\x12", 1, NULL},
|
|
{"\\x1234", 6, "\x34", 1, NULL},
|
|
{"\\xg", 3, "\x00g", 2, NULL},
|
|
{"\\xaga", 5, "\x0aga", 3, NULL},
|
|
{"\\xaag", 5, "\xaag", 2, NULL},
|
|
{"\\xaaa", 5, "\xaa", 1, NULL},
|
|
{"\\x55559", 7, "\x59", 1, NULL},
|
|
|
|
/* oct tests */
|
|
{"\\778", 4, "\000", 1, "octal value out of range"},
|
|
{"\\779", 4, "\001", 1, "octal value out of range"},
|
|
{"\\1x", 3, "\001x", 2, NULL},
|
|
{"\\7779", 5, "\xff" "9", 2, NULL},
|
|
{"\\7999", 5, "\x11" "9", 2, "octal value out of range"},
|
|
{"\\77a", 4, "\077a", 2, NULL},
|
|
{"\\5555555", 8, "\x6d" "5555", 5, NULL},
|
|
{"\\9999", 5, "\x91" "9", 2, "octal value out of range"},
|
|
};
|
|
|
|
static char failed[1000];
|
|
static char failmsg[100];
|
|
|
|
static int
|
|
run_test(Test_Entry *test)
|
|
{
|
|
char str[256];
|
|
size_t len;
|
|
yasm_warn_class wclass;
|
|
char *wstr;
|
|
|
|
strncpy(str, test->input, test->in_len);
|
|
len = test->in_len;
|
|
|
|
yasm_unescape_cstring((unsigned char *)str, &len);
|
|
if (len != test->result_len) {
|
|
sprintf(failmsg,
|
|
"unescape_cstring(\"%s\", %lu) bad output len: expected %lu, got %lu!",
|
|
test->input, (unsigned long)test->in_len,
|
|
(unsigned long)test->result_len, (unsigned long)len);
|
|
return 1;
|
|
}
|
|
|
|
if (strncmp(str, test->result, len) != 0) {
|
|
sprintf(failmsg,
|
|
"unescape_cstring(\"%s\", %lu) bad output: expected \"%s\", got \"%s\"!",
|
|
test->input, (unsigned long)test->in_len, test->result, str);
|
|
return 1;
|
|
}
|
|
|
|
yasm_warn_fetch(&wclass, &wstr);
|
|
if (wstr != NULL && test->warn == NULL) {
|
|
sprintf(failmsg,
|
|
"unescape_cstring(\"%s\", %lu) unexpected warning: %s!",
|
|
test->input, (unsigned long)test->in_len, wstr);
|
|
return 1;
|
|
}
|
|
if (wstr == NULL && test->warn != NULL) {
|
|
sprintf(failmsg,
|
|
"unescape_cstring(\"%s\", %lu) expected warning: %s, did not get it!",
|
|
test->input, (unsigned long)test->in_len, test->warn);
|
|
return 1;
|
|
}
|
|
if (wstr && test->warn && strcmp(wstr, test->warn) != 0) {
|
|
sprintf(failmsg,
|
|
"unescape_cstring(\"%s\", %lu) expected warning: %s, got %s!",
|
|
test->input, (unsigned long)test->in_len, test->warn, wstr);
|
|
return 1;
|
|
}
|
|
yasm_xfree(wstr);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
int nf = 0;
|
|
int numtests = sizeof(tests)/sizeof(Test_Entry);
|
|
int i;
|
|
|
|
yasm_errwarn_initialize();
|
|
|
|
failed[0] = '\0';
|
|
printf("Test uncstring_test: ");
|
|
for (i=0; i<numtests; i++) {
|
|
int fail = run_test(&tests[i]);
|
|
printf("%c", fail>0 ? 'F':'.');
|
|
fflush(stdout);
|
|
if (fail)
|
|
sprintf(failed, "%s ** F: %s\n", failed, failmsg);
|
|
nf += fail;
|
|
}
|
|
|
|
printf(" +%d-%d/%d %d%%\n%s",
|
|
numtests-nf, nf, numtests, 100*(numtests-nf)/numtests, failed);
|
|
|
|
yasm_errwarn_cleanup();
|
|
return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|