Code archives/Algorithms/Dynamic string array
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Allows one to modify / create one string containing multiple substrings. - each substring has a maximum length of 65535 - each substring can be made up of any characters you desire | |||||
; (c)oded by Mr Brine
;
;
; - doesnt require a split char
; - any character can be passed
; - use the provided functions to create the split string
; - a split string probably wont display properly if viewed in its raw state.
; - max string length that can be added to a split string is $ffff
; - fast, only 2 characters accessed per substring when navigiating the sub strings
;
; ----------------------------------------------------------------------------------------------------
Function split_debuglog(raw$)
Local l = Len(raw)
Local o = 1
Local i = 0
Local s$
DebugLog "========================================================================================"
DebugLog "count: " + Split_Count(raw$)
DebugLog "len: " + Len(raw)
DebugLog "raw: " + raw
DebugLog "----------------------------------------------------------------------------------------"
DebugLog "substr| raw | string | value"
DebugLog "index | offset | len |"
DebugLog "----------------------------------------------------------------------------------------"
While o < l
DebugLog i + String(" ", 6 - Len(i)) + "|" + o + String(" ", 8 - Len(o)) + "|" + split_ssi_getlen(raw, o) + String(" ", 8 - Len(split_ssi_getlen(raw, o))) + "|"+ "!" + split_ssi_gettext$(raw, o) + "!"
o = split_ssi_gotonext(raw, o)
i = i + 1
Wend
End Function
; ----------------------------------------------------------------------------------------------------
Function Split_Append$(raw$, sub$)
Return raw + split_ssi_create(sub, 1)
End Function
Function Split_Count(raw$)
Local c
Local l = Len(raw)
Local o = 1
While o < l
c = c + 1
o = split_ssi_gotonext(raw, o)
Wend
Return c
End Function
Function Split_Get$(raw$, ndx)
Local l = Len(raw)
Local o = 1
While o < l
If(Not ndx) Return Mid(raw, split_ssi_getoff(o), split_ssi_getlen(raw, o))
o = split_ssi_gotonext(raw, o)
ndx = ndx - 1
Wend
End Function
Function Split_GetLen(raw$, ndx)
Local l = Len(raw)
Local o = 1
While o < l
If(Not ndx) Return split_ssi_getlen(raw, o)
o = split_ssi_gotonext(raw, o)
ndx = ndx - 1
Wend
End Function
Function Split_Insert$(raw$, ndx, sub$)
Return split_ss_getrange(raw, 0, ndx) + split_ssi_create(sub, 1) + split_ss_getrange(raw, ndx, -1)
End Function
Function Split_Remove$(raw$, ndx)
Return split_ss_getrange(raw, 0, ndx) + split_ss_getrange(raw, ndx + 1, -1)
End Function
Function Split_Set$(raw$, ndx, sub$)
Return split_ss_getrange(raw, 0, ndx) + split_ssi_create(sub, 1) + split_ss_getrange(raw, ndx + 1, -1)
End Function
; ----------------------------------------------------------------------------------------------------
; - fi: first index
; - ct: sub string count -1: return all the remaining substrings
; 0: returns nothing
; >0: number of substrings to return
;
; - if the number of ss defined by ct is greater then the number of ss in raw, then getrange will
; create however many blank ss is req to make sure the returned value has the stated number of ss
;
Function split_ss_getrange$(raw$, fi, ct)
Local l = Len(raw)
Local ssi = 1
Local ssi2
If(ct < 0)
While fi
ssi = split_ssi_gotonext(raw$, ssi)
If(ssi => l) Return ""
fi = fi - 1
Wend
Return Mid(raw, ssi, l)
Else If(ct > 0)
While fi
ssi = split_ssi_gotonext(raw$, ssi)
fi = fi - 1
If(ssi => l) Exit
Wend
If(fi) Return split_ssi_create("", ct)
ssi2 = ssi
While ct
If(ssi2 => l) Exit
ssi2 = split_ssi_gotonext(raw$, ssi2)
ct = ct - 1
Wend
If(ct) Return Mid(raw, ssi, l) + split_ssi_create("", ct)
Return Mid(raw, ssi, ssi2 - ssi)
End If
End Function
; ----------------------------------------------------------------------------------------------------
; ssi - substring index
;
; - the first substring index (ssi) = 1
Function split_ssi_create$(sub$, rpeat)
Return String(Chr(Len(sub) And $00000ff) + Chr((Len(sub) And $000ff00) Shr 8) + Mid(sub, 1, Len(sub) And $ffff), rpeat)
End Function
Function split_ssi_gotonext(raw$, ssi)
Return ssi + Asc(Mid(raw, ssi, 1)) + Asc(Mid(raw, ssi + 1, 1)) Shl 8 + 2
End Function
Function split_ssi_getlen(raw$, ssi)
Return Asc(Mid(raw, ssi, 1)) + Asc(Mid(raw, ssi + 1, 1)) Shl 8
End Function
Function split_ssi_getoff(ssi)
Return ssi + 2
End Function
Function split_ssi_gettext$(raw$, ssi)
Return Mid(raw, ssi + 2, Asc(Mid(raw, ssi, 1)) + Asc(Mid(raw, ssi + 1, 1)) Shl 8)
End Function |
Comments
None.
Code Archives Forum