Well I stopped trying to make a string split method in C, so i've made the ultimate splitter in bmax instead:
'#Region Variables Global EFlags:Byte[]=New Byte[512] 'Token info - stores flags for 256 tokens :) Const SPLIT_Case=1 'Make it case semsitive Const SPLIT_Leave=2 'Add the text the splitter matches to elements 'between non-splitter elements Const SPLIT_Flags=4 'Flags appended to each element determine, defaults 'are determined by adding the other flags to this one '#end region '#region Info 'For the splitterflags flag, append the following flags to the end of the string seperators, they must 'be the last things in the string (note only two allowed per element): '~~caseon for casesensitivity '~~caseoff for none '~~leaveon to leave the splitters in '~~leaveoff to abandon them 'These will override the defaults for the splitter. 'You dont really need these element flags most of the time, its mostly for stuff im doing specifically '#End Region Function Split:TList(txt$,Splitters:String[],Flags:Byte=0) Local i,j,k Local DefaultCase=Flags & SPLIT_Case 'See above Local DefaultLeave=Flags & SPLIT_Leave '^ Local ElementFlags=Flags & SPLIT_Flags '^ Local CaseOn 'For each splitter Local LeaveOn '^ Local Prev=0 'End of previously found token Local Results:TList=New Tlist 'Dynamic list of results Local Low$ 'If necessary, a var holding lowered version If DefaultCase=0 Or ElementFlags Then Low$=Lower(txt)'Set it For i=0 Until Splitters.Length 'Loop through splitters CaseOn=DefaultCase LeaveOn=DefaultLeave If ElementFlags Then 'Find parameters n1=Splitters[i].findlast("~~") '1st param n2=Splitters[i].findlast("~~",Splitters[i].Length-n1+1) '2nd param Select Splitters[i][n1+1..Splitters[i].Length] 'Check 1st one Case "caseon" CaseOn=1 Case "leaveon" LeaveOn=1 Case "caseoff" CaseOn=0 Case "leaveoff" LeaveOn=0 Default If Not CaseOn Then Splitters[i]=Splitters[i].ToLower() 'Preprocess :) EFlags[i Shl 1]=CaseOn 'Set the databank EFlags[i Shl 1 + 1]=LeaveOn Continue End Select Splitters[i]=Splitters[i][0..n1] Select Splitters[i][n2+1..n1] 'Check 2nd one Case "caseon" CaseOn=1 Case "leaveon" LeaveOn=1 Case "caseoff" CaseOn=0 Case "leaveoff" LeaveOn=0 End Select EndIf If i=256 Then Throw "Less than 257 seperators please" 'Prolly not gonna happen EFlags[i Shl 1]=CaseOn 'Set the databank EFlags[i Shl 1 + 1]=LeaveOn If Not CaseOn Then Splitters[i]=Splitters[i].ToLower() 'Preprocess :) Next For i=0 Until txt.Length 'Loop through the chars For j=0 Until Splitters.Length 'Loop through the splitters CaseOn=EFlags[j Shl 1] 'Get flags LeaveOn=EFlags[j Shl 1 + 1] If CaseOn Then If Splitters[j]<>Txt[i..i+Splitters[j].Length] Then Continue Else If Splitters[j]<>Low[i..i+Splitters[j].Length] Then Continue EndIf 'Continue if not a match If i-prev>0 Then Results.AddLast(Txt[prev..i]) If LeaveOn Then Results.AddLast(Txt[i..i+Splitters[j].Length]) prev=i+Splitters[j].Length Exit Next Next If Txt.Length-prev>0 Then Results.AddLast(Txt[prev..Txt.Length]) EndIf Return Results End Function '#Region Example Local a:TList Print "Start" a=Split("Function Split:TList(txt$,Splitters:String[],Flags:Byte=0)~nLocal i,j,k~nLocal DefaultCase=Flags & SPLIT_Case",[" ~~leaveoff","~n",":", "(", ")", ",", "[", "]","=","+","-","/","*","@@","@","#","$","%","^","&","~~"],SPLIT_Leave|SPLIT_Flags) Print "End" For Local t$=EachIn a Print t Next '#end Region