Skip to content

Commit f38e935

Browse files
committed
fix rsplit for non-space characters
1 parent 9dc73e8 commit f38e935

File tree

2 files changed

+340
-5
lines changed

2 files changed

+340
-5
lines changed

pystring.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ typedef int Py_ssize_t;
202202
{
203203
if ( maxsplit < 0 )
204204
{
205-
split( str, result, sep, 0 );
205+
split( str, result, sep, maxsplit );
206206
return;
207207
}
208208

@@ -214,11 +214,11 @@ typedef int Py_ssize_t;
214214
return;
215215
}
216216

217-
std::string::size_type i,j, len = str.size(), n = sep.size();
217+
Py_ssize_t i,j, len = (Py_ssize_t) str.size(), n = (Py_ssize_t) sep.size();
218218

219219
i = j = len;
220220

221-
while ( i > n )
221+
while ( i >= n )
222222
{
223223
if ( str[i - 1] == sep[n - 1] && str.substr( i - n, n ) == sep )
224224
{

test.cpp

Lines changed: 337 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
PYSTRING_TEST_APP(PyStringUnitTests)
77

8-
98
PYSTRING_ADD_TEST(pystring, endswith)
109
{
1110
PYSTRING_CHECK_EQUAL(pystring::endswith("", ""), true);
@@ -123,6 +122,343 @@ PYSTRING_ADD_TEST(pystring, slice)
123122
PYSTRING_CHECK_EQUAL(pystring::slice("abcdef",0,-1), "abcde");
124123
}
125124

125+
PYSTRING_ADD_TEST(pystring, split)
126+
{
127+
std::vector< std::string > result;
128+
129+
{
130+
result.clear();
131+
pystring::split("", result, "/", 1);
132+
PYSTRING_CHECK_EQUAL(result.size(), 1);
133+
if(result.size()==1)
134+
{
135+
PYSTRING_CHECK_EQUAL(result[0], "");
136+
}
137+
}
138+
139+
{
140+
result.clear();
141+
pystring::split("/", result, "/", 1);
142+
PYSTRING_CHECK_EQUAL(result.size(), 2);
143+
if(result.size()==2)
144+
{
145+
PYSTRING_CHECK_EQUAL(result[0], "");
146+
PYSTRING_CHECK_EQUAL(result[1], "");
147+
}
148+
}
149+
150+
{
151+
result.clear();
152+
pystring::split(" ", result, " ", 1);
153+
PYSTRING_CHECK_EQUAL(result.size(), 2);
154+
if(result.size()==2)
155+
{
156+
PYSTRING_CHECK_EQUAL(result[0], "");
157+
PYSTRING_CHECK_EQUAL(result[1], "");
158+
}
159+
}
160+
161+
{
162+
result.clear();
163+
pystring::split(" /", result, "/", 1);
164+
PYSTRING_CHECK_EQUAL(result.size(), 2);
165+
if(result.size()==2)
166+
{
167+
PYSTRING_CHECK_EQUAL(result[0], " ");
168+
PYSTRING_CHECK_EQUAL(result[1], "");
169+
}
170+
}
171+
172+
{
173+
result.clear();
174+
pystring::split(" //", result, "/", 1);
175+
PYSTRING_CHECK_EQUAL(result.size(), 2);
176+
if(result.size()==2)
177+
{
178+
PYSTRING_CHECK_EQUAL(result[0], " ");
179+
PYSTRING_CHECK_EQUAL(result[1], "/");
180+
}
181+
}
182+
183+
{
184+
result.clear();
185+
pystring::split("a ", result, " ", 1);
186+
PYSTRING_CHECK_EQUAL(result.size(), 2);
187+
if(result.size()==2)
188+
{
189+
PYSTRING_CHECK_EQUAL(result[0], "a");
190+
PYSTRING_CHECK_EQUAL(result[1], " ");
191+
}
192+
}
193+
194+
{
195+
result.clear();
196+
pystring::split("//as//rew//gdf", result, "//");
197+
PYSTRING_CHECK_EQUAL(result.size(), 4);
198+
if(result.size()==4)
199+
{
200+
PYSTRING_CHECK_EQUAL(result[0], "");
201+
PYSTRING_CHECK_EQUAL(result[1], "as");
202+
PYSTRING_CHECK_EQUAL(result[2], "rew");
203+
PYSTRING_CHECK_EQUAL(result[3], "gdf");
204+
}
205+
}
206+
207+
{
208+
result.clear();
209+
pystring::split("/root", result, "/", 1);
210+
PYSTRING_CHECK_EQUAL(result.size(), 2);
211+
if(result.size()==2)
212+
{
213+
PYSTRING_CHECK_EQUAL(result[0], "");
214+
PYSTRING_CHECK_EQUAL(result[1], "root");
215+
}
216+
}
217+
218+
{
219+
result.clear();
220+
pystring::split("/root/world", result, "/", 0);
221+
PYSTRING_CHECK_EQUAL(result.size(), 1);
222+
if(result.size()==1)
223+
{
224+
PYSTRING_CHECK_EQUAL(result[0], "/root/world");
225+
}
226+
}
227+
228+
{
229+
result.clear();
230+
pystring::split("/root/world", result, "/", 1);
231+
PYSTRING_CHECK_EQUAL(result.size(), 2);
232+
if(result.size()==2)
233+
{
234+
PYSTRING_CHECK_EQUAL(result[0], "");
235+
PYSTRING_CHECK_EQUAL(result[1], "root/world");
236+
}
237+
}
238+
239+
{
240+
result.clear();
241+
pystring::split("/root/world", result, "/", 2);
242+
PYSTRING_CHECK_EQUAL(result.size(), 3);
243+
if(result.size()==3)
244+
{
245+
PYSTRING_CHECK_EQUAL(result[0], "");
246+
PYSTRING_CHECK_EQUAL(result[1], "root");
247+
PYSTRING_CHECK_EQUAL(result[2], "world");
248+
}
249+
}
250+
251+
{
252+
result.clear();
253+
pystring::split("/root/world", result, "/", -1);
254+
PYSTRING_CHECK_EQUAL(result.size(), 3);
255+
if(result.size()==3)
256+
{
257+
PYSTRING_CHECK_EQUAL(result[0], "");
258+
PYSTRING_CHECK_EQUAL(result[1], "root");
259+
PYSTRING_CHECK_EQUAL(result[2], "world");
260+
}
261+
}
262+
}
263+
264+
PYSTRING_ADD_TEST(pystring, rsplit)
265+
{
266+
std::vector< std::string > result;
267+
{
268+
result.clear();
269+
pystring::rsplit("", result, "/", 1);
270+
PYSTRING_CHECK_EQUAL(result.size(), 1);
271+
if(result.size()==1)
272+
{
273+
PYSTRING_CHECK_EQUAL(result[0], "");
274+
}
275+
}
276+
277+
{
278+
// "".rsplit(None, 1)
279+
result.clear();
280+
pystring::rsplit("", result, "", 1);
281+
PYSTRING_CHECK_EQUAL(result.size(), 0);
282+
}
283+
284+
{
285+
// " ".rsplit(None, 1)
286+
result.clear();
287+
pystring::rsplit(" ", result, "", 1);
288+
PYSTRING_CHECK_EQUAL(result.size(), 0);
289+
}
290+
291+
{
292+
result.clear();
293+
pystring::rsplit(" ", result, "", 1);
294+
PYSTRING_CHECK_EQUAL(result.size(), 0);
295+
}
296+
297+
{
298+
result.clear();
299+
pystring::rsplit("/", result, "/", 1);
300+
PYSTRING_CHECK_EQUAL(result.size(), 2);
301+
if(result.size()==2)
302+
{
303+
PYSTRING_CHECK_EQUAL(result[0], "");
304+
PYSTRING_CHECK_EQUAL(result[1], "");
305+
}
306+
}
307+
308+
309+
{
310+
result.clear();
311+
pystring::rsplit(" /", result, "/", 1);
312+
PYSTRING_CHECK_EQUAL(result.size(), 2);
313+
if(result.size()==2)
314+
{
315+
PYSTRING_CHECK_EQUAL(result[0], " ");
316+
PYSTRING_CHECK_EQUAL(result[1], "");
317+
}
318+
}
319+
320+
{
321+
result.clear();
322+
pystring::rsplit(" //", result, "/", 1);
323+
PYSTRING_CHECK_EQUAL(result.size(), 2);
324+
if(result.size()==2)
325+
{
326+
PYSTRING_CHECK_EQUAL(result[0], " /");
327+
PYSTRING_CHECK_EQUAL(result[1], "");
328+
}
329+
}
330+
331+
{
332+
result.clear();
333+
pystring::rsplit("/root", result, "/", 1);
334+
PYSTRING_CHECK_EQUAL(result.size(), 2);
335+
if(result.size()==2)
336+
{
337+
PYSTRING_CHECK_EQUAL(result[0], "");
338+
PYSTRING_CHECK_EQUAL(result[1], "root");
339+
}
340+
}
341+
342+
{
343+
result.clear();
344+
pystring::rsplit("/root/world", result, "/", 0);
345+
PYSTRING_CHECK_EQUAL(result.size(), 1);
346+
if(result.size()==1)
347+
{
348+
PYSTRING_CHECK_EQUAL(result[0], "/root/world");
349+
}
350+
}
351+
352+
{
353+
result.clear();
354+
pystring::rsplit("/root/world", result, "/", 1);
355+
PYSTRING_CHECK_EQUAL(result.size(), 2);
356+
if(result.size()==2)
357+
{
358+
PYSTRING_CHECK_EQUAL(result[0], "/root");
359+
PYSTRING_CHECK_EQUAL(result[1], "world");
360+
}
361+
}
362+
363+
{
364+
result.clear();
365+
pystring::rsplit("/root/world", result, "/", 2);
366+
PYSTRING_CHECK_EQUAL(result.size(), 3);
367+
if(result.size()==3)
368+
{
369+
PYSTRING_CHECK_EQUAL(result[0], "");
370+
PYSTRING_CHECK_EQUAL(result[1], "root");
371+
PYSTRING_CHECK_EQUAL(result[2], "world");
372+
}
373+
}
374+
375+
{
376+
result.clear();
377+
pystring::rsplit("/root/world", result, "/", -1);
378+
PYSTRING_CHECK_EQUAL(result.size(), 3);
379+
if(result.size()==3)
380+
{
381+
PYSTRING_CHECK_EQUAL(result[0], "");
382+
PYSTRING_CHECK_EQUAL(result[1], "root");
383+
PYSTRING_CHECK_EQUAL(result[2], "world");
384+
}
385+
}
386+
387+
{
388+
// " root world".rsplit(None, 0)
389+
result.clear();
390+
pystring::rsplit(" root world", result, "", 0);
391+
PYSTRING_CHECK_EQUAL(result.size(), 1);
392+
if(result.size()==1)
393+
{
394+
PYSTRING_CHECK_EQUAL(result[0], " root world");
395+
}
396+
}
397+
398+
{
399+
// " root world".rsplit(None, 1)
400+
result.clear();
401+
pystring::rsplit(" root world", result, "", 1);
402+
PYSTRING_CHECK_EQUAL(result.size(), 2);
403+
if(result.size()==2)
404+
{
405+
PYSTRING_CHECK_EQUAL(result[0], " root");
406+
PYSTRING_CHECK_EQUAL(result[1], "world");
407+
}
408+
}
409+
410+
{
411+
// " root world".rsplit(None, 2)
412+
result.clear();
413+
pystring::rsplit(" root world", result, "", 2);
414+
PYSTRING_CHECK_EQUAL(result.size(), 2);
415+
if(result.size()==2)
416+
{
417+
PYSTRING_CHECK_EQUAL(result[0], "root");
418+
PYSTRING_CHECK_EQUAL(result[1], "world");
419+
}
420+
}
421+
422+
423+
{
424+
// " root world".rsplit(" ", 0)
425+
result.clear();
426+
pystring::rsplit(" root world", result, " ", 0);
427+
PYSTRING_CHECK_EQUAL(result.size(), 1);
428+
if(result.size()==1)
429+
{
430+
PYSTRING_CHECK_EQUAL(result[0], " root world");
431+
}
432+
}
433+
434+
{
435+
// " root world".rsplit(" ", 1)
436+
result.clear();
437+
pystring::rsplit(" root world", result, " ", 1);
438+
PYSTRING_CHECK_EQUAL(result.size(), 2);
439+
if(result.size()==2)
440+
{
441+
PYSTRING_CHECK_EQUAL(result[0], " root");
442+
PYSTRING_CHECK_EQUAL(result[1], "world");
443+
}
444+
}
445+
446+
{
447+
// " root world".rsplit(" ", 2)
448+
result.clear();
449+
pystring::rsplit(" root world", result, " ", 2);
450+
PYSTRING_CHECK_EQUAL(result.size(), 3);
451+
if(result.size()==3)
452+
{
453+
PYSTRING_CHECK_EQUAL(result[0], "");
454+
PYSTRING_CHECK_EQUAL(result[1], "root");
455+
PYSTRING_CHECK_EQUAL(result[2], "world");
456+
}
457+
}
458+
}
459+
460+
461+
126462
PYSTRING_ADD_TEST(pystring, startswith)
127463
{
128464
PYSTRING_CHECK_EQUAL(pystring::startswith("", ""), true);
@@ -300,4 +636,3 @@ PYSTRING_ADD_TEST(pystring_os_path, splitext)
300636
splitext_nt(root, ext, "c:\\a.b.c"); PYSTRING_CHECK_EQUAL(root, "c:\\a.b"); PYSTRING_CHECK_EQUAL(ext, ".c");
301637
splitext_nt(root, ext, "c:\\a_b.c"); PYSTRING_CHECK_EQUAL(root, "c:\\a_b"); PYSTRING_CHECK_EQUAL(ext, ".c");
302638
}
303-

0 commit comments

Comments
 (0)