Skip to content

Commit 47b461e

Browse files
committed
udt-wstring: MID function will accept UDT as z|wstring
1 parent 7a96a53 commit 47b461e

File tree

5 files changed

+507
-1
lines changed

5 files changed

+507
-1
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Version 1.07.0
1313
- LCASE/UCASE will accept UDT as Z|WSTRING
1414
- Cxxx() conversion functions will accept UDT as Z|WSTRING
1515
- INSTR/INSTRREV will accept UDT as Z|WSTRING
16+
- MID function will accept UDT as Z|WSTRING
1617

1718
[fixed]
1819
- sf.net #881: C backend: support for varadic function parameters in gcc using __builtin_va_list type and related macros

src/compiler/rtl-string.bas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3092,7 +3092,8 @@ function rtlStrMid _
30923092

30933093
function = NULL
30943094

3095-
''
3095+
astTryOvlStringCONV( expr1 )
3096+
30963097
if( astGetDataType( expr1 ) <> FB_DATATYPE_WCHAR ) then
30973098
proc = astNewCALL( PROCLOOKUP( STRMID ) )
30983099
else

tests/udt-wstring/midfunc.bas

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
#include "fbcunit.bi"
2+
#include once "uwstring-fixed.bi"
3+
#include once "chk-wstring.bi"
4+
5+
#define ustring UWSTRING_FIXED
6+
7+
SUITE( fbc_tests.udt_wstring_.midfunc )
8+
9+
'' MID( wstring, start )
10+
#macro check( text, start, expected )
11+
scope
12+
dim st as wstring * 50 = text
13+
dim se as wstring * 50 = expected
14+
dim ut as ustring = st
15+
16+
CU_ASSERT( st = text )
17+
CU_ASSERT( ut = st )
18+
19+
dim rt as wstring * 50 = mid( st, start )
20+
dim ru as wstring * 50 = mid( ut, start )
21+
22+
CU_ASSERT_WSTRING_EQUAL( rt, ru )
23+
CU_ASSERT_WSTRING_EQUAL( rt, se )
24+
CU_ASSERT_WSTRING_EQUAL( ru, se )
25+
end scope
26+
#endmacro
27+
28+
'' MID( wstring, start, length )
29+
#macro check_i_n( text, start, length, expected )
30+
scope
31+
dim st as wstring * 50 = text
32+
dim se as wstring * 50 = expected
33+
dim ut as ustring = st
34+
35+
CU_ASSERT( st = text )
36+
CU_ASSERT( ut = st )
37+
38+
dim rt as wstring * 50 = mid( st, start, length )
39+
dim ru as wstring * 50 = mid( ut, start, length )
40+
41+
CU_ASSERT_WSTRING_EQUAL( rt, ru )
42+
CU_ASSERT_WSTRING_EQUAL( rt, se )
43+
CU_ASSERT_WSTRING_EQUAL( ru, se )
44+
end scope
45+
#endmacro
46+
47+
TEST( default )
48+
check( "" , -1, "" )
49+
check( "" , 0, "" )
50+
check( "" , 1, "" )
51+
52+
check( "a" , -1, "" )
53+
check( "a" , 0, "" )
54+
check( "a" , 1, "a" )
55+
check( "a" , 2, "" )
56+
57+
check( "ab" , -1, "" )
58+
check( "ab" , 0, "" )
59+
check( "ab" , 1, "ab" )
60+
check( "ab" , 2, "b" )
61+
check( "ab" , 3, "" )
62+
63+
check( "abc" , -1, "" )
64+
check( "abc" , 0, "" )
65+
check( "abc" , 1, "abc" )
66+
check( "abc" , 2, "bc" )
67+
check( "abc" , 3, "c" )
68+
check( "abc" , 4, "" )
69+
70+
check( !"\u3041", -1, !"" )
71+
check( !"\u3041", 0, !"" )
72+
check( !"\u3041", 1, !"\u3041" )
73+
check( !"\u3041", 2, !"" )
74+
75+
check( !"\u3041\u3043", -1, !"" )
76+
check( !"\u3041\u3043", 0, !"" )
77+
check( !"\u3041\u3043", 1, !"\u3041\u3043" )
78+
check( !"\u3041\u3043", 2, !"\u3043" )
79+
check( !"\u3041\u3043", 3, !"" )
80+
81+
check( !"\u3041\u3043\u3045", -1, !"" )
82+
check( !"\u3041\u3043\u3045", 0, !"" )
83+
check( !"\u3041\u3043\u3045", 1, !"\u3041\u3043\u3045" )
84+
check( !"\u3041\u3043\u3045", 2, !"\u3043\u3045" )
85+
check( !"\u3041\u3043\u3045", 3, !"\u3045" )
86+
check( !"\u3041\u3043\u3045", 4, !"" )
87+
END_TEST
88+
89+
TEST( length )
90+
check_i_n( "" , -1, -1, "" )
91+
check_i_n( "" , -1, 0, "" )
92+
check_i_n( "" , -1, 1, "" )
93+
94+
check_i_n( "" , 0, -1, "" )
95+
check_i_n( "" , 0, 0, "" )
96+
check_i_n( "" , 0, 1, "" )
97+
98+
check_i_n( "" , 1, -1, "" )
99+
check_i_n( "" , 1, 0, "" )
100+
check_i_n( "" , 1, 1, "" )
101+
102+
check_i_n( "a" , -1, -1, "" )
103+
check_i_n( "a" , -1, 0, "" )
104+
check_i_n( "a" , -1, 1, "" )
105+
check_i_n( "a" , -1, 2, "" )
106+
107+
check_i_n( "a" , 0, -1, "" )
108+
check_i_n( "a" , 0, 0, "" )
109+
check_i_n( "a" , 0, 1, "" )
110+
check_i_n( "a" , 0, 2, "" )
111+
112+
check_i_n( "a" , 1, -1, "a" )
113+
check_i_n( "a" , 1, 0, "" )
114+
check_i_n( "a" , 1, 1, "a" )
115+
check_i_n( "a" , 1, 2, "a" )
116+
117+
check_i_n( "a" , 2, -1, "" )
118+
check_i_n( "a" , 2, 0, "" )
119+
check_i_n( "a" , 2, 1, "" )
120+
check_i_n( "a" , 2, 2, "" )
121+
122+
check_i_n( "ab" , 1, -2, "ab" )
123+
check_i_n( "ab" , 1, -1, "ab" )
124+
check_i_n( "ab" , 1, 0, "" )
125+
check_i_n( "ab" , 1, 1, "a" )
126+
check_i_n( "ab" , 1, 2, "ab" )
127+
check_i_n( "ab" , 1, 3, "ab" )
128+
129+
check_i_n( "ab" , 2, -2, "b" )
130+
check_i_n( "ab" , 2, -1, "b" )
131+
check_i_n( "ab" , 2, 0, "" )
132+
check_i_n( "ab" , 2, 1, "b" )
133+
check_i_n( "ab" , 2, 2, "b" )
134+
check_i_n( "ab" , 2, 3, "b" )
135+
136+
check_i_n( "ab" , 3, -2, "" )
137+
check_i_n( "ab" , 3, -1, "" )
138+
check_i_n( "ab" , 3, 0, "" )
139+
check_i_n( "ab" , 3, 1, "" )
140+
check_i_n( "ab" , 3, 2, "" )
141+
check_i_n( "ab" , 3, 3, "" )
142+
143+
check_i_n( !"\u3041\u3043\u3045", -1, -2, !"" )
144+
check_i_n( !"\u3041\u3043\u3045", -1, -1, !"" )
145+
check_i_n( !"\u3041\u3043\u3045", -1, 0, !"" )
146+
check_i_n( !"\u3041\u3043\u3045", -1, 1, !"" )
147+
check_i_n( !"\u3041\u3043\u3045", -1, 2, !"" )
148+
check_i_n( !"\u3041\u3043\u3045", -1, 3, !"" )
149+
check_i_n( !"\u3041\u3043\u3045", -1, 4, !"" )
150+
151+
check_i_n( !"\u3041\u3043\u3045", 0, -2, !"" )
152+
check_i_n( !"\u3041\u3043\u3045", 0, -1, !"" )
153+
check_i_n( !"\u3041\u3043\u3045", 0, 0, !"" )
154+
check_i_n( !"\u3041\u3043\u3045", 0, 1, !"" )
155+
check_i_n( !"\u3041\u3043\u3045", 0, 2, !"" )
156+
check_i_n( !"\u3041\u3043\u3045", 0, 3, !"" )
157+
check_i_n( !"\u3041\u3043\u3045", 0, 4, !"" )
158+
159+
check_i_n( !"\u3041\u3043\u3045", 1, -2, !"\u3041\u3043\u3045" )
160+
check_i_n( !"\u3041\u3043\u3045", 1, -1, !"\u3041\u3043\u3045" )
161+
check_i_n( !"\u3041\u3043\u3045", 1, 0, !"" )
162+
check_i_n( !"\u3041\u3043\u3045", 1, 1, !"\u3041" )
163+
check_i_n( !"\u3041\u3043\u3045", 1, 2, !"\u3041\u3043" )
164+
check_i_n( !"\u3041\u3043\u3045", 1, 3, !"\u3041\u3043\u3045" )
165+
check_i_n( !"\u3041\u3043\u3045", 1, 4, !"\u3041\u3043\u3045" )
166+
167+
check_i_n( !"\u3041\u3043\u3045", 2, -2, !"\u3043\u3045" )
168+
check_i_n( !"\u3041\u3043\u3045", 2, -1, !"\u3043\u3045" )
169+
check_i_n( !"\u3041\u3043\u3045", 2, 0, !"" )
170+
check_i_n( !"\u3041\u3043\u3045", 2, 1, !"\u3043" )
171+
check_i_n( !"\u3041\u3043\u3045", 2, 2, !"\u3043\u3045" )
172+
check_i_n( !"\u3041\u3043\u3045", 2, 3, !"\u3043\u3045" )
173+
check_i_n( !"\u3041\u3043\u3045", 2, 4, !"\u3043\u3045" )
174+
175+
check_i_n( !"\u3041\u3043\u3045", 3, -2, !"\u3045" )
176+
check_i_n( !"\u3041\u3043\u3045", 3, -1, !"\u3045" )
177+
check_i_n( !"\u3041\u3043\u3045", 3, 0, !"" )
178+
check_i_n( !"\u3041\u3043\u3045", 3, 1, !"\u3045" )
179+
check_i_n( !"\u3041\u3043\u3045", 3, 2, !"\u3045" )
180+
check_i_n( !"\u3041\u3043\u3045", 3, 3, !"\u3045" )
181+
check_i_n( !"\u3041\u3043\u3045", 3, 4, !"\u3045" )
182+
183+
check_i_n( !"\u3041\u3043\u3045", 4, -1, !"" )
184+
check_i_n( !"\u3041\u3043\u3045", 4, 0, !"" )
185+
check_i_n( !"\u3041\u3043\u3045", 4, 1, !"" )
186+
check_i_n( !"\u3041\u3043\u3045", 4, 2, !"" )
187+
check_i_n( !"\u3041\u3043\u3045", 4, 3, !"" )
188+
check_i_n( !"\u3041\u3043\u3045", 4, 4, !"" )
189+
190+
END_TEST
191+
192+
193+
END_SUITE

