home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / smalltk / src / file.st < prev    next >
Text File  |  1991-10-12  |  3KB  |  141 lines

  1. *
  2. * Little Smalltalk, version 3
  3. * Written by Tim Budd, Oregon State University, January 1989
  4. *
  5. *  methods for dealing with files
  6. *   these are independent of the stdio package,
  7. *    work in all systems
  8. *
  9. *  a global variable "files" maintains all currently opened files
  10. *  these are reopened on system initialization time
  11. *
  12. Class File Object name number mode
  13. *
  14. Methods File 'all'
  15.   asString  | text line |
  16.     text <- ''.
  17.     [ (line <- self getString) notNil ]
  18.       whileTrue: [ text <- text , line ].
  19.     ^ text
  20. |
  21.   name: string
  22.     name <- string
  23. |
  24.   name
  25.     ^ name
  26. |
  27.   getNumber
  28.     " get a file number - called only by open"
  29.     (1 to: 15) do: [:i | (files at: i) isNil
  30.       ifTrue: [ files at: i put: self. number <- i. ^ nil]]
  31. |
  32.   open: m
  33.     self mode: m.
  34.     self open
  35. |
  36.   mode: m
  37.     mode <- m
  38. |
  39.   open
  40.     number notNil ifTrue: [ self close ].
  41.     self getNumber.
  42.     <120 number name mode> isNil
  43.       ifTrue: [ smalltalk error:
  44.          'open failed: ', name. ^ false].
  45.     ^ true
  46. |
  47.   close
  48.     " close file, take entry out of global variable "
  49.     number isNil ifTrue: [ ^ nil ].
  50.     files at: number put: nil.
  51.     <121 number>.
  52.     number <- nil.
  53. |
  54.   fileIn
  55.     " read code into the system "
  56.     (number notNil) ifTrue: [<123 number>]
  57. |
  58.   fileIn: name
  59.     self name: name.
  60.     self open: 'r'.
  61.     self fileIn.
  62.     self close.
  63. |
  64.   getString
  65.     ^ (number notNil)
  66.       ifTrue: [<125 number>]
  67. |
  68.   print: aString
  69.     (number notNil)
  70.       ifTrue: [<129 number aString>]
  71.       ifFalse: [smalltalk error: 'file not open']
  72. |
  73.   printNoReturn: aString
  74.     (number notNil)
  75.       ifTrue: [<128 number aString>]
  76.       ifFalse: [smalltalk error: 'file not open']
  77. |
  78.   readUntil: conditionBlock doing: actionBlock  | line |
  79.     [ line <- self getString. line notNil]
  80.       whileTrue: [ (conditionBlock value: line)
  81.           ifTrue: [ ^ line ].
  82.           actionBlock value: line ].
  83.     ^ nil
  84. |
  85.   saveImage
  86.     " subtle problem - when we read in image don't want
  87.       image file to be open for writing, so we remove it's
  88.       number from files array temporarily "
  89.     (number notNil)
  90.       ifTrue: [ files at: number put: nil.
  91.           <127 number>.
  92.           files at: number put: self]
  93.       ifFalse: [smalltalk error: 'saveImage: file not open']
  94. ]
  95. Methods File 'all'
  96.   scratchFile
  97.     name <- 'junk.tmp'
  98. |
  99.   delete
  100.     ('del ', name) unixCommand
  101. ]
  102. Methods Smalltalk 'image'
  103.   saveImage
  104.     self saveImage: (self getPrompt: 'type image name: ').
  105.     ^ 'done'
  106. |
  107.   saveImage: name
  108.     scheduler critical: [
  109.       " first get rid of our own process "
  110.       scheduler removeProcess: scheduler currentProcess.
  111.     File new;
  112.       name: name;
  113.       open: 'wb';
  114.       saveImage;
  115.       close ]
  116. ]
  117. Methods Class 'all'
  118.   fileOut   | f |
  119.     " file out whole class on class.st "
  120.     f <- File new; name: (name asString,'.st'); mode: 'w'; open.
  121.     self fileOutOn: f.
  122.     f close.
  123. |
  124.   fileOutOn: aFile
  125.     " file out class description "
  126.     aFile printNoReturn:
  127.       'Class ', name , ' ', superClass.
  128.     (variables notNil) ifTrue: [
  129.       variables do: [:v | aFile printNoReturn: ' ', v ]].
  130.     aFile print: ''.
  131.     self fileOutMethodsOn: aFile.
  132. |
  133.   fileOutMethodsOn: aFile
  134.     " file out all methods "
  135.     methods do: [:m |
  136.       aFile print: 'Methods ', name.
  137.       aFile print: m text.
  138.       aFile print: ']'
  139.       ]
  140. ]
  141.