1 #include "tst-main.c"
2
3 static const char *rf = __FILE__;
4
5 static unsigned int lens_fwd[4];
6 static int ret = 0;
7
tst_srch_buf(Vstr_base * t1,unsigned int off)8 static void tst_srch_buf(Vstr_base *t1, unsigned int off)
9 {
10 TST_B_TST(ret, off + 1,
11 VSTR_SRCH_CSTR_BUF_FWD(t1, 1, t1->len, "abcd") != lens_fwd[0]);
12 TST_B_TST(ret, off + 2,
13 VSTR_SRCH_CSTR_BUF_REV(t1, 1, t1->len, "abcd") != lens_fwd[3]);
14 TST_B_TST(ret, off + 3,
15 vstr_srch_cstr_buf_fwd(t1, 1, t1->len, "xyz ") != lens_fwd[1]);
16 TST_B_TST(ret, off + 4,
17 vstr_srch_cstr_buf_rev(t1, 1, t1->len, "xyz ") != lens_fwd[1]);
18 TST_B_TST(ret, off + 5,
19 VSTR_SRCH_CSTR_BUF_FWD(t1, 1, t1->len, "!") != lens_fwd[2]);
20 TST_B_TST(ret, off + 6,
21 VSTR_SRCH_CSTR_BUF_REV(t1, 1, t1->len, "!") != lens_fwd[2]);
22 TST_B_TST(ret, off + 7,
23 VSTR_SRCH_CSTR_BUF_FWD(t1, lens_fwd[0], t1->len - (lens_fwd[0] - 1),
24 "abcd ") != lens_fwd[0]);
25 TST_B_TST(ret, off + 8,
26 VSTR_SRCH_CSTR_BUF_REV(t1, lens_fwd[0], t1->len - (lens_fwd[0] - 1),
27 "abcd ") != lens_fwd[0]);
28
29 assert(!VSTR_SRCH_CSTR_BUF_REV(t1, 1, t1->len, " abcd"));
30 assert(!VSTR_SRCH_CSTR_BUF_REV(t1, 1, t1->len, "bcde"));
31
32 ASSERT(!vstr_srch_buf_fwd(t1, 1, 1, "ab", 2));
33 ASSERT(!vstr_srch_buf_rev(t1, 1, 1, "ab", 2));
34
35 ASSERT(!vstr_srch_buf_fwd(t1, 1, 0, "a", 1));
36 ASSERT(!vstr_srch_buf_rev(t1, 1, 0, "a", 1));
37
38 ASSERT(vstr_srch_buf_fwd(t1, 3, 2, "a", 0) == 3);
39 ASSERT(vstr_srch_buf_rev(t1, 3, 2, "a", 0) == 4);
40 }
41
tst_srch_non_buf(Vstr_base * t1)42 static void tst_srch_non_buf(Vstr_base *t1)
43 {
44 TST_B_TST(ret, 25,
45 vstr_srch_buf_fwd(t1, 1, t1->len, NULL, 4) != 8);
46
47 TST_B_TST(ret, 26,
48 vstr_srch_buf_rev(t1, 1, t1->len, NULL, 4) != 16);
49
50 TST_B_TST(ret, 27,
51 vstr_srch_buf_fwd(t1, 1, t1->len, NULL, 12) != 8);
52
53 TST_B_TST(ret, 28,
54 vstr_srch_buf_rev(t1, 1, t1->len, NULL, 12) != 8);
55
56 TST_B_TST(ret, 29,
57 vstr_srch_buf_fwd(t1, 1, t1->len, NULL, 13) != 0);
58
59 TST_B_TST(ret, 29,
60 vstr_srch_buf_rev(t1, 1, t1->len, NULL, 13) != 0);
61
62 TST_B_TST(ret, 29,
63 vstr_srch_buf_rev(t1, 4, 8, "", 0) != 11);
64
65 {
66 unsigned int scan = 0;
67 while (++scan <= t1->len)
68 {
69 ASSERT(vstr_srch_buf_fwd(t1, scan, 1, "", 0) == scan);
70 ASSERT(vstr_srch_buf_rev(t1, scan, 1, "", 0) == scan);
71 }
72 }
73 }
74
tst(void)75 int tst(void)
76 {
77 #ifdef USE_RESTRICTED_HEADERS /* %n doesn't work in dietlibc */
78 return (EXIT_FAILED_OK);
79 #endif
80
81 sprintf(buf, "%d%nabcd %d%nxyz %u%n!& %u%nabcd",
82 INT_MAX, lens_fwd + 0,
83 INT_MIN, lens_fwd + 1,
84 0, lens_fwd + 2,
85 UINT_MAX, lens_fwd + 3);
86 VSTR_ADD_CSTR_BUF(s1, s1->len, buf); /* norm */
87 VSTR_ADD_CSTR_BUF(s3, s3->len, buf); /* small */
88 VSTR_ADD_CSTR_BUF(s4, s4->len, buf); /* no iovec */
89
90 ++lens_fwd[0]; /* convert to position of char after %n */
91 ++lens_fwd[1];
92 ++lens_fwd[2];
93 ++lens_fwd[3];
94
95 tst_srch_buf(s1, 0);
96 tst_srch_buf(s3, 8);
97
98 /* make sure it's got a iovec cache */
99 vstr_export_iovec_ptr_all(s1, NULL, NULL);
100 vstr_export_iovec_ptr_all(s3, NULL, NULL);
101
102 tst_srch_buf(s1, 0);
103 tst_srch_buf(s3, 8);
104 tst_srch_buf(s4, 16);
105
106 TST_B_TST(ret, 29,
107 vstr_srch_buf_rev(s1, 4, 8, NULL, 1) != 0);
108
109 vstr_sub_non(s1, 2, 6, 6);
110 vstr_sub_non(s1, lens_fwd[3] - 7, 6, 6);
111
112 vstr_export_iovec_ptr_all(s1, NULL, NULL);
113 vstr_export_iovec_ptr_all(s3, NULL, NULL);
114
115 tst_srch_buf(s1, 0);
116 tst_srch_buf(s3, 8);
117 tst_srch_buf(s4, 16);
118
119 vstr_sub_rep_chr(s1, 2, 6, 'x', 6);
120 vstr_sub_rep_chr(s1, lens_fwd[3] - 7, 6, 'x', 6);
121
122 vstr_add_non(s1, 7, 12);
123 {
124 unsigned int pre_num = s3->num;
125
126 vstr_add_non(s3, 7, 3); /* merges on append, not prepend */
127 vstr_add_non(s3, 7 + 3, 3);
128 vstr_add_non(s3, 7, 6);
129 ASSERT(pre_num == (s3->num - 3)); /* split + 2 _NON */
130 vstr_add_ptr(s3, 7 + 3, "a", 1);
131 vstr_del(s3, 7 + 4, 1);
132 ASSERT(pre_num == (s3->num - 4)); /* split + 3 _NON */
133 }
134
135 vstr_add_non(s4, 7, 12);
136
137 /* won't have a cache again... */
138 ASSERT(!s1->iovec_upto_date);
139 ASSERT(!s3->iovec_upto_date);
140
141 tst_srch_non_buf(s1);
142 tst_srch_non_buf(s3);
143
144 /* make sure it's got a iovec cache */
145 vstr_export_iovec_ptr_all(s1, NULL, NULL);
146 vstr_export_iovec_ptr_all(s3, NULL, NULL);
147
148 tst_srch_non_buf(s1);
149 tst_srch_non_buf(s3);
150 tst_srch_non_buf(s4);
151
152 vstr_del(s1, 1, s1->len);
153 vstr_add_cstr_buf(s1, s1->len, "ab");
154 vstr_add_cstr_ptr(s1, s1->len, "cd");
155 vstr_add_cstr_buf(s1, s1->len, "ef");
156 vstr_add_cstr_ptr(s1, s1->len, "gh");
157 vstr_add_cstr_buf(s1, s1->len, "ij");
158
159 ASSERT(!vstr_srch_cstr_buf_fwd(s1, 1, s1->len, "Xabcdefghi"));
160 ASSERT(!vstr_srch_cstr_buf_rev(s1, 1, s1->len, "Xabcdefghi"));
161 ASSERT(!vstr_srch_cstr_buf_fwd(s1, 1, s1->len, "abcdefghiX"));
162 ASSERT(!vstr_srch_cstr_buf_rev(s1, 1, s1->len, "abcdefghiX"));
163
164 vstr_export_iovec_ptr_all(s1, NULL, NULL);
165
166 ASSERT(!vstr_srch_cstr_buf_fwd(s1, 1, s1->len, "Xabcdefghi"));
167 ASSERT(!vstr_srch_cstr_buf_rev(s1, 1, s1->len, "Xabcdefghi"));
168 ASSERT(!vstr_srch_cstr_buf_fwd(s1, 1, s1->len, "abcdefghiX"));
169 ASSERT(!vstr_srch_cstr_buf_rev(s1, 1, s1->len, "abcdefghiX"));
170
171 vstr_add_non(s1, 2, 1);
172 vstr_add_non(s1, s1->len - 2, 1);
173
174 ASSERT(!vstr_srch_cstr_buf_fwd(s1, 1, s1->len, "abcdefghi"));
175 ASSERT(!vstr_srch_cstr_buf_rev(s1, 1, s1->len, "abcdefghi"));
176
177 vstr_export_iovec_ptr_all(s1, NULL, NULL);
178
179 ASSERT(!vstr_srch_cstr_buf_fwd(s1, 1, s1->len, "abcdefghi"));
180 ASSERT(!vstr_srch_cstr_buf_rev(s1, 1, s1->len, "abcdefghi"));
181
182 return (TST_B_RET(ret));
183 }
184