Code archives/Miscellaneous/StringList

This code has been declared by its author to be Public Domain code.

Download source code

StringList by Mahan
(Posted 18 years ago)
Lists of strings are very useful in programming.

examples:
* read a complete text-file and examine line-by-line in memory.
* split strings by some separator and get a list of all the elements.
* Add strings to the list during some operation for later processing.
* Storing the text lines of a chat/status window.

Note: The implementation is not very optimized or advanced. It will work well for small to moderate amounts of information, but I wouldn't recommend using it for 10's or 100's of megabytes of text.


code examples:

Include "strlist.bb"

;Example 1 - Make a list of the components of a path, using \ as separator
sl = CreateStrings()
AddSplitString(sl, "c:\program\test\file.txt", "")
For i = 0 To CountStrings(sl)-1
	Print GetString(sl, i)
Next

;Example 2 - Reformat and tidy up a sentence rebuilding spaces
sl2 = CreateStrings()
AddSplitString(sl2, "    Mobilis     in   Mobile    ", " ")
DeleteString(sl2, "")
Print "Reformatted string: '" + StringFromStrings(sl2, " ") + "'"

;Example 3 - Read up text file
sl3 = CreateStrings()
If FileType("strlist.bb")=0 Then End
f=ReadFile("strlist.bb")
ReadStrings(sl3, f)
CloseFile(f)
;For i = 0 To CountStrings(sl3)-1
;	Print GetString(sl3, i)
;Next
Print "Lines in file: " + CountStrings(sl3)

FreeStrings(sl)
FreeStrings(sl2)
FreeStrings(sl3)
;-------------------------------------------------
; strlist.bb - stringlist functions
;
; purpose: 
;	A very basic StringList.
;
;   Beware. Performance will degrade if used with
;   large amounts of Data. 
;
;-------------------------------------------------

Global sfHdlCounter_=-1

;INTERNAL: This is a contaner type for all strings in all stringlists.
Type TStrings
	Field hdl; this object belongs to this list-handle
	Field string$
End Type

;-------------------------------------------------
; Creates a new stringlist.
;
; Returns handle to new stringlist.
;
Function CreateStrings()
	sfHdlCounter_=sfHdlCounter_+1
	Return sfHdlCounter_
End Function

;-------------------------------------------------
; Frees (releases) a stringlist by handle.
;
; hdl - handle to previously created stringlist.
Function FreeStrings(hdl)
	For s.TStrings = Each TStrings
		If s\hdl=hdl Then Delete s
	Next
End Function

;-------------------------------------------------
; Adds a new string to the stringlist.
;
; hdl - stringlist handle
; s$ - the string to add
Function AddString(hdl, s$)
	n.TStrings = New TStrings
	n\hdl=hdl
	n\string=s
End Function

;-------------------------------------------------
; Returns the current number of strings in the
; stringlist.
;
; hdl - stringlist handle
Function CountStrings(hdl)
	cnt=0
	For s.TStrings = Each TStrings
		If s\hdl = hdl Then cnt=cnt+1
	Next
	Return cnt
End Function

;-------------------------------------------------
; Returns the string at a current index in the
; stringlist.
; 
; hdl - stringlist handle
; idx - index of a string between 0 and
;       CountStrings(hdl)-1.
;
; NOTE: Passing an invalid index will return ""
Function GetString$(hdl, idx)
	cnt=0
	For s.TStrings = Each TStrings
		If (s\hdl = hdl) And (cnt=idx) Then Return s.TStrings\String
		If s\hdl = hdl Then cnt=cnt+1
	Next
	Return ""
End Function


;-------------------------------------------------
; Splits a string based on a separator into a
; stringlist.
;
; hdl - stringlist handle
; s$ - the string to split
; sep$ - the separator
Function AddSplitString(hdl, s$, sep$)
	ls=Len(sep)
	p=Instr(s, sep)
	While p>0
		AddString(hdl, Left$(s, p-1))
		;s=Right$(s, p+ls+1)
		s$=Mid$(s$, p+ls, 2000000000) ; just copy the rest of the string
		p=Instr(s, sep)
	Wend
	If Len(s) > 0 Then AddString(hdl, s)
End Function

;-------------------------------------------------
; Deletes a string on a certain index in the
; stringlist.
;
; hdl - stringlist handle
; idx - index of a string between 0 and
;       CountStrings(hdl)-1.
;
; NOTE: Passing an invalid index will just waste
; cpu-cycles and do nothing.
Function DeleteStringIdx(hdl, idx)
	cnt=0
	For s.TStrings = Each TStrings
		If (s\hdl = hdl) And (cnt=idx) Then
			Delete s
			Return
		EndIf
		If s\hdl = hdl Then cnt=cnt+1
	Next
End Function


;-------------------------------------------------
; Deletes all strings equal to s$ in a stringlist.
;
; hdl - stringlist handle
; s$ - string to delete
Function DeleteString(hdl, s$)
	For st.TStrings = Each TStrings
		If (st\hdl = hdl) And (st\String=s) Then Delete st
	Next
End Function

;-------------------------------------------------
; Build a new string from all strings in the
; stringlist. A separator may be used between each
; element of the stringlist
;
; hdl - stringlist handle
; sep$ - optional separator
Function StringFromStrings$(hdl, sep$="")
	res$=""
	For s.TStrings = Each TStrings
		If (s\hdl = hdl) Then
			res=res+s\String+sep
		EndIf
	Next
	l = Len(res)
	ls = Len(sep)
	If (ls>0) And (l>0) Then res = Left$(res, l-Len(sep)) ;remove last separator
	Return res
End Function


;-------------------------------------------------
; Read in a whole ascii-stream into a stringlist
;
; hdl - stringlist handle
; stream - stream/file handle.
Function ReadStrings(hdl, stream)
	While Not Eof(stream)
		AddString(hdl, ReadLine(stream))
	Wend
End Function