<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2013/12/30 Chris Muller <span dir="ltr">&lt;<a href="mailto:asqueaker@gmail.com" target="_blank">asqueaker@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
One thing we&#39;ve been saying is that a small-kernel of a Smalltalk<br>
system should be able to expand itself.  So, I&#39;m just wondering<br>
whether file-in should not be part of Kernel or whether System is<br>
destined to be part of that small-kernel Smalltalk system..?<br>
<div class="HOEnZb"><div class="h5"><br></div></div></blockquote><div>But fileIn requires a Compiler, and a Compiler does not have to be in a small kernel right?<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">
<br>
On Sat, Dec 28, 2013 at 4:22 PM,  &lt;<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>&gt; wrote:<br>
&gt; Frank Shearar uploaded a new version of Collections to project The Trunk:<br>
&gt; <a href="http://source.squeak.org/trunk/Collections-fbs.553.mcz" target="_blank">http://source.squeak.org/trunk/Collections-fbs.553.mcz</a><br>
&gt;<br>
&gt; ==================== Summary ====================<br>
&gt;<br>
&gt; Name: Collections-fbs.553<br>
&gt; Author: fbs<br>
&gt; Time: 28 December 2013, 10:22:03.872 pm<br>
&gt; UUID: 30896006-fd4c-fc47-803c-572d1c1779ad<br>
&gt; Ancestors: Collections-nice.552<br>
&gt;<br>
&gt; Move all of Collections&#39; file in/out logic to System, where the other file in/out logic lives (in System-Object Storage and friends).<br>
&gt;<br>
&gt; =============== Diff against Collections-nice.552 ===============<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: Array&gt;&gt;objectForDataStream: (in category &#39;file in/out&#39;) -----<br>
&gt; - objectForDataStream: refStrm<br>
&gt; -       | dp |<br>
&gt; -       &quot;I am about to be written on an object file.  If I am one of two shared global arrays, write a proxy instead.&quot;<br>
&gt; -<br>
&gt; - self == (TextConstants at: #DefaultTabsArray) ifTrue: [<br>
&gt; -       dp := DiskProxy global: #TextConstants selector: #at: args: #(DefaultTabsArray).<br>
&gt; -       refStrm replace: self with: dp.<br>
&gt; -       ^ dp].<br>
&gt; - self == (TextConstants at: #DefaultMarginTabsArray) ifTrue: [<br>
&gt; -       dp := DiskProxy global: #TextConstants selector: #at: args: #(DefaultMarginTabsArray).<br>
&gt; -       refStrm replace: self with: dp.<br>
&gt; -       ^ dp].<br>
&gt; - ^ super objectForDataStream: refStrm!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: Association&gt;&gt;objectForDataStream: (in category &#39;objects from disk&#39;) -----<br>
&gt; - objectForDataStream: refStrm<br>
&gt; -       | dp |<br>
&gt; -       &quot;I am about to be written on an object file.  If I am a known global, write a proxy that will hook up with the same resource in the destination system.&quot;<br>
&gt; -<br>
&gt; -       ^ (Smalltalk globals associationAt: key ifAbsent: [nil]) == self<br>
&gt; -               ifTrue: [dp := DiskProxy global: #Smalltalk selector: #associationOrUndeclaredAt:<br>
&gt; -                                                       args: (Array with: key).<br>
&gt; -                       refStrm replace: self with: dp.<br>
&gt; -                       dp]<br>
&gt; -               ifFalse: [self]!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;backChunk (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - backChunk<br>
&gt; -       &quot;Answer the contents of the receiver back to the previous terminator character.  Doubled terminators indicate an embedded terminator character.&quot;<br>
&gt; -<br>
&gt; -       | output character |<br>
&gt; -       output := WriteStream on: (String new: 1000).<br>
&gt; -       self back. &quot;oldBack compatibility&quot;<br>
&gt; -       [ (character := self back) == nil ] whileFalse: [<br>
&gt; -               character == $!! ifTrue: [<br>
&gt; -                       self back == $!! ifFalse: [<br>
&gt; -                               self skip: 2. &quot;oldBack compatibility&quot;<br>
&gt; -                               ^output contents reversed ] ].<br>
&gt; -               output nextPut: character].<br>
&gt; -       self skip: 1. &quot;oldBack compatibility&quot;<br>
&gt; -       ^output contents reversed!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;basicNextChunk (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - basicNextChunk<br>
&gt; -       &quot;Answer the contents of the receiver, up to the next terminator character. Doubled terminators indicate an embedded terminator character.&quot;<br>
&gt; -       | terminator out ch |<br>
&gt; -       terminator := $!!.<br>
&gt; -       out := WriteStream on: (String new: 1000).<br>
&gt; -       self skipSeparators.<br>
&gt; -       [(ch := self next) == nil] whileFalse: [<br>
&gt; -               (ch == terminator) ifTrue: [<br>
&gt; -                       self peek == terminator ifTrue: [<br>
&gt; -                               self next.  &quot;skip doubled terminator&quot;<br>
&gt; -                       ] ifFalse: [<br>
&gt; -                               ^ out contents  &quot;terminator is not doubled; we&#39;re done!!&quot;<br>
&gt; -                       ].<br>
&gt; -               ].<br>
&gt; -               out nextPut: ch.<br>
&gt; -       ].<br>
&gt; -       ^ out contents!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;checkForPreamble: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - checkForPreamble: chunk<br>
&gt; -       ((chunk beginsWith: &#39;&quot;Change Set:&#39;) and: [ChangeSet current preambleString == nil])<br>
&gt; -               ifTrue: [ChangeSet current preambleString: chunk].<br>
&gt; -       ((chunk beginsWith: &#39;&quot;Postscript:&#39;) and: [ChangeSet current postscriptString == nil])<br>
&gt; -               ifTrue: [ChangeSet current postscriptString: chunk].<br>
&gt; -<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;command: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - command: aString<br>
&gt; -       &quot;Overridden by HtmlFileStream to append commands directly without translation.  4/5/96 tk&quot;<br>
&gt; -       &quot;We ignore any HTML commands.  Do nothing&quot;!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;copyMethodChunkFrom: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - copyMethodChunkFrom: aStream<br>
&gt; -       &quot;Copy the next chunk from aStream (must be different from the receiver).&quot;<br>
&gt; -       | chunk |<br>
&gt; -       chunk := aStream nextChunkText.<br>
&gt; -       chunk runs values size = 1 &quot;Optimize for unembellished text&quot;<br>
&gt; -               ifTrue: [self nextChunkPut: chunk asString]<br>
&gt; -               ifFalse: [self nextChunkPutWithStyle: chunk]!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;copyMethodChunkFrom:at: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - copyMethodChunkFrom: aStream at: pos<br>
&gt; -       &quot;Copy the next chunk from aStream (must be different from the receiver).&quot;<br>
&gt; -       | chunk |<br>
&gt; -       aStream position: pos.<br>
&gt; -       chunk := aStream nextChunkText.<br>
&gt; -       chunk runs values size = 1 &quot;Optimize for unembellished text&quot;<br>
&gt; -               ifTrue: [self nextChunkPut: chunk asString]<br>
&gt; -               ifFalse: [self nextChunkPutWithStyle: chunk]!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;copyPreamble:from:at: (in category &#39;filein/out&#39;) -----<br>
&gt; - copyPreamble: preamble from: aStream at: pos<br>
&gt; -       &quot;Look for a changeStamp for this method by peeking backward.<br>
&gt; -       Write a method preamble, with that stamp if found.&quot;<br>
&gt; -       | terminator last50 stamp i |<br>
&gt; -       terminator := $!!.<br>
&gt; -<br>
&gt; -       &quot;Look back to find stamp in old preamble, such as...<br>
&gt; -       Polygon methodsFor: &#39;private&#39; stamp: &#39;di 6/25/97 21:42&#39; prior: 34957598!! &quot;<br>
&gt; -       aStream position: pos.<br>
&gt; -       aStream backChunk.      &quot;to beginning of method&quot;<br>
&gt; -       last50 := aStream backChunk.    &quot;to get preamble&quot;<br>
&gt; -       aStream position: pos.<br>
&gt; -       stamp := String new.<br>
&gt; -       (i := last50<br>
&gt; -               findLastOccurrenceOfString: &#39;stamp:&#39;<br>
&gt; -               startingAt: 1) &gt; 0 ifTrue:<br>
&gt; -               [ stamp := (last50<br>
&gt; -                       copyFrom: i + 8<br>
&gt; -                       to: last50 size) copyUpTo: $&#39; ].<br>
&gt; -<br>
&gt; -       &quot;Write the new preamble, with old stamp if any.&quot;<br>
&gt; -       self<br>
&gt; -               cr;<br>
&gt; -               nextPut: terminator.<br>
&gt; -       self nextChunkPut: (String streamContents:<br>
&gt; -                       [ :strm |<br>
&gt; -                       strm nextPutAll: preamble.<br>
&gt; -                       stamp size &gt; 0 ifTrue:<br>
&gt; -                               [ strm<br>
&gt; -                                       nextPutAll: &#39; stamp: &#39;;<br>
&gt; -                                       print: stamp ] ]).<br>
&gt; -       self cr!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;decodeString:andRuns: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - decodeString: string andRuns: runsRaw<br>
&gt; -<br>
&gt; -       | strm runLength runValues newString index |<br>
&gt; -       strm := runsRaw readStream.<br>
&gt; -       (strm peekFor: $( ) ifFalse: [^ nil].<br>
&gt; -       runLength := OrderedCollection new.<br>
&gt; -       [strm skipSeparators.<br>
&gt; -        strm peekFor: $)] whileFalse:<br>
&gt; -               [runLength add: (Number readFrom: strm)].<br>
&gt; -<br>
&gt; -       runValues := OrderedCollection new.<br>
&gt; -       [strm atEnd not] whileTrue:<br>
&gt; -               [runValues add: (Number readFrom: strm).<br>
&gt; -               strm next.].<br>
&gt; -<br>
&gt; -       newString := WideString new: string size.<br>
&gt; -       index := 1.<br>
&gt; -       runLength with: runValues do: [:length :leadingChar |<br>
&gt; -               index to: index + length - 1 do: [:pos |<br>
&gt; -                       newString at: pos put: (Character leadingChar: leadingChar code: (string at: pos) charCode).<br>
&gt; -               ].<br>
&gt; -               index := index + length.<br>
&gt; -       ].<br>
&gt; -<br>
&gt; -       ^ newString.<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;decodeStyle:version: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - decodeStyle: runsObjData version: styleVersion<br>
&gt; -       &quot;Decode the runs array from the ReferenceStream it is stored in.&quot;<br>
&gt; -       &quot;Verify that the class mentioned have the same inst vars as we have now&quot;<br>
&gt; -<br>
&gt; -       | structureInfo |<br>
&gt; -       styleVersion = RemoteString currentTextAttVersion ifTrue: [<br>
&gt; -               &quot;Matches our classes, no need for checking&quot;<br>
&gt; -               ^ (ReferenceStream on: runsObjData) next].<br>
&gt; -       structureInfo := RemoteString structureAt: styleVersion.        &quot;or nil&quot;<br>
&gt; -               &quot;See SmartRefStream instVarInfo: for dfn&quot;<br>
&gt; -       ^ SmartRefStream read: runsObjData withClasses: structureInfo!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;fileIn (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileIn<br>
&gt; -       &quot;This is special for reading expressions from text that has been formatted<br>
&gt; -       with exclamation delimitors. The expressions are read and passed to the<br>
&gt; -       Compiler. Answer the result of compilation.&quot;<br>
&gt; -<br>
&gt; -       ^ self fileInAnnouncing: &#39;Reading &#39; , self name!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;fileInAnnouncing: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileInAnnouncing: announcement<br>
&gt; -       &quot;This is special for reading expressions from text that has been formatted<br>
&gt; -       with exclamation delimitors. The expressions are read and passed to the<br>
&gt; -       Compiler. Answer the result of compilation.  Put up a progress report with<br>
&gt; -      the given announcement as the title.&quot;<br>
&gt; -<br>
&gt; -       | val |<br>
&gt; -       announcement<br>
&gt; -               displayProgressFrom: 0<br>
&gt; -               to: self size<br>
&gt; -               during:<br>
&gt; -                       [:bar |<br>
&gt; -                       [self atEnd] whileFalse:<br>
&gt; -                                       [bar value: self position.<br>
&gt; -                                       self skipSeparators.<br>
&gt; -<br>
&gt; -                                       [ | chunk |<br>
&gt; -                                       val := (self peekFor: $!!)<br>
&gt; -                                                               ifTrue: [(Compiler evaluate: self nextChunk logged: false) scanFrom: self]<br>
&gt; -                                                               ifFalse:<br>
&gt; -                                                                       [chunk := self nextChunk.<br>
&gt; -                                                                       self checkForPreamble: chunk.<br>
&gt; -                                                                       Compiler evaluate: chunk logged: true]]<br>
&gt; -                                                       on: InMidstOfFileinNotification<br>
&gt; -                                                       do: [:ex | ex resume: true].<br>
&gt; -                                       self skipStyleChunk].<br>
&gt; -                       self close].<br>
&gt; -       &quot;Note:  The main purpose of this banner is to flush the changes file.&quot;<br>
&gt; -       Smalltalk logChange: &#39;----End fileIn of &#39; , self name , &#39;----&#39;.<br>
&gt; -       self flag: #ThisMethodShouldNotBeThere. &quot;sd&quot;<br>
&gt; -       ^val!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;fileInFor:announcing: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileInFor: client announcing: announcement<br>
&gt; -       &quot;This is special for reading expressions from text that has been formatted<br>
&gt; -       with exclamation delimitors. The expressions are read and passed to the<br>
&gt; -       Compiler. Answer the result of compilation.  Put up a progress report with<br>
&gt; -      the given announcement as the title.<br>
&gt; -       Does NOT handle preambles or postscripts specially.&quot;<br>
&gt; -       | val |<br>
&gt; -       announcement<br>
&gt; -               displayProgressFrom: 0<br>
&gt; -               to: self size<br>
&gt; -               during:<br>
&gt; -               [:bar |<br>
&gt; -               [self atEnd]<br>
&gt; -                       whileFalse:<br>
&gt; -                               [bar value: self position.<br>
&gt; -                               self skipSeparators.<br>
&gt; -                               [ | chunk |<br>
&gt; -                               val := (self peekFor: $!!) ifTrue: [<br>
&gt; -                                               (Compiler evaluate: self nextChunk for: client logged: false) scanFrom: self<br>
&gt; -                                       ] ifFalse: [<br>
&gt; -                                               chunk := self nextChunk.<br>
&gt; -                                               self checkForPreamble: chunk.<br>
&gt; -                                               Compiler evaluate: chunk for: client logged: true ].<br>
&gt; -                               ] on: InMidstOfFileinNotification<br>
&gt; -                                 do: [ :ex | ex resume: true].<br>
&gt; -                               self atEnd ifFalse: [ self skipStyleChunk ]].<br>
&gt; -               self close].<br>
&gt; -       &quot;Note:  The main purpose of this banner is to flush the changes file.&quot;<br>
&gt; -       Smalltalk logChange: &#39;----End fileIn of &#39; , self name , &#39;----&#39;.<br>
&gt; -       ^ val!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;fileInSilentlyAnnouncing: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileInSilentlyAnnouncing: announcement<br>
&gt; -       &quot;This is special for reading expressions from text that has been formatted<br>
&gt; -       with exclamation delimitors. The expressions are read and passed to the<br>
&gt; -       Compiler. Answer the result of compilation.  Put up a progress report with<br>
&gt; -      the given announcement as the title.&quot;<br>
&gt; -<br>
&gt; -       | val chunk |<br>
&gt; -       [self atEnd] whileFalse:<br>
&gt; -                       [self skipSeparators.<br>
&gt; -<br>
&gt; -                       [val := (self peekFor: $!!)<br>
&gt; -                                               ifTrue: [(Compiler evaluate: self nextChunk logged: false) scanFrom: self]<br>
&gt; -                                               ifFalse:<br>
&gt; -                                                       [chunk := self nextChunk.<br>
&gt; -                                                       self checkForPreamble: chunk.<br>
&gt; -                                                       Compiler evaluate: chunk logged: true]]<br>
&gt; -                                       on: InMidstOfFileinNotification<br>
&gt; -                                       do: [:ex | ex resume: true].<br>
&gt; -                       self skipStyleChunk].<br>
&gt; -       self close.<br>
&gt; -       &quot;Note:  The main purpose of this banner is to flush the changes file.&quot;<br>
&gt; -       Smalltalk  logChange: &#39;----End fileIn of &#39; , self name , &#39;----&#39;.<br>
&gt; -       self flag: #ThisMethodShouldNotBeThere. &quot;sd&quot;<br>
&gt; -       SystemNavigation new allBehaviorsDo:<br>
&gt; -                       [:cl |<br>
&gt; -                       cl<br>
&gt; -                               removeSelectorSimply: #DoIt;<br>
&gt; -                               removeSelectorSimply: #DoItIn:].<br>
&gt; -       ^val!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;header (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - header<br>
&gt; -       &quot;If the stream requires a standard header, override this message.  See HtmlFileStream&quot;!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;nextChunk (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - nextChunk<br>
&gt; -       &quot;Answer the contents of the receiver, up to the next terminator character. Doubled terminators indicate an embedded terminator character.&quot;<br>
&gt; -       | terminator out ch |<br>
&gt; -       terminator := $!!.<br>
&gt; -       out := WriteStream on: (String new: 1000).<br>
&gt; -       self skipSeparators.<br>
&gt; -       [(ch := self next) == nil] whileFalse: [<br>
&gt; -               (ch == terminator) ifTrue: [<br>
&gt; -                       self peek == terminator ifTrue: [<br>
&gt; -                               self next.  &quot;skip doubled terminator&quot;<br>
&gt; -                       ] ifFalse: [<br>
&gt; -                               ^ self parseLangTagFor: out contents  &quot;terminator is not doubled; we&#39;re done!!&quot;<br>
&gt; -                       ].<br>
&gt; -               ].<br>
&gt; -               out nextPut: ch.<br>
&gt; -       ].<br>
&gt; -       ^ self parseLangTagFor: out contents.<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;nextChunkText (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - nextChunkText<br>
&gt; -       &quot;Deliver the next chunk as a Text.  Decode the following ]style[ chunk if present.  Position at start of next real chunk.&quot;<br>
&gt; -       | string runs peek pos |<br>
&gt; -       &quot;Read the plain text&quot;<br>
&gt; -       string := self nextChunk.<br>
&gt; -<br>
&gt; -       &quot;Test for ]style[ tag&quot;<br>
&gt; -       pos := self position.<br>
&gt; -       peek := self skipSeparatorsAndPeekNext.<br>
&gt; -       peek = $] ifFalse: [self position: pos. ^ string asText].  &quot;no tag&quot;<br>
&gt; -       (self upTo: $[) = &#39;]style&#39; ifFalse: [self position: pos. ^ string asText].  &quot;different tag&quot;<br>
&gt; -<br>
&gt; -       &quot;Read and decode the style chunk&quot;<br>
&gt; -       runs := RunArray scanFrom: self basicNextChunk readStream.<br>
&gt; -<br>
&gt; -       ^ Text basicNew setString: string setRunsChecking: runs.<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;parseLangTagFor: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - parseLangTagFor: aString<br>
&gt; -<br>
&gt; -       | string peek runsRaw pos |<br>
&gt; -       string := aString.<br>
&gt; -       &quot;Test for ]lang[ tag&quot;<br>
&gt; -       pos := self position.<br>
&gt; -       peek := self skipSeparatorsAndPeekNext.<br>
&gt; -       peek = $] ifFalse: [self position: pos. ^ string].  &quot;no tag&quot;<br>
&gt; -       (self upTo: $[) = &#39;]lang&#39; ifTrue: [<br>
&gt; -               runsRaw := self basicNextChunk.<br>
&gt; -               string := self decodeString: aString andRuns: runsRaw<br>
&gt; -       ] ifFalse: [<br>
&gt; -               self position: pos<br>
&gt; -       ].<br>
&gt; -       ^ string.<br>
&gt; - !<br>
&gt;<br>
&gt; Item was changed:<br>
&gt; + ----- Method: PositionableStream&gt;&gt;skipSeparators (in category &#39;positioning&#39;) -----<br>
&gt; - ----- Method: PositionableStream&gt;&gt;skipSeparators (in category &#39;fileIn/Out&#39;) -----<br>
&gt;   skipSeparators<br>
&gt;         [self atEnd]<br>
&gt;                 whileFalse:<br>
&gt;                 [self next isSeparator ifFalse: [^ self position: self position-1]]!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;skipSeparatorsAndPeekNext (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - skipSeparatorsAndPeekNext<br>
&gt; -       &quot;A special function to make nextChunk fast&quot;<br>
&gt; -       | peek |<br>
&gt; -       [self atEnd]<br>
&gt; -               whileFalse:<br>
&gt; -               [(peek := self next) isSeparator<br>
&gt; -                       ifFalse: [self position: self position-1. ^ peek]]!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;skipStyleChunk (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - skipStyleChunk<br>
&gt; -       &quot;Get to the start of the next chunk that is not a style for the previous chunk&quot;<br>
&gt; -<br>
&gt; -       | pos |<br>
&gt; -       pos := self position.<br>
&gt; -       self skipSeparators.<br>
&gt; -       self peek == $]<br>
&gt; -               ifTrue: [(self upTo: $[) = &#39;]text&#39;      &quot;old -- no longer needed&quot;<br>
&gt; -                               &quot;now positioned past the open bracket&quot;<br>
&gt; -                       ifFalse: [self nextChunk]]      &quot;absorb ]style[ and its whole chunk&quot;<br>
&gt; -<br>
&gt; -               ifFalse: [self position: pos]   &quot;leave untouched&quot;<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;trailer (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - trailer<br>
&gt; -       &quot;If the stream requires a standard trailer, override this message.  See HtmlFileStream&quot;!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;unCommand (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - unCommand<br>
&gt; -       &quot;If this read stream is at a &lt;, then skip up to just after the next &gt;.  For removing html commands.&quot;<br>
&gt; -       | char |<br>
&gt; -       [self peek = $&lt;] whileTrue: [&quot;begin a block&quot;<br>
&gt; -               [self atEnd == false and: [self next ~= $&gt;]] whileTrue.<br>
&gt; -               &quot;absorb characters&quot;<br>
&gt; -               ].<br>
&gt; -  !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: PositionableStream&gt;&gt;verbatim: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - verbatim: aString<br>
&gt; -       &quot;Do not attempt to translate the characters.  Use to override nextPutAll:&quot;<br>
&gt; -       ^ self nextPutAll: aString!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: ReadWriteStream&gt;&gt;fileInObjectAndCode (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileInObjectAndCode<br>
&gt; -       &quot;This file may contain:<br>
&gt; - 1) a fileIn of code<br>
&gt; - 2) just an object in SmartReferenceStream format<br>
&gt; - 3) both code and an object.<br>
&gt; -       File it in and return the object.  Note that self must be a FileStream or RWBinaryOrTextStream.  Maybe ReadWriteStream incorporate RWBinaryOrTextStream?&quot;<br>
&gt; -       | refStream object |<br>
&gt; -       self text.<br>
&gt; -       self peek asciiValue = 4<br>
&gt; -               ifTrue: [  &quot;pure object file&quot;<br>
&gt; -                       refStream := SmartRefStream on: self.<br>
&gt; -                       object := refStream nextAndClose]<br>
&gt; -               ifFalse: [  &quot;objects mixed with a fileIn&quot;<br>
&gt; -                       self fileIn.  &quot;reads code and objects, then closes the file&quot;<br>
&gt; -                       object := SmartRefStream scannedObject].        &quot;set by side effect of one of the chunks&quot;<br>
&gt; -       SmartRefStream scannedObject: nil.  &quot;clear scannedObject&quot;<br>
&gt; -       ^ object!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: ReadWriteStream&gt;&gt;fileNameEndsWith: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileNameEndsWith: aString<br>
&gt; -       &quot;See comment in FileStream fileNameEndsWith:&quot;<br>
&gt; -<br>
&gt; -       ^false!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: ReadWriteStream&gt;&gt;fileOutChangeSet:andObject: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileOutChangeSet: aChangeSetOrNil andObject: theObject<br>
&gt; -       &quot;Write a file that has both the source code for the named class and an object as bits.  Any instance-specific object will get its class written automatically.&quot;<br>
&gt; -<br>
&gt; -       &quot;An experimental version to fileout a changeSet first so that a project can contain its own classes&quot;<br>
&gt; -<br>
&gt; -<br>
&gt; -       self setFileTypeToObject.<br>
&gt; -               &quot;Type and Creator not to be text, so can attach correctly to an email msg&quot;<br>
&gt; -       self header; timeStamp.<br>
&gt; -<br>
&gt; -       aChangeSetOrNil ifNotNil: [<br>
&gt; -               aChangeSetOrNil fileOutPreambleOn: self.<br>
&gt; -               aChangeSetOrNil fileOutOn: self.<br>
&gt; -               aChangeSetOrNil fileOutPostscriptOn: self.<br>
&gt; -       ].<br>
&gt; -       self trailer.   &quot;Does nothing for normal files.  HTML streams will have trouble with object data&quot;<br>
&gt; -<br>
&gt; -       &quot;Append the object&#39;s raw data&quot;<br>
&gt; -       (SmartRefStream on: self)<br>
&gt; -               nextPut: theObject;  &quot;and all subobjects&quot;<br>
&gt; -               close.          &quot;also closes me&quot;<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: ReadWriteStream&gt;&gt;fileOutChanges (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileOutChanges<br>
&gt; -       &quot;Append to the receiver a description of all class changes.&quot;<br>
&gt; -       Cursor write showWhile:<br>
&gt; -               [self header; timeStamp.<br>
&gt; -               ChangeSet current fileOutOn: self.<br>
&gt; -               self trailer; close]!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: ReadWriteStream&gt;&gt;fileOutClass:andObject: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileOutClass: extraClass andObject: theObject<br>
&gt; -       &quot;Write a file that has both the source code for the named class and an object as bits.  Any instance-specific object will get its class written automatically.&quot;<br>
&gt; -<br>
&gt; -       | class srefStream |<br>
&gt; -       self setFileTypeToObject.<br>
&gt; -               &quot;Type and Creator not to be text, so can attach correctly to an email msg&quot;<br>
&gt; -       self text.<br>
&gt; -       self header; timeStamp.<br>
&gt; -<br>
&gt; -       extraClass ifNotNil: [<br>
&gt; -               class := extraClass.    &quot;A specific class the user wants written&quot;<br>
&gt; -               class sharedPools size &gt; 0 ifTrue:<br>
&gt; -                       [class shouldFileOutPools<br>
&gt; -                               ifTrue: [class fileOutSharedPoolsOn: self]].<br>
&gt; -               class fileOutOn: self moveSource: false toFile: 0].<br>
&gt; -       self trailer.   &quot;Does nothing for normal files.  HTML streams will have trouble with object data&quot;<br>
&gt; -       self binary.<br>
&gt; -<br>
&gt; -       &quot;Append the object&#39;s raw data&quot;<br>
&gt; -       srefStream := SmartRefStream on: self.<br>
&gt; -       srefStream nextPut: theObject.  &quot;and all subobjects&quot;<br>
&gt; -       srefStream close.               &quot;also closes me&quot;<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: ReadWriteStream&gt;&gt;fileOutClass:andObject:blocking: (in category &#39;fileIn/Out&#39;) -----<br>
&gt; - fileOutClass: extraClass andObject: theObject blocking: anIdentDict<br>
&gt; -       &quot;Write a file that has both the source code for the named class and an object as bits.  Any instance-specific object will get its class written automatically.  Accept a list of objects to map to nil or some other object (blockers).  In addition to teh choices in each class&#39;s objectToStoreOnDataStream&quot;<br>

&gt; -<br>
&gt; -       | class srefStream |<br>
&gt; -       self setFileTypeToObject.<br>
&gt; -               &quot;Type and Creator not to be text, so can attach correctly to an email msg&quot;<br>
&gt; -       self header; timeStamp.<br>
&gt; -<br>
&gt; -       extraClass ifNotNil: [<br>
&gt; -               class := extraClass.    &quot;A specific class the user wants written&quot;<br>
&gt; -               class sharedPools size &gt; 0 ifTrue:<br>
&gt; -                       [class shouldFileOutPools<br>
&gt; -                               ifTrue: [class fileOutSharedPoolsOn: self]].<br>
&gt; -               class fileOutOn: self moveSource: false toFile: 0].<br>
&gt; -       self trailer.   &quot;Does nothing for normal files.  HTML streams will have trouble with object data&quot;<br>
&gt; -<br>
&gt; -       &quot;Append the object&#39;s raw data&quot;<br>
&gt; -       srefStream := SmartRefStream on: self.<br>
&gt; -       srefStream blockers: anIdentDict.<br>
&gt; -       srefStream nextPut: theObject.  &quot;and all subobjects&quot;<br>
&gt; -       srefStream close.               &quot;also closes me&quot;<br>
&gt; - !<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: SmartRefStream&gt;&gt;abstractStringx0 (in category &#39;*Collections-Strings-conversion&#39;) -----<br>
&gt; - abstractStringx0<br>
&gt; -<br>
&gt; -       ^ String!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: SmartRefStream&gt;&gt;multiStringx0 (in category &#39;*Collections-Strings-conversion&#39;) -----<br>
&gt; - multiStringx0<br>
&gt; -<br>
&gt; -       ^ WideString!<br>
&gt;<br>
&gt; Item was removed:<br>
&gt; - ----- Method: SmartRefStream&gt;&gt;multiSymbolx0 (in category &#39;*Collections-Strings-conversion&#39;) -----<br>
&gt; - multiSymbolx0<br>
&gt; -<br>
&gt; -       ^ WideSymbol!<br>
&gt;<br>
&gt;<br>
<br>
</div></div></blockquote></div><br></div></div>