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