mirror of
https://github.com/LongSoft/UEFITool.git
synced 2024-11-26 01:48:23 +08:00
3690 lines
112 KiB
C
3690 lines
112 KiB
C
|
/*
|
||
|
* This source file is part of the bstring string library. This code was
|
||
|
* written by Paul Hsieh in 2002-2015, and is covered by the BSD open source
|
||
|
* license. Refer to the accompanying documentation for details on usage and
|
||
|
* license.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* bstest.c
|
||
|
*
|
||
|
* This file is the C unit test for Bstrlib.
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <stdarg.h>
|
||
|
#include <limits.h>
|
||
|
#include <ctype.h>
|
||
|
#include "bstrlib.h"
|
||
|
#include "bstraux.h"
|
||
|
|
||
|
static bstring dumpOut[16];
|
||
|
static int rot = 0;
|
||
|
|
||
|
static int incorrectBstring (const struct tagbstring * b) {
|
||
|
if (NULL == b) return 1;
|
||
|
if (NULL == b->data) return 1;
|
||
|
if (b->slen < 0) return 1;
|
||
|
if (b->mlen > 0 && b->slen > b->mlen) return 1;
|
||
|
if (b->data[b->slen] != '\0') return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static char * dumpBstring (const struct tagbstring * b) {
|
||
|
rot = (rot + 1) % (unsigned)16;
|
||
|
if (dumpOut[rot] == NULL) {
|
||
|
dumpOut[rot] = bfromcstr ("");
|
||
|
if (dumpOut[rot] == NULL) return "FATAL INTERNAL ERROR";
|
||
|
}
|
||
|
dumpOut[rot]->slen = 0;
|
||
|
if (b == NULL) {
|
||
|
bcatcstr (dumpOut[rot], "NULL");
|
||
|
} else {
|
||
|
static char msg[256];
|
||
|
sprintf (msg, "%p", (void *)b);
|
||
|
bcatcstr (dumpOut[rot], msg);
|
||
|
|
||
|
if (b->slen < 0) {
|
||
|
sprintf (msg, ":[err:slen=%d<0]", b->slen);
|
||
|
bcatcstr (dumpOut[rot], msg);
|
||
|
} else {
|
||
|
if (b->mlen > 0 && b->mlen < b->slen) {
|
||
|
sprintf (msg, ":[err:mlen=%d<slen=%d]", b->mlen, b->slen);
|
||
|
bcatcstr (dumpOut[rot], msg);
|
||
|
} else {
|
||
|
if (b->mlen == -1) {
|
||
|
bcatcstr (dumpOut[rot], "[p]");
|
||
|
} else if (b->mlen < 0) {
|
||
|
bcatcstr (dumpOut[rot], "[c]");
|
||
|
}
|
||
|
bcatcstr (dumpOut[rot], ":");
|
||
|
if (b->data == NULL) {
|
||
|
bcatcstr (dumpOut[rot], "[err:data=NULL]");
|
||
|
} else {
|
||
|
bcatcstr (dumpOut[rot], "\"");
|
||
|
bcatcstr (dumpOut[rot], (const char *) b->data);
|
||
|
bcatcstr (dumpOut[rot], "\"");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return (char *) dumpOut[rot]->data;
|
||
|
}
|
||
|
|
||
|
static char* dumpCstring (const char* s) {
|
||
|
rot = (rot + 1) % (unsigned)16;
|
||
|
if (dumpOut[rot] == NULL) {
|
||
|
dumpOut[rot] = bfromcstr ("");
|
||
|
if (dumpOut[rot] == NULL) return "FATAL INTERNAL ERROR";
|
||
|
}
|
||
|
dumpOut[rot]->slen = 0;
|
||
|
if (s == NULL) {
|
||
|
bcatcstr (dumpOut[rot], "NULL");
|
||
|
} else {
|
||
|
static char msg[64];
|
||
|
int i;
|
||
|
|
||
|
sprintf (msg, "cstr[%p] -> ", (void *)s);
|
||
|
bcatcstr (dumpOut[rot], msg);
|
||
|
|
||
|
bcatStatic (dumpOut[rot], "\"");
|
||
|
for (i = 0; s[i]; i++) {
|
||
|
if (i > 1024) {
|
||
|
bcatStatic (dumpOut[rot], " ...");
|
||
|
break;
|
||
|
}
|
||
|
bconchar (dumpOut[rot], s[i]);
|
||
|
}
|
||
|
bcatStatic (dumpOut[rot], "\"");
|
||
|
}
|
||
|
|
||
|
return (char *) dumpOut[rot]->data;
|
||
|
}
|
||
|
|
||
|
static int test0_0 (const char * s, const char * res) {
|
||
|
bstring b0 = bfromcstr (s);
|
||
|
int ret = 0;
|
||
|
|
||
|
if (s == NULL) {
|
||
|
if (res != NULL) ret++;
|
||
|
printf (".\tbfromcstr (NULL) = %s\n", dumpBstring (b0));
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b0->slen)
|
||
|
|| (0 != memcmp (res, b0->data, b0->slen));
|
||
|
ret += b0->data[b0->slen] != '\0';
|
||
|
|
||
|
printf (".\tbfromcstr (\"%s\") = %s\n", s, dumpBstring (b0));
|
||
|
bdestroy (b0);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test0_1 (const char * s, int len, const char * res) {
|
||
|
bstring b0 = bfromcstralloc (len, s);
|
||
|
int ret = 0;
|
||
|
|
||
|
if (s == NULL) {
|
||
|
if (res != NULL) ret++;
|
||
|
printf (".\tbfromcstralloc (*, NULL) = %s\n", dumpBstring (b0));
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b0->slen)
|
||
|
|| (0 != memcmp (res, b0->data, b0->slen));
|
||
|
ret += b0->data[b0->slen] != '\0';
|
||
|
ret += len > b0->mlen;
|
||
|
|
||
|
printf (".\tbfromcstralloc (%d, \"%s\") = %s\n", len, s, dumpBstring (b0));
|
||
|
bdestroy (b0);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#define EMPTY_STRING ""
|
||
|
#define SHORT_STRING "bogus"
|
||
|
#define EIGHT_CHAR_STRING "Waterloo"
|
||
|
#define LONG_STRING "This is a bogus but reasonably long string. Just long enough to cause some mallocing."
|
||
|
|
||
|
static int test0_2 (char* s) {
|
||
|
int l = s?strlen(s):2;
|
||
|
int i, j, k;
|
||
|
int ret = 0;
|
||
|
|
||
|
for (i = 0; i < l*2; i++) {
|
||
|
for (j = 0; j < l*2; j++) {
|
||
|
for (k = 0; k <= l; k++) {
|
||
|
char* t = s ? (s + k) : NULL;
|
||
|
bstring b = bfromcstrrangealloc (i, j, t);
|
||
|
if (NULL == b) {
|
||
|
if (i < j && t != NULL) {
|
||
|
printf ("[%d] i = %d, j = %d, l = %d, k = %d\n", __LINE__, i, j, l, k);
|
||
|
}
|
||
|
ret += (i < j && t != NULL);
|
||
|
continue;
|
||
|
}
|
||
|
if (NULL == t) {
|
||
|
printf ("[%d] i = %d, j = %d, l = %d, k = %d\n", __LINE__, i, j, l, k);
|
||
|
ret++;
|
||
|
bdestroy (b);
|
||
|
continue;
|
||
|
}
|
||
|
if (b->data == NULL) {
|
||
|
printf ("[%d] i = %d, j = %d, l = %d, k = %d\n", __LINE__, i, j, l, k);
|
||
|
ret++;
|
||
|
continue;
|
||
|
}
|
||
|
if (b->slen != l-k || b->data[l-k] != '\0' || b->mlen <= b->slen) {
|
||
|
printf ("[%d] i = %d, j = %d, l = %d, k = %d, b->slen = %d\n", __LINE__, i, j, l, k, b->slen);
|
||
|
ret++;
|
||
|
} else if (0 != memcmp (t, b->data, l-k+1)) {
|
||
|
printf ("[%d] \"%s\" != \"%s\"\n", b->data, t);
|
||
|
ret++;
|
||
|
}
|
||
|
bdestroy (b);
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf (".\tbfromcstrrangealloc (*,*,%s) correct\n", dumpCstring(s));
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test0 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: bstring bfromcstr (const char * str);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test0_0 (NULL, NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test0_0 (EMPTY_STRING, EMPTY_STRING);
|
||
|
ret += test0_0 (SHORT_STRING, SHORT_STRING);
|
||
|
ret += test0_0 (LONG_STRING, LONG_STRING);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
|
||
|
printf ("TEST: bstring bfromcstralloc (int len, const char * str);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test0_1 (NULL, 0, NULL);
|
||
|
ret += test0_1 (NULL, 30, NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test0_1 (EMPTY_STRING, 0, EMPTY_STRING);
|
||
|
ret += test0_1 (EMPTY_STRING, 30, EMPTY_STRING);
|
||
|
ret += test0_1 (SHORT_STRING, 0, SHORT_STRING);
|
||
|
ret += test0_1 (SHORT_STRING, 30, SHORT_STRING);
|
||
|
ret += test0_1 ( LONG_STRING, 0, LONG_STRING);
|
||
|
ret += test0_1 ( LONG_STRING, 30, LONG_STRING);
|
||
|
|
||
|
printf ("TEST: bstring bfromcstrrangealloc (int minl, int maxl, const char * str);\n");
|
||
|
|
||
|
ret += test0_2 (NULL);
|
||
|
ret += test0_2 (EMPTY_STRING);
|
||
|
ret += test0_2 ( LONG_STRING);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test1_0 (const void * blk, int len, const char * res) {
|
||
|
bstring b0 = blk2bstr (blk, len);
|
||
|
int ret = 0;
|
||
|
if (b0 == NULL) {
|
||
|
if (res != NULL) ret++;
|
||
|
printf (".\tblk2bstr (NULL, len=%d) = %s\n", len, dumpBstring (b0));
|
||
|
} else {
|
||
|
ret += (res == NULL) || (len != b0->slen)
|
||
|
|| (0 != memcmp (res, b0->data, len));
|
||
|
ret += b0->data[b0->slen] != '\0';
|
||
|
printf (".\tblk2bstr (blk=%p, len=%d) = %s\n", blk, len, dumpBstring (b0));
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
bdestroy (b0);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test1 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: bstring blk2bstr (const void * blk, int len);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test1_0 (NULL, 10, NULL);
|
||
|
ret += test1_0 (NULL, 0, NULL);
|
||
|
ret += test1_0 (NULL, -1, NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test1_0 (SHORT_STRING, sizeof (SHORT_STRING)-1, SHORT_STRING);
|
||
|
ret += test1_0 (LONG_STRING, sizeof (LONG_STRING)-1, LONG_STRING);
|
||
|
ret += test1_0 (LONG_STRING, 5, "This ");
|
||
|
ret += test1_0 (LONG_STRING, 0, "");
|
||
|
ret += test1_0 (LONG_STRING, -1, NULL);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test2_0 (const_bstring b, char z, const unsigned char * res) {
|
||
|
char * s = bstr2cstr (b, z);
|
||
|
int ret = 0;
|
||
|
if (s == NULL) {
|
||
|
if (res != NULL) ret++;
|
||
|
printf (".\tbstr2cstr (%s, %02X) = NULL\n", dumpBstring (b), z);
|
||
|
free(s);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
if (res == NULL) ret++;
|
||
|
else {
|
||
|
if (z != '\0') if ((int) strlen (s) != b->slen) ret++;
|
||
|
if (!ret) {
|
||
|
ret += (0 != memcmp (res, b->data, b->slen));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf (".\tbstr2cstr (%s, %02X) = \"%s\"\n", dumpBstring (b), z, s);
|
||
|
free (s);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
struct tagbstring emptyBstring = bsStatic ("");
|
||
|
struct tagbstring shortBstring = bsStatic ("bogus");
|
||
|
struct tagbstring longBstring = bsStatic ("This is a bogus but reasonably long string. Just long enough to cause some mallocing.");
|
||
|
|
||
|
struct tagbstring badBstring1 = {8, 4, NULL};
|
||
|
struct tagbstring badBstring2 = {2, -5, (unsigned char *) "bogus"};
|
||
|
struct tagbstring badBstring3 = {2, 5, (unsigned char *) "bogus"};
|
||
|
|
||
|
struct tagbstring xxxxxBstring = bsStatic ("xxxxx");
|
||
|
|
||
|
static int test2 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: char * bstr2cstr (const_bstring s, char z);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test2_0 (NULL, (char) '?', NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test2_0 (&emptyBstring, (char) '?', emptyBstring.data);
|
||
|
ret += test2_0 (&shortBstring, (char) '?', shortBstring.data);
|
||
|
ret += test2_0 (&longBstring, (char) '?', longBstring.data);
|
||
|
ret += test2_0 (&badBstring1, (char) '?', NULL);
|
||
|
ret += test2_0 (&badBstring2, (char) '?', NULL);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test3_0 (const_bstring b) {
|
||
|
bstring b0 = bstrcpy (b);
|
||
|
int ret = 0;
|
||
|
printf (".\tbstrcpy (%s) = %s\n", dumpBstring (b), dumpBstring (b0));
|
||
|
if (b0 == NULL) {
|
||
|
if (b != NULL && b->data != NULL && b->slen >= 0) ret++;
|
||
|
} else {
|
||
|
ret += (b == NULL) || (b->slen != b0->slen)
|
||
|
|| (0 != memcmp (b->data, b0->data, b->slen));
|
||
|
ret += b0->data[b0->slen] != '\0';
|
||
|
}
|
||
|
bdestroy (b0);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test3 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: bstring bstrcpy (const_bstring b1);\n");
|
||
|
|
||
|
/* tests with NULL to make sure that there is NULL propogation */
|
||
|
ret += test3_0 (NULL);
|
||
|
ret += test3_0 (&badBstring1);
|
||
|
ret += test3_0 (&badBstring2);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test3_0 (&emptyBstring);
|
||
|
ret += test3_0 (&shortBstring);
|
||
|
ret += test3_0 (&longBstring);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test4_0 (const_bstring b, int left, int len, const char * res) {
|
||
|
bstring b0 = bmidstr (b, left, len);
|
||
|
int ret = 0;
|
||
|
printf (".\tbmidstr (%s, %d, %d) = %s\n", dumpBstring (b), left, len, dumpBstring (b0));
|
||
|
if (b0 == NULL) {
|
||
|
if (b != NULL && b->data != NULL && b->slen >= 0 && len >= 0) ret++;
|
||
|
} else {
|
||
|
ret += (b == NULL) || (res == NULL) || (b0->slen > len && len >= 0)
|
||
|
|| (b0->slen != (int) strlen (res))
|
||
|
|| (b0->slen > 0 && 0 != memcmp (res, b0->data, b0->slen));
|
||
|
ret += b0->data[b0->slen] != '\0';
|
||
|
}
|
||
|
if (ret) {
|
||
|
printf ("(b == NULL) = %d\n", (b == NULL));
|
||
|
printf ("(res == NULL) = %d\n", (res == NULL));
|
||
|
printf ("(b0->slen > len && len >= 0) = %d\n", (b0->slen > len && len >= 0));
|
||
|
if (res) printf ("(b0->slen != strlen (res)) = %d\n", (b0->slen != (int) strlen (res)));
|
||
|
printf ("(b0->slen > 0 && 0 != memcmp (res, b0->data, b0->slen) = %d\n", (b0->slen > 0 && 0 != memcmp (res, b0->data, b0->slen)));
|
||
|
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
bdestroy (b0);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test4 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: bstring bmidstr (const_bstring b, int left, int len);\n");
|
||
|
|
||
|
/* tests with NULL to make sure that there is NULL propogation */
|
||
|
ret += test4_0 (NULL, 0, 0, NULL);
|
||
|
ret += test4_0 (NULL, 0, 2, NULL);
|
||
|
ret += test4_0 (NULL, 0, -2, NULL);
|
||
|
ret += test4_0 (NULL, -5, 2, NULL);
|
||
|
ret += test4_0 (NULL, -5, -2, NULL);
|
||
|
ret += test4_0 (&badBstring1, 1, 3, NULL);
|
||
|
ret += test4_0 (&badBstring2, 1, 3, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test4_0 (&emptyBstring, 0, 0, "");
|
||
|
ret += test4_0 (&emptyBstring, 0, -1, "");
|
||
|
ret += test4_0 (&emptyBstring, 1, 3, "");
|
||
|
ret += test4_0 (&shortBstring, 0, 0, "");
|
||
|
ret += test4_0 (&shortBstring, 0, -1, "");
|
||
|
ret += test4_0 (&shortBstring, 1, 3, "ogu");
|
||
|
ret += test4_0 (&shortBstring, -1, 3, "bo");
|
||
|
ret += test4_0 (&shortBstring, -1, 9, "bogus");
|
||
|
ret += test4_0 (&shortBstring, 3, -1, "");
|
||
|
ret += test4_0 (&shortBstring, 9, 3, "");
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test5_0 (bstring b0, const_bstring b1, const char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
b1 != NULL && b1->data != NULL && b1->slen >= 0 ) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbconcat (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bconcat (b2, b1);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%s) = %s\n", dumpBstring (b1), dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbconcat (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bconcat (b2, b1);
|
||
|
|
||
|
printf ("%s) = %s\n", dumpBstring (b1), dumpBstring (b2));
|
||
|
|
||
|
if (b1) ret += (b2->slen != b0->slen + b1->slen);
|
||
|
ret += ((0 != rv) && (b1 != NULL)) || ((0 == rv) && (b1 == NULL));
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bconcat (b0, b1)));
|
||
|
printf (".\tbconcat (%s, %s) = %d\n", dumpBstring (b0), dumpBstring (b1), rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test5_1 (void) {
|
||
|
bstring b, c;
|
||
|
struct tagbstring t;
|
||
|
int i, ret;
|
||
|
|
||
|
printf ("TEST: bconcat aliasing\n");
|
||
|
for (ret=i=0; i < longBstring.slen; i++) {
|
||
|
b = bstrcpy (&longBstring);
|
||
|
c = bstrcpy (&longBstring);
|
||
|
bmid2tbstr (t, b, i, longBstring.slen);
|
||
|
ret += 0 != bconcat (c, &t);
|
||
|
ret += 0 != bconcat (b, &t);
|
||
|
ret += !biseq (b, c);
|
||
|
bdestroy (b);
|
||
|
bdestroy (c);
|
||
|
}
|
||
|
|
||
|
b = bfromcstr ("abcd");
|
||
|
c = bfromcstr ("abcd");
|
||
|
|
||
|
for (ret=i=0; i < 100; i++) {
|
||
|
bmid2tbstr (t, b, 0, 3);
|
||
|
ret += 0 != bcatcstr (c, "abc");
|
||
|
ret += 0 != bconcat (b, &t);
|
||
|
ret += !biseq (b, c);
|
||
|
}
|
||
|
|
||
|
bdestroy (b);
|
||
|
bdestroy (c);
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\talias failures(%d) = %d\n", __LINE__, ret);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test5 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bconcat (bstring b0, const_bstring b1);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test5_0 (NULL, NULL, NULL);
|
||
|
ret += test5_0 (NULL, &emptyBstring, NULL);
|
||
|
ret += test5_0 (&emptyBstring, NULL, "");
|
||
|
ret += test5_0 (&emptyBstring, &badBstring1, NULL);
|
||
|
ret += test5_0 (&emptyBstring, &badBstring2, NULL);
|
||
|
ret += test5_0 (&badBstring1, &emptyBstring, NULL);
|
||
|
ret += test5_0 (&badBstring2, &emptyBstring, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test5_0 (&emptyBstring, &emptyBstring, "");
|
||
|
ret += test5_0 (&emptyBstring, &shortBstring, "bogus");
|
||
|
ret += test5_0 (&shortBstring, &emptyBstring, "bogus");
|
||
|
ret += test5_0 (&shortBstring, &shortBstring, "bogusbogus");
|
||
|
|
||
|
ret += test5_1 ();
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test6_0 (bstring b, char c, const char * res) {
|
||
|
bstring b0;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b != NULL && b->data != NULL && b->slen >= 0) {
|
||
|
b0 = bstrcpy (b);
|
||
|
bwriteprotect (*b0);
|
||
|
rv = bconchar (b0, c);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b)) ret++;
|
||
|
|
||
|
printf (".\tbconchar (%s, %c) = %s\n", dumpBstring (b), c, dumpBstring (b0));
|
||
|
|
||
|
bwriteallow (*b0);
|
||
|
rv = bconchar (b0, c);
|
||
|
ret += (0 != rv);
|
||
|
ret += (b0->slen != b->slen + 1);
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b0->slen)
|
||
|
|| (0 != memcmp (b0->data, res, b0->slen));
|
||
|
ret += b0->data[b0->slen] != '\0';
|
||
|
printf (".\tbconchar (%s, %c) = %s\n", dumpBstring (b), c, dumpBstring (b0));
|
||
|
|
||
|
bdestroy (b0);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bconchar (b, c)));
|
||
|
printf (".\tbconchar (%s, %c) = %d\n", dumpBstring (b), c, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test6 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bconchar (bstring b, char c);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test6_0 (NULL, (char) 'x', NULL);
|
||
|
ret += test6_0 (&badBstring1, (char) 'x', NULL);
|
||
|
ret += test6_0 (&badBstring2, (char) 'x', NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test6_0 (&emptyBstring, (char) 'x', "x");
|
||
|
ret += test6_0 (&shortBstring, (char) 'x', "bogusx");
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test7x8_0 (char * fnname, int (* fnptr) (const struct tagbstring *, const struct tagbstring *), const struct tagbstring * b0, const struct tagbstring * b1, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = fnptr (b0, b1)));
|
||
|
printf (".\t%s (%s, %s) = %d\n", fnname, dumpBstring (b0), dumpBstring (b1), rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test7x8 (char * fnname, int (* fnptr) (const struct tagbstring *, const struct tagbstring *),
|
||
|
int retFail, int retLT, int retGT, int retEQ) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int %s (const_bstring b0, const_bstring b1);\n", fnname);
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test7x8_0 (fnname, fnptr, NULL, NULL, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, &emptyBstring, NULL, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, NULL, &emptyBstring, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, &shortBstring, NULL, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, NULL, &shortBstring, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, &badBstring1, &badBstring1, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, &badBstring2, &badBstring2, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, &shortBstring, &badBstring2, retFail);
|
||
|
ret += test7x8_0 (fnname, fnptr, &badBstring2, &shortBstring, retFail);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test7x8_0 (fnname, fnptr, &emptyBstring, &emptyBstring, retEQ);
|
||
|
ret += test7x8_0 (fnname, fnptr, &shortBstring, &emptyBstring, retGT);
|
||
|
ret += test7x8_0 (fnname, fnptr, &emptyBstring, &shortBstring, retLT);
|
||
|
ret += test7x8_0 (fnname, fnptr, &shortBstring, &shortBstring, retEQ);
|
||
|
|
||
|
{
|
||
|
bstring b = bstrcpy (&shortBstring);
|
||
|
b->data[1]++;
|
||
|
ret += test7x8_0 (fnname, fnptr, b, &shortBstring, retGT);
|
||
|
bdestroy (b);
|
||
|
}
|
||
|
|
||
|
if (fnptr == biseq) {
|
||
|
ret += test7x8_0 (fnname, fnptr, &shortBstring, &longBstring, retGT);
|
||
|
ret += test7x8_0 (fnname, fnptr, &longBstring, &shortBstring, retLT);
|
||
|
} else {
|
||
|
ret += test7x8_0 (fnname, fnptr, &shortBstring, &longBstring, 'b'-'T');
|
||
|
ret += test7x8_0 (fnname, fnptr, &longBstring, &shortBstring, 'T'-'b');
|
||
|
}
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#define test7() test7x8 ("biseq", biseq, -1, 0, 0, 1)
|
||
|
#define test8() test7x8 ("bstrcmp", bstrcmp, SHRT_MIN, -1, 1, 0)
|
||
|
|
||
|
static int test47_0 (const struct tagbstring* b, const unsigned char* blk, int len, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = biseqblk (b, blk, len)));
|
||
|
printf (".\tbiseqblk (%s, %s) = %d\n", dumpBstring (b), dumpCstring (blk), rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test47 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int biseqblk (const_bstring b, const void * blk, int len);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test47_0 (NULL, NULL, 0, -1);
|
||
|
ret += test47_0 (&emptyBstring, NULL, 0, -1);
|
||
|
ret += test47_0 (NULL, emptyBstring.data, 0, -1);
|
||
|
ret += test47_0 (&shortBstring, NULL, shortBstring.slen, -1);
|
||
|
ret += test47_0 (NULL, shortBstring.data, 0, -1);
|
||
|
ret += test47_0 (&badBstring1, badBstring1.data, badBstring1.slen, -1);
|
||
|
ret += test47_0 (&badBstring2, badBstring2.data, badBstring2.slen, -1);
|
||
|
ret += test47_0 (&shortBstring, badBstring2.data, badBstring2.slen, -1);
|
||
|
ret += test47_0 (&badBstring2, shortBstring.data, shortBstring.slen, -1);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test47_0 (&emptyBstring, emptyBstring.data, emptyBstring.slen, 1);
|
||
|
ret += test47_0 (&shortBstring, emptyBstring.data, emptyBstring.slen, 0);
|
||
|
ret += test47_0 (&emptyBstring, shortBstring.data, shortBstring.slen, 0);
|
||
|
ret += test47_0 (&shortBstring, shortBstring.data, shortBstring.slen, 1);
|
||
|
|
||
|
{
|
||
|
bstring b = bstrcpy (&shortBstring);
|
||
|
b->data[1]++;
|
||
|
ret += test47_0 (b, shortBstring.data, shortBstring.slen, 0);
|
||
|
bdestroy (b);
|
||
|
}
|
||
|
ret += test47_0 (&shortBstring, longBstring.data, longBstring.slen, 0);
|
||
|
ret += test47_0 (&longBstring, shortBstring.data, shortBstring.slen, 0);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test9_0 (const_bstring b0, const_bstring b1, int n, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = bstrncmp (b0, b1, n)));
|
||
|
printf (".\tbstrncmp (%s, %s, %d) = %d\n", dumpBstring (b0), dumpBstring (b1), n, rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test9 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bstrncmp (const_bstring b0, const_bstring b1, int n);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test9_0 (NULL, NULL, 0, SHRT_MIN);
|
||
|
ret += test9_0 (NULL, NULL, -1, SHRT_MIN);
|
||
|
ret += test9_0 (NULL, NULL, 1, SHRT_MIN);
|
||
|
ret += test9_0 (&emptyBstring, NULL, 0, SHRT_MIN);
|
||
|
ret += test9_0 (NULL, &emptyBstring, 0, SHRT_MIN);
|
||
|
ret += test9_0 (&emptyBstring, NULL, 1, SHRT_MIN);
|
||
|
ret += test9_0 (NULL, &emptyBstring, 1, SHRT_MIN);
|
||
|
ret += test9_0 (&badBstring1, &badBstring1, 1, SHRT_MIN);
|
||
|
ret += test9_0 (&badBstring2, &badBstring2, 1, SHRT_MIN);
|
||
|
ret += test9_0 (&emptyBstring, &badBstring1, 1, SHRT_MIN);
|
||
|
ret += test9_0 (&emptyBstring, &badBstring2, 1, SHRT_MIN);
|
||
|
ret += test9_0 (&badBstring1, &emptyBstring, 1, SHRT_MIN);
|
||
|
ret += test9_0 (&badBstring2, &emptyBstring, 1, SHRT_MIN);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test9_0 (&emptyBstring, &emptyBstring, -1, 0);
|
||
|
ret += test9_0 (&emptyBstring, &emptyBstring, 0, 0);
|
||
|
ret += test9_0 (&emptyBstring, &emptyBstring, 1, 0);
|
||
|
ret += test9_0 (&shortBstring, &shortBstring, -1, 0);
|
||
|
ret += test9_0 (&shortBstring, &shortBstring, 0, 0);
|
||
|
ret += test9_0 (&shortBstring, &shortBstring, 1, 0);
|
||
|
ret += test9_0 (&shortBstring, &shortBstring, 9, 0);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test10_0 (bstring b, int res, int nochange) {
|
||
|
struct tagbstring sb = bsStatic ("<NULL>");
|
||
|
int rv, x, ret = 0;
|
||
|
|
||
|
if (b) sb = *b;
|
||
|
printf (".\tbdestroy (%s) = ", dumpBstring (b));
|
||
|
rv = bdestroy (b);
|
||
|
printf ("%d\n", rv);
|
||
|
|
||
|
if (b != NULL) {
|
||
|
if (rv >= 0)
|
||
|
/* If the bdestroy was successful we have to assume
|
||
|
the contents were "changed" */
|
||
|
x = 1;
|
||
|
else
|
||
|
x = memcmp (&sb, b, sizeof sb);
|
||
|
} else x = !nochange;
|
||
|
ret += (rv != res);
|
||
|
ret += (!nochange) == (!x);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d nochange = %d, x = %d, sb.slen = %d, sb.mlen = %d, sb.data = %p\n", __LINE__, res, nochange, x, sb.slen, sb.mlen, sb.data);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test10 (void) {
|
||
|
bstring c = bstrcpy (&shortBstring);
|
||
|
bstring b = bstrcpy (&emptyBstring);
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bdestroy (const_bstring b);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test10_0 (NULL, BSTR_ERR, 1);
|
||
|
|
||
|
/* protected, constant and regular instantiations on empty or not */
|
||
|
bwriteprotect (*b);
|
||
|
bwriteprotect (*c);
|
||
|
ret += test10_0 (b, BSTR_ERR, 1);
|
||
|
ret += test10_0 (c, BSTR_ERR, 1);
|
||
|
bwriteallow (*b);
|
||
|
bwriteallow (*c);
|
||
|
ret += test10_0 (b, BSTR_OK, 0);
|
||
|
ret += test10_0 (c, BSTR_OK, 0);
|
||
|
ret += test10_0 (&emptyBstring, BSTR_ERR, 1);
|
||
|
bwriteallow (emptyBstring);
|
||
|
ret += test10_0 (&emptyBstring, BSTR_ERR, 1);
|
||
|
ret += test10_0 (&shortBstring, BSTR_ERR, 1);
|
||
|
bwriteallow (emptyBstring);
|
||
|
ret += test10_0 (&shortBstring, BSTR_ERR, 1);
|
||
|
ret += test10_0 (&badBstring1, BSTR_ERR, 1);
|
||
|
ret += test10_0 (&badBstring2, BSTR_ERR, 1);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test11_0 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbinstr (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = binstr (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test11_1 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbinstrcaseless (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = binstrcaseless (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test11 (void) {
|
||
|
bstring b, c;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int binstr (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test11_0 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test11_0 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test11_0 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_0 (&emptyBstring, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test11_0 (&emptyBstring, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test11_0 (&badBstring1, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_0 (&badBstring2, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_0 (&badBstring1, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test11_0 (&badBstring2, 0, &badBstring1, BSTR_ERR);
|
||
|
|
||
|
ret += test11_0 (&emptyBstring, 0, &emptyBstring, 0);
|
||
|
ret += test11_0 (&emptyBstring, 1, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_0 (&shortBstring, 1, &shortBstring, BSTR_ERR);
|
||
|
ret += test11_0 (&shortBstring, 5, &emptyBstring, 5);
|
||
|
ret += test11_0 (&shortBstring, -1, &shortBstring, BSTR_ERR);
|
||
|
ret += test11_0 (&shortBstring, 0, &shortBstring, 0);
|
||
|
ret += test11_0 (&shortBstring, 0, b = bstrcpy (&shortBstring), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (&shortBstring, 0, b = bfromcstr ("BOGUS"), BSTR_ERR);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (&longBstring, 0, &shortBstring, 10);
|
||
|
ret += test11_0 (&longBstring, 20, &shortBstring, BSTR_ERR);
|
||
|
|
||
|
ret += test11_0 (c = bfromcstr ("sssssssssap"), 0, b = bfromcstr ("sap"), 8);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("sssssssssap"), 3, b = bfromcstr ("sap"), 8);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("ssssssssssap"), 3, b = bfromcstr ("sap"), 9);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("sssssssssap"), 0, b = bfromcstr ("s"), 0);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("sssssssssap"), 3, b = bfromcstr ("s"), 3);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("sssssssssap"), 0, b = bfromcstr ("a"), 9);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("sssssssssap"), 5, b = bfromcstr ("a"), 9);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("sasasasasap"), 0, b = bfromcstr ("sap"), 8);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
ret += test11_0 (c = bfromcstr ("ssasasasasap"), 0, b = bfromcstr ("sap"), 9);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf ("TEST: int binstrcaseless (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test11_1 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test11_1 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test11_1 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_1 (&emptyBstring, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test11_1 (&emptyBstring, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test11_1 (&badBstring1, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_1 (&badBstring2, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_1 (&badBstring1, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test11_1 (&badBstring2, 0, &badBstring1, BSTR_ERR);
|
||
|
|
||
|
ret += test11_1 (&emptyBstring, 0, &emptyBstring, 0);
|
||
|
ret += test11_1 (&emptyBstring, 1, &emptyBstring, BSTR_ERR);
|
||
|
ret += test11_1 (&shortBstring, 1, &shortBstring, BSTR_ERR);
|
||
|
ret += test11_1 (&shortBstring, 5, &emptyBstring, 5);
|
||
|
ret += test11_1 (&shortBstring, -1, &shortBstring, BSTR_ERR);
|
||
|
ret += test11_1 (&shortBstring, 0, &shortBstring, 0);
|
||
|
ret += test11_1 (&shortBstring, 0, b = bstrcpy (&shortBstring), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test11_1 (&shortBstring, 0, b = bfromcstr ("BOGUS"), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test11_1 (&longBstring, 0, &shortBstring, 10);
|
||
|
ret += test11_1 (&longBstring, 20, &shortBstring, BSTR_ERR);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test12_0 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbinstrr (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = binstrr (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test12_1 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbinstrrcaseless (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = binstrrcaseless (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test12 (void) {
|
||
|
bstring b;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int binstrr (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test12_0 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test12_0 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test12_0 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_0 (&emptyBstring, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test12_0 (&emptyBstring, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test12_0 (&badBstring1, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_0 (&badBstring2, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_0 (&badBstring1, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test12_0 (&badBstring2, 0, &badBstring1, BSTR_ERR);
|
||
|
|
||
|
ret += test12_0 (&emptyBstring, 0, &emptyBstring, 0);
|
||
|
ret += test12_0 (&emptyBstring, 1, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_0 (&shortBstring, 1, &shortBstring, 0);
|
||
|
ret += test12_0 (&shortBstring, 5, &emptyBstring, 5);
|
||
|
ret += test12_0 (&shortBstring, -1, &shortBstring, BSTR_ERR);
|
||
|
ret += test12_0 (&shortBstring, 0, &shortBstring, 0);
|
||
|
ret += test12_0 (&shortBstring, 0, b = bstrcpy (&shortBstring), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test12_0 (&shortBstring, 0, b = bfromcstr ("BOGUS"), BSTR_ERR);
|
||
|
bdestroy (b);
|
||
|
ret += test12_0 (&longBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test12_0 (&longBstring, 20, &shortBstring, 10);
|
||
|
|
||
|
printf ("TEST: int binstrrcaseless (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test12_1 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test12_1 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test12_1 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_1 (&emptyBstring, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test12_1 (&emptyBstring, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test12_1 (&badBstring1, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_1 (&badBstring2, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_1 (&badBstring1, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test12_1 (&badBstring2, 0, &badBstring1, BSTR_ERR);
|
||
|
|
||
|
ret += test12_1 (&emptyBstring, 0, &emptyBstring, 0);
|
||
|
ret += test12_1 (&emptyBstring, 1, &emptyBstring, BSTR_ERR);
|
||
|
ret += test12_1 (&shortBstring, 1, &shortBstring, 0);
|
||
|
ret += test12_1 (&shortBstring, 5, &emptyBstring, 5);
|
||
|
ret += test12_1 (&shortBstring, -1, &shortBstring, BSTR_ERR);
|
||
|
ret += test12_1 (&shortBstring, 0, &shortBstring, 0);
|
||
|
ret += test12_1 (&shortBstring, 0, b = bstrcpy (&shortBstring), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test12_1 (&shortBstring, 0, b = bfromcstr ("BOGUS"), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test12_1 (&longBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test12_1 (&longBstring, 20, &shortBstring, 10);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test13_0 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbinchr (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = binchr (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test13 (void) {
|
||
|
bstring b;
|
||
|
int ret = 0;
|
||
|
struct tagbstring multipleOs = bsStatic ("ooooo");
|
||
|
|
||
|
printf ("TEST: int binchr (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test13_0 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test13_0 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test13_0 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&emptyBstring, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test13_0 (&emptyBstring, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test13_0 (&badBstring1, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&badBstring2, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&badBstring2, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test13_0 (&badBstring1, 0, &badBstring2, BSTR_ERR);
|
||
|
|
||
|
ret += test13_0 (&emptyBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&shortBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&shortBstring, 0, &shortBstring, 0);
|
||
|
ret += test13_0 (&shortBstring, 0, &multipleOs, 1);
|
||
|
ret += test13_0 (&shortBstring, 0, b = bstrcpy (&shortBstring), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test13_0 (&shortBstring, -1, &shortBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&shortBstring, 10, &shortBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&shortBstring, 1, &shortBstring, 1);
|
||
|
ret += test13_0 (&emptyBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&xxxxxBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test13_0 (&longBstring, 0, &shortBstring, 3);
|
||
|
ret += test13_0 (&longBstring, 10, &shortBstring, 10);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test14_0 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbinchrr (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = binchrr (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test14 (void) {
|
||
|
bstring b;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int binchrr (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test14_0 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test14_0 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test14_0 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&emptyBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&shortBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&emptyBstring, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test14_0 (&emptyBstring, 0, &badBstring2, BSTR_ERR);
|
||
|
ret += test14_0 (&badBstring1, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&badBstring2, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&badBstring2, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test14_0 (&badBstring1, 0, &badBstring2, BSTR_ERR);
|
||
|
|
||
|
ret += test14_0 (&shortBstring, 0, &shortBstring, 0);
|
||
|
ret += test14_0 (&shortBstring, 0, b = bstrcpy (&shortBstring), 0);
|
||
|
bdestroy (b);
|
||
|
ret += test14_0 (&shortBstring, -1, &shortBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&shortBstring, 5, &shortBstring, 4);
|
||
|
ret += test14_0 (&shortBstring, 4, &shortBstring, 4);
|
||
|
ret += test14_0 (&shortBstring, 1, &shortBstring, 1);
|
||
|
ret += test14_0 (&emptyBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&xxxxxBstring, 4, &shortBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&longBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test14_0 (&longBstring, 10, &shortBstring, 10);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test15_0 (bstring b0, int pos, const_bstring b1, unsigned char fill, char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0, linenum = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
b1 != NULL && b1->data != NULL && b1->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbsetstr (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bsetstr (b2, pos, b1, fill);
|
||
|
ret += (rv == 0); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
if (!biseq (b0, b2)) ret++; if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
|
||
|
printf ("%d, %s, %02X) = %s\n", pos, dumpBstring (b1), fill, dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbsetstr (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bsetstr (b2, pos, b1, fill);
|
||
|
if (b1) {
|
||
|
ret += (pos >= 0) && (b2->slen != b0->slen + b1->slen) && (b2->slen != pos + b1->slen); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
ret += (pos < 0) && (b2->slen != b0->slen); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
}
|
||
|
|
||
|
ret += ((rv == 0) != (pos >= 0)); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
ret += (res == NULL); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
ret += ((int) strlen (res) > b2->slen); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
ret += (0 != memcmp (b2->data, res, b2->slen)); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
ret += b2->data[b2->slen] != '\0'; if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
|
||
|
printf ("%d, %s, %02X) = %s\n", pos, dumpBstring (b1), fill, dumpBstring (b2));
|
||
|
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bsetstr (b0, pos, b1, fill))); if (ret && 0 == linenum) linenum = __LINE__;
|
||
|
printf (".\tbsetstr (%s, %d, %s, %02X) = %d\n", dumpBstring (b0), pos, dumpBstring (b1), fill, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", linenum, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test15 (void) {
|
||
|
int ret = 0;
|
||
|
printf ("TEST: int bsetstr (bstring b0, int pos, const_bstring b1, unsigned char fill);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test15_0 (NULL, 0, NULL, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (NULL, 0, &emptyBstring, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&badBstring1, 0, NULL, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&badBstring1, 0, &badBstring1, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&emptyBstring, 0, &badBstring1, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&badBstring1, 0, &emptyBstring, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&badBstring2, 0, NULL, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&badBstring2, 0, &badBstring2, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&emptyBstring, 0, &badBstring2, (unsigned char) '?', NULL);
|
||
|
ret += test15_0 (&badBstring2, 0, &emptyBstring, (unsigned char) '?', NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test15_0 (&emptyBstring, 0, &emptyBstring, (unsigned char) '?', "");
|
||
|
ret += test15_0 (&emptyBstring, 5, &emptyBstring, (unsigned char) '?', "?????");
|
||
|
ret += test15_0 (&emptyBstring, 5, &shortBstring, (unsigned char) '?', "?????bogus");
|
||
|
ret += test15_0 (&shortBstring, 0, &emptyBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test15_0 (&emptyBstring, 0, &shortBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test15_0 (&shortBstring, 0, &shortBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test15_0 (&shortBstring, -1, &shortBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test15_0 (&shortBstring, 2, &shortBstring, (unsigned char) '?', "bobogus");
|
||
|
ret += test15_0 (&shortBstring, 6, &shortBstring, (unsigned char) '?', "bogus?bogus");
|
||
|
ret += test15_0 (&shortBstring, 6, NULL, (unsigned char) '?', "bogus?");
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test16_0 (bstring b0, int pos, const_bstring b1, unsigned char fill, char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
b1 != NULL && b1->data != NULL && b1->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbinsert (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = binsert (b2, pos, b1, fill);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%d, %s, %02X) = %s\n", pos, dumpBstring (b1), fill, dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbinsert (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = binsert (b2, pos, b1, fill);
|
||
|
if (b1) {
|
||
|
ret += (pos >= 0) && (b2->slen != b0->slen + b1->slen) && (b2->slen != pos + b1->slen);
|
||
|
ret += (pos < 0) && (b2->slen != b0->slen);
|
||
|
ret += ((rv == 0) != (pos >= 0 && pos <= b2->slen));
|
||
|
}
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
|
||
|
printf ("%d, %s, %02X) = %s\n", pos, dumpBstring (b1), fill, dumpBstring (b2));
|
||
|
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = binsert (b0, pos, b1, fill)));
|
||
|
printf (".\tbinsert (%s, %d, %s, %02X) = %d\n", dumpBstring (b0), pos, dumpBstring (b1), fill, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test16_1 (void) {
|
||
|
bstring b0 = bfromStatic ("aaaaabbbbb");
|
||
|
struct tagbstring b1;
|
||
|
int res, ret = 0;
|
||
|
|
||
|
bmid2tbstr (b1, b0, 4, 4);
|
||
|
b0->slen = 6;
|
||
|
|
||
|
printf (".\tbinsert (%s, 2, %s, '?') = ", dumpBstring (b0), dumpBstring (&b1));
|
||
|
res = binsert (b0, 2, &b1, '?');
|
||
|
printf ("%s (Alias test)\n", dumpBstring (b0));
|
||
|
|
||
|
ret += (res != 0);
|
||
|
ret += !biseqStatic(b0, "aaabbbaaab");
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test16 (void) {
|
||
|
int ret = 0;
|
||
|
printf ("TEST: int binsert (bstring b0, int pos, const_bstring b1, unsigned char fill);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test16_0 (NULL, 0, NULL, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (NULL, 0, &emptyBstring, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&badBstring1, 0, NULL, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&badBstring1, 0, &badBstring1, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&emptyBstring, 0, &badBstring1, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&badBstring1, 0, &emptyBstring, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&badBstring2, 0, NULL, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&badBstring2, 0, &badBstring2, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&emptyBstring, 0, &badBstring2, (unsigned char) '?', NULL);
|
||
|
ret += test16_0 (&badBstring2, 0, &emptyBstring, (unsigned char) '?', NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test16_0 (&emptyBstring, 0, &emptyBstring, (unsigned char) '?', "");
|
||
|
ret += test16_0 (&emptyBstring, 5, &emptyBstring, (unsigned char) '?', "?????");
|
||
|
ret += test16_0 (&emptyBstring, 5, &shortBstring, (unsigned char) '?', "?????bogus");
|
||
|
ret += test16_0 (&shortBstring, 0, &emptyBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test16_0 (&emptyBstring, 0, &shortBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test16_0 (&shortBstring, 0, &shortBstring, (unsigned char) '?', "bogusbogus");
|
||
|
ret += test16_0 (&shortBstring, -1, &shortBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test16_0 (&shortBstring, 2, &shortBstring, (unsigned char) '?', "bobogusgus");
|
||
|
ret += test16_0 (&shortBstring, 6, &shortBstring, (unsigned char) '?', "bogus?bogus");
|
||
|
ret += test16_0 (&shortBstring, 6, NULL, (unsigned char) '?', "bogus");
|
||
|
|
||
|
/* Alias testing */
|
||
|
ret += test16_1 ();
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test17_0 (bstring s1, int pos, int len, char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (s1 != NULL && s1->data != NULL && s1->slen >= 0) {
|
||
|
b2 = bstrcpy (s1);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbdelete (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bdelete (b2, pos, len);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (s1, b2)) ret++;
|
||
|
|
||
|
printf ("%d, %d) = %s\n", pos, len, dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbdelete (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bdelete (b2, pos, len);
|
||
|
ret += (len >= 0) != (rv == 0);
|
||
|
ret += (b2->slen > s1->slen) || (b2->slen < pos && s1->slen >= pos);
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
|
||
|
printf ("%d, %d) = %s\n", pos, len, dumpBstring (b2));
|
||
|
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bdelete (s1, pos, len)));
|
||
|
printf (".\tbdelete (%s, %d, %d) = %d\n", dumpBstring (s1), pos, len, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test17 (void) {
|
||
|
int ret = 0;
|
||
|
printf ("TEST: int bdelete (bstring s1, int pos, int len);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test17_0 (NULL, 0, 0, NULL);
|
||
|
ret += test17_0 (&badBstring1, 0, 0, NULL);
|
||
|
ret += test17_0 (&badBstring2, 0, 0, NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test17_0 (&emptyBstring, 0, 0, "");
|
||
|
ret += test17_0 (&shortBstring, 1, 3, "bs");
|
||
|
ret += test17_0 (&shortBstring, -1, 3, "gus");
|
||
|
ret += test17_0 (&shortBstring, 1, -3, "bogus");
|
||
|
ret += test17_0 (&shortBstring, 3, 9, "bog");
|
||
|
ret += test17_0 (&shortBstring, 3, 1, "bogs");
|
||
|
ret += test17_0 (&longBstring, 4, 300, "This");
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test18_0 (bstring b, int len, int res, int mlen) {
|
||
|
int ret = 0;
|
||
|
int rv;
|
||
|
int ol = 0;
|
||
|
|
||
|
printf (".\tballoc (%s, %d) = ", dumpBstring (b), len);
|
||
|
if (b) ol = b->mlen;
|
||
|
rv = balloc (b, len);
|
||
|
printf ("%d\n", rv);
|
||
|
|
||
|
if (b != NULL && b->data != NULL && b->slen >=0 && ol > b->mlen) {
|
||
|
printf ("\t\tfailure(%d) oldmlen = %d, newmlen %d\n", __LINE__, ol, b->mlen);
|
||
|
ret++;
|
||
|
}
|
||
|
|
||
|
if (rv != res) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
ret++;
|
||
|
}
|
||
|
if (b != NULL && (mlen > b->mlen || b->mlen == 0)) {
|
||
|
printf ("\t\tfailure(%d) b->mlen = %d mlen = %d\n", __LINE__, b->mlen, mlen);
|
||
|
ret++;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test18_1_int (bstring b, int len, int res, int mlen, int __line__) {
|
||
|
int ret = 0;
|
||
|
int rv;
|
||
|
int ol = 0;
|
||
|
|
||
|
printf (".\tballocmin (%s, %d) = ", dumpBstring (b), len);
|
||
|
if (b) ol = b->mlen;
|
||
|
|
||
|
rv = ballocmin (b, len);
|
||
|
printf ("[%d] %d\n", __LINE__, rv);
|
||
|
|
||
|
if (b != NULL && b->data != NULL && b->mlen != mlen) {
|
||
|
printf ("\t\t[%d] failure(%d) oldmlen = %d, newmlen = %d, mlen = %d len = %d\n", __line__, __LINE__, ol, b->mlen, mlen, b->slen);
|
||
|
ret++;
|
||
|
}
|
||
|
|
||
|
if (rv != res) {
|
||
|
printf ("\t\t[%d] failure(%d) res = %d\n", __line__, __LINE__, res);
|
||
|
ret++;
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#define test18_1(b, len, res, mlen) test18_1_int (b, len, res, mlen, __LINE__)
|
||
|
|
||
|
static int test18 (void) {
|
||
|
int ret = 0, reto;
|
||
|
bstring b = bfromcstr ("test");
|
||
|
|
||
|
printf ("TEST: int balloc (bstring s, int len);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test18_0 (NULL, 2, BSTR_ERR, 0);
|
||
|
ret += test18_0 (&badBstring1, 2, BSTR_ERR, 0);
|
||
|
ret += test18_0 (&badBstring2, 2, BSTR_ERR, 0);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test18_0 (b, 2, 0, b->mlen);
|
||
|
ret += test18_0 (b, -1, BSTR_ERR, b->mlen);
|
||
|
ret += test18_0 (b, 9, 0, 9);
|
||
|
ret += test18_0 (b, 2, 0, 9);
|
||
|
bwriteprotect (*b);
|
||
|
ret += test18_0 (b, 4, BSTR_ERR, b->mlen);
|
||
|
bwriteallow (*b);
|
||
|
ret += test18_0 (b, 2, 0, b->mlen);
|
||
|
ret += test18_0 (&emptyBstring, 9, BSTR_ERR, emptyBstring.mlen);
|
||
|
|
||
|
bdestroy (b);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
|
||
|
reto = ret;
|
||
|
ret = 0;
|
||
|
|
||
|
b = bfromcstr ("test");
|
||
|
|
||
|
printf ("TEST: int ballocmin (bstring s, int len);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test18_1 (NULL, 2, BSTR_ERR, 0);
|
||
|
ret += test18_1 (&badBstring1, 2, BSTR_ERR, 0);
|
||
|
ret += test18_1 (&badBstring2, 2, BSTR_ERR, 2);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test18_1 (b, 2, 0, b->slen + 1);
|
||
|
ret += test18_1 (b, -1, BSTR_ERR, b->mlen);
|
||
|
ret += test18_1 (b, 9, 0, 9);
|
||
|
ret += test18_1 (b, 2, 0, b->slen + 1);
|
||
|
ret += test18_1 (b, 9, 0, 9);
|
||
|
bwriteprotect (*b);
|
||
|
ret += test18_1 (b, 4, BSTR_ERR, -1);
|
||
|
bwriteallow (*b);
|
||
|
ret += test18_1 (b, 2, 0, b->slen + 1);
|
||
|
ret += test18_1 (&emptyBstring, 9, BSTR_ERR, emptyBstring.mlen);
|
||
|
|
||
|
bdestroy (b);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
|
||
|
return reto + ret;
|
||
|
}
|
||
|
|
||
|
static int test19_0 (bstring b, int len, const char * res, int erv) {
|
||
|
int rv, ret = 0;
|
||
|
bstring b1;
|
||
|
|
||
|
if (b != NULL && b->data != NULL && b->slen >= 0) {
|
||
|
b1 = bstrcpy (b);
|
||
|
bwriteprotect (*b1);
|
||
|
ret += bpattern (b1, len) != BSTR_ERR;
|
||
|
ret += !biseq (b1, b);
|
||
|
bwriteallow (*b1);
|
||
|
|
||
|
printf (".\tbpattern (%s, %d) = ", dumpBstring (b1), len);
|
||
|
|
||
|
rv = bpattern (b1, len);
|
||
|
|
||
|
printf ("%s\n", dumpBstring (b1));
|
||
|
|
||
|
ret += (rv != erv);
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b1->slen)
|
||
|
|| (0 != memcmp (b1->data, res, b1->slen));
|
||
|
ret += b1->data[b1->slen] != '\0';
|
||
|
} else {
|
||
|
ret += BSTR_ERR != (rv = bpattern (b, len));
|
||
|
printf (".\tbpattern (%s, %d) = %d\n", dumpBstring (b), len, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) rv = %d erv = %d (res = %p", __LINE__, rv, erv, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test19 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bpattern (bstring b, int len);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test19_0 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test19_0 (NULL, 5, NULL, BSTR_ERR);
|
||
|
ret += test19_0 (NULL, -5, NULL, BSTR_ERR);
|
||
|
ret += test19_0 (&badBstring1, 5, NULL, BSTR_ERR);
|
||
|
ret += test19_0 (&badBstring2, 5, NULL, BSTR_ERR);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test19_0 (&emptyBstring, 0, "", BSTR_ERR);
|
||
|
ret += test19_0 (&emptyBstring, 10, "", BSTR_ERR);
|
||
|
ret += test19_0 (&emptyBstring, -1, "", BSTR_ERR);
|
||
|
ret += test19_0 (&shortBstring, 0, "", 0);
|
||
|
ret += test19_0 (&shortBstring, 12, "bogusbogusbo", 0);
|
||
|
ret += test19_0 (&shortBstring, -1, "bogus", BSTR_ERR);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test20 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
#if !defined (BSTRLIB_NOVSNP)
|
||
|
int rv;
|
||
|
bstring b, c;
|
||
|
|
||
|
printf ("TEST: bstring bformat (const char * fmt, ...);\n");
|
||
|
/* tests with NULL */
|
||
|
printf (".\tbformat (NULL, 1, 2) = ");
|
||
|
b = bformat (NULL, 1, 2);
|
||
|
printf ("%s\n", dumpBstring (b));
|
||
|
ret += b != NULL;
|
||
|
|
||
|
/* normal operation tests */
|
||
|
printf (".\tbformat (\"%%d %%s\", 1, \"xy\") = ");
|
||
|
b = bformat ("%d %s", 1, "xy");
|
||
|
printf ("%s\n", dumpBstring (b));
|
||
|
ret += !biseq (c = bfromcstr ("1 xy"), b);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf (".\tbformat (\"%%d %%s(%%s)\", 6, %s, %s) = ", dumpBstring (c), dumpBstring (&shortBstring));
|
||
|
b = bformat ("%d %s(%s)", 6, c->data, shortBstring.data);
|
||
|
printf ("%s\n", dumpBstring (b));
|
||
|
bdestroy (c);
|
||
|
ret += !biseq (c = bfromcstr ("6 1 xy(bogus)"), b);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf (".\tbformat (\"%%s%%s%%s%%s%%s%%s%%s%%s\", ...) ...\n");
|
||
|
b = bformat ("%s%s%s%s%s%s%s%s", longBstring.data, longBstring.data
|
||
|
, longBstring.data, longBstring.data
|
||
|
, longBstring.data, longBstring.data
|
||
|
, longBstring.data, longBstring.data);
|
||
|
c = bstrcpy (&longBstring);
|
||
|
bconcat (c, c);
|
||
|
bconcat (c, c);
|
||
|
bconcat (c, c);
|
||
|
ret += !biseq (c, b);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
|
||
|
b = bfromcstr ("");
|
||
|
printf ("TEST: int bformata (bstring b, const char * fmt, ...);\n");
|
||
|
/* tests with NULL */
|
||
|
printf (".\tbformata (%s, NULL, 1, 2) = ", dumpBstring (b));
|
||
|
rv = bformata (b, NULL, 1, 2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += rv != BSTR_ERR;
|
||
|
printf (".\tbformata (%s, \"%%d %%d\", 1, 2) = ", dumpBstring (&badBstring1));
|
||
|
rv = bformata (&badBstring1, "%d %d", 1, 2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += rv != BSTR_ERR;
|
||
|
printf (".\tbformata (%s, \"%%d %%d\", 1, 2) = ", dumpBstring (b));
|
||
|
rv = bformata (b, "%d %d", 1, 2);
|
||
|
printf ("%s\n", dumpBstring (b));
|
||
|
ret += !biseq (c = bfromcstr ("1 2"), b);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf (".\tbformata (\"x\", \"%%s%%s%%s%%s%%s%%s%%s%%s\", ...) ...\n");
|
||
|
rv = bformata (b = bfromcstr ("x"), "%s%s%s%s%s%s%s%s",
|
||
|
longBstring.data, longBstring.data,
|
||
|
longBstring.data, longBstring.data,
|
||
|
longBstring.data, longBstring.data,
|
||
|
longBstring.data, longBstring.data);
|
||
|
ret += rv == BSTR_ERR;
|
||
|
c = bstrcpy (&longBstring);
|
||
|
bconcat (c, c);
|
||
|
bconcat (c, c);
|
||
|
bconcat (c, c);
|
||
|
binsertch (c, 0, 1, (char) 'x');
|
||
|
ret += !biseq (c, b);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
|
||
|
b = bfromcstr ("Initial");
|
||
|
printf ("TEST: int bassignformat (bstring b, const char * fmt, ...);\n");
|
||
|
/* tests with NULL */
|
||
|
printf (".\tbassignformat (%s, NULL, 1, 2) = ", dumpBstring (b));
|
||
|
rv = bassignformat (b, NULL, 1, 2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += rv != BSTR_ERR;
|
||
|
printf (".\tbassignformat (%s, \"%%d %%d\", 1, 2) = ", dumpBstring (&badBstring1));
|
||
|
rv = bassignformat (&badBstring1, "%d %d", 1, 2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += rv != BSTR_ERR;
|
||
|
printf (".\tbassignformat (%s, \"%%d %%d\", 1, 2) = ", dumpBstring (b));
|
||
|
rv = bassignformat (b, "%d %d", 1, 2);
|
||
|
printf ("%s\n", dumpBstring (b));
|
||
|
ret += !biseq (c = bfromcstr ("1 2"), b);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf (".\tbassignformat (\"x\", \"%%s%%s%%s%%s%%s%%s%%s%%s\", ...) ...\n");
|
||
|
rv = bassignformat (b = bfromcstr ("x"), "%s%s%s%s%s%s%s%s",
|
||
|
longBstring.data, longBstring.data,
|
||
|
longBstring.data, longBstring.data,
|
||
|
longBstring.data, longBstring.data,
|
||
|
longBstring.data, longBstring.data);
|
||
|
ret += rv == BSTR_ERR;
|
||
|
c = bstrcpy (&longBstring);
|
||
|
bconcat (c, c);
|
||
|
bconcat (c, c);
|
||
|
bconcat (c, c);
|
||
|
ret += !biseq (c, b);
|
||
|
bdestroy (c);
|
||
|
bdestroy (b);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
#endif
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test21_0 (bstring b, char sc, int ns) {
|
||
|
struct bstrList * l;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf (".\tbsplit (%s, '%c') = ", dumpBstring (b), sc);
|
||
|
|
||
|
if (b != NULL && b->data != NULL && b->slen >= 0) {
|
||
|
bstring c;
|
||
|
struct tagbstring t;
|
||
|
|
||
|
blk2tbstr(t,&sc,1);
|
||
|
|
||
|
printf ("{");
|
||
|
|
||
|
l = bsplit (b, sc);
|
||
|
|
||
|
if (l) {
|
||
|
int i;
|
||
|
for (i=0; i < l->qty; i++) {
|
||
|
if (i != 0) printf (", ");
|
||
|
printf ("%s", dumpBstring (l->entry[i]));
|
||
|
}
|
||
|
printf (":<%d>", l->qty);
|
||
|
if (ns != l->qty) ret++;
|
||
|
} else {
|
||
|
printf ("NULL");
|
||
|
ret ++;
|
||
|
}
|
||
|
|
||
|
printf ("}\n");
|
||
|
|
||
|
c = bjoin (l, &t);
|
||
|
ret += !biseq (c, b);
|
||
|
ret += incorrectBstring (c);
|
||
|
bdestroy (c);
|
||
|
ret += 0 != bstrListDestroy (l);
|
||
|
} else {
|
||
|
l = bsplit (b, sc);
|
||
|
ret += (l != NULL);
|
||
|
printf ("%p\n", (void *) l);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) ns = %d\n", __LINE__, ns);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test21_1 (bstring b, const_bstring sc, int ns) {
|
||
|
struct bstrList * l;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf (".\tbsplitstr (%s, %s) = ", dumpBstring (b), dumpBstring (sc));
|
||
|
|
||
|
if (b != NULL && b->data != NULL && b->slen >= 0) {
|
||
|
bstring c;
|
||
|
|
||
|
printf ("{");
|
||
|
|
||
|
l = bsplitstr (b, sc);
|
||
|
|
||
|
if (l) {
|
||
|
int i;
|
||
|
for (i=0; i < l->qty; i++) {
|
||
|
if (i != 0) printf (", ");
|
||
|
printf ("%s", dumpBstring (l->entry[i]));
|
||
|
}
|
||
|
printf (":<%d>", l->qty);
|
||
|
if (ns != l->qty) ret++;
|
||
|
} else {
|
||
|
printf ("NULL");
|
||
|
ret ++;
|
||
|
}
|
||
|
|
||
|
printf ("}\n");
|
||
|
|
||
|
c = bjoin (l, sc);
|
||
|
ret += !biseq (c, b);
|
||
|
ret += incorrectBstring (c);
|
||
|
bdestroy (c);
|
||
|
ret += 0 != bstrListDestroy (l);
|
||
|
} else {
|
||
|
l = bsplitstr (b, sc);
|
||
|
ret += (l != NULL);
|
||
|
printf ("%p\n", (void *) l);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) ns = %d\n", __LINE__, ns);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test21 (void) {
|
||
|
struct tagbstring is = bsStatic ("is");
|
||
|
struct tagbstring ng = bsStatic ("ng");
|
||
|
struct tagbstring commas = bsStatic (",,,,");
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: struct bstrList * bsplit (const_bstring str, unsigned char splitChar);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test21_0 (NULL, (char) '?', 0);
|
||
|
ret += test21_0 (&badBstring1, (char) '?', 0);
|
||
|
ret += test21_0 (&badBstring2, (char) '?', 0);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test21_0 (&emptyBstring, (char) '?', 1);
|
||
|
ret += test21_0 (&shortBstring, (char) 'o', 2);
|
||
|
ret += test21_0 (&shortBstring, (char) 's', 2);
|
||
|
ret += test21_0 (&shortBstring, (char) 'b', 2);
|
||
|
ret += test21_0 (&longBstring, (char) 'o', 9);
|
||
|
ret += test21_0 (&commas, (char) ',', 5);
|
||
|
|
||
|
printf ("TEST: struct bstrList * bsplitstr (bstring str, const_bstring splitStr);\n");
|
||
|
|
||
|
ret += test21_1 (NULL, NULL, 0);
|
||
|
ret += test21_1 (&badBstring1, &emptyBstring, 0);
|
||
|
ret += test21_1 (&badBstring2, &emptyBstring, 0);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test21_1 (&shortBstring, &emptyBstring, 5);
|
||
|
ret += test21_1 (&longBstring, &is, 3);
|
||
|
ret += test21_1 (&longBstring, &ng, 5);
|
||
|
|
||
|
if (0 == ret) {
|
||
|
struct bstrList * l;
|
||
|
unsigned char c;
|
||
|
struct tagbstring t;
|
||
|
bstring b;
|
||
|
bstring list[3] = { &emptyBstring, &shortBstring, &longBstring };
|
||
|
int i;
|
||
|
|
||
|
blk2tbstr (t, &c, 1);
|
||
|
|
||
|
for (i=0; i < 3; i++) {
|
||
|
c = (unsigned char) '\0';
|
||
|
for (;;) {
|
||
|
b = bjoin (l = bsplit (list[i], c), &t);
|
||
|
if (!biseq (b, list[i])) {
|
||
|
printf ("\t\tfailure(%d) ", __LINE__);
|
||
|
printf ("join (bsplit (%s, x%02X), {x%02X}) = %s\n", dumpBstring (list[i]), c, c, dumpBstring (b));
|
||
|
ret++;
|
||
|
}
|
||
|
bdestroy (b);
|
||
|
bstrListDestroy (l);
|
||
|
if (ret) break;
|
||
|
|
||
|
b = bjoin (l = bsplitstr (list[i], &t), &t);
|
||
|
if (!biseq (b, list[i])) {
|
||
|
printf ("\t\tfailure(%d) ", __LINE__);
|
||
|
printf ("join (bsplitstr (%s, {x%02X}), {x%02X}) = %s\n", dumpBstring (list[i]), c, c, dumpBstring (b));
|
||
|
ret++;
|
||
|
}
|
||
|
bdestroy (b);
|
||
|
bstrListDestroy (l);
|
||
|
if (ret) break;
|
||
|
|
||
|
if (UCHAR_MAX == c) break;
|
||
|
c++;
|
||
|
}
|
||
|
if (ret) break;
|
||
|
}
|
||
|
|
||
|
l = bsplit (&emptyBstring, 'x');
|
||
|
bdestroy (l->entry[0]);
|
||
|
l->qty--;
|
||
|
b = bjoin (l, &longBstring);
|
||
|
ret += incorrectBstring (b);
|
||
|
bstrListDestroy (l);
|
||
|
if (b->slen) {
|
||
|
printf ("\t\tfailure(%d) ", __LINE__);
|
||
|
ret++;
|
||
|
}
|
||
|
bdestroy (b);
|
||
|
|
||
|
}
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test22_0 (const_bstring b, const_bstring sep, int ns, ...) {
|
||
|
va_list arglist;
|
||
|
struct bstrList * l;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf (".\tbsplits (%s, %s)", dumpBstring (b), dumpBstring (sep));
|
||
|
if ( b != NULL && b->data != NULL && b->slen >= 0 &&
|
||
|
sep != NULL && sep->data != NULL && sep->slen >= 0) {
|
||
|
printf (" {");
|
||
|
|
||
|
l = bsplits (b, sep);
|
||
|
|
||
|
if (l) {
|
||
|
int i;
|
||
|
va_start (arglist, ns);
|
||
|
|
||
|
for (i=0; i < l->qty; i++) {
|
||
|
char * res;
|
||
|
|
||
|
res = va_arg (arglist, char *);
|
||
|
|
||
|
if (i != 0) printf (", ");
|
||
|
printf ("%s", dumpBstring (l->entry[i]));
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) > l->entry[i]->slen)
|
||
|
|| (0 != memcmp (l->entry[i]->data, res, l->entry[i]->slen));
|
||
|
ret += l->entry[i]->data[l->entry[i]->slen] != '\0';
|
||
|
}
|
||
|
|
||
|
va_end (arglist);
|
||
|
|
||
|
printf (":<%d>", l->qty);
|
||
|
if (ns != l->qty) ret++;
|
||
|
} else {
|
||
|
printf ("NULL");
|
||
|
ret += (ns != 0);
|
||
|
}
|
||
|
|
||
|
printf ("}\n");
|
||
|
|
||
|
ret += (0 != bstrListDestroy (l) && l != NULL);
|
||
|
} else {
|
||
|
l = bsplits (b, sep);
|
||
|
ret += (l != NULL);
|
||
|
printf (" = %p\n", (void *) l);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) ns = %d\n", __LINE__, ns);
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test22 (void) {
|
||
|
int ret = 0;
|
||
|
struct tagbstring o=bsStatic("o");
|
||
|
struct tagbstring s=bsStatic("s");
|
||
|
struct tagbstring b=bsStatic("b");
|
||
|
struct tagbstring bs=bsStatic("bs");
|
||
|
struct tagbstring uo=bsStatic("uo");
|
||
|
|
||
|
printf ("TEST: extern struct bstrList * bsplits (const_bstring str, const_bstring splitStr);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test22_0 (NULL, &o, 0);
|
||
|
ret += test22_0 (&o, NULL, 0);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test22_0 (&emptyBstring, &o, 1, "");
|
||
|
ret += test22_0 (&emptyBstring, &uo, 1, "");
|
||
|
ret += test22_0 (&shortBstring, &emptyBstring, 1, "bogus");
|
||
|
ret += test22_0 (&shortBstring, &o, 2, "b", "gus");
|
||
|
ret += test22_0 (&shortBstring, &s, 2, "bogu", "");
|
||
|
ret += test22_0 (&shortBstring, &b, 2, "" , "ogus");
|
||
|
ret += test22_0 (&shortBstring, &bs, 3, "" , "ogu", "");
|
||
|
ret += test22_0 (&longBstring, &o, 9, "This is a b", "gus but reas", "nably l", "ng string. Just l", "ng en", "ugh t", " cause s", "me mall", "cing.");
|
||
|
ret += test22_0 (&shortBstring, &uo, 3, "b", "g", "s");
|
||
|
|
||
|
if (0 == ret) {
|
||
|
struct bstrList * l;
|
||
|
unsigned char c;
|
||
|
struct tagbstring t;
|
||
|
bstring bb;
|
||
|
bstring list[3] = { &emptyBstring, &shortBstring, &longBstring };
|
||
|
int i;
|
||
|
|
||
|
blk2tbstr (t, &c, 1);
|
||
|
|
||
|
for (i=0; i < 3; i++) {
|
||
|
c = (unsigned char) '\0';
|
||
|
for (;;) {
|
||
|
bb = bjoin (l = bsplits (list[i], &t), &t);
|
||
|
if (!biseq (bb, list[i])) {
|
||
|
printf ("\t\tfailure(%d) ", __LINE__);
|
||
|
printf ("join (bsplits (%s, {x%02X}), {x%02X}) = %s\n", dumpBstring (list[i]), c, c, dumpBstring (bb));
|
||
|
ret++;
|
||
|
}
|
||
|
bdestroy (bb);
|
||
|
bstrListDestroy (l);
|
||
|
if (ret) break;
|
||
|
if (UCHAR_MAX == c) break;
|
||
|
c++;
|
||
|
}
|
||
|
if (ret) break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
struct sbstr {
|
||
|
int ofs;
|
||
|
bstring b;
|
||
|
};
|
||
|
|
||
|
static size_t test23_aux_read (void *buff, size_t elsize, size_t nelem, void *parm) {
|
||
|
struct sbstr * sb = (struct sbstr *)parm;
|
||
|
int els, len;
|
||
|
|
||
|
if (parm == NULL || elsize == 0 || nelem == 0) return 0;
|
||
|
len = (int) (nelem * elsize); if (len <= 0) return 0;
|
||
|
if (len + sb->ofs > sb->b->slen) len = sb->b->slen - sb->ofs;
|
||
|
els = (int) (len / elsize);
|
||
|
len = (int) (els * elsize);
|
||
|
if (len > 0) {
|
||
|
memcpy (buff, sb->b->data + sb->ofs, len);
|
||
|
sb->ofs += len;
|
||
|
}
|
||
|
return els;
|
||
|
}
|
||
|
|
||
|
static int test23_aux_open (struct sbstr * sb, bstring b) {
|
||
|
if (!sb || b == NULL || b->data == NULL) return -__LINE__;
|
||
|
sb->ofs = 0;
|
||
|
sb->b = b;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int test23_aux_splitcb (void * parm, int ofs, const struct tagbstring * entry) {
|
||
|
bstring b = (bstring) parm;
|
||
|
|
||
|
ofs = ofs;
|
||
|
if (b->slen > 0) bconchar (b, (char) '|');
|
||
|
bconcat (b, entry);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
struct tagBss {
|
||
|
int first;
|
||
|
unsigned char sc;
|
||
|
bstring b;
|
||
|
};
|
||
|
|
||
|
static int test23_aux_splitcbx (void * parm, int ofs, const struct tagbstring * entry) {
|
||
|
struct tagBss * p = (struct tagBss *) parm;
|
||
|
|
||
|
ofs = ofs;
|
||
|
if (!p->first) {
|
||
|
bconchar (p->b, (char) p->sc);
|
||
|
} else p->first = 0;
|
||
|
|
||
|
bconcat (p->b, entry);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int test23 (void) {
|
||
|
struct tagbstring space = bsStatic (" ");
|
||
|
struct sbstr sb;
|
||
|
struct bStream * bs;
|
||
|
bstring b;
|
||
|
int l, ret = 0;
|
||
|
|
||
|
printf ("TEST: bstream integrated test\n");
|
||
|
test23_aux_open (&sb, &longBstring);
|
||
|
ret += NULL != (bs = bsopen ((bNread) NULL, &sb));
|
||
|
ret += NULL == (bs = bsopen ((bNread) test23_aux_read, &sb));
|
||
|
ret += (bseof (bs) != 0);
|
||
|
ret += BSTR_ERR != bsbufflength (NULL, -1);
|
||
|
ret += BSTR_ERR != bsbufflength (NULL, 1);
|
||
|
ret += BSTR_ERR != bsbufflength (bs, -1);
|
||
|
printf (".\tbsbufflength (bs, 0) -> %d\n", bsbufflength (bs, 0));
|
||
|
ret += BSTR_ERR == bsbufflength (bs, 1);
|
||
|
ret += BSTR_ERR != bspeek (NULL, bs);
|
||
|
ret += BSTR_ERR != bsreadln (NULL, bs, (char) '?');
|
||
|
ret += BSTR_ERR != bsreadln (&emptyBstring, bs, (char) '?');
|
||
|
ret += BSTR_ERR != bspeek (&emptyBstring, bs);
|
||
|
|
||
|
ret += BSTR_ERR == bspeek (b = bfromcstr (""), bs);
|
||
|
|
||
|
printf (".\tbspeek () -> %s\n", dumpBstring (b));
|
||
|
ret += BSTR_ERR != bsreadln (b, NULL, (char) '?');
|
||
|
b->slen = 0;
|
||
|
ret += BSTR_ERR == bsreadln (b, bs, (char) '?');
|
||
|
ret += (bseof (bs) <= 0);
|
||
|
ret += biseq (b, &longBstring) < 0;
|
||
|
printf (".\tbsreadln ('?') -> %s\n", dumpBstring (b));
|
||
|
ret += BSTR_ERR == bsunread (bs, b);
|
||
|
ret += (bseof (bs) != 0);
|
||
|
printf (".\tbsunread (%s)\n", dumpBstring (b));
|
||
|
b->slen = 0;
|
||
|
ret += BSTR_ERR == bspeek (b, bs);
|
||
|
ret += biseq (b, &longBstring) < 0;
|
||
|
printf (".\tbspeek () -> %s\n", dumpBstring (b));
|
||
|
b->slen = 0;
|
||
|
ret += BSTR_ERR == bsreadln (b, bs, (char) '?');
|
||
|
ret += (bseof (bs) <= 0);
|
||
|
ret += biseq (b, &longBstring) < 0;
|
||
|
printf (".\tbsreadln ('?') -> %s\n", dumpBstring (b));
|
||
|
ret += NULL == bsclose (bs);
|
||
|
sb.ofs = 0;
|
||
|
|
||
|
ret += NULL == (bs = bsopen ((bNread) test23_aux_read, &sb));
|
||
|
b->slen = 0;
|
||
|
ret += BSTR_ERR == bsreadln (b, bs, (char) '.');
|
||
|
l = b->slen;
|
||
|
ret += (0 != bstrncmp (b, &longBstring, l)) || (longBstring.data[l-1] != '.');
|
||
|
printf (".\tbsreadln ('.') -> %s\n", dumpBstring (b));
|
||
|
ret += BSTR_ERR == bsunread (bs, b);
|
||
|
|
||
|
printf (".\tbsunread (%s)\n", dumpBstring (b));
|
||
|
b->slen = 0;
|
||
|
ret += BSTR_ERR == bspeek (b, bs);
|
||
|
ret += biseq (b, &longBstring) < 0;
|
||
|
printf (".\tbspeek () -> %s\n", dumpBstring (b));
|
||
|
b->slen = 0;
|
||
|
ret += BSTR_ERR == bsreadln (b, bs, (char) '.');
|
||
|
|
||
|
ret += b->slen != l || (0 != bstrncmp (b, &longBstring, l)) || (longBstring.data[l-1] != '.');
|
||
|
printf (".\tbsreadln ('.') -> %s\n", dumpBstring (b));
|
||
|
ret += NULL == bsclose (bs);
|
||
|
|
||
|
test23_aux_open (&sb, &longBstring);
|
||
|
ret += NULL == (bs = bsopen ((bNread) test23_aux_read, &sb));
|
||
|
ret += (bseof (bs) != 0);
|
||
|
b->slen = 0;
|
||
|
l = bssplitscb (bs, &space, test23_aux_splitcb, b);
|
||
|
ret += (bseof (bs) <= 0);
|
||
|
ret += NULL == bsclose (bs);
|
||
|
printf (".\tbssplitscb (' ') -> %s\n", dumpBstring (b));
|
||
|
|
||
|
for (l=1; l < 4; l++) {
|
||
|
char * str;
|
||
|
for (str = (char *) longBstring.data; *str; str++) {
|
||
|
test23_aux_open (&sb, &longBstring);
|
||
|
ret += NULL == (bs = bsopen ((bNread) test23_aux_read, &sb));
|
||
|
ret += bseof (bs) != 0;
|
||
|
ret += 0 > bsbufflength (bs, l);
|
||
|
b->slen = 0;
|
||
|
while (0 == bsreadlna (b, bs, *str)) ;
|
||
|
ret += 0 == biseq (b, &longBstring);
|
||
|
ret += bseof (bs) <= 0;
|
||
|
ret += NULL == bsclose (bs);
|
||
|
if (ret) break;
|
||
|
}
|
||
|
if (ret) break;
|
||
|
}
|
||
|
|
||
|
bdestroy (b);
|
||
|
|
||
|
if (0 == ret) {
|
||
|
unsigned char c;
|
||
|
struct tagbstring t;
|
||
|
bstring list[3] = { &emptyBstring, &shortBstring, &longBstring };
|
||
|
int i;
|
||
|
|
||
|
blk2tbstr (t, &c, 1);
|
||
|
|
||
|
for (i=0; i < 3; i++) {
|
||
|
c = (unsigned char) '\0';
|
||
|
for (;;) {
|
||
|
struct tagBss bss;
|
||
|
|
||
|
bss.sc = c;
|
||
|
bss.b = bfromcstr ("");
|
||
|
bss.first = 1;
|
||
|
|
||
|
test23_aux_open (&sb, list[i]);
|
||
|
bs = bsopen ((bNread) test23_aux_read, &sb);
|
||
|
bssplitscb (bs, &t, test23_aux_splitcbx, &bss);
|
||
|
bsclose (bs);
|
||
|
|
||
|
if (!biseq (bss.b, list[i])) {
|
||
|
printf ("\t\tfailure(%d) ", __LINE__);
|
||
|
printf ("join (bssplitscb (%s, {x%02X}), {x%02X}) = %s\n", dumpBstring (list[i]), c, c, dumpBstring (bss.b));
|
||
|
ret++;
|
||
|
}
|
||
|
bdestroy (bss.b);
|
||
|
if (ret) break;
|
||
|
if (UCHAR_MAX == c) break;
|
||
|
c++;
|
||
|
}
|
||
|
if (ret) break;
|
||
|
|
||
|
for (;;) {
|
||
|
struct tagBss bss;
|
||
|
|
||
|
bss.sc = c;
|
||
|
bss.b = bfromcstr ("");
|
||
|
bss.first = 1;
|
||
|
|
||
|
test23_aux_open (&sb, list[i]);
|
||
|
bs = bsopen ((bNread) test23_aux_read, &sb);
|
||
|
bssplitstrcb (bs, &t, test23_aux_splitcbx, &bss);
|
||
|
bsclose (bs);
|
||
|
|
||
|
if (!biseq (bss.b, list[i])) {
|
||
|
printf ("\t\tfailure(%d) ", __LINE__);
|
||
|
printf ("join (bssplitstrcb (%s, {x%02X}), {x%02X}) = %s\n", dumpBstring (list[i]), c, c, dumpBstring (bss.b));
|
||
|
ret++;
|
||
|
}
|
||
|
bdestroy (bss.b);
|
||
|
if (ret) break;
|
||
|
if (UCHAR_MAX == c) break;
|
||
|
c++;
|
||
|
}
|
||
|
if (ret) break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test24_0 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbninchr (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = bninchr (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test24 (void) {
|
||
|
bstring b;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bninchr (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test24_0 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test24_0 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test24_0 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test24_0 (&shortBstring, 3, &badBstring1, BSTR_ERR);
|
||
|
ret += test24_0 (&badBstring1, 3, &shortBstring, BSTR_ERR);
|
||
|
|
||
|
ret += test24_0 (&emptyBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test24_0 (&shortBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test24_0 (&shortBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test24_0 (&shortBstring, 1, &shortBstring, BSTR_ERR);
|
||
|
ret += test24_0 (&longBstring, 3, &shortBstring, 4);
|
||
|
ret += test24_0 (&longBstring, 3, b = bstrcpy (&shortBstring), 4);
|
||
|
bdestroy (b);
|
||
|
ret += test24_0 (&longBstring, -1, &shortBstring, BSTR_ERR);
|
||
|
ret += test24_0 (&longBstring, 1000, &shortBstring, BSTR_ERR);
|
||
|
ret += test24_0 (&xxxxxBstring, 0, &shortBstring, 0);
|
||
|
ret += test24_0 (&xxxxxBstring, 1, &shortBstring, 1);
|
||
|
ret += test24_0 (&emptyBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
|
||
|
ret += test24_0 (&longBstring, 0, &shortBstring, 0);
|
||
|
ret += test24_0 (&longBstring, 10, &shortBstring, 15);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test25_0 (bstring s1, int pos, const_bstring s2, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbninchrr (%s, %d, %s) = ", dumpBstring (s1), pos, dumpBstring (s2));
|
||
|
rv = bninchrr (s1, pos, s2);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test25 (void) {
|
||
|
bstring b;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bninchrr (const_bstring s1, int pos, const_bstring s2);\n");
|
||
|
ret += test25_0 (NULL, 0, NULL, BSTR_ERR);
|
||
|
ret += test25_0 (&emptyBstring, 0, NULL, BSTR_ERR);
|
||
|
ret += test25_0 (NULL, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test25_0 (&emptyBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test25_0 (&shortBstring, 0, &emptyBstring, BSTR_ERR);
|
||
|
ret += test25_0 (&shortBstring, 0, &badBstring1, BSTR_ERR);
|
||
|
ret += test25_0 (&badBstring1, 0, &shortBstring, BSTR_ERR);
|
||
|
|
||
|
ret += test25_0 (&shortBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
ret += test25_0 (&shortBstring, 4, &shortBstring, BSTR_ERR);
|
||
|
ret += test25_0 (&longBstring, 10, &shortBstring, 9);
|
||
|
ret += test25_0 (&longBstring, 10, b = bstrcpy (&shortBstring), 9);
|
||
|
bdestroy (b);
|
||
|
ret += test25_0 (&xxxxxBstring, 4, &shortBstring, 4);
|
||
|
ret += test25_0 (&emptyBstring, 0, &shortBstring, BSTR_ERR);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test26_0 (bstring b0, int pos, int len, const_bstring b1, unsigned char fill, char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
b1 != NULL && b1->data != NULL && b1->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbreplace (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = breplace (b2, pos, len, b1, fill);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%d, %d, %s, %02X) = %s\n", pos, len, dumpBstring (b1), fill, dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbreplace (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = breplace (b2, pos, len, b1, fill);
|
||
|
if (b1) {
|
||
|
ret += (pos < 0) && (b2->slen != b0->slen);
|
||
|
ret += ((rv == 0) != (pos >= 0 && pos <= b2->slen));
|
||
|
}
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
|
||
|
printf ("%d, %d, %s, %02X) = %s\n", pos, len, dumpBstring (b1), fill, dumpBstring (b2));
|
||
|
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = breplace (b0, pos, len, b1, fill)));
|
||
|
printf (".\tbreplace (%s, %d, %d, %s, %02X) = %d\n", dumpBstring (b0), pos, len, dumpBstring (b1), fill, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test26 (void) {
|
||
|
int ret = 0;
|
||
|
printf ("TEST: int breplace (bstring b0, int pos, int len, const_bstring b1, unsigned char fill);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test26_0 (NULL, 0, 0, NULL, (unsigned char) '?', NULL);
|
||
|
ret += test26_0 (NULL, 0, 0, &emptyBstring, (unsigned char) '?', NULL);
|
||
|
ret += test26_0 (&badBstring1, 1, 3, &shortBstring, (unsigned char) '?', NULL);
|
||
|
ret += test26_0 (&shortBstring, 1, 3, &badBstring1, (unsigned char) '?', NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test26_0 (&emptyBstring, 0, 0, &emptyBstring, (unsigned char) '?', "");
|
||
|
ret += test26_0 (&emptyBstring, 5, 0, &emptyBstring, (unsigned char) '?', "?????");
|
||
|
ret += test26_0 (&emptyBstring, 5, 0, &shortBstring, (unsigned char) '?', "?????bogus");
|
||
|
ret += test26_0 (&shortBstring, 0, 0, &emptyBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test26_0 (&emptyBstring, 0, 0, &shortBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test26_0 (&shortBstring, 0, 0, &shortBstring, (unsigned char) '?', "bogusbogus");
|
||
|
ret += test26_0 (&shortBstring, 1, 3, &shortBstring, (unsigned char) '?', "bboguss");
|
||
|
ret += test26_0 (&shortBstring, 3, 8, &shortBstring, (unsigned char) '?', "bogbogus");
|
||
|
ret += test26_0 (&shortBstring, -1, 0, &shortBstring, (unsigned char) '?', "bogus");
|
||
|
ret += test26_0 (&shortBstring, 2, 0, &shortBstring, (unsigned char) '?', "bobogusgus");
|
||
|
ret += test26_0 (&shortBstring, 6, 0, &shortBstring, (unsigned char) '?', "bogus?bogus");
|
||
|
ret += test26_0 (&shortBstring, 6, 0, NULL, (unsigned char) '?', "bogus");
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test27_0 (bstring b0, const_bstring b1, const char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
b1 != NULL && b1->data != NULL && b1->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbassign (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bassign (b2, b1);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%s) = %s\n", dumpBstring (b1), dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbassign (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bassign (b2, b1);
|
||
|
|
||
|
printf ("%s) = %s\n", dumpBstring (b1), dumpBstring (b2));
|
||
|
|
||
|
if (b1) ret += (b2->slen != b1->slen);
|
||
|
ret += ((0 != rv) && (b1 != NULL)) || ((0 == rv) && (b1 == NULL));
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bassign (b0, b1)));
|
||
|
printf (".\tbassign (%s, %s) = %d\n", dumpBstring (b0), dumpBstring (b1), rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test27 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bassign (bstring b0, const_bstring b1);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test27_0 (NULL, NULL, NULL);
|
||
|
ret += test27_0 (NULL, &emptyBstring, NULL);
|
||
|
ret += test27_0 (&emptyBstring, NULL, "");
|
||
|
ret += test27_0 (&badBstring1, &emptyBstring, NULL);
|
||
|
ret += test27_0 (&badBstring2, &emptyBstring, NULL);
|
||
|
ret += test27_0 (&emptyBstring, &badBstring1, NULL);
|
||
|
ret += test27_0 (&emptyBstring, &badBstring2, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test27_0 (&emptyBstring, &emptyBstring, "");
|
||
|
ret += test27_0 (&emptyBstring, &shortBstring, "bogus");
|
||
|
ret += test27_0 (&shortBstring, &emptyBstring, "");
|
||
|
ret += test27_0 (&shortBstring, &shortBstring, "bogus");
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test28_0 (bstring s1, int c, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbstrchr (%s, %d) = ", dumpBstring (s1), c);
|
||
|
rv = bstrchr (s1, c);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test28_1 (bstring s1, int c, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbstrrchr (%s, %d) = ", dumpBstring (s1), c);
|
||
|
rv = bstrrchr (s1, c);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d rv = %d\n", __LINE__, res, rv);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test28_2 (bstring s1, int c, int pos, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbstrchrp (%s, %d, %d) = ", dumpBstring (s1), c, pos);
|
||
|
rv = bstrchrp (s1, c, pos);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d\n", __LINE__, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test28_3 (bstring s1, int c, int pos, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
printf (".\tbstrrchrp (%s, %d, %d) = ", dumpBstring (s1), c, pos);
|
||
|
rv = bstrrchrp (s1, c, pos);
|
||
|
printf ("%d\n", rv);
|
||
|
ret += (rv != res);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) res = %d rv = %d\n", __LINE__, res, rv);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test28 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bstrchr (const_bstring s1, int c);\n");
|
||
|
ret += test28_0 (NULL, 0, BSTR_ERR);
|
||
|
ret += test28_0 (&badBstring1, 'b', BSTR_ERR);
|
||
|
ret += test28_0 (&badBstring2, 's', BSTR_ERR);
|
||
|
|
||
|
ret += test28_0 (&emptyBstring, 0, BSTR_ERR);
|
||
|
ret += test28_0 (&shortBstring, 0, BSTR_ERR);
|
||
|
ret += test28_0 (&shortBstring, 'b', 0);
|
||
|
ret += test28_0 (&shortBstring, 's', 4);
|
||
|
ret += test28_0 (&shortBstring, 'q', BSTR_ERR);
|
||
|
ret += test28_0 (&xxxxxBstring, 0, BSTR_ERR);
|
||
|
ret += test28_0 (&xxxxxBstring, 'b', BSTR_ERR);
|
||
|
ret += test28_0 (&longBstring, 'i', 2);
|
||
|
|
||
|
printf ("TEST: int bstrrchr (const_bstring s1, int c);\n");
|
||
|
ret += test28_1 (NULL, 0, BSTR_ERR);
|
||
|
ret += test28_1 (&badBstring1, 'b', BSTR_ERR);
|
||
|
ret += test28_1 (&badBstring2, 's', BSTR_ERR);
|
||
|
|
||
|
ret += test28_1 (&emptyBstring, 0, BSTR_ERR);
|
||
|
ret += test28_1 (&shortBstring, 0, BSTR_ERR);
|
||
|
ret += test28_1 (&shortBstring, 'b', 0);
|
||
|
ret += test28_1 (&shortBstring, 's', 4);
|
||
|
ret += test28_1 (&shortBstring, 'q', BSTR_ERR);
|
||
|
ret += test28_1 (&xxxxxBstring, 0, BSTR_ERR);
|
||
|
ret += test28_1 (&xxxxxBstring, 'b', BSTR_ERR);
|
||
|
ret += test28_1 (&longBstring, 'i', 82);
|
||
|
|
||
|
printf ("TEST: int bstrchrp (const_bstring s1, int c, int pos);\n");
|
||
|
ret += test28_2 (NULL, 0, 0, BSTR_ERR);
|
||
|
ret += test28_2 (&badBstring1, 'b', 0, BSTR_ERR);
|
||
|
ret += test28_2 (&badBstring2, 's', 0, BSTR_ERR);
|
||
|
ret += test28_2 (&shortBstring, 'b', -1, BSTR_ERR);
|
||
|
ret += test28_2 (&shortBstring, 'b', shortBstring.slen, BSTR_ERR);
|
||
|
|
||
|
ret += test28_2 (&emptyBstring, 0, 0, BSTR_ERR);
|
||
|
ret += test28_2 (&shortBstring, 0, 0, BSTR_ERR);
|
||
|
ret += test28_2 (&shortBstring, 'b', 0, 0);
|
||
|
ret += test28_2 (&shortBstring, 'b', 1, BSTR_ERR);
|
||
|
ret += test28_2 (&shortBstring, 's', 0, 4);
|
||
|
ret += test28_2 (&shortBstring, 'q', 0, BSTR_ERR);
|
||
|
|
||
|
printf ("TEST: int bstrrchrp (const_bstring s1, int c, int pos);\n");
|
||
|
ret += test28_3 (NULL, 0, 0, BSTR_ERR);
|
||
|
ret += test28_3 (&badBstring1, 'b', 0, BSTR_ERR);
|
||
|
ret += test28_3 (&badBstring2, 's', 0, BSTR_ERR);
|
||
|
ret += test28_3 (&shortBstring, 'b', -1, BSTR_ERR);
|
||
|
ret += test28_3 (&shortBstring, 'b', shortBstring.slen, BSTR_ERR);
|
||
|
|
||
|
ret += test28_3 (&emptyBstring, 0, 0, BSTR_ERR);
|
||
|
ret += test28_3 (&shortBstring, 0, 0, BSTR_ERR);
|
||
|
ret += test28_3 (&shortBstring, 'b', 0, 0);
|
||
|
ret += test28_3 (&shortBstring, 'b', shortBstring.slen - 1, 0);
|
||
|
ret += test28_3 (&shortBstring, 's', shortBstring.slen - 1, 4);
|
||
|
ret += test28_3 (&shortBstring, 's', 0, BSTR_ERR);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test29_0 (bstring b0, char * s, const char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbcatcstr (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bcatcstr (b2, s);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%p) = %s\n", s, dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbcatcstr (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bcatcstr (b2, s);
|
||
|
|
||
|
printf ("%p) = %s\n", s, dumpBstring (b2));
|
||
|
|
||
|
if (s) ret += (b2->slen != b0->slen + (int) strlen (s));
|
||
|
ret += ((0 != rv) && (s != NULL)) || ((0 == rv) && (s == NULL));
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bcatcstr (b0, s)));
|
||
|
printf (".\tbcatcstr (%s, %p) = %d\n", dumpBstring (b0), s, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test29 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bcatcstr (bstring b0, const char * s);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test29_0 (NULL, NULL, NULL);
|
||
|
ret += test29_0 (NULL, "", NULL);
|
||
|
ret += test29_0 (&emptyBstring, NULL, "");
|
||
|
ret += test29_0 (&badBstring1, "bogus", NULL);
|
||
|
ret += test29_0 (&badBstring2, "bogus", NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test29_0 (&emptyBstring, "", "");
|
||
|
ret += test29_0 (&emptyBstring, "bogus", "bogus");
|
||
|
ret += test29_0 (&shortBstring, "", "bogus");
|
||
|
ret += test29_0 (&shortBstring, "bogus", "bogusbogus");
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test30_0 (bstring b0, const unsigned char * s, int len, const char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbcatblk (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bcatblk (b2, s, len);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%p) = %s\n", s, dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbcatblk (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bcatblk (b2, s, len);
|
||
|
|
||
|
printf ("%p) = %s\n", s, dumpBstring (b2));
|
||
|
|
||
|
if (s) {
|
||
|
if (len >= 0) ret += (b2->slen != b0->slen + len);
|
||
|
else ret += (b2->slen != b0->slen);
|
||
|
}
|
||
|
ret += ((0 != rv) && (s != NULL && len >= 0)) || ((0 == rv) && (s == NULL || len < 0));
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bcatblk (b0, s, len)));
|
||
|
printf (".\tbcatblk (%s, %p, %d) = %d\n", dumpBstring (b0), s, len, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test30 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bcatblk (bstring b0, const char * s);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test30_0 (NULL, NULL, 0, NULL);
|
||
|
ret += test30_0 (NULL, (unsigned char *) "", 0, NULL);
|
||
|
ret += test30_0 (&emptyBstring, NULL, 0, "");
|
||
|
ret += test30_0 (&emptyBstring, NULL, -1, "");
|
||
|
ret += test30_0 (&badBstring1, NULL, 0, NULL);
|
||
|
ret += test30_0 (&badBstring2, NULL, 0, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test30_0 (&emptyBstring, (unsigned char *) "", -1, "");
|
||
|
ret += test30_0 (&emptyBstring, (unsigned char *) "", 0, "");
|
||
|
ret += test30_0 (&emptyBstring, (unsigned char *) "bogus", 5, "bogus");
|
||
|
ret += test30_0 (&shortBstring, (unsigned char *) "", 0, "bogus");
|
||
|
ret += test30_0 (&shortBstring, (unsigned char *) "bogus", 5, "bogusbogus");
|
||
|
ret += test30_0 (&shortBstring, (unsigned char *) "bogus", -1, "bogus");
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test31_0 (bstring b0, const_bstring find, const_bstring replace, int pos, char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
find != NULL && find->data != NULL && find->slen >= 0 &&
|
||
|
replace != NULL && replace->data != NULL && replace->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbfindreplace (%s, %s, %s, %d) = ", dumpBstring (b2), dumpBstring (find), dumpBstring (replace), pos);
|
||
|
|
||
|
rv = bfindreplace (b2, find, replace, pos);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%d\n", rv);
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbfindreplace (%s, %s, %s, %d)", dumpBstring (b2), dumpBstring (find), dumpBstring (replace), pos);
|
||
|
|
||
|
rv = bfindreplace (b2, find, replace, pos);
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
|
||
|
printf (" -> %s\n", dumpBstring (b2));
|
||
|
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bfindreplace (b0, find, replace, pos)));
|
||
|
printf (".\tbfindreplace (%s, %s, %s, %d) = %d\n", dumpBstring (b0), dumpBstring (find), dumpBstring (replace), pos, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test31_1 (bstring b0, const_bstring find, const_bstring replace, int pos, char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
find != NULL && find->data != NULL && find->slen >= 0 &&
|
||
|
replace != NULL && replace->data != NULL && replace->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbfindreplacecaseless (%s, %s, %s, %d) = ", dumpBstring (b2), dumpBstring (find), dumpBstring (replace), pos);
|
||
|
|
||
|
rv = bfindreplacecaseless (b2, find, replace, pos);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%d\n", rv);
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbfindreplacecaseless (%s, %s, %s, %d)", dumpBstring (b2), dumpBstring (find), dumpBstring (replace), pos);
|
||
|
|
||
|
rv = bfindreplacecaseless (b2, find, replace, pos);
|
||
|
|
||
|
ret += (res == NULL) || ((int) strlen (res) > b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
|
||
|
printf (" -> %s\n", dumpBstring (b2));
|
||
|
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bfindreplacecaseless (b0, find, replace, pos)));
|
||
|
printf (".\tbfindreplacecaseless (%s, %s, %s, %d) = %d\n", dumpBstring (b0), dumpBstring (find), dumpBstring (replace), pos, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
#define LOTS_OF_S "ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
|
||
|
|
||
|
static int test31 (void) {
|
||
|
int ret = 0;
|
||
|
struct tagbstring t0 = bsStatic ("funny");
|
||
|
struct tagbstring t1 = bsStatic ("weird");
|
||
|
struct tagbstring t2 = bsStatic ("s");
|
||
|
struct tagbstring t3 = bsStatic ("long");
|
||
|
struct tagbstring t4 = bsStatic ("big");
|
||
|
struct tagbstring t5 = bsStatic ("ss");
|
||
|
struct tagbstring t6 = bsStatic ("sstsst");
|
||
|
struct tagbstring t7 = bsStatic ("xx" LOTS_OF_S "xx");
|
||
|
struct tagbstring t8 = bsStatic ("S");
|
||
|
struct tagbstring t9 = bsStatic ("LONG");
|
||
|
|
||
|
printf ("TEST: int bfindreplace (bstring b, const_bstring f, const_bstring r, int pos);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test31_0 (NULL, NULL, NULL, 0, NULL);
|
||
|
ret += test31_0 (&shortBstring, NULL, &t1, 0, (char *) shortBstring.data);
|
||
|
ret += test31_0 (&shortBstring, &t2, NULL, 0, (char *) shortBstring.data);
|
||
|
ret += test31_0 (&badBstring1, &t2, &t1, 0, NULL);
|
||
|
ret += test31_0 (&badBstring2, &t2, &t1, 0, NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test31_0 (&longBstring, &shortBstring, &t0, 0, "This is a funny but reasonably long string. Just long enough to cause some mallocing.");
|
||
|
ret += test31_0 (&longBstring, &t2, &t1, 0, "Thiweird iweird a boguweird but reaweirdonably long weirdtring. Juweirdt long enough to cauweirde weirdome mallocing.");
|
||
|
ret += test31_0 (&shortBstring, &t2, &t1, 0, "boguweird");
|
||
|
ret += test31_0 (&shortBstring, &t8, &t1, 0, "bogus");
|
||
|
ret += test31_0 (&longBstring, &t2, &t1, 27, "This is a bogus but reasonably long weirdtring. Juweirdt long enough to cauweirde weirdome mallocing.");
|
||
|
ret += test31_0 (&longBstring, &t3, &t4, 0, "This is a bogus but reasonably big string. Just big enough to cause some mallocing.");
|
||
|
ret += test31_0 (&longBstring, &t9, &t4, 0, "This is a bogus but reasonably long string. Just long enough to cause some mallocing.");
|
||
|
ret += test31_0 (&t6, &t2, &t5, 0, "sssstsssst");
|
||
|
ret += test31_0 (&t7, &t2, &t5, 0, "xx" LOTS_OF_S LOTS_OF_S "xx");
|
||
|
|
||
|
printf ("TEST: int bfindreplacecaseless (bstring b, const_bstring f, const_bstring r, int pos);\n");
|
||
|
/* tests with NULL */
|
||
|
ret += test31_1 (NULL, NULL, NULL, 0, NULL);
|
||
|
ret += test31_1 (&shortBstring, NULL, &t1, 0, (char *) shortBstring.data);
|
||
|
ret += test31_1 (&shortBstring, &t2, NULL, 0, (char *) shortBstring.data);
|
||
|
ret += test31_1 (&badBstring1, &t2, &t1, 0, NULL);
|
||
|
ret += test31_1 (&badBstring2, &t2, &t1, 0, NULL);
|
||
|
|
||
|
/* normal operation tests */
|
||
|
ret += test31_1 (&longBstring, &shortBstring, &t0, 0, "This is a funny but reasonably long string. Just long enough to cause some mallocing.");
|
||
|
ret += test31_1 (&longBstring, &t2, &t1, 0, "Thiweird iweird a boguweird but reaweirdonably long weirdtring. Juweirdt long enough to cauweirde weirdome mallocing.");
|
||
|
ret += test31_1 (&shortBstring, &t2, &t1, 0, "boguweird");
|
||
|
ret += test31_1 (&shortBstring, &t8, &t1, 0, "boguweird");
|
||
|
ret += test31_1 (&longBstring, &t2, &t1, 27, "This is a bogus but reasonably long weirdtring. Juweirdt long enough to cauweirde weirdome mallocing.");
|
||
|
ret += test31_1 (&longBstring, &t3, &t4, 0, "This is a bogus but reasonably big string. Just big enough to cause some mallocing.");
|
||
|
ret += test31_1 (&longBstring, &t9, &t4, 0, "This is a bogus but reasonably big string. Just big enough to cause some mallocing.");
|
||
|
ret += test31_1 (&t6, &t2, &t5, 0, "sssstsssst");
|
||
|
ret += test31_1 (&t6, &t8, &t5, 0, "sssstsssst");
|
||
|
ret += test31_1 (&t7, &t2, &t5, 0, "xx" LOTS_OF_S LOTS_OF_S "xx");
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test32_0 (const_bstring b, const char * s, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = biseqcstr (b, s)));
|
||
|
printf (".\tbiseqcstr (%s, %p:<%s>) = %d\n", dumpBstring (b), s, (s ? s : NULL), rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test32_1 (const_bstring b, const char * s, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = biseqcstrcaseless (b, s)));
|
||
|
printf (".\tbiseqcstrcaseless (%s, %p:<%s>) = %d\n", dumpBstring (b), s, (s ? s : NULL), rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int test32 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int biseqcstr (const_bstring b, const char * s);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test32_0 (NULL, NULL, BSTR_ERR);
|
||
|
ret += test32_0 (&emptyBstring, NULL, BSTR_ERR);
|
||
|
ret += test32_0 (NULL, "", BSTR_ERR);
|
||
|
ret += test32_0 (&badBstring1, "", BSTR_ERR);
|
||
|
ret += test32_0 (&badBstring2, "bogus", BSTR_ERR);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test32_0 (&emptyBstring, "", 1);
|
||
|
ret += test32_0 (&shortBstring, "bogus", 1);
|
||
|
ret += test32_0 (&emptyBstring, "bogus", 0);
|
||
|
ret += test32_0 (&shortBstring, "", 0);
|
||
|
|
||
|
{
|
||
|
bstring b = bstrcpy (&shortBstring);
|
||
|
b->data[1]++;
|
||
|
ret += test32_0 (b, (char *) shortBstring.data, 0);
|
||
|
bdestroy (b);
|
||
|
}
|
||
|
|
||
|
printf ("TEST: int biseqcstrcaseless (const_bstring b, const char * s);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test32_1 (NULL, NULL, BSTR_ERR);
|
||
|
ret += test32_1 (&emptyBstring, NULL, BSTR_ERR);
|
||
|
ret += test32_1 (NULL, "", BSTR_ERR);
|
||
|
ret += test32_1 (&badBstring1, "", BSTR_ERR);
|
||
|
ret += test32_1 (&badBstring2, "bogus", BSTR_ERR);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test32_1 (&emptyBstring, "", 1);
|
||
|
ret += test32_1 (&shortBstring, "bogus", 1);
|
||
|
ret += test32_1 (&shortBstring, "BOGUS", 1);
|
||
|
ret += test32_1 (&emptyBstring, "bogus", 0);
|
||
|
ret += test32_1 (&shortBstring, "", 0);
|
||
|
|
||
|
{
|
||
|
bstring b = bstrcpy (&shortBstring);
|
||
|
b->data[1]++;
|
||
|
ret += test32_1 (b, (char *) shortBstring.data, 0);
|
||
|
bdestroy (b);
|
||
|
}
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test33_0 (bstring b0, const char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbtoupper (%s)", dumpBstring (b2));
|
||
|
|
||
|
rv = btoupper (b2);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf (" = %s\n", dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbtoupper (%s)", dumpBstring (b2));
|
||
|
|
||
|
rv = btoupper (b2);
|
||
|
|
||
|
printf (" = %s\n", dumpBstring (b2));
|
||
|
|
||
|
ret += (b2->slen != b0->slen);
|
||
|
ret += (0 != rv);
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = btoupper (b0)));
|
||
|
printf (".\tbtoupper (%s) = %d\n", dumpBstring (b0), rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test33 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int btoupper (bstring b);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test33_0 (NULL, NULL);
|
||
|
ret += test33_0 (&badBstring1, NULL);
|
||
|
ret += test33_0 (&badBstring2, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test33_0 (&emptyBstring, "");
|
||
|
ret += test33_0 (&shortBstring, "BOGUS");
|
||
|
ret += test33_0 (&longBstring, "THIS IS A BOGUS BUT REASONABLY LONG STRING. JUST LONG ENOUGH TO CAUSE SOME MALLOCING.");
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test34_0 (bstring b0, const char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbtolower (%s)", dumpBstring (b2));
|
||
|
|
||
|
rv = btolower (b2);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf (" = %s\n", dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbtolower (%s)", dumpBstring (b2));
|
||
|
|
||
|
rv = btolower (b2);
|
||
|
|
||
|
printf (" = %s\n", dumpBstring (b2));
|
||
|
|
||
|
ret += (b2->slen != b0->slen);
|
||
|
ret += (0 != rv);
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = btolower (b0)));
|
||
|
printf (".\tbtolower (%s) = %d\n", dumpBstring (b0), rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test34 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int btolower (bstring b);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test34_0 (NULL, NULL);
|
||
|
ret += test34_0 (&badBstring1, NULL);
|
||
|
ret += test34_0 (&badBstring2, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test34_0 (&emptyBstring, "");
|
||
|
ret += test34_0 (&shortBstring, "bogus");
|
||
|
ret += test34_0 (&longBstring, "this is a bogus but reasonably long string. just long enough to cause some mallocing.");
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test35_0 (const_bstring b0, const_bstring b1, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = bstricmp (b0, b1)));
|
||
|
printf (".\tbstricmp (%s, %s) = %d\n", dumpBstring (b0), dumpBstring (b1), rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test35 (void) {
|
||
|
int ret = 0;
|
||
|
struct tagbstring t0 = bsStatic ("bOgUs");
|
||
|
struct tagbstring t1 = bsStatic ("bOgUR");
|
||
|
struct tagbstring t2 = bsStatic ("bOgUt");
|
||
|
|
||
|
printf ("TEST: int bstricmp (const_bstring b0, const_bstring b1);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test35_0 (NULL, NULL, SHRT_MIN);
|
||
|
ret += test35_0 (&emptyBstring, NULL, SHRT_MIN);
|
||
|
ret += test35_0 (NULL, &emptyBstring, SHRT_MIN);
|
||
|
ret += test35_0 (&emptyBstring, &badBstring1, SHRT_MIN);
|
||
|
ret += test35_0 (&badBstring1, &emptyBstring, SHRT_MIN);
|
||
|
ret += test35_0 (&shortBstring, &badBstring2, SHRT_MIN);
|
||
|
ret += test35_0 (&badBstring2, &shortBstring, SHRT_MIN);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test35_0 (&emptyBstring, &emptyBstring, 0);
|
||
|
ret += test35_0 (&shortBstring, &t0, 0);
|
||
|
ret += test35_0 (&shortBstring, &t1, tolower (shortBstring.data[4]) - tolower (t1.data[4]));
|
||
|
ret += test35_0 (&shortBstring, &t2, tolower (shortBstring.data[4]) - tolower (t2.data[4]));
|
||
|
|
||
|
t0.slen++;
|
||
|
ret += test35_0 (&shortBstring, &t0, -(UCHAR_MAX+1));
|
||
|
ret += test35_0 (&t0, &shortBstring, (UCHAR_MAX+1));
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test36_0 (const_bstring b0, const_bstring b1, int n, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = bstrnicmp (b0, b1, n)));
|
||
|
printf (".\tbstrnicmp (%s, %s, %d) = %d\n", dumpBstring (b0), dumpBstring (b1), n, rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test36 (void) {
|
||
|
int ret = 0;
|
||
|
struct tagbstring t0 = bsStatic ("bOgUs");
|
||
|
struct tagbstring t1 = bsStatic ("bOgUR");
|
||
|
struct tagbstring t2 = bsStatic ("bOgUt");
|
||
|
|
||
|
printf ("TEST: int bstrnicmp (const_bstring b0, const_bstring b1);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test36_0 (NULL, NULL, 0, SHRT_MIN);
|
||
|
ret += test36_0 (&emptyBstring, NULL, 0, SHRT_MIN);
|
||
|
ret += test36_0 (NULL, &emptyBstring, 0, SHRT_MIN);
|
||
|
ret += test36_0 (&emptyBstring, &badBstring1, 0, SHRT_MIN);
|
||
|
ret += test36_0 (&badBstring1, &emptyBstring, 0, SHRT_MIN);
|
||
|
ret += test36_0 (&shortBstring, &badBstring2, 5, SHRT_MIN);
|
||
|
ret += test36_0 (&badBstring2, &shortBstring, 5, SHRT_MIN);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test36_0 (&emptyBstring, &emptyBstring, 0, 0);
|
||
|
ret += test36_0 (&shortBstring, &t0, 0, 0);
|
||
|
ret += test36_0 (&shortBstring, &t0, 5, 0);
|
||
|
ret += test36_0 (&shortBstring, &t0, 4, 0);
|
||
|
ret += test36_0 (&shortBstring, &t0, 6, 0);
|
||
|
ret += test36_0 (&shortBstring, &t1, 5, shortBstring.data[4] - t1.data[4]);
|
||
|
ret += test36_0 (&shortBstring, &t1, 4, 0);
|
||
|
ret += test36_0 (&shortBstring, &t1, 6, shortBstring.data[4] - t1.data[4]);
|
||
|
ret += test36_0 (&shortBstring, &t2, 5, shortBstring.data[4] - t2.data[4]);
|
||
|
ret += test36_0 (&shortBstring, &t2, 4, 0);
|
||
|
ret += test36_0 (&shortBstring, &t2, 6, shortBstring.data[4] - t2.data[4]);
|
||
|
|
||
|
t0.slen++;
|
||
|
ret += test36_0 (&shortBstring, &t0, 5, 0);
|
||
|
ret += test36_0 (&shortBstring, &t0, 6, -(UCHAR_MAX+1));
|
||
|
ret += test36_0 (&t0, &shortBstring, 6, (UCHAR_MAX+1));
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test37_0 (const_bstring b0, const_bstring b1, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = biseqcaseless (b0, b1)));
|
||
|
printf (".\tbiseqcaseless (%s, %s) = %d\n", dumpBstring (b0), dumpBstring (b1), rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test37 (void) {
|
||
|
int ret = 0;
|
||
|
struct tagbstring t0 = bsStatic ("bOgUs");
|
||
|
struct tagbstring t1 = bsStatic ("bOgUR");
|
||
|
struct tagbstring t2 = bsStatic ("bOgUt");
|
||
|
|
||
|
printf ("TEST: int biseqcaseless (const_bstring b0, const_bstring b1);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test37_0 (NULL, NULL, BSTR_ERR);
|
||
|
ret += test37_0 (&emptyBstring, NULL, BSTR_ERR);
|
||
|
ret += test37_0 (NULL, &emptyBstring, BSTR_ERR);
|
||
|
ret += test37_0 (&emptyBstring, &badBstring1, BSTR_ERR);
|
||
|
ret += test37_0 (&badBstring1, &emptyBstring, BSTR_ERR);
|
||
|
ret += test37_0 (&shortBstring, &badBstring2, BSTR_ERR);
|
||
|
ret += test37_0 (&badBstring2, &shortBstring, BSTR_ERR);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test37_0 (&emptyBstring, &emptyBstring, 1);
|
||
|
ret += test37_0 (&shortBstring, &t0, 1);
|
||
|
ret += test37_0 (&shortBstring, &t1, 0);
|
||
|
ret += test37_0 (&shortBstring, &t2, 0);
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test48_0 (const_bstring b, const unsigned char * blk, int len, int res) {
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
ret += (res != (rv = biseqcaselessblk (b, blk, len)));
|
||
|
printf (".\tbiseqcaselessblk (%s, %s, %d) = %d\n", dumpBstring (b), dumpCstring (blk), len, rv);
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %d)\n", __LINE__, ret, res);
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test48 (void) {
|
||
|
int ret = 0;
|
||
|
struct tagbstring t0 = bsStatic ("bOgUs");
|
||
|
struct tagbstring t1 = bsStatic ("bOgUR");
|
||
|
struct tagbstring t2 = bsStatic ("bOgUt");
|
||
|
|
||
|
printf ("TEST: int biseqcaselessblk (const_bstring b, const void * blk, int len);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test48_0 (NULL, NULL, 0, BSTR_ERR);
|
||
|
ret += test48_0 (&emptyBstring, NULL, 0, BSTR_ERR);
|
||
|
ret += test48_0 (NULL, emptyBstring.data, 0, BSTR_ERR);
|
||
|
ret += test48_0 (&emptyBstring, badBstring1.data, emptyBstring.slen, BSTR_ERR);
|
||
|
ret += test48_0 (&badBstring1, emptyBstring.data, badBstring1.slen, BSTR_ERR);
|
||
|
ret += test48_0 (&shortBstring, badBstring2.data, badBstring2.slen, BSTR_ERR);
|
||
|
ret += test48_0 (&badBstring2, shortBstring.data, badBstring2.slen, BSTR_ERR);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test48_0 (&emptyBstring, emptyBstring.data, emptyBstring.slen, 1);
|
||
|
ret += test48_0 (&shortBstring, t0.data, t0.slen, 1);
|
||
|
ret += test48_0 (&shortBstring, t1.data, t1.slen, 0);
|
||
|
ret += test48_0 (&shortBstring, t2.data, t2.slen, 0);
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
struct emuFile {
|
||
|
int ofs;
|
||
|
bstring contents;
|
||
|
};
|
||
|
|
||
|
static int test38_aux_bNgetc (struct emuFile * f) {
|
||
|
int v = EOF;
|
||
|
if (NULL != f && EOF != (v = bchare (f->contents, f->ofs, EOF))) f->ofs++;
|
||
|
return v;
|
||
|
}
|
||
|
|
||
|
static size_t test38_aux_bNread (void *buff, size_t elsize, size_t nelem, struct emuFile * f) {
|
||
|
char * b = (char *) buff;
|
||
|
int v;
|
||
|
size_t i, j, c = 0;
|
||
|
|
||
|
if (NULL == f || NULL == b) return c;
|
||
|
for (i=0; i < nelem; i++) for (j=0; j < elsize; j++) {
|
||
|
v = test38_aux_bNgetc (f);
|
||
|
if (EOF == v) {
|
||
|
*b = (char) '\0';
|
||
|
return c;
|
||
|
} else {
|
||
|
*b = (char) v;
|
||
|
b++;
|
||
|
c++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
static int test38_aux_bNopen (struct emuFile * f, bstring b) {
|
||
|
if (NULL == f || NULL == b) return -__LINE__;
|
||
|
f->ofs = 0;
|
||
|
f->contents = b;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int test38 (void) {
|
||
|
struct emuFile f;
|
||
|
bstring b0, b1, b2, b3;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: bgets/breads test\n");
|
||
|
|
||
|
test38_aux_bNopen (&f, &shortBstring);
|
||
|
|
||
|
/* Creation/reads */
|
||
|
|
||
|
b0 = bgets ((bNgetc) test38_aux_bNgetc, &f, (char) 'b');
|
||
|
b1 = bread ((bNread) test38_aux_bNread, &f);
|
||
|
b2 = bgets ((bNgetc) test38_aux_bNgetc, &f, (char) '\0');
|
||
|
b3 = bread ((bNread) test38_aux_bNread, &f);
|
||
|
|
||
|
ret += 1 != biseqcstr (b0, "b");
|
||
|
ret += 1 != biseqcstr (b1, "ogus");
|
||
|
ret += NULL != b2;
|
||
|
ret += 1 != biseqcstr (b3, "");
|
||
|
|
||
|
/* Bogus accumulations */
|
||
|
|
||
|
f.ofs = 0;
|
||
|
|
||
|
ret += 0 <= bgetsa (NULL, (bNgetc) test38_aux_bNgetc, &f, (char) 'o');
|
||
|
ret += 0 <= breada (NULL, (bNread) test38_aux_bNread, &f);
|
||
|
ret += 0 <= bgetsa (&shortBstring, (bNgetc) test38_aux_bNgetc, &f, (char) 'o');
|
||
|
ret += 0 <= breada (&shortBstring, (bNread) test38_aux_bNread, &f);
|
||
|
|
||
|
/* Normal accumulations */
|
||
|
|
||
|
ret += 0 > bgetsa (b0, (bNgetc) test38_aux_bNgetc, &f, (char) 'o');
|
||
|
ret += 0 > breada (b1, (bNread) test38_aux_bNread, &f);
|
||
|
|
||
|
ret += 1 != biseqcstr (b0, "bbo");
|
||
|
ret += 1 != biseqcstr (b1, "ogusgus");
|
||
|
|
||
|
/* Attempt to append past end should do nothing */
|
||
|
|
||
|
ret += 0 > bgetsa (b0, (bNgetc) test38_aux_bNgetc, &f, (char) 'o');
|
||
|
ret += 0 > breada (b1, (bNread) test38_aux_bNread, &f);
|
||
|
|
||
|
ret += 1 != biseqcstr (b0, "bbo");
|
||
|
ret += 1 != biseqcstr (b1, "ogusgus");
|
||
|
|
||
|
bdestroy (b0);
|
||
|
bdestroy (b1);
|
||
|
bdestroy (b2);
|
||
|
bdestroy (b3);
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test39_0 (const_bstring b, const_bstring lt, const_bstring rt, const_bstring t) {
|
||
|
bstring r;
|
||
|
int ret = 0;
|
||
|
|
||
|
ret += 0 <= bltrimws (NULL);
|
||
|
ret += 0 <= brtrimws (NULL);
|
||
|
ret += 0 <= btrimws (NULL);
|
||
|
|
||
|
r = bstrcpy (b);
|
||
|
bwriteprotect (*r);
|
||
|
ret += 0 <= bltrimws (r);
|
||
|
ret += 0 <= brtrimws (r);
|
||
|
ret += 0 <= btrimws (r);
|
||
|
bwriteallow(*r);
|
||
|
ret += 0 != bltrimws (r);
|
||
|
printf (".\tbltrim (%s) = %s\n", dumpBstring (b), dumpBstring (r));
|
||
|
ret += !biseq (r, lt);
|
||
|
bdestroy (r);
|
||
|
|
||
|
r = bstrcpy (b);
|
||
|
ret += 0 != brtrimws (r);
|
||
|
printf (".\tbrtrim (%s) = %s\n", dumpBstring (b), dumpBstring (r));
|
||
|
ret += !biseq (r, rt);
|
||
|
bdestroy (r);
|
||
|
|
||
|
r = bstrcpy (b);
|
||
|
ret += 0 != btrimws (r);
|
||
|
printf (".\tbtrim (%s) = %s\n", dumpBstring (b), dumpBstring (r));
|
||
|
ret += !biseq (r, t);
|
||
|
bdestroy (r);
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test39 (void) {
|
||
|
int ret = 0;
|
||
|
struct tagbstring t0 = bsStatic (" bogus string ");
|
||
|
struct tagbstring t1 = bsStatic ("bogus string ");
|
||
|
struct tagbstring t2 = bsStatic (" bogus string");
|
||
|
struct tagbstring t3 = bsStatic ("bogus string");
|
||
|
struct tagbstring t4 = bsStatic (" ");
|
||
|
struct tagbstring t5 = bsStatic ("");
|
||
|
|
||
|
printf ("TEST: trim functions\n");
|
||
|
|
||
|
ret += test39_0 (&t0, &t1, &t2, &t3);
|
||
|
ret += test39_0 (&t1, &t1, &t3, &t3);
|
||
|
ret += test39_0 (&t2, &t3, &t2, &t3);
|
||
|
ret += test39_0 (&t3, &t3, &t3, &t3);
|
||
|
ret += test39_0 (&t4, &t5, &t5, &t5);
|
||
|
ret += test39_0 (&t5, &t5, &t5, &t5);
|
||
|
|
||
|
if (ret) printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test40_0 (bstring b0, const_bstring b1, int left, int len, const char * res) {
|
||
|
bstring b2;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
if (b0 != NULL && b0->data != NULL && b0->slen >= 0 &&
|
||
|
b1 != NULL && b1->data != NULL && b1->slen >= 0) {
|
||
|
b2 = bstrcpy (b0);
|
||
|
bwriteprotect (*b2);
|
||
|
|
||
|
printf (".\tbassignmidstr (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bassignmidstr (b2, b1, left, len);
|
||
|
ret += (rv == 0);
|
||
|
if (!biseq (b0, b2)) ret++;
|
||
|
|
||
|
printf ("%s, %d, %d) = %s\n", dumpBstring (b1), left, len, dumpBstring (b2));
|
||
|
|
||
|
bwriteallow (*b2);
|
||
|
|
||
|
printf (".\tbassignmidstr (%s, ", dumpBstring (b2));
|
||
|
|
||
|
rv = bassignmidstr (b2, b1, left, len);
|
||
|
|
||
|
printf ("%s, %d, %d) = %s\n", dumpBstring (b1), left, len, dumpBstring (b2));
|
||
|
|
||
|
if (b1) ret += (b2->slen > len) | (b2->slen < 0);
|
||
|
ret += ((0 != rv) && (b1 != NULL)) || ((0 == rv) && (b1 == NULL));
|
||
|
ret += (res == NULL) || ((int) strlen (res) != b2->slen)
|
||
|
|| (0 != memcmp (b2->data, res, b2->slen));
|
||
|
ret += b2->data[b2->slen] != '\0';
|
||
|
bdestroy (b2);
|
||
|
} else {
|
||
|
ret += (BSTR_ERR != (rv = bassignmidstr (b0, b1, left, len)));
|
||
|
printf (".\tbassignmidstr (%s, %s, %d, %d) = %d\n", dumpBstring (b0), dumpBstring (b1), left, len, rv);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test40 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bassignmidstr (bstring b0, const_bstring b1, int left, int len);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test40_0 (NULL, NULL, 0, 1, NULL);
|
||
|
ret += test40_0 (NULL, &emptyBstring, 0, 1, NULL);
|
||
|
ret += test40_0 (&emptyBstring, NULL, 0, 1, "");
|
||
|
ret += test40_0 (&badBstring1, &emptyBstring, 0, 1, NULL);
|
||
|
ret += test40_0 (&badBstring2, &emptyBstring, 0, 1, NULL);
|
||
|
ret += test40_0 (&emptyBstring, &badBstring1, 0, 1, NULL);
|
||
|
ret += test40_0 (&emptyBstring, &badBstring2, 0, 1, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test40_0 (&emptyBstring, &emptyBstring, 0, 1, "");
|
||
|
ret += test40_0 (&emptyBstring, &shortBstring, 1, 3, "ogu");
|
||
|
ret += test40_0 (&shortBstring, &emptyBstring, 0, 1, "");
|
||
|
ret += test40_0 (&shortBstring, &shortBstring, 1, 3, "ogu");
|
||
|
ret += test40_0 (&shortBstring, &shortBstring, -1, 4, "bog");
|
||
|
ret += test40_0 (&shortBstring, &shortBstring, 1, 9, "ogus");
|
||
|
ret += test40_0 (&shortBstring, &shortBstring, 9, 1, "");
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test41_0 (bstring b1, int left, int len, const char * res) {
|
||
|
struct tagbstring t;
|
||
|
bstring b2, b3;
|
||
|
int ret = 0;
|
||
|
|
||
|
if (b1 != NULL && b1->data != NULL && b1->slen >= 0) {
|
||
|
b2 = bfromcstr ("");
|
||
|
|
||
|
bassignmidstr (b2, b1, left, len);
|
||
|
|
||
|
bmid2tbstr (t, b1, left, len);
|
||
|
b3 = bstrcpy (&t);
|
||
|
|
||
|
printf (".\tbmid2tbstr (%s, %d, %d) = %s\n", dumpBstring (b1), left, len, dumpBstring (b3));
|
||
|
|
||
|
ret += !biseq (&t, b2);
|
||
|
|
||
|
bdestroy (b2);
|
||
|
bdestroy (b3);
|
||
|
} else {
|
||
|
bmid2tbstr (t, b1, left, len);
|
||
|
b3 = bstrcpy (&t);
|
||
|
ret += t.slen != 0;
|
||
|
|
||
|
printf (".\tbmid2tbstr (%s, %d, %d) = %s\n", dumpBstring (b1), left, len, dumpBstring (b3));
|
||
|
bdestroy (b3);
|
||
|
}
|
||
|
|
||
|
if (ret) {
|
||
|
printf ("\t\tfailure(%d) = %d (res = %p", __LINE__, ret, res);
|
||
|
if (res) printf (" = \"%s\"", res);
|
||
|
printf (")\n");
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test41 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bmid2tbstr (struct tagbstring &t, const_bstring b1, int left, int len);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test41_0 (NULL, 0, 1, NULL);
|
||
|
ret += test41_0 (&emptyBstring, 0, 1, NULL);
|
||
|
ret += test41_0 (NULL, 0, 1, "");
|
||
|
ret += test41_0 (&emptyBstring, 0, 1, NULL);
|
||
|
ret += test41_0 (&emptyBstring, 0, 1, NULL);
|
||
|
ret += test41_0 (&badBstring1, 0, 1, NULL);
|
||
|
ret += test41_0 (&badBstring2, 0, 1, NULL);
|
||
|
|
||
|
/* normal operation tests on all sorts of subranges */
|
||
|
ret += test41_0 (&emptyBstring, 0, 1, "");
|
||
|
ret += test41_0 (&shortBstring, 1, 3, "ogu");
|
||
|
ret += test41_0 (&emptyBstring, 0, 1, "");
|
||
|
ret += test41_0 (&shortBstring, 1, 3, "ogu");
|
||
|
ret += test41_0 (&shortBstring, -1, 4, "bog");
|
||
|
ret += test41_0 (&shortBstring, 1, 9, "ogus");
|
||
|
ret += test41_0 (&shortBstring, 9, 1, "");
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test42_0 (const_bstring bi, int len, const char * res) {
|
||
|
bstring b;
|
||
|
int rv, ret = 0;
|
||
|
|
||
|
rv = btrunc (b = bstrcpy (bi), len);
|
||
|
ret += (len >= 0) ? (rv < 0) : (rv >= 0);
|
||
|
if (res) ret += (0 == biseqcstr (b, res));
|
||
|
printf (".\tbtrunc (%s, %d) = %s\n", dumpBstring (bi), len, dumpBstring (b));
|
||
|
bdestroy (b);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test42 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int btrunc (bstring b, int n);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += 0 <= btrunc (NULL, 2);
|
||
|
ret += 0 <= btrunc (NULL, 0);
|
||
|
ret += 0 <= btrunc (NULL, -1);
|
||
|
|
||
|
/* write protected */
|
||
|
ret += 0 <= btrunc (&shortBstring, 2);
|
||
|
ret += 0 <= btrunc (&shortBstring, 0);
|
||
|
ret += 0 <= btrunc (&shortBstring, -1);
|
||
|
|
||
|
ret += test42_0 (&emptyBstring, 10, "");
|
||
|
ret += test42_0 (&emptyBstring, 0, "");
|
||
|
ret += test42_0 (&emptyBstring, -1, NULL);
|
||
|
|
||
|
ret += test42_0 (&shortBstring, 10, "bogus");
|
||
|
ret += test42_0 (&shortBstring, 3, "bog");
|
||
|
ret += test42_0 (&shortBstring, 0, "");
|
||
|
ret += test42_0 (&shortBstring, -1, NULL);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test43 (void) {
|
||
|
static struct tagbstring ts0 = bsStatic ("");
|
||
|
static struct tagbstring ts1 = bsStatic (" ");
|
||
|
static struct tagbstring ts2 = bsStatic (" abc");
|
||
|
static struct tagbstring ts3 = bsStatic ("abc ");
|
||
|
static struct tagbstring ts4 = bsStatic (" abc ");
|
||
|
static struct tagbstring ts5 = bsStatic ("abc");
|
||
|
bstring tstrs[6] = { &ts0, &ts1, &ts2, &ts3, &ts4, &ts5 };
|
||
|
int ret = 0;
|
||
|
int i;
|
||
|
|
||
|
printf ("TEST: int btfromblk*trim (struct tagbstring t, void * s, int l);\n");
|
||
|
|
||
|
for (i=0; i < 6; i++) {
|
||
|
struct tagbstring t;
|
||
|
bstring b;
|
||
|
|
||
|
btfromblkltrimws (t, tstrs[i]->data, tstrs[i]->slen);
|
||
|
bltrimws (b = bstrcpy (tstrs[i]));
|
||
|
if (!biseq (b, &t)) {
|
||
|
ret++;
|
||
|
bassign (b, &t);
|
||
|
printf ("btfromblkltrimws failure: <%s> -> <%s>\n", tstrs[i]->data, b->data);
|
||
|
}
|
||
|
printf (".\tbtfromblkltrimws (\"%s\", \"%s\", %d)\n", (char *) bdatae (b, NULL), tstrs[i]->data, tstrs[i]->slen);
|
||
|
bdestroy (b);
|
||
|
|
||
|
btfromblkrtrimws (t, tstrs[i]->data, tstrs[i]->slen);
|
||
|
brtrimws (b = bstrcpy (tstrs[i]));
|
||
|
if (!biseq (b, &t)) {
|
||
|
ret++;
|
||
|
bassign (b, &t);
|
||
|
printf ("btfromblkrtrimws failure: <%s> -> <%s>\n", tstrs[i]->data, b->data);
|
||
|
}
|
||
|
printf (".\tbtfromblkrtrimws (\"%s\", \"%s\", %d)\n", (char *) bdatae (b, NULL), tstrs[i]->data, tstrs[i]->slen);
|
||
|
bdestroy (b);
|
||
|
|
||
|
btfromblktrimws (t, tstrs[i]->data, tstrs[i]->slen);
|
||
|
btrimws (b = bstrcpy (tstrs[i]));
|
||
|
if (!biseq (b, &t)) {
|
||
|
ret++;
|
||
|
bassign (b, &t);
|
||
|
printf ("btfromblktrimws failure: <%s> -> <%s>\n", tstrs[i]->data, b->data);
|
||
|
}
|
||
|
printf (".\tbtfromblktrimws (\"%s\", \"%s\", %d)\n", (char *) bdatae (b, NULL), tstrs[i]->data, tstrs[i]->slen);
|
||
|
bdestroy (b);
|
||
|
}
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test44_0 (const char * str) {
|
||
|
int ret = 0, v;
|
||
|
bstring b;
|
||
|
if (NULL == str) {
|
||
|
ret += 0 <= bassigncstr (NULL, "test");
|
||
|
printf (".\tbassigncstr (b = %s, NULL)", dumpBstring (b = bfromcstr ("")));
|
||
|
ret += 0 <= (v = bassigncstr (b, NULL));
|
||
|
printf (" = %d; b -> %s\n", v, dumpBstring (b));
|
||
|
ret += 0 <= bassigncstr (&shortBstring, NULL);
|
||
|
bdestroy (b);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
ret += 0 <= bassigncstr (NULL, str);
|
||
|
printf (".\tbassigncstr (b = %s, \"%s\")", dumpBstring (b = bfromcstr ("")), str);
|
||
|
ret += 0 > (v = bassigncstr (b, str));
|
||
|
printf (" = %d; b -> %s\n", v, dumpBstring (b));
|
||
|
ret += 0 != strcmp (bdatae (b, ""), str);
|
||
|
ret += ((size_t) b->slen) != strlen (str);
|
||
|
ret += 0 > bassigncstr (b, "xxxxx");
|
||
|
bwriteprotect(*b)
|
||
|
printf (".\tbassigncstr (b = %s, \"%s\")", dumpBstring (b), str);
|
||
|
ret += 0 <= (v = bassigncstr (b, str));
|
||
|
printf (" = %d; b -> %s\n", v, dumpBstring (b));
|
||
|
ret += 0 != strcmp (bdatae (b, ""), "xxxxx");
|
||
|
ret += ((size_t) b->slen) != strlen ("xxxxx");
|
||
|
bwriteallow(*b)
|
||
|
ret += 0 <= bassigncstr (&shortBstring, str);
|
||
|
bdestroy (b);
|
||
|
printf (".\tbassigncstr (a = %s, \"%s\")", dumpBstring (&shortBstring), str);
|
||
|
ret += 0 <= (v = bassigncstr (&shortBstring, str));
|
||
|
printf (" = %d; a -> %s\n", v, dumpBstring (&shortBstring));
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test44 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bassigncstr (bstring a, char * str);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test44_0 (NULL);
|
||
|
|
||
|
ret += test44_0 (EMPTY_STRING);
|
||
|
ret += test44_0 (SHORT_STRING);
|
||
|
ret += test44_0 (LONG_STRING);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test45_0 (const char * str) {
|
||
|
int ret = 0, v, len;
|
||
|
bstring b;
|
||
|
if (NULL == str) {
|
||
|
ret += 0 <= bassignblk (NULL, "test", 4);
|
||
|
printf (".\tbassignblk (b = %s, NULL, 1)", dumpBstring (b = bfromcstr ("")));
|
||
|
ret += 0 <= (v = bassignblk (b, NULL, 1));
|
||
|
printf (" = %d; b -> %s\n", v, dumpBstring (b));
|
||
|
ret += 0 <= bassignblk (&shortBstring, NULL, 1);
|
||
|
bdestroy (b);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
len = (int) strlen (str);
|
||
|
ret += 0 <= bassignblk (NULL, str, len);
|
||
|
printf (".\tbassignblk (b = %s, \"%s\", %d)", dumpBstring (b = bfromcstr ("")), str, len);
|
||
|
ret += 0 > (v = bassignblk (b, str, len));
|
||
|
printf (" = %d; b -> %s\n", v, dumpBstring (b));
|
||
|
ret += 0 != strcmp (bdatae (b, ""), str);
|
||
|
ret += b->slen != len;
|
||
|
ret += 0 > bassigncstr (b, "xxxxx");
|
||
|
bwriteprotect(*b)
|
||
|
printf (".\tbassignblk (b = %s, \"%s\", %d)", dumpBstring (b), str, len);
|
||
|
ret += 0 <= (v = bassignblk (b, str, len));
|
||
|
printf (" = %d; b -> %s\n", v, dumpBstring (b));
|
||
|
ret += 0 != strcmp (bdatae (b, ""), "xxxxx");
|
||
|
ret += ((size_t) b->slen) != strlen ("xxxxx");
|
||
|
bwriteallow(*b)
|
||
|
ret += 0 <= bassignblk (&shortBstring, str, len);
|
||
|
bdestroy (b);
|
||
|
printf (".\tbassignblk (a = %s, \"%s\", %d)", dumpBstring (&shortBstring), str, len);
|
||
|
ret += 0 <= (v = bassignblk (&shortBstring, str, len));
|
||
|
printf (" = %d; a -> %s\n", v, dumpBstring (&shortBstring));
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test45 (void) {
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bassignblk (bstring a, const void * s, int len);\n");
|
||
|
|
||
|
/* tests with NULL */
|
||
|
ret += test45_0 (NULL);
|
||
|
|
||
|
ret += test45_0 (EMPTY_STRING);
|
||
|
ret += test45_0 (SHORT_STRING);
|
||
|
ret += test45_0 (LONG_STRING);
|
||
|
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test46_0 (const_bstring r, bstring b, int count, const char * fmt, ...) {
|
||
|
int ret;
|
||
|
va_list arglist;
|
||
|
|
||
|
printf (".\tbvcformata (%s, %d, \"%s\", ...) -> ", dumpBstring (b), count, fmt);
|
||
|
va_start (arglist, fmt);
|
||
|
ret = bvcformata (b, count, fmt, arglist);
|
||
|
va_end (arglist);
|
||
|
printf ("%d, %s (%s)\n", ret, dumpBstring (b), dumpBstring (r));
|
||
|
if (ret < 0) return (NULL != r);
|
||
|
ret += 1 != biseq (r, b);
|
||
|
if (0 != ret) printf ("\t->failed\n");
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test46_1 (bstring b, const char * fmt, const_bstring r, ...) {
|
||
|
int ret;
|
||
|
|
||
|
printf (".\tbvformata (&, %s, \"%s\", ...) -> ", dumpBstring (b), fmt);
|
||
|
bvformata (ret, b, fmt, r);
|
||
|
printf ("%d, %s (%s)\n", ret, dumpBstring (b), dumpBstring (r));
|
||
|
if (ret < 0) return (NULL != r);
|
||
|
ret += 1 != biseq (r, b);
|
||
|
if (0 != ret) printf ("\t->failed\n");
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
static int test46 (void) {
|
||
|
bstring b, b2;
|
||
|
int ret = 0;
|
||
|
|
||
|
printf ("TEST: int bvcformata (bstring b, int count, const char * fmt, va_list arg);\n");
|
||
|
|
||
|
ret += test46_0 (NULL, NULL, 8, "[%d]", 15);
|
||
|
ret += test46_0 (NULL, &shortBstring, 8, "[%d]", 15);
|
||
|
ret += test46_0 (NULL, &badBstring1, 8, "[%d]", 15);
|
||
|
ret += test46_0 (NULL, &badBstring2, 8, "[%d]", 15);
|
||
|
ret += test46_0 (NULL, &badBstring3, 8, "[%d]", 15);
|
||
|
|
||
|
b = bfromcstr ("");
|
||
|
ret += test46_0 (&shortBstring, b, shortBstring.slen, "%s", (char *) shortBstring.data);
|
||
|
b->slen = 0;
|
||
|
ret += test46_0 (&shortBstring, b, shortBstring.slen + 1, "%s", (char *) shortBstring.data);
|
||
|
b->slen = 0;
|
||
|
ret += test46_0 (NULL, b, shortBstring.slen-1, "%s", (char *) shortBstring.data);
|
||
|
|
||
|
printf ("TEST: bvformata (int &ret, bstring b, const char * fmt, <type> lastarg);\n");
|
||
|
|
||
|
ret += test46_1 (NULL, "[%d]", NULL, 15);
|
||
|
ret += test46_1 (&shortBstring, "[%d]", NULL, 15);
|
||
|
ret += test46_1 (&badBstring1, "[%d]", NULL, 15);
|
||
|
ret += test46_1 (&badBstring2, "[%d]", NULL, 15);
|
||
|
ret += test46_1 (&badBstring3, "[%d]", NULL, 15);
|
||
|
|
||
|
b->slen = 0;
|
||
|
ret += test46_1 (b, "%s", &shortBstring, (char *) shortBstring.data);
|
||
|
|
||
|
b->slen = 0;
|
||
|
ret += test46_1 (b, "%s", &longBstring, (char *) longBstring.data);
|
||
|
|
||
|
b->slen = 0;
|
||
|
b2 = bfromcstr (EIGHT_CHAR_STRING);
|
||
|
bconcat (b2, b2);
|
||
|
bconcat (b2, b2);
|
||
|
bconcat (b2, b2);
|
||
|
ret += test46_1 (b, "%s%s%s%s%s%s%s%s", b2,
|
||
|
EIGHT_CHAR_STRING, EIGHT_CHAR_STRING, EIGHT_CHAR_STRING, EIGHT_CHAR_STRING,
|
||
|
EIGHT_CHAR_STRING, EIGHT_CHAR_STRING, EIGHT_CHAR_STRING, EIGHT_CHAR_STRING);
|
||
|
bdestroy (b2);
|
||
|
|
||
|
bdestroy (b);
|
||
|
printf ("\t# failures: %d\n", ret);
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
int main (int argc, char * argv[]) {
|
||
|
int ret = 0;
|
||
|
|
||
|
argc = argc;
|
||
|
argv = argv;
|
||
|
|
||
|
printf ("Direct case testing of bstring core functions\n");
|
||
|
|
||
|
ret += test0 ();
|
||
|
ret += test1 ();
|
||
|
ret += test2 ();
|
||
|
ret += test3 ();
|
||
|
ret += test4 ();
|
||
|
ret += test5 ();
|
||
|
ret += test6 ();
|
||
|
ret += test7 ();
|
||
|
ret += test8 ();
|
||
|
ret += test9 ();
|
||
|
ret += test10 ();
|
||
|
ret += test11 ();
|
||
|
ret += test12 ();
|
||
|
ret += test13 ();
|
||
|
ret += test14 ();
|
||
|
ret += test15 ();
|
||
|
ret += test16 ();
|
||
|
ret += test17 ();
|
||
|
ret += test18 ();
|
||
|
ret += test19 ();
|
||
|
ret += test20 ();
|
||
|
ret += test21 ();
|
||
|
ret += test22 ();
|
||
|
ret += test23 ();
|
||
|
ret += test24 ();
|
||
|
ret += test25 ();
|
||
|
ret += test26 ();
|
||
|
ret += test27 ();
|
||
|
ret += test28 ();
|
||
|
ret += test29 ();
|
||
|
ret += test30 ();
|
||
|
ret += test31 ();
|
||
|
ret += test32 ();
|
||
|
ret += test33 ();
|
||
|
ret += test34 ();
|
||
|
ret += test35 ();
|
||
|
ret += test36 ();
|
||
|
ret += test37 ();
|
||
|
ret += test38 ();
|
||
|
ret += test39 ();
|
||
|
ret += test40 ();
|
||
|
ret += test41 ();
|
||
|
ret += test42 ();
|
||
|
ret += test43 ();
|
||
|
ret += test44 ();
|
||
|
ret += test45 ();
|
||
|
ret += test46 ();
|
||
|
ret += test47 ();
|
||
|
ret += test48 ();
|
||
|
|
||
|
printf ("# test failures: %d\n", ret);
|
||
|
|
||
|
return 0;
|
||
|
}
|