1/*
2 * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers.
3 *	All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 */
10
11#pragma ident	"%Z%%M%	%I%	%E% SMI"
12
13#include <sm/gen.h>
14SM_IDSTR(id, "@(#)$Id: t-strl.c,v 1.13 2001/08/27 23:00:05 gshapiro Exp $")
15
16#include <stdlib.h>
17#include <stdio.h>
18#include <sm/heap.h>
19#include <sm/string.h>
20#include <sm/test.h>
21
22#define MAXL	16
23#define N	5
24#define SIZE	128
25
26int
27main(argc, argv)
28	int argc;
29	char *argv[];
30{
31	char *s1, *s2, *s3;
32	int one, two, k;
33	char src1[N][SIZE], dst1[SIZE], dst2[SIZE];
34	char *r;
35
36	sm_test_begin(argc, argv, "test strl* string functions");
37	s1 = "abc";
38	s2 = "123";
39	s3 = sm_malloc_x(MAXL);
40
41	SM_TEST(sm_strlcpy(s3, s1, 4) == 3);
42	SM_TEST(strcmp(s1, s3) == 0);
43
44	SM_TEST(sm_strlcat(s3, s2, 8) == 6);
45	r ="abc123";
46	SM_TEST(strcmp(s3, r) == 0);
47
48	SM_TEST(sm_strlcpy(s3, s1, 2) == 3);
49	r = "a";
50	SM_TEST(strcmp(s3, r) == 0);
51
52	SM_TEST(sm_strlcat(s3, s2, 3) == 4);
53	r = "a1";
54	SM_TEST(strcmp(s3, r) == 0);
55
56	SM_TEST(sm_strlcpy(s3, s1, 4) == 3);
57	r = ":";
58	SM_TEST(sm_strlcat2(s3, r, s2, MAXL) == 7);
59	r = "abc:123";
60	SM_TEST(strcmp(s3, r) == 0);
61
62	SM_TEST(sm_strlcpy(s3, s1, 4) == 3);
63	r = ":";
64	SM_TEST(sm_strlcat2(s3, r, s2, 6) == 7);
65	r = "abc:1";
66	SM_TEST(strcmp(s3, r) == 0);
67
68	SM_TEST(sm_strlcpy(s3, s1, 4) == 3);
69	r = ":";
70	SM_TEST(sm_strlcat2(s3, r, s2, 2) == 7);
71	r = "abc";
72	SM_TEST(strcmp(s3, r) == 0);
73
74	SM_TEST(sm_strlcpy(s3, s1, 4) == 3);
75	r = ":";
76	SM_TEST(sm_strlcat2(s3, r, s2, 4) == 7);
77	r = "abc";
78	SM_TEST(strcmp(s3, r) == 0);
79
80	SM_TEST(sm_strlcpy(s3, s1, 4) == 3);
81	r = ":";
82	SM_TEST(sm_strlcat2(s3, r, s2, 5) == 7);
83	r = "abc:";
84	SM_TEST(strcmp(s3, r) == 0);
85
86	SM_TEST(sm_strlcpy(s3, s1, 4) == 3);
87	r = ":";
88	SM_TEST(sm_strlcat2(s3, r, s2, 6) == 7);
89	r = "abc:1";
90	SM_TEST(strcmp(s3, r) == 0);
91
92	for (k = 0; k < N; k++)
93	{
94		(void) sm_strlcpy(src1[k], "abcdef", sizeof src1);
95	}
96
97	one = sm_strlcpyn(dst1, sizeof dst1, 3, src1[0], "/", src1[1]);
98	two = sm_snprintf(dst2, sizeof dst2, "%s/%s", src1[0], src1[1]);
99	SM_TEST(one == two);
100	SM_TEST(strcmp(dst1, dst2) == 0);
101	one = sm_strlcpyn(dst1, 10, 3, src1[0], "/", src1[1]);
102	two = sm_snprintf(dst2, 10, "%s/%s", src1[0], src1[1]);
103	SM_TEST(one == two);
104	SM_TEST(strcmp(dst1, dst2) == 0);
105	one = sm_strlcpyn(dst1, 5, 3, src1[0], "/", src1[1]);
106	two = sm_snprintf(dst2, 5, "%s/%s", src1[0], src1[1]);
107	SM_TEST(one == two);
108	SM_TEST(strcmp(dst1, dst2) == 0);
109	one = sm_strlcpyn(dst1, 0, 3, src1[0], "/", src1[1]);
110	two = sm_snprintf(dst2, 0, "%s/%s", src1[0], src1[1]);
111	SM_TEST(one == two);
112	SM_TEST(strcmp(dst1, dst2) == 0);
113	one = sm_strlcpyn(dst1, sizeof dst1, 5, src1[0], "/", src1[1], "/", src1[2]);
114	two = sm_snprintf(dst2, sizeof dst2, "%s/%s/%s", src1[0], src1[1], src1[2]);
115	SM_TEST(one == two);
116	SM_TEST(strcmp(dst1, dst2) == 0);
117	one = sm_strlcpyn(dst1, 15, 5, src1[0], "/", src1[1], "/", src1[2]);
118	two = sm_snprintf(dst2, 15, "%s/%s/%s", src1[0], src1[1], src1[2]);
119	SM_TEST(one == two);
120	SM_TEST(strcmp(dst1, dst2) == 0);
121	one = sm_strlcpyn(dst1, 20, 5, src1[0], "/", src1[1], "/", src1[2]);
122	two = sm_snprintf(dst2, 20, "%s/%s/%s", src1[0], src1[1], src1[2]);
123	SM_TEST(one == two);
124	SM_TEST(strcmp(dst1, dst2) == 0);
125
126	one = sm_strlcpyn(dst1, sizeof dst1, 0);
127	SM_TEST(one == 0);
128	r = "";
129	SM_TEST(strcmp(dst1, r) == 0);
130	one = sm_strlcpyn(dst1, 20, 1, src1[0]);
131	two = sm_snprintf(dst2, 20, "%s", src1[0]);
132	SM_TEST(one == two);
133	one = sm_strlcpyn(dst1, 2, 1, src1[0]);
134	two = sm_snprintf(dst2, 2, "%s", src1[0]);
135	SM_TEST(one == two);
136
137	return sm_test_end();
138}
139