1 #Region "Microsoft.VisualBasic::b0f9ebce27978db239c045ecba1fc41a, Microsoft.VisualBasic.Core\Language\Language\C\CString.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Module CString
35     
36     '         Function: ChangeCharacter, IsXDigit, StrChr, StrRChr, StrStr
37     '                   StrTok
38     '         Structure __tokensHelper
39     
40     '             Function: StrTok
41     
42     
43     
44     
45     ' /********************************************************************************/
46
47 #End Region
48
49 '----------------------------------------------------------------------------------------
50 ' Copyright © 2006 - 2012 Tangible Software Solutions Inc.
51 ' This class can be used by anyone provided that the copyright notice remains intact.
52 '
53 ' This class provides the ability to simulate various classic C string functions
54 ' which don't have exact equivalents in the .NET Framework.
55 '----------------------------------------------------------------------------------------
56
57 Imports System.Runtime.CompilerServices
58
59 Namespace Language.C
60
61     ''' <summary>
62     ''' This class provides the ability to simulate various classic C string functions
63     ''' which don't have exact equivalents in the .NET Framework.
64     ''' </summary>
65     Public Module CString
66
67         <Extension> Public Function Decode(s As StringAs String
68             If s.StringEmpty Then
69                 Return s
70             Else
71                 s = s.Replace("\U""\u").Replace("\A""\a")
72             End If
73
74             Try
75                 ' Hex Unicode \u0000
76                 Do
77                     Dim i = s.IndexOf("\u")
78
79                     If i = -1 Then
80                         Exit Do
81                     End If
82
83                     Dim u = s.Substring(i, 6)
84                     Dim n = Convert.ToInt16(u.Replace("\u"""), 16)
85
86                     s = s.Replace(u, ChrW(n))
87                 Loop
88
89                 Decimal ASCII \a000
90                 Do
91                     Dim i = s.IndexOf("\a")
92
93                     If i = -1 Then
94                         Exit Do
95                     End If
96
97                     Dim a = s.Substring(i, 5)
98                     Dim n = CByte(a.Replace("\a"""))
99
100                     s = s.Replace(a, Chr(n))
101                 Loop
102
103             Catch ex As Exception
104                 Throw New Exception("bad format")
105             End Try
106
107             Return s
108         End Function
109
110         ''' <summary>
111         ''' This method allows replacing a single character in a string, to help convert
112         ''' C++ code where a single character in a character array is replaced.
113         ''' </summary>
114         ''' <param name="sourcestring"></param>
115         ''' <param name="charindex"></param>
116         ''' <param name="changechar"></param>
117         ''' <returns></returns>
118         ''' 
119         <Extension>
120         Public Function ChangeCharacter(sourcestring As String, charindex As Integer, changechar As CharAs String
121             Return (If(charindex > 0, sourcestring.Substring(0, charindex), "")) & changechar.ToString() & (If(charindex < sourcestring.Length - 1, sourcestring.Substring(charindex + 1), ""))
122         End Function
123
124         ''' <summary>
125         ''' This method simulates the classic C string function 'isxdigit' (and 'iswxdigit').
126         ''' </summary>
127         ''' <param name="character"></param>
128         ''' <returns></returns>
129         ''' 
130         <Extension>
131         Public Function IsXDigit(character As CharAs Boolean
132             If Char.IsDigit(character) Then
133                 Return True
134             ElseIf "ABCDEFabcdef".IndexOf(character) > -1 Then
135                 Return True
136             Else
137                 Return False
138             End If
139         End Function
140
141         ''' <summary>
142         ''' This method simulates the classic C string function 'strchr' (and 'wcschr').
143         ''' </summary>
144         ''' <param name="stringtosearch"></param>
145         ''' <param name="chartofind"></param>
146         ''' <returns></returns>
147         ''' 
148         <Extension>
149         Public Function StrChr(stringtosearch As String, chartofind As CharAs String
150             Dim index As Integer = stringtosearch.IndexOf(chartofind)
151             If index > -1 Then
152                 Return stringtosearch.Substring(index)
153             Else
154                 Return Nothing
155             End If
156         End Function
157
158         ''' <summary>
159         ''' This method simulates the classic C string function 'strrchr' (and 'wcsrchr').
160         ''' </summary>
161         ''' <param name="stringtosearch"></param>
162         ''' <param name="chartofind"></param>
163         ''' <returns></returns>
164         ''' 
165         <Extension>
166         Public Function StrRChr(stringtosearch As String, chartofind As CharAs String
167             Dim index As Integer = stringtosearch.LastIndexOf(chartofind)
168             If index > -1 Then
169                 Return stringtosearch.Substring(index)
170             Else
171                 Return Nothing
172             End If
173         End Function
174
175         ''' <summary>
176         ''' This method simulates the classic C string function 'strstr' (and 'wcsstr').
177         ''' </summary>
178         ''' <param name="stringtosearch"></param>
179         ''' <param name="stringtofind"></param>
180         ''' <returns></returns>
181         ''' 
182         <Extension>
183         Public Function StrStr(stringtosearch As String, stringtofind As StringAs String
184             Dim index As Integer = stringtosearch.IndexOf(stringtofind)
185             If index > -1 Then
186                 Return stringtosearch.Substring(index)
187             Else
188                 Return Nothing
189             End If
190         End Function
191
192         Private Structure __tokensHelper
193             Private activestring As String
194             Private activeposition As Integer
195
196             ''' <summary>
197             ''' This method simulates the classic C string function 'strtok' (and 'wcstok').
198             ''' Note that the .NET string 'Split' method cannot be used to simulate 'strtok' since
199             ''' it doesn't allow changing the delimiters between each token retrieval.
200             ''' </summary>
201             ''' <param name="stringtotokenize"></param>
202             ''' <param name="delimiters"></param>
203             ''' <returns></returns>
204             Public Function StrTok(stringtotokenize As String, delimiters As StringAs String
205                 If stringtotokenize IsNot Nothing Then
206                     activestring = stringtotokenize
207                     activeposition = -1
208                 End If
209
210                 'the stringtotokenize was never set:
211                 If activestring Is Nothing Then
212                     Return Nothing
213                 End If
214
215                 'all tokens have already been extracted:
216                 If activeposition = activestring.Length Then
217                     Return Nothing
218                 End If
219
220                 'bypass delimiters:
221                 activeposition += 1
222                 While activeposition < activestring.Length AndAlso delimiters.IndexOf(activestring(activeposition)) > -1
223                     activeposition += 1
224                 End While
225
226                 'only delimiters were left, so return null:
227                 If activeposition = activestring.Length Then
228                     Return Nothing
229                 End If
230
231                 'get starting position of string to return:
232                 Dim startingposition As Integer = activeposition
233
234                 'read until next delimiter:
235                 Do
236                     activeposition += 1
237                 Loop While activeposition < activestring.Length AndAlso delimiters.IndexOf(activestring(activeposition)) = -1
238
239                 Return activestring.Substring(startingposition, activeposition - startingposition)
240             End Function
241         End Structure
242
243         ''' <summary>
244         ''' This method simulates the classic C string function 'strtok' (and 'wcstok').
245         ''' Note that the .NET string 'Split' method cannot be used to simulate 'strtok' since
246         ''' it doesn't allow changing the delimiters between each token retrieval.
247         ''' </summary>
248         ''' <param name="stringtotokenize"></param>
249         ''' <param name="delimiters"></param>
250         ''' <returns></returns>
251         <Extension>
252         Public Function StrTok(stringtotokenize As String, delimiters As StringAs String
253             Return New __tokensHelper().StrTok(stringtotokenize, delimiters)
254         End Function
255     End Module
256 End Namespace