tests/udt-zstring/midfunc.bas

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#include "fbcunit.bi"
2+
#include once "uzstring-fixed.bi"
3+
#include once "chk-zstring.bi"
4+
5+
#define ustring UZSTRING_FIXED
6+
7+
SUITE( fbc_tests.udt_zstring_.midfunc )
8+
9+
'' MID( wstring, start )
10+
#macro check( text, start, expected )
11+
scope
12+
dim st as zstring * 50 = text
13+
dim se as zstring * 50 = expected
14+
dim ut as ustring = st
15+
16+
CU_ASSERT( st = text )
17+
CU_ASSERT( ut = st )
18+
19+
dim rt as zstring * 50 = mid( st, start )
20+
dim ru as wstring * 50 = mid( ut, start )
21+
22+
CU_ASSERT_ZSTRING_EQUAL( rt, ru )
23+
CU_ASSERT_ZSTRING_EQUAL( rt, se )
24+
CU_ASSERT_ZSTRING_EQUAL( ru, se )
25+
end scope
26+
#endmacro
27+
28+
'' MID( wstring, start, length )
29+
#macro check_i_n( text, start, length, expected )
30+
scope
31+
dim st as zstring * 50 = text
32+
dim se as zstring * 50 = expected
33+
dim ut as ustring = st
34+
35+
CU_ASSERT( st = text )
36+
CU_ASSERT( ut = st )
37+
38+
dim rt as zstring * 50 = mid( st, start, length )
39+
dim ru as wstring * 50 = mid( ut, start, length )
40+
41+
CU_ASSERT_ZSTRING_EQUAL( rt, ru )
42+
CU_ASSERT_ZSTRING_EQUAL( rt, se )
43+
CU_ASSERT_ZSTRING_EQUAL( ru, se )
44+
end scope
45+
#endmacro
46+
47+
TEST( default )
48+
check( "" , -1, "" )
49+
check( "" , 0, "" )
50+
check( "" , 1, "" )
51+
52+
check( "a" , -1, "" )
53+
check( "a" , 0, "" )
54+
check( "a" , 1, "a" )
55+
check( "a" , 2, "" )
56+
57+
check( "ab" , -1, "" )
58+
check( "ab" , 0, "" )
59+
check( "ab" , 1, "ab" )
60+
check( "ab" , 2, "b" )
61+
check( "ab" , 3, "" )
62+
63+
check( "abc" , -1, "" )
64+
check( "abc" , 0, "" )
65+
check( "abc" , 1, "abc" )
66+
check( "abc" , 2, "bc" )
67+
check( "abc" , 3, "c" )
68+
check( "abc" , 4, "" )
69+
70+
END_TEST
71+
72+
TEST( length )
73+
check_i_n( "" , -1, -1, "" )
74+
check_i_n( "" , -1, 0, "" )
75+
check_i_n( "" , -1, 1, "" )
76+
77+
check_i_n( "" , 0, -1, "" )
78+
check_i_n( "" , 0, 0, "" )
79+
check_i_n( "" , 0, 1, "" )
80+
81+
check_i_n( "" , 1, -1, "" )
82+
check_i_n( "" , 1, 0, "" )
83+
check_i_n( "" , 1, 1, "" )
84+
85+
check_i_n( "a" , -1, -1, "" )
86+
check_i_n( "a" , -1, 0, "" )
87+
check_i_n( "a" , -1, 1, "" )
88+
check_i_n( "a" , -1, 2, "" )
89+
90+
check_i_n( "a" , 0, -1, "" )
91+
check_i_n( "a" , 0, 0, "" )
92+
check_i_n( "a" , 0, 1, "" )
93+
check_i_n( "a" , 0, 2, "" )
94+
95+
check_i_n( "a" , 1, -1, "a" )
96+
check_i_n( "a" , 1, 0, "" )
97+
check_i_n( "a" , 1, 1, "a" )
98+
check_i_n( "a" , 1, 2, "a" )
99+
100+
check_i_n( "a" , 2, -1, "" )
101+
check_i_n( "a" , 2, 0, "" )
102+
check_i_n( "a" , 2, 1, "" )
103+
check_i_n( "a" , 2, 2, "" )
104+
105+
check_i_n( "ab" , 1, -2, "ab" )
106+
check_i_n( "ab" , 1, -1, "ab" )
107+
check_i_n( "ab" , 1, 0, "" )
108+
check_i_n( "ab" , 1, 1, "a" )
109+
check_i_n( "ab" , 1, 2, "ab" )
110+
check_i_n( "ab" , 1, 3, "ab" )
111+
112+
check_i_n( "ab" , 2, -2, "b" )
113+
check_i_n( "ab" , 2, -1, "b" )
114+
check_i_n( "ab" , 2, 0, "" )
115+
check_i_n( "ab" , 2, 1, "b" )
116+
check_i_n( "ab" , 2, 2, "b" )
117+
check_i_n( "ab" , 2, 3, "b" )
118+
119+
check_i_n( "ab" , 3, -2, "" )
120+
check_i_n( "ab" , 3, -1, "" )
121+
check_i_n( "ab" , 3, 0, "" )
122+
check_i_n( "ab" , 3, 1, "" )
123+
check_i_n( "ab" , 3, 2, "" )
124+
check_i_n( "ab" , 3, 3, "" )
125+
126+
END_TEST
127+
128+
129+
END_SUITE

0 commit comments

Comments
 (0)