head 1.28; access; symbols STR_0_9_12:1.28 LMTP2NNTP_1_4_1:1.28 LMTP2NNTP_1_4_0:1.28 STR_0_9_11:1.28 STR_0_9_10:1.28 LMTP2NNTP_1_3_0:1.27 LMTP2NNTP_1_3b2:1.27 LMTP2NNTP_1_3b1:1.27 LMTP2NNTP_1_3a3:1.27 LMTP2NNTP_1_3a2:1.27 STR_0_9_9:1.27 LMTP2NNTP_1_3a1:1.27 STR_0_9_8:1.27 LMTP2NNTP_1_2_0:1.27 LMTP2NNTP_1_2b4:1.27 LMTP2NNTP_1_2b3:1.27 LMTP2NNTP_1_2b2:1.27 LMTP2NNTP_1_2b1:1.26 LMTP2NNTP_1_2a8:1.26 LMTP2NNTP_1_2a7:1.26 LMTP2NNTP_1_2a6:1.25 LMTP2NNTP_1_2a5:1.25 STR_0_9_7:1.25 LMTP2NNTP_1_2a4:1.23 LMTP2NNTP_1_2a3:1.23 OSSP_RC_SPEC:1.23 LMTP2NNTP_1_2a1:1.21 LMTP2NNTP_1_1_1:1.21 LMTP2NNTP_1_1_0:1.21 LMTP2NNTP_1_1b4:1.21 LMTP2NNTP_1_1b3:1.21 LMTP2NNTP_1_1b2:1.21 LMTP2NNTP_1_1b1:1.21 STR_0_9_6:1.21 STR_0_9_5:1.21 STR_0_9_4:1.19 STR_0_9_3:1.18 STR_0_9_2:1.17 STR_0_9_1:1.15 STR_0_9_0:1.15 str_init:1.1.1.1 str:1.1.1; locks; strict; comment @ * @; 1.28 date 2005.01.24.15.22.19; author rse; state Exp; branches; next 1.27; 1.27 date 2003.02.11.08.45.27; author rse; state Exp; branches; next 1.26; 1.26 date 2003.01.06.19.13.48; author rse; state Exp; branches; next 1.25; 1.25 date 2002.04.01.09.03.49; author rse; state Exp; branches; next 1.24; 1.24 date 2002.04.01.08.32.54; author rse; state Exp; branches; next 1.23; 1.23 date 2002.01.02.17.09.13; author rse; state Exp; branches; next 1.22; 1.22 date 2001.12.27.12.11.01; author rse; state Exp; branches; next 1.21; 1.21 date 2001.08.16.13.21.23; author rse; state Exp; branches; next 1.20; 1.20 date 2001.08.16.13.16.31; author rse; state Exp; branches; next 1.19; 1.19 date 2000.03.01.11.08.48; author rse; state Exp; branches; next 1.18; 1.18 date 2000.02.21.13.02.38; author rse; state Exp; branches; next 1.17; 1.17 date 2000.01.20.18.56.18; author rse; state Exp; branches; next 1.16; 1.16 date 2000.01.10.11.55.58; author rse; state Exp; branches; next 1.15; 1.15 date 2000.01.01.13.05.18; author rse; state Exp; branches; next 1.14; 1.14 date 99.12.28.10.47.28; author rse; state Exp; branches; next 1.13; 1.13 date 99.12.28.10.19.00; author rse; state Exp; branches; next 1.12; 1.12 date 99.12.27.15.53.31; author rse; state Exp; branches; next 1.11; 1.11 date 99.12.27.13.43.06; author rse; state Exp; branches; next 1.10; 1.10 date 99.12.26.16.32.22; author rse; state Exp; branches; next 1.9; 1.9 date 99.12.26.16.30.17; author rse; state Exp; branches; next 1.8; 1.8 date 99.12.25.18.23.02; author rse; state Exp; branches; next 1.7; 1.7 date 99.11.26.17.04.21; author rse; state Exp; branches; next 1.6; 1.6 date 99.11.26.16.48.27; author rse; state Exp; branches; next 1.5; 1.5 date 99.11.24.09.48.21; author rse; state Exp; branches; next 1.4; 1.4 date 99.11.23.16.08.11; author rse; state Exp; branches; next 1.3; 1.3 date 99.11.23.08.58.42; author rse; state Exp; branches; next 1.2; 1.2 date 99.11.23.08.57.35; author rse; state Exp; branches; next 1.1; 1.1 date 99.11.22.17.29.12; author rse; state Exp; branches 1.1.1.1; next ; 1.1.1.1 date 99.11.22.17.29.12; author rse; state Exp; branches; next ; desc @@ 1.28 log @Adjusted copyright messages for new year 2004/2005. @ text @/* ** OSSP str - String Handling ** Copyright (c) 1999-2005 Ralf S. Engelschall ** Copyright (c) 1999-2005 The OSSP Project ** ** This file is part of OSSP str, a string handling and manipulation ** library which can be found at http://www.ossp.org/pkg/lib/str/. ** ** Permission to use, copy, modify, and distribute this software for ** any purpose with or without fee is hereby granted, provided that ** the above copyright notice and this permission notice appear in all ** copies. ** ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS AND COPYRIGHT HOLDERS AND THEIR ** 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. ** ** str_test.c: test suite */ #include #include #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(HAVE_DMALLOC_H) && defined(WITH_DMALLOC) #include "dmalloc.h" #endif #include "str.h" #include "ts.h" #define LONG_STRING 1024 /* * Test String Length */ TS_TEST(test_length) { ts_test_check(TS_CTX, "NULL handling"); if (str_len(NULL) != 0) ts_test_fail(TS_CTX, "unexpected non-zero return"); ts_test_check(TS_CTX, "empty string handling"); if (str_len("") != 0) ts_test_fail(TS_CTX, "unexpected non-zero return"); ts_test_check(TS_CTX, "short string handling"); if (str_len("a") != 1) ts_test_fail(TS_CTX, "unexpected return != 1"); ts_test_check(TS_CTX, "longer string handling"); if (str_len("foo bar quux") != 12) ts_test_fail(TS_CTX, "unexpected return != 12"); return; } /* * Test String Locating */ struct { char *s; str_size_t n; char *p; int o; } loctab[] = { { "foo bar quux", 0, "", 0 }, { "foo bar quux", 0, "foo", 0 }, { "foo bar quux", 0, "bar", 4 }, { "foo bar quux", 0, "quux", 8 }, { "foo bar quux", 0, "x", 11 }, { "foo bar quux", 3, "foo", 0 }, { "foo bar quux", 4, "x", -1 }, { "foo bar quux", 5, "bar", -1 }, { "foo bar", 0, "foo bar", 0 }, { "foo bar", 0, "foo bar quux", -1 }, { NULL, 0, NULL, 0 } }; TS_TEST(test_locate) { int i; char *rv; for (i = 0; loctab[i].s != NULL; i++) { rv = str_locate(loctab[i].s, loctab[i].n, loctab[i].p); ts_test_check(TS_CTX, "str_locate(\"%s\", %d, \"%s\") = \"%s\"", loctab[i].s, loctab[i].n, loctab[i].p, rv == NULL ? "[NULL]" : rv); if (!((rv-loctab[i].s == loctab[i].o) || (rv == NULL && loctab[i].o == -1))) ts_test_fail(TS_CTX, "result was \"%s\", expected \"%s\"", rv, loctab[i].s+loctab[i].o); } return; } /* * Test String Spanning */ struct { char *s; str_size_t n; char *cs; int m; int o; } spantab[] = { { "foo bar quux", 0, "", 0, 0 }, { "foo bar quux", 0, "xyz", 0, 0 }, { "foo bar quux", 0, "fo ", 0, 4 }, { "foo bar quux", 0, "b", STR_COMPLEMENT, 4 }, { "foo bar quux", 0, "", STR_COMPLEMENT, 12 }, { "foo bar quux", 0, "", STR_RIGHT, 11 }, { "foo bar quux", 0, "abc", STR_RIGHT, 11 }, { "foo bar quux", 0, "qux ", STR_RIGHT, 6 }, { "foo bar quux", 0, "r", STR_RIGHT|STR_COMPLEMENT, 6 }, { "foo bar quux", 0, "", STR_RIGHT|STR_COMPLEMENT, 0 }, { "", 0, "", STR_COMPLEMENT, 0 }, { "", 0, "", STR_RIGHT|STR_COMPLEMENT, 0 }, { NULL, 0, NULL, 0, 0 } }; TS_TEST(test_span) { int i; char *rv; for (i = 0; spantab[i].s != NULL; i++) { rv = str_span(spantab[i].s, spantab[i].n, spantab[i].cs, spantab[i].m); ts_test_check(TS_CTX, "str_span(\"%s\", %d, \"%s\", %d) = \"%s\"", spantab[i].s, spantab[i].n, spantab[i].cs, spantab[i].m, rv); if (rv-spantab[i].s != spantab[i].o) ts_test_fail(TS_CTX, "result was \"%s\", expected \"%s\"", rv, spantab[i].s+spantab[i].o); } return; } /* * Test String Tokenization */ struct { char *s; char *d; char *q; char *c; int f; char *r[4]; } toktab[] = { { "foo bar quux", " \t", "\"'", "#", 0, { "foo", "bar", "quux", NULL } }, { " foo \t \"bar \t b'az\" quux#vwxyz", " \t", "\"'", "#", STR_STRIPQUOTES, { "foo", "bar \t b'az", "quux", NULL } }, { NULL, NULL, NULL, NULL, 0, { NULL, NULL, NULL, NULL } } }; static char *prstr_tab[200]; static int prstr_idx = 0; static char *prstr(char *s) { char *cp; char *p, *q; if (s == NULL) return "NULL"; if ((cp = malloc(strlen(s)+20)) == NULL) return "ERROR"; prstr_tab[prstr_idx++] = cp; q = cp; p = s; *q++ = '"'; while (*p != NUL) { switch (*p) { case '\t': *q++ = '\\'; *q++ = 't'; p++; break; case '\n': *q++ = '\\'; *q++ = 'n'; p++; break; case '\r': *q++ = '\\'; *q++ = 'r'; p++; break; case '"': *q++ = '\\'; *q++ = '"'; p++; break; default: *q++ = *p++; } } *q++ = '"'; *q = NUL; return cp; } static void prstr_free(void) { while (prstr_idx > 0) free(prstr_tab[--prstr_idx]); return; } TS_TEST(test_tokenize) { char *cp; char *cp2; char *cp3; char *rc; int i, j; for (i = 0; toktab[i].s != NULL; i++) { ts_test_check(TS_CTX, "tokenization of \"%s\"\n", prstr(toktab[i].s)); prstr_free(); cp2 = cp = strdup(toktab[i].s); for (j = 0; j < 4; j++) { cp3 = strdup(cp); rc = str_token(&cp, toktab[i].d, toktab[i].q, toktab[i].c, toktab[i].f); ts_test_check(TS_CTX, "str_token(&%s, %s, %s, %s, %d) = %s", prstr(cp3), prstr(toktab[i].d), prstr(toktab[i].q), prstr(toktab[i].c), toktab[i].f, prstr(rc)), prstr_free(); free(cp3); if (!( (rc == NULL && toktab[i].r[j] == NULL) || (rc != NULL && toktab[i].r[j] != NULL && strcmp(rc, toktab[i].r[j]) == 0))) { ts_test_fail(TS_CTX, "expected result is \"%s\"", prstr(toktab[i].r[j])); prstr_free(); } } free(cp2); } return; } /* * Test String Parsing */ struct { char *s; char *p; char *r1; char *r2; char *r3; char *r4; int rv; } test2_tab[] = { { "foobar", "foobar", NULL, NULL, NULL, NULL, 1 }, { "foobar", "m/^foobar$/", NULL, NULL, NULL, NULL, 1 }, { "foobar", "foobarquux", NULL, NULL, NULL, NULL, 0 }, { "foobar", "foo", NULL, NULL, NULL, NULL, 1 }, { "foobar", "?", NULL, NULL, NULL, NULL, -1 }, { "foobar", "m/(foo|bar)(bar|foo)/", "foo", "bar", NULL, NULL, 1 }, { "foobar", "m&(?:foo|bar)(?:bar|foo)&", NULL, NULL, NULL, NULL, 1 }, { "foobar", "m/(?:foo|bar)(?:bar|foo)/o", NULL, NULL, NULL, NULL, 1 }, { "foobar", "m/(?:FOO|BAR)(?:bar|foo)/io", NULL, NULL, NULL, NULL, 1 }, { "foobar", "((f(.)\\3)(b.*))", "foobar", "foo", "o", "bar", 1 }, { "foobar", "s/((f(.)\\3)(b.*))/$2-$4/io", "foo-bar", NULL, NULL, NULL, 1 }, { "foobar", "s/((f(.)\\3)(b.*))/$2-%s-$4/io", "foo-quux-bar", "quux", NULL, NULL, 1 }, { "foobar", "s/((f(.)\\3)(b.*))/$2-%s-%s-%s-$4/io", "foo-quux-baz-0815-bar", "quux", "baz", "0815", 1 }, { "foo:bar", "m/^(f[^:]+):(.*)$/", "foo", "bar", NULL, NULL, 1 }, { "foo:bar", "s/^([^:]+):(.*)$/$1-%s-$2/o", "foo-quux-bar", "quux", NULL, NULL, 1 }, { NULL, NULL, NULL, NULL, NULL, NULL, 0 } }; TS_TEST(test_parsing) { int i; int rv; char *r1, *r2, *r3, *r4; for (i = 0; test2_tab[i].s != NULL; i++) { ts_test_check(TS_CTX, "str_parse(\"%s\", \"%s\", ...)", test2_tab[i].s, test2_tab[i].p); if (*(test2_tab[i].p) == 's') { r1 = NULL; r2 = test2_tab[i].r2; r3 = test2_tab[i].r3; r4 = test2_tab[i].r4; rv = str_parse(test2_tab[i].s, test2_tab[i].p, &r1, r2, r3, r4); } else { r1 = r2 = r3 = r4 = NULL; rv = str_parse(test2_tab[i].s, test2_tab[i].p, &r1, &r2, &r3, &r4); } if (rv != test2_tab[i].rv || ((r1 == NULL && test2_tab[i].r1 != NULL) || (r1 != NULL && test2_tab[i].r1 == NULL) || (r1 != NULL && test2_tab[i].r1 != NULL && strcmp(r1, test2_tab[i].r1) != 0)) || ((r2 == NULL && test2_tab[i].r2 != NULL) || (r2 != NULL && test2_tab[i].r2 == NULL) || (r2 != NULL && test2_tab[i].r2 != NULL && strcmp(r2, test2_tab[i].r2) != 0)) || ((r3 == NULL && test2_tab[i].r3 != NULL) || (r3 != NULL && test2_tab[i].r3 == NULL) || (r3 != NULL && test2_tab[i].r3 != NULL && strcmp(r3, test2_tab[i].r3) != 0)) || ((r4 == NULL && test2_tab[i].r4 != NULL) || (r4 != NULL && test2_tab[i].r4 == NULL) || (r4 != NULL && test2_tab[i].r4 != NULL && strcmp(r4, test2_tab[i].r4) != 0))) { ts_test_fail(TS_CTX, "expected result: %d + <%s><%s><%s><%s>", test2_tab[i].rv, test2_tab[i].r1 == NULL ? "NULL" : test2_tab[i].r1, test2_tab[i].r2 == NULL ? "NULL" : test2_tab[i].r2, test2_tab[i].r3 == NULL ? "NULL" : test2_tab[i].r3, test2_tab[i].r4 == NULL ? "NULL" : test2_tab[i].r4); } if (*(test2_tab[i].p) == 's') { if (r1 != NULL) free(r1); } else { if (r1 != NULL) free(r1); if (r2 != NULL) free(r2); if (r3 != NULL) free(r3); if (r4 != NULL) free(r4); } } str_parse(NULL, NULL); return; } /* * Test String Formatting */ TS_TEST(test_formatting) { char buf1[LONG_STRING]; char buf2[LONG_STRING]; char *fp_fmt[] = { "%-1.5f", "%1.5f", "%123.9f", "%10.5f", "% 10.5f", "%+22.9f", "%+4.9f", "%01.3f", "%4f", "%3.1f", "%3.2f", "%.0f", "%.1f", NULL }; double fp_nums[] = { -1.5, 134.21, 91340.2, 341.1234, 0203.9, 0.96, 0.996, 0.9996, 1.996, 4.136, 0 }; char *int_fmt[] = { "%-1.5d", "%1.5d", "%123.9d", "%5.5d", "%10.5d", "% 10.5d", "%+22.33d", "%01.3d", "%4d", #if defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG > 0) "%12qd", #endif NULL }; #if defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG > 0) long long #else long #endif int_nums[] = { -1, 134, 91340, 341, 0203, 4294967290UL, /* less than 2^32 */ #if defined(SIZEOF_LONG_LONG) && (SIZEOF_LONG_LONG > 0) 4294967297ULL, /* more than 2^32 (actually 2^32 + 1) */ #endif 0 }; int x, y; int len; ts_test_check(TS_CTX, "str_format vs. vendor sprintf comparison"); for (x = 0; fp_fmt[x] != NULL; x++) { ts_test_check(TS_CTX, "str_format(..,..,\"%s\",..)", fp_fmt[x]); for (y = 0; fp_nums[y] != 0; y++) { len = str_format(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]); sprintf(buf2, fp_fmt[x], fp_nums[y]); if (strcmp(buf1, buf2) != 0) ts_test_fail(TS_CTX, "mismatch: str_format: \"%s\", snprintf: \"%s\"", buf1, buf2); } } for (x = 0; int_fmt[x] != NULL; x++) { ts_test_check(TS_CTX, "str_format(..,..,\"%s\",..)", int_fmt[x]); for (y = 0; int_nums[y] != 0; y++) { len = str_format(buf1, sizeof(buf1), int_fmt[x], int_nums[y]); sprintf(buf2, int_fmt[x], int_nums[y]); if (strcmp(buf1, buf2) != 0) ts_test_fail(TS_CTX, "mismatch: str_format: \"%s\", snprintf: \"%s\"", buf1, buf2); } } return; } /* * Test Base64 Encoding/Decoding */ static void test_base64_do(ts_test_t *_t, unsigned char *ucp, int ulen, int mode) { unsigned char ucp2[1024]; char cp[1024]; int n1, n2, n3, n4; int i; n1 = str_base64(NULL, 0, ucp, ulen, STR_BASE64_ENCODE|mode); n2 = str_base64(cp, sizeof(cp), ucp, ulen, STR_BASE64_ENCODE|mode); if (n1 != n2) ts_test_fail(TS_CTX, "encoding length mismatch: %d vs. %d\n", n1, n2); n3 = str_base64(cp, n2, NULL, 0, STR_BASE64_DECODE|mode); if (n3 != ulen) ts_test_fail(TS_CTX, "decoding check length mismatch: %d vs. %d\n", n3, ulen); n4 = str_base64(cp, n2, ucp2, ulen, STR_BASE64_DECODE|mode); if (n3 != n4) ts_test_fail(TS_CTX, "decoding length mismatch: %d vs. %d\n", n3, n4); for (i = 0; i < 256; i++) { if (ucp[i] != ucp2[i]) { ts_test_fail(TS_CTX, "decoding contents mismatch\n"); break; } } return; } TS_TEST(test_base64) { unsigned char ucp[256]; int i; ts_test_check(TS_CTX, "encode/decode of 0 bytes"); for (i = 0; i < 256; i++) ucp[i] = 0x55; test_base64_do(_t, ucp, 256, STR_BASE64_STRICT); ts_test_check(TS_CTX, "encode/decode of increasing bytes\n"); for (i = 0; i < 256; i++) ucp[i] = i; test_base64_do(_t, ucp, 256, STR_BASE64_STRICT); ts_test_check(TS_CTX, "encode/decode of distributed bytes\n"); for (i = 0; i < 256; i++) ucp[i] = i*31; test_base64_do(_t, ucp, 256, STR_BASE64_STRICT); return; } /* * Main Test Suite Procedure */ int main(int argc, char *argv[]) { ts_suite_t *ts; int n; ts = ts_suite_new("OSSP str (String Handling)"); ts_suite_test(ts, test_length, "String Length Determination"); ts_suite_test(ts, test_locate, "String Locating"); ts_suite_test(ts, test_span, "String Spanning"); ts_suite_test(ts, test_tokenize, "String Tokenizing"); ts_suite_test(ts, test_parsing, "String Parsing"); ts_suite_test(ts, test_formatting, "String Formatting"); ts_suite_test(ts, test_base64, "String Encoding/Decoding"); n = ts_suite_run(ts); ts_suite_free(ts); return n; } @ 1.27 log @fix memory leak in test suite @ text @d3 2 a4 2 ** Copyright (c) 1999-2003 Ralf S. Engelschall ** Copyright (c) 1999-2003 The OSSP Project @ 1.26 log @- adjust copyright messages for new year 2003 - strip trailing whitespaces - consistently use OSSP ASCII-art - add standard devtool.conf stuff from OSSP sa @ text @d288 9 @ 1.25 log @- switch to our OSSP ts sub-library - switch from str_config.h to just config.h @ text @d3 2 a4 2 ** Copyright (c) 1999-2002 Ralf S. Engelschall ** Copyright (c) 1999-2002 The OSSP Project d6 1 a6 1 ** This file is part of OSSP str, a string handling and manipulation d194 1 a194 1 { d269 2 a270 2 ((r1 == NULL && test2_tab[i].r1 != NULL) || (r1 != NULL && test2_tab[i].r1 == NULL) || d272 2 a273 2 ((r2 == NULL && test2_tab[i].r2 != NULL) || (r2 != NULL && test2_tab[i].r2 == NULL) || d275 2 a276 2 ((r3 == NULL && test2_tab[i].r3 != NULL) || (r3 != NULL && test2_tab[i].r3 == NULL) || d278 2 a279 2 ((r4 == NULL && test2_tab[i].r4 != NULL) || (r4 != NULL && test2_tab[i].r4 == NULL) || d282 1 a282 1 test2_tab[i].rv, d394 1 a394 1 @ 1.24 log @finally switch to full OSSP branding @ text @d33 3 a35 2 #include "str.h" #include "str_config.h" d41 3 d50 1 a50 1 static void test_length(int *ok, int *fail) d52 15 a66 19 if (str_len(NULL) == 0) (*ok)++; else (*fail)++; if (str_len("") == 0) (*ok)++; else (*fail)++; if (str_len("a") == 1) (*ok)++; else (*fail)++; if (str_len("foo bar quux") == 12) (*ok)++; else (*fail)++; d90 1 a90 1 static void test_locate(int *ok, int *fail) d97 5 a101 9 printf("str_locate(\"%s\", %d, \"%s\") = \"%s\"\n", loctab[i].s, loctab[i].n, loctab[i].p, rv == NULL ? "[NULL]" : rv); if ((rv-loctab[i].s == loctab[i].o) || (rv == NULL && loctab[i].o == -1)) (*ok)++; else { fprintf(stderr, "ERROR: result was \"%s\", expected \"%s\"\n", rv, loctab[i].s+loctab[i].o); (*fail)++; } d128 1 a128 1 static void test_span(int *ok, int *fail) d135 5 a139 9 printf("str_span(\"%s\", %d, \"%s\", %d) = \"%s\"\n", spantab[i].s, spantab[i].n, spantab[i].cs, spantab[i].m, rv); if (rv-spantab[i].s == spantab[i].o) (*ok)++; else { fprintf(stderr, "ERROR: result was \"%s\", expected \"%s\"\n", rv, spantab[i].s+spantab[i].o); (*fail)++; } d193 1 a193 1 static void test_tokenize(int *ok, int *fail) d202 2 a203 1 fprintf(stderr, "Testing tokenization of %s\n", prstr(toktab[i].s)), prstr_free(); d208 4 a211 4 fprintf(stderr, "str_token(&%s, %s, %s, %s, %d) = %s\n", prstr(cp3), prstr(toktab[i].d), prstr(toktab[i].q), prstr(toktab[i].c), toktab[i].f, prstr(rc)), prstr_free(); d215 2 a216 1 fprintf(stderr, "ERROR: expected result is %s\n", prstr(toktab[i].r[j])), prstr_free(); a219 1 fprintf(stderr, "\n"); d249 1 a249 1 static void test_parsing(int *ok, int *fail) d256 1 a256 1 fprintf(stderr, "%d. str_parse(\"%s\", \"%s\", ...)\n", i, test2_tab[i].s, test2_tab[i].p); a267 4 fprintf(stderr, "%d. str_parse(\"%s\", \"%s\", ...) = %d + <%s><%s><%s><%s>\n", i, test2_tab[i].s, test2_tab[i].p, rv, r1 == NULL ? "NULL" : r1, r2 == NULL ? "NULL" : r2, r3 == NULL ? "NULL" : r3, r4 == NULL ? "NULL" : r4); d281 6 a286 7 fprintf(stderr, " ERROR: expected result: %d + <%s><%s><%s><%s>\n", test2_tab[i].rv, test2_tab[i].r1 == NULL ? "NULL" : test2_tab[i].r1, test2_tab[i].r2 == NULL ? "NULL" : test2_tab[i].r2, test2_tab[i].r3 == NULL ? "NULL" : test2_tab[i].r3, test2_tab[i].r4 == NULL ? "NULL" : test2_tab[i].r4); (*fail)++; a287 2 else (*ok)++; d297 1 a297 1 static void test_formatting(int *ok, int *fail) d336 1 a336 1 fprintf(stderr, "\n** Testing str_format format codes against vendor sprintf **\n\n"); d339 1 a339 1 fprintf(stderr, "testing \"%s\"\n", fp_fmt[x]); d343 2 a344 10 if (strcmp(buf1, buf2) != 0) { fprintf(stderr, " mismatch:\n"); fprintf(stderr, " str_format: \"%s\"\n" " sprintf: \"%s\"\n", buf1, buf2); (*fail)++; } else { fprintf(stderr, " ok: %d \"%s\" (%d)\n", len, buf1, (int)strlen(buf1)); (*ok)++; } d349 1 a349 1 fprintf(stderr, "testing \"%s\"\n", int_fmt[x]); d353 2 a354 10 if (strcmp(buf1, buf2) != 0) { fprintf(stderr, " mismatch:\n"); fprintf(stderr, " str_format: \"%s\"\n" " sprintf: \"%s\"\n", buf1, buf2); (*fail)++; } else { fprintf(stderr, " ok: %d \"%s\" (%d)\n", len, buf1, (int)strlen(buf1)); (*ok)++; } d360 5 a364 1 static void test_base64_do(unsigned char *ucp, int ulen, int mode, int *ok, int *fail) a369 1 int fine; d373 2 a374 6 if (n1 != n2) { fprintf(stderr, " ERROR: encoding length mismatch: %d vs. %d\n", n1, n2); (*fail)++; } else (*ok)++; d376 2 a377 6 if (n3 != ulen) { fprintf(stderr, " ERROR: decoding check length mismatch: %d vs. %d\n", n3, ulen); (*fail)++; } else (*ok)++; d379 2 a380 7 if (n3 != n4) { fprintf(stderr, " ERROR: decoding length mismatch: %d vs. %d\n", n3, n4); (*fail)++; } else (*ok)++; fine = TRUE; d383 1 a383 1 fine = FALSE; a386 6 if (!fine) { fprintf(stderr, " ERROR: decoding mismatch\n"); (*fail)++; } else (*ok)++; d390 1 a390 1 static void test_base64(int *ok, int *fail) d395 1 a395 3 fprintf(stderr, "\n** Testing str_base64 **\n\n"); fprintf(stderr, "1. Encode/Decode of 0 bytes\n"); d398 1 a398 1 test_base64_do(ucp, 256, STR_BASE64_STRICT, ok, fail); d400 1 a400 1 fprintf(stderr, "2. Encode/Decode of increasing bytes\n"); d403 1 a403 1 test_base64_do(ucp, 256, STR_BASE64_STRICT, ok, fail); d405 1 a405 1 fprintf(stderr, "3. Encode/Decode of distributed bytes\n"); d408 1 a408 1 test_base64_do(ucp, 256, STR_BASE64_STRICT, ok, fail); d414 1 a414 1 * Main Test Driver Program a416 16 struct { char *name; void (*func)(int *, int *); int ok; int fail; } tests[] = { { "Length", test_length, 0, 0 }, { "Locating", test_locate, 0, 0 }, { "Spanning", test_span, 0, 0 }, { "Tokenizing", test_tokenize, 0, 0 }, { "Parsing", test_parsing, 0, 0 }, { "Formatting", test_formatting, 0, 0 }, { "Base64", test_base64, 0, 0 }, { NULL, NULL, 0,0 } }; d419 2 a420 3 int i; int fail; int ok; d422 11 a432 18 ok = 0; fail = 0; fprintf(stderr, "\n"); fprintf(stderr, "String Library Test Suite\n"); fprintf(stderr, "________________________________________\n\n"); for (i = 0; tests[i].name != NULL; i++) { fprintf(stderr, "==== Testing %s ====\n", tests[i].name); tests[i].ok = tests[i].fail = 0; tests[i].func(&tests[i].ok, &tests[i].fail); fprintf(stderr, "==== Tests failed %d/%d ====\n", tests[i].fail, tests[i].ok+tests[i].fail); fprintf(stderr, "\n"); ok += tests[i].ok; fail += tests[i].fail; } fprintf(stderr, "________________________________________\n\n"); fprintf(stderr, "TOTAL: failed %d/%d\n", fail, fail+ok); fprintf(stderr, "\n"); return fail; @ 1.23 log @bump copyright year @ text @d2 1 a2 1 ** Str - String Library d4 1 d6 2 a7 2 ** This file is part of Str, a string handling and manipulation ** library which can be found at http://www.engelschall.com/sw/str/. @ 1.22 log @more dmalloc support @ text @d3 1 a3 1 ** Copyright (c) 1999-2001 Ralf S. Engelschall @ 1.21 log @Adjust copyright for year 2001. @ text @d35 4 d302 1 @ 1.20 log @Add two more tests for the recent problematic regex @ text @d3 1 a3 1 ** Copyright (c) 1999-2000 Ralf S. Engelschall @ 1.19 log @*** empty log message *** @ text @d246 2 @ 1.18 log @*** empty log message *** @ text @d38 28 d463 1 @ 1.17 log @*** empty log message *** @ text @d38 82 d435 2 @ 1.16 log @*** empty log message *** @ text @d272 71 d356 1 @ 1.15 log @*** empty log message *** @ text @d158 4 a161 4 printf("%d. str_parse(\"%s\", \"%s\", ...) = %d + <%s><%s><%s><%s>\n", i, test2_tab[i].s, test2_tab[i].p, rv, r1 == NULL ? "NULL" : r1, r2 == NULL ? "NULL" : r2, r3 == NULL ? "NULL" : r3, r4 == NULL ? "NULL" : r4); d175 6 a180 6 printf(" ERROR: expected result: %d + <%s><%s><%s><%s>\n", test2_tab[i].rv, test2_tab[i].r1 == NULL ? "NULL" : test2_tab[i].r1, test2_tab[i].r2 == NULL ? "NULL" : test2_tab[i].r2, test2_tab[i].r3 == NULL ? "NULL" : test2_tab[i].r3, test2_tab[i].r4 == NULL ? "NULL" : test2_tab[i].r4); d232 1 a232 1 printf("\n** Testing str_snprintf format codes against vendor sprintf **\n\n"); d235 1 a235 1 printf("testing \"%s\"\n", fp_fmt[x]); d237 1 a237 1 snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]); d239 4 a242 5 if (strcmp(buf1, buf2)) { printf("snprintf doesn't match Format: %s\n", fp_fmt[x]); printf("\tsnprintf = %s\n\tsprintf = %s\n", buf1, buf2); d245 2 a246 1 else d248 1 d253 1 a253 1 printf("testing \"%s\"\n", int_fmt[x]); d258 3 a260 3 printf(" mismatch:\n"); printf(" str_format: \"%s\"\n" " sprintf: \"%s\"\n", buf1, buf2); d264 1 a264 1 printf(" ok: %d \"%s\" (%d)\n", len, buf1, (int)strlen(buf1)); @ 1.14 log @*** empty log message *** @ text @d3 1 a3 1 ** Copyright (c) 1999 Ralf S. Engelschall @ 1.13 log @*** empty log message *** @ text @a116 9 * Test String Handling */ static void test_handling(int *ok, int *fail) { return; } /* d281 2 a282 3 // { "Handling", test_handling, 0, 0 }, { "Tokenizing", test_tokenize, 0, 0 }, // { "Parsing", test_parsing, 0, 0 }, d284 1 a284 1 { NULL, NULL, 0 } @ 1.12 log @*** empty log message *** @ text @a153 4 #ifndef STR_PCRE fprintf(stderr, "NO PCRE LIBRARY\n"); return; #endif @ 1.11 log @. @ text @d267 1 a267 1 len = str_snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]); d271 2 a272 2 printf(" str_snprintf: \"%s\"\n" " sprintf: \"%s\"\n", buf1, buf2); d295 1 d297 1 a297 2 // { "Formatting", test_formatting, 0, 0 }, { "Tokenizing", test_tokenize, 0, 0 }, @ 1.10 log @*** empty log message *** @ text @d38 79 d294 4 a297 3 { "Handling", test_handling, 0, 0 }, { "Parsing", test_parsing, 0, 0 }, { "Formatting", test_formatting, 0, 0 }, @ 1.9 log @*** empty log message *** @ text @d75 4 @ 1.8 log @*** empty log message *** @ text @d37 87 a123 1 static void test1(void) a159 2 int fail = 0; int num = 0; d165 1 a165 1 printf("testing %s\n", fp_fmt[x]); d174 1 a174 1 fail++; d176 2 a177 1 num++; d182 1 a182 1 printf("testing: %s\n", int_fmt[x]); d190 1 a190 1 fail++; d194 1 a195 1 num++; a197 2 printf("%d tests failed out of %d.\n", fail, num); d201 4 d206 9 a214 16 char *s; char *p; char *r1; char *r2; char *r3; char *r4; int rv; } test2_tab[] = { { "foobar", "foobar", NULL, NULL, NULL, NULL, 1 }, { "foobar", "m/^foobar$/", NULL, NULL, NULL, NULL, 1 }, { "foobar", "foobarquux", NULL, NULL, NULL, NULL, 0 }, { "foobar", "foo", NULL, NULL, NULL, NULL, 1 }, { "foobar", "?", NULL, NULL, NULL, NULL, -1 }, { "foobar", "m/(foo|bar)(bar|foo)/", "foo", "bar", NULL, NULL, 1 }, { "foobar", "m&(?:foo|bar)(?:bar|foo)&", NULL, NULL, NULL, NULL, 1 }, { "foobar", "m/(?:foo|bar)(?:bar|foo)/o", NULL, NULL, NULL, NULL, 1 }, { "foobar", "m/(?:FOO|BAR)(?:bar|foo)/io", NULL, NULL, NULL, NULL, 1 }, { "foobar", "((f(.)\\3)(b.*))", "foobar", "foo", "o", "bar", 1 }, { "foobar", "s/((f(.)\\3)(b.*))/$2-$4/io", "foo-bar", NULL, NULL, NULL, 1 }, { "foobar", "s/((f(.)\\3)(b.*))/$2-%s-$4/io", "foo-quux-bar", "quux", NULL, NULL, 1 }, { "foobar", "s/((f(.)\\3)(b.*))/$2-%s-%s-%s-$4/io", "foo-quux-baz-0815-bar", "quux", "baz", "0815", 1 }, { NULL, NULL, NULL, NULL, NULL, NULL, 0 } d217 1 a217 1 static void test2(void) d220 2 a221 2 int rv; char *r1, *r2, *r3, *r4; d223 13 a235 38 printf("*** str_parse ****\n"); for (i = 0; test2_tab[i].s != NULL; i++) { fprintf(stderr, "%d. str_parse(\"%s\", \"%s\", ...)\n", i, test2_tab[i].s, test2_tab[i].p); if (*(test2_tab[i].p) == 's') { r1 = NULL; r2 = test2_tab[i].r2; r3 = test2_tab[i].r3; r4 = test2_tab[i].r4; rv = str_parse(test2_tab[i].s, test2_tab[i].p, &r1, r2, r3, r4); } else { r1 = r2 = r3 = r4 = NULL; rv = str_parse(test2_tab[i].s, test2_tab[i].p, &r1, &r2, &r3, &r4); } printf("%d. str_parse(\"%s\", \"%s\", ...) = %d + <%s><%s><%s><%s>\n", i, test2_tab[i].s, test2_tab[i].p, rv, r1 == NULL ? "NULL" : r1, r2 == NULL ? "NULL" : r2, r3 == NULL ? "NULL" : r3, r4 == NULL ? "NULL" : r4); if (rv != test2_tab[i].rv || ((r1 == NULL && test2_tab[i].r1 != NULL) || (r1 != NULL && test2_tab[i].r1 == NULL) || (r1 != NULL && test2_tab[i].r1 != NULL && strcmp(r1, test2_tab[i].r1) != 0)) || ((r2 == NULL && test2_tab[i].r2 != NULL) || (r2 != NULL && test2_tab[i].r2 == NULL) || (r2 != NULL && test2_tab[i].r2 != NULL && strcmp(r2, test2_tab[i].r2) != 0)) || ((r3 == NULL && test2_tab[i].r3 != NULL) || (r3 != NULL && test2_tab[i].r3 == NULL) || (r3 != NULL && test2_tab[i].r3 != NULL && strcmp(r3, test2_tab[i].r3) != 0)) || ((r4 == NULL && test2_tab[i].r4 != NULL) || (r4 != NULL && test2_tab[i].r4 == NULL) || (r4 != NULL && test2_tab[i].r4 != NULL && strcmp(r4, test2_tab[i].r4) != 0))) { printf(" ERROR: expected result: %d + <%s><%s><%s><%s>\n", test2_tab[i].rv, test2_tab[i].r1 == NULL ? "NULL" : test2_tab[i].r1, test2_tab[i].r2 == NULL ? "NULL" : test2_tab[i].r2, test2_tab[i].r3 == NULL ? "NULL" : test2_tab[i].r3, test2_tab[i].r4 == NULL ? "NULL" : test2_tab[i].r4); } d237 4 a240 8 return; } int main(int argc, char *argv[]) { test1(); test2(); return 0; @ 1.7 log @*** empty log message *** @ text @d1 27 @ 1.6 log @*** empty log message *** @ text @d160 1 a160 3 char *cp; int rc; // test1(); a161 3 // rc = str_parse("foobar", "s/((f(.)\\3)(b.*))/$2-%s-$4/io", &cp, "quux", "quux2", "333"); // fprintf(stderr, "%d, <%s>\n", rc, cp); // free(cp); @ 1.5 log @*** empty log message *** @ text @d3 1 d106 1 a106 1 { "foobar", "s/((f(.)\\3)(b.*))/$2-%s-%s-%s-$4/io", "foo-quux-bar", "quux", "quux2", "3", 1 }, d118 1 d160 2 d164 3 @ 1.4 log @*** empty log message *** @ text @d105 1 @ 1.3 log @*** empty log message *** @ text @d103 2 a104 1 { "foobar", "s/((f(.)\\3)(b.*))/$2-$4/io", "foobar", "foo", "o", "bar", 1 }, d116 11 a126 2 r1 = r2 = r3 = r4 = NULL; rv = str_parse(test2_tab[i].s, test2_tab[i].p, &r1, &r2, &r3, &r4); @ 1.2 log @*** empty log message *** @ text @d113 1 a113 1 printf("*** str_match ****\n"); d116 2 a117 2 rv = str_match(test2_tab[i].s, test2_tab[i].p, &r1, &r2, &r3, &r4); printf("%d. str_match(\"%s\", \"%s\", ...) = %d + <%s><%s><%s><%s>\n", @ 1.1 log @Initial revision @ text @d103 1 @ 1.1.1.1 log @ @ text @@