@@ -45,15 +45,14 @@ Private P_TEXT As String '-------------------------Holds the current stream's te
4545'#
4646Private Buffer As String
4747Private BufferDelta As Long
48- Private BufferEnds As Boolean
4948Private BufferMark As Long
5049Private CorrectedPos As Long
5150Private EndLineMark As EndLineChar
5251Private FileHandled As Integer
5352Private InitialPos As Long
5453Private LCS As Long
5554Private NullChar As String
56- Private NullCharPos As String
55+ Private NullCharPos As Long
5756'////////////////////////////////////////////////////////////////////////////////////////////
5857'#
5958'////////////////////////////////////////////////////////////////////////////////////////////
@@ -124,6 +123,61 @@ Attribute CloseStream.VB_Description = "Closes the current text file stream."
124123 P_ISOPENSTREAM = False
125124 End If
126125End Sub
126+ Private Sub FindEOLcharacter ()
127+ Dim LastCrLfPos As Long
128+ Dim LastCrPos As Long
129+ Dim LastLfPos As Long
130+ Dim tmpResultPos As Long
131+ Dim bufferReverse As String
132+ Dim EOLchr As EndLineChar
133+ Dim missingEOLchar As Boolean
134+ Dim EOStream As Boolean
135+ Dim tmpBuffer As String
136+
137+ Do
138+ bufferReverse = StrReverse(Buffer)
139+ LastCrLfPos = InStrB(1 , bufferReverse, vbCrLf)
140+ LastCrPos = InStrB(1 , bufferReverse, vbCr)
141+ LastLfPos = InStrB(1 , bufferReverse, vbLf)
142+ missingEOLchar = (LastCrLfPos = 0 And LastCrPos = 0 And LastLfPos = 0 )
143+ If missingEOLchar Then
144+ tmpBuffer = Buffer
145+ Get #FileHandled, , Buffer
146+ Buffer = tmpBuffer + Buffer
147+ InitialPos = Seek (FileHandled)
148+ BufferMark = LenB(Buffer)
149+ EOStream = ((P_STREAMLENGTH - InitialPos) <= 0 )
150+ NullCharPos = InStrB(Buffer, NullChar)
151+ If NullCharPos Then
152+ Buffer = MidB$(Buffer, 1 , NullCharPos)
153+ End If
154+ End If
155+ Loop While missingEOLchar And Not EOStream
156+ P_ATENDOFSTREAM = EOStream
157+ If Not EOStream Then
158+ tmpResultPos = LastCrLfPos
159+ EOLchr = CRLF
160+ If tmpResultPos < LastCrPos Then
161+ tmpResultPos = LastCrPos
162+ EOLchr = CR
163+ End If
164+ If tmpResultPos < LastLfPos Then
165+ tmpResultPos = LastLfPos
166+ EOLchr = LF
167+ End If
168+ Select Case EOLchr
169+ Case 0
170+ BufferDelta = (tmpResultPos - 3 ) / 2
171+ Case Else
172+ BufferDelta = (tmpResultPos - 1 ) / 2
173+ End Select
174+ BufferMark = BufferMark - BufferDelta
175+ CorrectedPos = InitialPos - BufferDelta
176+ Else
177+ CorrectedPos = InitialPos
178+ End If
179+ Seek #FileHandled, CorrectedPos
180+ End Sub
127181Public Sub OpenStream (filePath As String )
128182Attribute OpenStream.VB_Description = "Opens a stream over a text file."
129183 FileHandled = FreeFile
@@ -138,57 +192,12 @@ Attribute ReadText.VB_Description = "Reads a number of characters from the strea
138192 Select Case P_BUFFERLENGTH
139193 Case Is < LCS
140194 BufferDelta = 0
141- BufferEnds = False
142195 Get #FileHandled, , Buffer
143196 InitialPos = Seek (FileHandled)
144197 BufferMark = LenB(Buffer)
145198 If P_ENDSTREAMONLINEBREAK Then
146- Dim Last2Chrs As String
147- Dim LastChr As String
148- Last2Chrs = MidB$(Buffer, BufferMark - 3 , 4 )
149- BufferEnds = (Last2Chrs = vbCrLf)
150- Select Case BufferEnds
151- Case False
152- LastChr = MidB$(Last2Chrs, 3 , 2 )
153- BufferEnds = (LastChr = vbCr)
154- Select Case BufferEnds
155- Case False
156- BufferEnds = (LastChr = vbLf)
157- If BufferEnds Then
158- P_LINEBREAK = vbLf
159- End If
160- Case Else
161- P_LINEBREAK = vbCr
162- End Select
163- Case Else
164- P_LINEBREAK = vbCrLf
165- End Select
166- Do While Not BufferEnds
167- BufferMark = BufferMark - 2
168- BufferDelta = BufferDelta + 1
169- Last2Chrs = MidB$(Buffer, BufferMark - 3 , 4 )
170- BufferEnds = (Last2Chrs = vbCrLf)
171- Select Case BufferEnds
172- Case False
173- LastChr = MidB$(Last2Chrs, 3 , 2 )
174- BufferEnds = (LastChr = vbCr)
175- Select Case BufferEnds
176- Case False
177- BufferEnds = (LastChr = vbLf)
178- If BufferEnds Then
179- P_LINEBREAK = vbLf
180- End If
181- Case Else
182- P_LINEBREAK = vbCr
183- End Select
184- Case Else
185- P_LINEBREAK = vbCrLf
186- End Select
187- Loop
188- CorrectedPos = InitialPos - BufferDelta
189- Seek #FileHandled, CorrectedPos
199+ FindEOLcharacter
190200 LCS = P_STREAMLENGTH - CorrectedPos
191- P_ATENDOFSTREAM = False
192201 P_TEXT = MidB$(Buffer, 1 , BufferMark)
193202 Else
194203 P_LINEBREAK = vbNullString
0 commit comments