Skip to content

Commit 1619bdd

Browse files
committed
Update ECPTextStream.cls
1 parent c29ef32 commit 1619bdd

File tree

1 file changed

+57
-48
lines changed

1 file changed

+57
-48
lines changed

src/ECPTextStream.cls

Lines changed: 57 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,14 @@ Private P_TEXT As String '-------------------------Holds the current stream's te
4545
'#
4646
Private Buffer As String
4747
Private BufferDelta As Long
48-
Private BufferEnds As Boolean
4948
Private BufferMark As Long
5049
Private CorrectedPos As Long
5150
Private EndLineMark As EndLineChar
5251
Private FileHandled As Integer
5352
Private InitialPos As Long
5453
Private LCS As Long
5554
Private 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
126125
End 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
127181
Public Sub OpenStream(filePath As String)
128182
Attribute 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

Comments
 (0)