FileText.st
author claus
Thu, 17 Nov 1994 15:21:02 +0100
changeset 48 18b9353c9d07
parent 36 d046fe84ea67
child 55 d1c4bb80d6b3
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     1
"
4
1f66800df351 *** empty log message ***
claus
parents: 2
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
     3
	      All Rights Reserved
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     4
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
1cf8d1747859 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    11
"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    12
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    13
Text subclass:#FileText
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'myStream lastLineKnown lastLineOfFile
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    15
			      cachedLines cacheLineNr'
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    16
       classVariableNames:''
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    17
       poolDictionaries:''
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    18
       category:'Collections-Text'
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    19
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    20
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    21
FileText comment:'
4
1f66800df351 *** empty log message ***
claus
parents: 2
diff changeset
    22
COPYRIGHT (c) 1989 by Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    23
	      All Rights Reserved
36
d046fe84ea67 *** empty log message ***
claus
parents: 31
diff changeset
    24
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    25
$Header: /cvs/stx/stx/libbasic2/FileText.st,v 1.8 1994-11-17 14:21:02 claus Exp $
28
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    26
'!
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    27
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    28
!FileText class methodsFor:'documentation'!
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    29
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    30
copyright
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    31
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    32
 COPYRIGHT (c) 1989 by Claus Gittinger
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    33
	      All Rights Reserved
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    34
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    35
 This software is furnished under a license and may be used
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    36
 only in accordance with the terms of that license and with the
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    37
 inclusion of the above copyright notice.   This software may not
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    38
 be provided or otherwise made available to, or used by, any
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    39
 other person.  No title to or ownership of the software is
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    40
 hereby transferred.
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    41
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    42
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    43
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    44
version
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    45
"
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    46
$Header: /cvs/stx/stx/libbasic2/FileText.st,v 1.8 1994-11-17 14:21:02 claus Exp $
31
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    47
"
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    48
!
e223f3cf2995 *** empty log message ***
claus
parents: 28
diff changeset
    49
28
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    50
documentation
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    51
"
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    52
    FileText represents the contents of a text-file;
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    53
    only the offsets of the text-lines are stored in an internal array
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    54
    to save some space. The at: method fetches the line from the file.
28
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    55
    Individual textlines may be replaced by strings.
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    56
    the underlying file is NOT updated in this case.
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    57
28
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    58
    Care should be taken, if the underlying file is rewritten -
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    59
    you have to manually update/flush the pointers.
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    60
    Never rewrite the file using the data from a FileText.
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    61
    If you keep a files contents in a FileText object and want to
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    62
    rewrite that file, you MUST write to a temporary file first.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    63
    Otherwise, you will clobber the contents.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    64
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
    65
    It is highly recommended, to use fileText for readonly texts only.
28
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    66
"
350f8e9493a4 *** empty log message ***
claus
parents: 4
diff changeset
    67
! !
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    68
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    69
!FileText class methodsFor:'instance creation'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    70
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    71
of:aStream
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    72
    "return a new FileText object for the stream aStream"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    73
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    74
    ^ (self new:1) of:aStream
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    75
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    76
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    77
ofFile:aFileName
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    78
    "return a new FileText object for the named file"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    79
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    80
    |aStream|
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    81
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    82
    aStream := FileStream readonlyFileNamed:aFileName.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    83
    aStream isNil ifTrue:[^ nil].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    84
    ^ (self new:1) of:aStream
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    85
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    86
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    87
!FileText methodsFor:'accessing'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    88
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    89
of:aStream
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    90
    myStream := aStream.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    91
    lastLineOfFile := nil.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    92
    lastLineKnown := 0.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    93
    cachedLines := nil
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    94
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    95
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    96
!FileText methodsFor:'accessing'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    97
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    98
at:index
1cf8d1747859 Initial revision
claus
parents:
diff changeset
    99
    |entry oldPosition|
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   100
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   101
    (index > lastLineKnown) ifTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   102
	self scanUpToLine:index.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   103
	(lastLineOfFile notNil) ifTrue:[
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   104
	    (index > lastLineOfFile) ifTrue:[
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   105
		^ self subscriptBoundsError
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   106
	    ]
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   107
	]
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   108
    ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   109
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   110
    entry := super at:index.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   111
    (entry isMemberOf:String) ifTrue:[^ entry].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   112
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   113
    cachedLines isNil ifTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   114
	cachedLines := Array new:50.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   115
	cacheLineNr := -9999
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   116
    ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   117
    ((index < cacheLineNr)
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   118
     or:[index >= (cacheLineNr + cachedLines size)]) ifTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   119
	oldPosition := myStream position.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   120
	myStream position:entry.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   121
	1 to:(cachedLines size) do:[:cacheIndex|
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   122
	    cachedLines at:cacheIndex put:(myStream nextLine)
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   123
	].
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   124
	myStream position:oldPosition.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   125
	cacheLineNr := index
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   126
    ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   127
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   128
    ^ cachedLines at:(index - cacheLineNr + 1)
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   129
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   130
    
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   131
size
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   132
    "return the number of text-lines - have to scan file the first time"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   133
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   134
    (lastLineOfFile isNil) ifTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   135
	self scanUpToEnd
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   136
    ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   137
    ^ lastLineOfFile
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   138
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   139
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   140
!FileText methodsFor:'enumerating'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   141
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   142
do:aBlock
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   143
    self from:1 to:(self size) do:aBlock
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   144
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   145
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   146
from:index1 to:index2 do:aBlock
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   147
    "must be redefined back since elements are indices into file, not the elements themselfes"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   148
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   149
    |index "{ Class: SmallInteger }"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   150
     stop  "{ Class: SmallInteger }" |
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   151
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   152
    index := index1.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   153
    stop := index2.
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   154
    [index <= stop] whileTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   155
	aBlock value:(self at:index).
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   156
	index := index + 1
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   157
    ]
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   158
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   159
! !
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   160
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   161
!FileText methodsFor:'private'!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   162
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   163
scanUpToEnd
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   164
    "scan myStream up to the end of file"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   165
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   166
    (lastLineOfFile notNil) ifTrue:[^ self].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   167
    [true] whileTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   168
	lastLineKnown := lastLineKnown + 1.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   169
	(super size < lastLineKnown) ifTrue:[
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   170
	    super grow:(super size * 2 + 1)
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   171
	].
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   172
	super at:lastLineKnown put:(myStream position).
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   173
	myStream skipLine isNil ifTrue:[
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   174
	    lastLineOfFile := lastLineKnown.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   175
	    ^ self
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   176
	]
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   177
    ]
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   178
!
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   179
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   180
scanUpToLine:index
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   181
    "scan myStream up to line index and save line-start-positions"
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   182
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   183
    (lastLineOfFile notNil) ifTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   184
	(index > lastLineOfFile) ifTrue:[^ self]
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   185
    ].
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   186
    [lastLineKnown <= index] whileTrue:[
48
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   187
	lastLineKnown := lastLineKnown + 1.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   188
	(super size < lastLineKnown) ifTrue:[
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   189
	    super grow:(super size * 2 + 1)
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   190
	].
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   191
	super at:lastLineKnown put:(myStream position).
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   192
	myStream skipLine isNil ifTrue:[
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   193
	    lastLineOfFile := lastLineKnown.
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   194
	    ^ self
18b9353c9d07 *** empty log message ***
claus
parents: 36
diff changeset
   195
	]
0
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   196
    ]
1cf8d1747859 Initial revision
claus
parents:
diff changeset
   197
! !