comparison string.rhope @ 77:a748300a4143

Some untested progress on String
author Mike Pavone <pavone@retrodev.com>
date Thu, 08 Jul 2010 09:57:16 -0400
parents f7bcf3db1342
children 4d5ea487f810
comparison
equal deleted inserted replaced
76:004f0fc8941f 77:a748300a4143
82 { 82 {
83 Buffer 83 Buffer
84 Length(Int32,Naked) 84 Length(Int32,Naked)
85 } 85 }
86 86
87 String[in(Array):out(String)] 87 String@Array[in:out(String)]
88 { 88 {
89 out <- [[Build[String()]]Buffer <<[in]]Length <<[Count UTF8[in, 0, 0]] 89 out <- [[Build[String()]]Buffer <<[in]]Length <<[Count UTF8[in, 0, 0]]
90 } 90 }
91 91
92 Print@String[string:out] 92 Print@String[string:out]
144 Flatten@String[string:out] 144 Flatten@String[string:out]
145 { 145 {
146 out <- string 146 out <- string
147 } 147 }
148 148
149 _CPOff to BOff[buff,cur,expected:outcur,outboff]
150 {
151 If[expected]
152 {
153 outcur <- cur
154 outboff <- 0i32
155 }{
156 err <- If[[byte]>[192u8]] {}
157 {
158 err <- If[[byte]<[128u8]] {}
159 {
160 outcur <- _CPOff to BOff[buff, [cur]+[1i32], [expected]-[1i32]] {}
161 { outboff <- [~]+[1i32] }
162 }
163 }
164
165 Val[err]
166 {
167 outcur <- [cur]+[1i32]
168 outboff <- 1i32
169 }
170 }
171 }
172
173 CPOff to BOff[buff,cur,boff,cpoff:out]
174 {
175 If[[cur]=[cpoff]]
176 {
177 out <- boff
178 }{
179 byte <- [buff]Index[cur]
180 If[[byte] < [128u8]]
181 {
182 nboff <- [bof]+[1i32]
183 ncur <- [cur]+[1i32]
184 }{
185 If[[byte]<[192u8]]
186 {
187 //Error: Encoding for 2nd,3rd or 4th byte of sequence
188 //treat as a single character
189 nboff <- [bof]+[1i32]
190 ncur <- [cur]+[1i32]
191 }{
192 If[[byte]<[224u8]]
193 {
194 expect <- 1i32
195 }{
196 If[[byte]<[240u8]]
197 {
198 expect <- 2i32
199 }{
200 If[[byte]<[245u8]]
201 {
202 expect <- 3i32
203 }{
204 //Error
205 nboff <- [bof]+[1i32]
206 ncur <- [cur]+[1i32]
207 }
208 }
209 }
210 Val[expect]
211 {
212 ncur <- _CPOff to BOff[buff, [cur]+[1i32], expect] {}
213 { nboff <- [1i32]+[~] }
214 }
215 }
216 }
217 out <- CPOff to BOff[buff, ncur, cpoff, nboff]
218 }
219 }
220
149 Slice@String[string,slicepoint:left,right] 221 Slice@String[string,slicepoint:left,right]
150 { 222 {
151 //TODO: Handle invalid slicepoints 223 //TODO: Handle invalid slicepoints
152 left <- String Slice[string, 0i32, slicepoint] 224 sliceoffset <- CPOff to BOff[[string]Buffer >>, 0i32, 0i32, slicepoint]
153 right <- String Slice[string, slicepoint, [[string]Length >>]-[slicepoint]] 225 left <- String Slice[string, 0i32, slicepoint, sliceoffset]
226 right <- String Slice[string, sliceoffset, [[string]Length >>]-[slicepoint], [[[string]Buffer >>]Length]-[sliceoffset]]
154 } 227 }
155 228
156 Byte@String[string,index:out,invalid] 229 Byte@String[string,index:out,invalid]
157 { 230 {
158 out,invalid <- [[string]Buffer >>]Index[index] 231 out,invalid <- [[string]Buffer >>]Index[index]
174 }{ 247 }{
175 out <- Yes 248 out <- Yes
176 } 249 }
177 } 250 }
178 251
252 Eq String[left,right:out]
253 {
254 ,out <- If[[[left]Length] = [[right]Length]]
255 {
256 out <- _=String[left,right,0]
257 }
258 }
259
179 =@String[left,right:out] 260 =@String[left,right:out]
180 { 261 {
181 ,out <- If[[[left]Length] = [[right]Length]] 262 out <- Eq String[left,right]
182 { 263 }
183 out <- _=String[left,right,0] 264
184 } 265 Byte Length@String[string:out]
266 {
267 out <- [[string]Buffer >>]Length
268 }
269
270 Append@String[left,right:out]
271 {
272 out <- String Cat[left,right]
185 } 273 }
186 274
187 Blueprint String Slice 275 Blueprint String Slice
188 { 276 {
189 Source 277 Source
190 Offset(Int32,Naked) 278 Offset(Int32,Naked)
191 Length(Int32,Naked) 279 Length(Int32,Naked)
192 } 280 ByteLen(Int32,Naked)
193 281 }
194 String Slice[source,offset,length:out(String Slice)] 282
195 { 283 String Slice[source,offset,length,bytelen:out(String Slice)]
196 out <- [[[Build[String Slice()]]Source <<[source]]Offset <<[offset]]Length <<[length] 284 {
197 } 285 out <- [[[[Build[String Slice()]]Source <<[source]]Offset <<[offset]]Length <<[length]]ByteLen <<[bytelen]
198 286 }
199 287
288 Byte@String Slice[string,index:out,invalid]
289 {
290 ,invalid <- If[[index]<[[string]ByteLen >>]]
291 {
292 out,invalid <- [[string]Source >>]Byte[[index]+[[string]Offset >>]]
293 }
294 }
295
296 Byte Length@String Slice[string:out]
297 {
298 out <- [string]ByteLen >>
299 }
300
301 =@String Slice[left,right:out]
302 {
303 out <- Eq String[left,right]
304 }
305
306 _Flatten@String[string,dest,offset,count:out]
307 {
308 If[count]
309 {
310 out <- [string]_Flatten[[dest]Append[ [[string]Buffer >>]Index[offset] ], [offset]+[1i32], [count]-[1i32]]
311 }{
312 out <- dest
313 }
314 }
315
316 Flatten@String[string:out]
317 {
318 out <- string
319 }
320
321 _Flatten@String Slice[string,dest,offset,count:out]
322 {
323 out <- [[string]Source >>]_Flatten[dest, [[string]Offset >>]+[offset], count]
324 }
325
326 Flatten@String Slice[string:out]
327 {
328 out <- String[ [[string]Source >>]_Flatten[Array[], [string]Offset >>, [string]ByteLen >>] ]
329 }
330
331 Append@String Slice[left,right:out]
332 {
333 out <- String Cat[left,right]
334 }
335
336 Blueprint String Cat
337 {
338 Left
339 Right
340 Length
341 ByteLen
342 }
343
344 String Cat[left,right:out]
345 {
346 out <- [[[[Build[String Cat()]
347 ]Left <<[left]
348 ]Right <<[right]
349 ]Length <<[ [[left]Length]+[[right]Length] ]
350 ]ByteLen <<[ [[left]Byte Length]+[[right]Byte Length] ]
351 }
352
353 Append@String Cat[left,right:out]
354 {
355 out <- String Cat[left,right]
356 }
357
358 Byte@String Cat[string,index:out,invalid]
359 {
360 leftlen <- [[string]Left >>]Byte Length
361 If[[index]<[leftlen]]
362 {
363 out,invalid <- [[string]Left >>]Byte[index]
364 }{
365 rindex <- [index]-[leftlen]
366 ,invalid <- If[[rindex]<[[[string]Right >>]Byte Length]]
367 {
368 out,invalid <- [[string]Right >>]Byte[rindex]
369 }
370 }
371 }
372
373 Byte Length@String Cat[string:out]
374 {
375 out <- [string]ByteLen >>
376 }
377
378 _Flatten@String Cat[string,dest,offset,count:out]
379 {
380 [string]Left >>
381 }
382