source: trunk/ab5.0/ablib/src/Classes/System/String.ab @ 531

Last change on this file since 531 was 531, checked in by OverTaker, 15 years ago

String.Split,Joinメソッド実装

File size: 21.3 KB
Line 
1' Classes/System/String.ab
2
3Namespace System
4
5    Class String
6        Implements /*IComparable, ICloneable, IConvertible, IComparable<String>, IEnumerable, IEnumerable<Char>, IEquatable<String>*/
7
8        m_Length As Long
9        Chars As *Char
10
11        Sub validPointerCheck(p As VoidPtr, size = 1 As Long)
12            If p As ULONG_PTR < &h10000 Then
13                Throw New ArgumentException
14            ElseIf IsBadReadPtr(p, size As ULONG_PTR) Then
15                Throw New ArgumentException
16            End If
17        End Sub
18    Public
19        Static Const Empty = New String
20
21        Sub String()
22'           Chars = 0
23'           m_Length = 0
24        End Sub
25
26        Sub String(initStr As PCWSTR)
27            validPointerCheck(initStr)
28            Assign(initStr, lstrlenW(initStr))
29        End Sub
30
31        Sub String(initStr As PCWSTR, length As Long)
32            validPointerCheck(initStr, length)
33            Assign(initStr, length)
34        End Sub
35
36        Sub String(initStr As PCWSTR, start As Long, length As Long)
37            If start < 0 Or length Or start + length < 0 Then
38                Throw New ArgumentOutOfRangeException("String constractor: One or more arguments are out of range value.", "start or length or both")
39            End If
40            validPointerCheck(initStr + start, length)
41            Assign(initStr + start, length)
42        End Sub
43
44        Sub String(initStr As PCSTR)
45            validPointerCheck(initStr)
46            Assign(initStr, lstrlenA(initStr))
47        End Sub
48
49        Sub String(initStr As PCSTR, length As Long)
50            validPointerCheck(initStr, length)
51            Assign(initStr, length)
52        End Sub
53
54        Sub String(initStr As PCSTR, start As Long, length As Long)
55            If start < 0 Or length < 0 Then
56                Throw New ArgumentOutOfRangeException("String constructor: One or more arguments are out of range value.", "start or length or both")
57            End If
58            validPointerCheck(initStr + start, length)
59            Assign(initStr + start, length)
60        End Sub
61
62        Sub String(initStr As String)
63            If Not String.IsNullOrEmpty(initStr) Then
64                Assign(initStr.Chars, initStr.m_Length)
65            End If
66        End Sub
67
68        Sub String(initChar As Char, length As Long)
69            AllocStringBuffer(length)
70            ActiveBasic.Strings.ChrFill(Chars, length, initChar)
71            Chars[length] = 0
72        End Sub
73
74        Sub String(sb As Text.StringBuilder)
75            Chars = StrPtr(sb)
76            m_Length = sb.Length
77            sb.__Stringized()
78        End Sub
79
80        Const Function Length() As Long
81            Return m_Length
82        End Function
83
84        Function Operator() As *Char
85            Return Chars
86        End Function
87
88        Const Function Operator [] (n As Long) As Char
89            rangeCheck(n)
90            Return Chars[n]
91        End Function
92
93        Const Function Operator + (y As PCSTR) As String
94            If y = 0 Then
95                Return This
96            Else
97                Return Concat(y, lstrlenA(y))
98            End If
99        End Function
100
101        Const Function Operator + (y As PCWSTR) As String
102            If y = 0 Then
103                Return This
104            Else
105                Return Concat(y, lstrlenW(y))
106            End If
107        End Function
108
109        Const Function Operator + (y As String) As String
110            If ActiveBasic.IsNothing(y) Then
111                Return This
112            Else
113                Return Concat(y.Chars, y.m_Length)
114            End If
115        End Function
116
117        Const Function Operator & (y As PCSTR) As String
118            Return This + y
119        End Function
120
121        Const Function Operator & (y As PCWSTR) As String
122            Return This + y
123        End Function
124
125        Const Function Operator & (y As String) As String
126            Return This + y
127        End Function
128
129        Const Function Operator == (y As String) As Boolean
130            Return Compare(This, y) = 0
131        End Function
132
133        Const Function Operator == (y As *Char) As Boolean
134            Return Compare(This, y) = 0
135        End Function
136
137        Const Function Operator <> (y As String) As Boolean
138            Return Compare(This, y) <> 0
139        End Function
140
141        Const Function Operator <> (y As *Char) As Boolean
142            Return Compare(This, y) <> 0
143        End Function
144
145        Const Function Operator < (y As String) As Boolean
146            Return Compare(This, y) < 0
147        End Function
148
149        Const Function Operator < (y As *Char) As Boolean
150            Return Compare(This, y) < 0
151        End Function
152
153        Const Function Operator > (y As String) As Boolean
154            Return Compare(This, y) > 0
155        End Function
156
157        Const Function Operator > (y As *Char) As Boolean
158            Return Compare(This, y) > 0
159        End Function
160
161        Const Function Operator <= (y As String) As Boolean
162            Return Compare(This, y) <= 0
163        End Function
164
165        Const Function Operator <= (y As *Char) As Boolean
166            Return Compare(This, y) <= 0
167        End Function
168
169        Const Function Operator >= (y As String) As Boolean
170            Return Compare(This, y) >= 0
171        End Function
172
173        Const Function Operator >= (y As *Char) As Boolean
174            Return Compare(This, y) >= 0
175        End Function
176
177        Static Function Compare(x As String, y As String) As Long
178            Return CompareOrdinal(x, y)
179        End Function
180
181    Public
182        'Compareなどで、x.Charsではなく、StrPtr(x)と書く理由は、xがNothingの場合のため。
183
184        Static Function Compare(x As String, indexX As Long, y As String, indexY As Long, length As Long) As Long
185            Return CompareOrdinal(x, indexX, y, indexY, length)
186        End Function
187
188        Static Function CompareOrdinal(x As String, y As String) As Long
189            Return CompareOrdinal(StrPtr(x), StrPtr(y))
190        End Function
191
192        Static Function CompareOrdinal(x As String, indexX As Long, y As String, indexY As Long, length As Long) As Long
193            Return CompareOrdinal(StrPtr(x), indexX, StrPtr(y), indexY, length)
194        End Function
195    Private
196        Static Function Compare(x As String, y As *Char) As Long
197            Return CompareOrdinal(x, y)
198        End Function
199
200        Static Function CompareOrdinal(x As String, y As *Char) As Long
201            Return CompareOrdinal(StrPtr(x), y)
202        End Function
203
204        Static Function CompareOrdinal(x As *Char, y As *Char) As Long
205            If x = 0 Then
206                If y = 0 Then
207                    Return 0
208                Else
209                    Return -1
210                End If
211            ElseIf y = 0 Then
212                Return 1
213            End If
214            Return ActiveBasic.Strings.StrCmp(x, y)
215        End Function
216
217        Static Function CompareOrdinal(x As *Char, indexX As Long, y As *Char, indexY As Long, length As Long) As Long
218            If x = 0 Then
219                If y = 0 Then
220                    Return 0
221                Else
222                    Return -1
223                End If
224            ElseIf y = 0 Then
225                Return 1
226            End If
227            Return ActiveBasic.Strings.ChrCmp(VarPtr(x[indexX]), VarPtr(y[indexY]), length As SIZE_T)
228        End Function
229    Public
230        Function CompareTo(y As String) As Long
231            Return String.Compare(This, y)
232        End Function
233
234        Function CompareTo(y As Object) As Long
235            If Not Object.Equals(This.GetType(), y.GetType()) Then
236                Throw New ArgumentException("String.CompareTo: The type of the argument y is not String.", "y")
237            End If
238            Return CompareTo(y As String)
239        End Function
240
241        Function Equals(s As String) As Boolean
242            Return This = s
243        End Function
244
245        Override Function Equals(s As Object) As Boolean
246            If Not ActiveBasic.IsNothing(s) Then
247                If Object.Equals(This.GetType(), s.GetType()) Then
248                    Return This.Equals(s As String)
249                End If
250            End If
251            Return False
252        End Function
253
254        Const Function StrPtr() As *Char
255            Return Chars
256        End Function
257Private
258
259        Sub Assign(text As PCSTR, textLengthA As Long)
260#ifdef UNICODE
261            Dim textLengthW = MultiByteToWideChar(CP_THREAD_ACP, 0, text, textLengthA, 0, 0)
262            If AllocStringBuffer(textLengthW) <> 0 Then
263                MultiByteToWideChar(CP_THREAD_ACP, 0, text, textLengthA, Chars, textLengthW)
264                Chars[textLengthW] = 0
265            End If
266#else
267            AssignFromCharPtr(text, textLengthA)
268#endif
269        End Sub
270
271        Sub Assign(text As PCWSTR, textLengthW As Long)
272#ifdef UNICODE
273            AssignFromCharPtr(text, textLengthW)
274#else
275            Dim textLengthA = WideCharToMultiByte(CP_THREAD_ACP, 0, text, textLengthW, 0, 0, 0, 0)
276            If AllocStringBuffer(textLengthA) <> 0 Then
277                WideCharToMultiByte(CP_THREAD_ACP, 0, text, textLengthW, Chars, textLengthA, 0, 0)
278                Chars[textLengthA] = 0
279            End If
280#endif
281        End Sub
282
283    Private
284        Static Function ConcatChar(text1 As *Char, text1Length As Long, text2 As *Char, text2Length As Long) As String
285            ConcatChar = New String()
286            With ConcatChar
287                .AllocStringBuffer(text1Length + text2Length)
288                ActiveBasic.Strings.ChrCopy(.Chars, text1, text1Length As SIZE_T)
289                ActiveBasic.Strings.ChrCopy(VarPtr(.Chars[text1Length]), text2, text2Length As SIZE_T)
290                .Chars[text1Length + text2Length] = 0
291            End With
292        End Function
293    Public
294        Const Function Concat(text As PCSTR, len As Long) As String
295#ifdef UNICODE
296            With Concat
297                Dim lenW = MultiByteToWideChar(CP_THREAD_ACP, 0, text, len, 0, 0)
298                Concat = New String
299                .AllocStringBuffer(m_Length + lenW)
300                ActiveBasic.Strings.ChrCopy(.Chars, This.Chars, m_Length As SIZE_T)
301                MultiByteToWideChar(CP_THREAD_ACP, 0, text, len, VarPtr(.Chars[m_Length]), lenW)
302                .Chars[m_Length + lenW] = 0
303            End With
304#else
305            Return ConcatChar(This.Chars, m_Length, text, len)
306#endif
307        End Function
308
309        Const Function Concat(text As PCWSTR, len As Long) As String
310#ifdef UNICODE
311            Return ConcatChar(This.Chars, m_Length, text, len)
312#else
313            With Concat
314                Concat = New String
315                Dim lenA = WideCharToMultiByte(CP_THREAD_ACP, 0, text, len, 0, 0, 0, 0)
316                .AllocStringBuffer(m_Length + lenA)
317                ActiveBasic.Strings.ChrCopy(.Chars, This.Chars, m_Length As SIZE_T)
318                WideCharToMultiByte(CP_THREAD_ACP, 0, text, len, VarPtr(.Chars[m_Length]), lenA, 0, 0)
319                .Chars[m_Length + lenA] = 0
320            End With
321#endif
322        End Function
323
324        Static Function Concat(x As String, y As String) As String
325            If String.IsNullOrEmpty(x) Then
326                Return y
327            Else
328                Return x.Concat(y.Chars, y.m_Length)
329            End If
330        End Function
331
332        Static Function Concat(x As String, y As String, z As String) As String
333            Dim sb = New Text.StringBuilder(removeNull(x).Length + removeNull(y).Length + removeNull(z).Length)
334            sb.Append(x).Append(y).Append(z)
335            Concat = sb.ToString
336        End Function
337
338        Static Function Concat(x As String, y As String, z As String, w As String) As String
339            Dim sb = New Text.StringBuilder(removeNull(x).Length + removeNull(y).Length + removeNull(z).Length + removeNull(w).Length)
340            sb.Append(x).Append(y).Append(z).Append(w)
341            Concat = sb.ToString
342        End Function
343
344        Static Function Concat(x As Object, y As Object) As String
345            Return Concat(x.ToString, y.ToString)
346        End Function
347
348        Static Function Concat(x As Object, y As Object, z As Object) As String
349            Return Concat(x.ToString, y.ToString, z.ToString)
350        End Function
351
352        Static Function Concat(x As Object, y As Object, z As Object, w As Object) As String
353            Return Concat(x.ToString, y.ToString, z.ToString, w.ToString)
354        End Function
355
356        Const Function Contains(c As Char) As Boolean
357            Return IndexOf(c) >= 0
358        End Function
359
360        Const Function Contains(s As String) As Boolean
361            If Object.ReferenceEquals(s, Nothing) Then
362                Throw New ArgumentNullException("String.Contains: An argument is null value.", "s")
363            ElseIf s = "" Then
364                Return True
365            Else
366                Return IndexOf(s, 0, m_Length) >= 0
367            End If
368        End Function
369
370        Const Function IndexOf(c As Char) As Long
371            Return indexOfCore(c, 0, m_Length)
372        End Function
373
374        Const Function IndexOf(c As Char, start As Long) As Long
375            rangeCheck(start)
376            Return indexOfCore(c, start, m_Length - start)
377        End Function
378
379        Const Function IndexOf(c As Char, start As Long, count As Long) As Long
380            rangeCheck(start, count)
381            Return indexOfCore(c, start, count)
382        End Function
383    Private
384        Const Function indexOfCore(c As Char, start As Long, count As Long) As Long
385            indexOfCore = ActiveBasic.Strings.ChrFind(VarPtr(Chars[start]), count, c) As Long
386            If indexOfCore <> -1 Then
387                indexOfCore += start
388            End If
389        End Function
390    Public
391        Const Function IndexOf(s As String) As Long
392            Return IndexOf(s, 0, m_Length)
393        End Function
394
395        Const Function IndexOf(s As String, startIndex As Long) As Long
396            Return IndexOf(s, startIndex, m_Length - startIndex)
397        End Function
398
399        Const Function IndexOf(s As String, startIndex As Long, count As Long) As Long
400            rangeCheck(startIndex, count)
401            If Object.ReferenceEquals(s, Nothing) Then
402                Throw New ArgumentNullException("String.IndexOf: An argument is out of range value.", "s")
403            End If
404
405            Dim length = s.Length
406            If length = 0 Then Return startIndex
407
408            Dim i As Long, j As Long
409            For i = startIndex To startIndex + count - 1
410                For j = 0 To length - 1
411                    If Chars[i + j] = s[j] Then
412                        If j = length - 1 Then Return i
413                    Else
414                        Exit For
415                    End If
416                Next
417            Next
418            Return -1
419        End Function
420
421        Const Function LastIndexOf(c As Char) As Long
422            Return lastIndexOf(c, m_Length - 1, m_Length)
423        End Function
424
425        Const Function LastIndexOf(c As Char, start As Long) As Long
426            rangeCheck(start)
427            Return lastIndexOf(c, start, start + 1)
428        End Function
429
430        Const Function LastIndexOf(c As Char, start As Long, count As Long) As Long
431            rangeCheck(start)
432            Dim lastFindPos = start - (count - 1)
433            If Not (m_Length > lastFindPos And lastFindPos >= 0) Then
434                Throw New ArgumentOutOfRangeException("String.LastIndexOf: An argument is out of range value.", "count")
435            End If
436            Return lastIndexOf(c, start, count)
437        End Function
438    Private
439        Const Function lastIndexOf(c As Char, start As Long, count As Long) As Long
440            Dim lastFindPos = start - (count - 1)
441            Dim i As Long
442            For i = start To lastFindPos Step -1
443                If Chars[i] = c Then
444                    Return i
445                End If
446            Next
447            Return -1
448        End Function
449
450    Public
451        Const Function LastIndexOf(s As String) As Long
452            Return LastIndexOf(s, m_Length - 1, m_Length)
453        End Function
454
455        Const Function LastIndexOf(s As String, startIndex As Long) As Long
456            Return LastIndexOf(s, startIndex, startIndex + 1)
457        End Function
458
459        Const Function LastIndexOf(s As String, start As Long, count As Long) As Long
460            If Object.ReferenceEquals(s, Nothing) Then
461                Throw New ArgumentNullException("String.LastIndexOf: An argument is out of range value.", "s")
462            End If
463
464            If start < 0 Or start > m_Length - 1 Or _
465                count < 0 Or count > start + 2 Then
466                Throw New ArgumentOutOfRangeException("String.LastIndexOf: One or more arguments are out of range value.", "start or count or both")
467            End If
468            Dim length = s.m_Length
469            If length > m_Length Then Return -1
470            If length = 0 Then Return start
471
472            Dim i As Long, j As Long
473            For i = start To  start - count + 1 Step -1
474                For j = length - 1 To 0 Step -1
475                    If Chars[i + j] = s[j] Then
476                        If j = 0 Then Return i
477                    Else
478                        Exit For
479                    End If
480                Next
481            Next
482            Return -1
483        End Function
484
485        Const Function StartsWith(c As Char) As Boolean
486            Return IndexOf(c) = 0
487        End Function
488
489        Const Function StartsWith(s As String) As Boolean
490            Return IndexOf(s) = 0
491        End Function
492
493        Const Function EndsWith(c As Char) As Boolean
494            Return LastIndexOf(c) = m_Length - 1
495        End Function
496
497        Const Function EndsWith(s As String) As Boolean
498            Return LastIndexOf(s) = m_Length - s.Length
499        End Function
500
501        Const Function Insert(startIndex As Long, text As String) As String
502            Dim sb = New Text.StringBuilder(This)
503            sb.Insert(startIndex, text)
504            Return sb.ToString
505        End Function
506
507        Const Function Substring(startIndex As Long) As String
508            rangeCheck(startIndex)
509            Return Substring(startIndex, m_Length - startIndex)
510        End Function
511
512        Const Function Substring(startIndex As Long, length As Long) As String
513            rangeCheck(startIndex, length)
514            Return New String(Chars, startIndex, length)
515        End Function
516
517        Const Function Remove(startIndex As Long) As String
518            rangeCheck(startIndex)
519            Remove = Substring(0, startIndex)
520        End Function
521
522        Const Function Remove(startIndex As Long, count As Long) As String
523            Dim sb = New Text.StringBuilder(This)
524            sb.Remove(startIndex, count)
525            Remove = sb.ToString
526        End Function
527
528        Static Function IsNullOrEmpty(s As String) As Boolean
529            If Not Object.ReferenceEquals(s, Nothing) Then
530                If s.m_Length > 0 Then
531                    Return False
532                End If
533            End If
534            Return True
535        End Function
536
537        Const Function Replace(oldChar As Char, newChar As Char) As String
538            Dim sb = New Text.StringBuilder(This)
539            sb.Replace(oldChar, newChar)
540            Replace = sb.ToString
541        End Function
542
543        Const Function Replace(oldStr As String, newStr As String) As String
544            Dim sb = New Text.StringBuilder(This)
545            sb.Replace(oldStr, newStr)
546            Return sb.ToString
547        End Function
548
549        Function Split(separator As System.Collections.Generic.List<String>) As System.Collections.Generic.List<String>
550            Return Split(separator, -1, StringSplitOptions.None)
551        End Function
552
553        Function Split(separator As System.Collections.Generic.List<String>, options As StringSplitOptions) As System.Collections.Generic.List<String>
554            Return Split(separator, -1, options)
555        End Function
556
557        Function Split(separator As System.Collections.Generic.List<String>, count As Long, options As StringSplitOptions) As System.Collections.Generic.List<String>
558            Dim split As System.Collections.Generic.List<String>
559            Dim index As Long, t1Index As Long, t2Index As Long
560            Dim s As String, substring As String
561            Dim flag As Boolean
562
563            Do
564                t1Index = Length
565                flag = True
566                Foreach s In separator
567                    t2Index = IndexOf(s, index)
568                    If t2Index > -1 Then
569                        t1Index = Math.Min(t1Index, t2Index)
570                        flag = False
571                    End If
572                Next
573
574                substring = Substring(index, t1Index - index)
575                If Not ( IsNullOrEmpty(substring) and (options = StringSplitOptions.RemoveEmptyEntries) ) Then
576                    split.Add(substring)
577                End If
578
579                If flag Then Return split
580                If split.Count = count Then Return split
581               
582                index = t1Index + 1
583            Loop
584        End Function
585
586        Static Function Join(separator As String, strings As System.Collections.Generic.List<String>) As String
587            Return Join(separator, strings, 0, strings.Count)
588        End Function
589
590        Static Function Join(separator As String, strings As System.Collections.Generic.List<String>, startIndex As Long, count As Long) As String
591            If (startIndex+count > strings.Count) or (startIndex < 0) or (count < 1) Then
592                Throw New ArgumentOutOfRangeException("String.Join: One or more arguments are out of range value.", "startIndex or count")
593            End If
594
595            Dim string As String
596            Dim i As Long
597            For i = startIndex To startIndex + count - 2
598                string += strings[i] + separator
599            Next
600            Return string + strings[i]
601        End Function
602
603        Const Function ToLower() As String
604            Dim sb = New Text.StringBuilder(m_Length)
605            sb.Length = m_Length
606            Dim i As Long
607            For i = 0 To ELM(m_Length)
608                sb[i] = ActiveBasic.CType.ToLower(Chars[i])
609            Next
610            Return sb.ToString
611        End Function
612
613        Const Function ToUpper() As String
614            Dim sb = New Text.StringBuilder(m_Length)
615            sb.Length = m_Length
616            Dim i As Long
617            For i = 0 To ELM(m_Length)
618                sb[i] = ActiveBasic.CType.ToUpper(Chars[i])
619            Next
620            Return sb.ToString
621        End Function
622
623        Override Function ToString() As String
624            ToString = This
625        End Function
626
627        Const Function Clone() As String
628            Clone = This
629        End Function
630/*
631        Function Clone() As Object
632            Clone = This
633        End Function
634*/
635        Static Function Copy(s As String) As String
636            Copy = New String(s.Chars, s.m_Length)
637        End Function
638
639        Sub CopyTo(sourceIndex As Long, destination As *Char, destinationIndex As Long, count As Long)
640            ActiveBasic.Strings.ChrCopy(VarPtr(destination[destinationIndex]), VarPtr(Chars[sourceIndex]), count As SIZE_T)
641        End Sub
642
643        Override Function GetHashCode() As Long
644#ifdef UNICODE
645            Dim size = m_Length
646#else
647            Dim size = (m_Length + 1) >> 1
648#endif
649            Return _System_GetHashFromWordArray(Chars As *Word, size) Xor m_Length
650        End Function
651
652        Function PadLeft(total As Long) As String
653            PadLeft(total, &h30 As Char)
654        End Function
655
656        Function PadLeft(total As Long, c As Char) As String
657            If total < 0 Then
658                Throw New ArgumentOutOfRangeException("String.PadLeft: An arguments is out of range value.", "total")
659            End If
660            If total >= m_Length Then
661                Return This
662            End If
663            Dim sb = New Text.StringBuilder(total)
664            sb.Append(c, total - m_Length)
665            sb.Append(This)
666            Return sb.ToString
667        End Function
668
669        Function PadRight(total As Long) As String
670            PadRight(total, &h30 As Char)
671        End Function
672
673        Function PadRight(total As Long, c As Char) As String
674            If total < 0 Then
675                Throw New ArgumentOutOfRangeException("String.PadRight: An arguments is out of range value.", "total")
676            End If
677            If total >= m_Length Then
678                Return This
679            End If
680            Dim sb = New Text.StringBuilder(total)
681            sb.Append(This)
682            sb.Append(c, total - m_Length)
683            Return sb.ToString
684        End Function
685    Private
686        Function AllocStringBuffer(textLength As Long) As *Char
687            If textLength < 0 Then
688                Return 0
689            End If
690            AllocStringBuffer = GC_malloc_atomic(SizeOf(Char) * (textLength + 1))
691            If AllocStringBuffer = 0 Then
692                'Throw New OutOfMemoryException
693            End If
694            m_Length = textLength
695            Chars = AllocStringBuffer
696        End Function
697
698        Sub AssignFromCharPtr(text As *Char, textLength As Long)
699            AllocStringBuffer(textLength)
700            ActiveBasic.Strings.ChrCopy(Chars, text, textLength As SIZE_T)
701            Chars[m_Length] = 0
702        End Sub
703
704        Const Sub rangeCheck(index As Long)
705            If index < 0 Or index > m_Length Then
706                Throw New ArgumentOutOfRangeException("String: An arguments is out of range value.", "index")
707            End If
708        End Sub
709
710        Const Sub rangeCheck(start As Long, length As Long)
711            If start < 0 Or start > This.m_Length Or length < 0 Then
712                Throw New ArgumentOutOfRangeException("String: One or more arguments are out of range value.", "start or length or both")
713            End If
714        End Sub
715
716        Static Function removeNull(s As String) As String
717            If ActiveBasic.IsNothing(s) Then
718                removeNull = Empty
719            Else
720                removeNull = s
721            End If
722        End Function
723    End Class
724
725    Enum StringSplitOptions
726        None
727        RemoveEmptyEntries
728    End Enum
729
730End Namespace
Note: See TracBrowser for help on using the repository browser.