ResourcePack.st
author claus
Fri, 16 Jul 1993 11:42:20 +0200
changeset 0 48194c26a46c
child 2 b35336ab0de3
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
48194c26a46c Initial revision
claus
parents:
diff changeset
     1
'From Smalltalk/X, Version:2.7.1 on 10-Jul-1993 at 19:03:09'!
48194c26a46c Initial revision
claus
parents:
diff changeset
     2
48194c26a46c Initial revision
claus
parents:
diff changeset
     3
Dictionary subclass:#ResourcePack
48194c26a46c Initial revision
claus
parents:
diff changeset
     4
         instanceVariableNames:'elements dependents fileName'
48194c26a46c Initial revision
claus
parents:
diff changeset
     5
         classVariableNames:'packs'
48194c26a46c Initial revision
claus
parents:
diff changeset
     6
         poolDictionaries:''
48194c26a46c Initial revision
claus
parents:
diff changeset
     7
         category:'System-Support'
48194c26a46c Initial revision
claus
parents:
diff changeset
     8
!
48194c26a46c Initial revision
claus
parents:
diff changeset
     9
48194c26a46c Initial revision
claus
parents:
diff changeset
    10
!ResourcePack class methodsFor:'initialization'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    11
48194c26a46c Initial revision
claus
parents:
diff changeset
    12
initialize
48194c26a46c Initial revision
claus
parents:
diff changeset
    13
    packs isNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
    14
        packs := ShadowArray new:30
48194c26a46c Initial revision
claus
parents:
diff changeset
    15
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
    16
48194c26a46c Initial revision
claus
parents:
diff changeset
    17
    "ResourcePack initialize"
48194c26a46c Initial revision
claus
parents:
diff changeset
    18
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
    19
48194c26a46c Initial revision
claus
parents:
diff changeset
    20
!ResourcePack class methodsFor:'instance creation'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    21
48194c26a46c Initial revision
claus
parents:
diff changeset
    22
fromFile:aFileName
48194c26a46c Initial revision
claus
parents:
diff changeset
    23
    "get the resource definitions from a file"
48194c26a46c Initial revision
claus
parents:
diff changeset
    24
48194c26a46c Initial revision
claus
parents:
diff changeset
    25
    |inStream newPack temp idx|
48194c26a46c Initial revision
claus
parents:
diff changeset
    26
48194c26a46c Initial revision
claus
parents:
diff changeset
    27
    "first look, if not already here"
48194c26a46c Initial revision
claus
parents:
diff changeset
    28
48194c26a46c Initial revision
claus
parents:
diff changeset
    29
    packs isNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
    30
        self initialize
48194c26a46c Initial revision
claus
parents:
diff changeset
    31
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
    32
    packs do:[:aPack |
48194c26a46c Initial revision
claus
parents:
diff changeset
    33
        aPack notNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
    34
            aPack fileName = aFileName ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
    35
                ^ aPack
48194c26a46c Initial revision
claus
parents:
diff changeset
    36
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
    37
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
    38
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
    39
48194c26a46c Initial revision
claus
parents:
diff changeset
    40
    inStream := Smalltalk systemFileStreamFor:('resources/' , aFileName).
48194c26a46c Initial revision
claus
parents:
diff changeset
    41
    inStream isNil ifTrue:[^ self new].
48194c26a46c Initial revision
claus
parents:
diff changeset
    42
    newPack := self new readFromResourceStream:inStream.
48194c26a46c Initial revision
claus
parents:
diff changeset
    43
    newPack fileName:aFileName.
48194c26a46c Initial revision
claus
parents:
diff changeset
    44
    inStream close.
48194c26a46c Initial revision
claus
parents:
diff changeset
    45
48194c26a46c Initial revision
claus
parents:
diff changeset
    46
    idx := packs identityIndexOf:nil.
48194c26a46c Initial revision
claus
parents:
diff changeset
    47
    idx notNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
    48
        packs at:idx put:newPack
48194c26a46c Initial revision
claus
parents:
diff changeset
    49
    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
    50
        temp := ShadowArray new:(packs size).
48194c26a46c Initial revision
claus
parents:
diff changeset
    51
        temp replaceFrom:1 with:packs.
48194c26a46c Initial revision
claus
parents:
diff changeset
    52
        packs := temp
48194c26a46c Initial revision
claus
parents:
diff changeset
    53
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
    54
48194c26a46c Initial revision
claus
parents:
diff changeset
    55
    ^ newPack
48194c26a46c Initial revision
claus
parents:
diff changeset
    56
48194c26a46c Initial revision
claus
parents:
diff changeset
    57
    "ResourcePack fromFile:'SBrowser.rs'"
48194c26a46c Initial revision
claus
parents:
diff changeset
    58
    "ResourcePack fromFile:'FBrowser.rs'"
48194c26a46c Initial revision
claus
parents:
diff changeset
    59
    "ResourcePack fromFile:'Smalltalk.rs'"
48194c26a46c Initial revision
claus
parents:
diff changeset
    60
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    61
48194c26a46c Initial revision
claus
parents:
diff changeset
    62
for:aClass
48194c26a46c Initial revision
claus
parents:
diff changeset
    63
    "get the resource definitions for aClass"
48194c26a46c Initial revision
claus
parents:
diff changeset
    64
48194c26a46c Initial revision
claus
parents:
diff changeset
    65
    |superPack|
48194c26a46c Initial revision
claus
parents:
diff changeset
    66
48194c26a46c Initial revision
claus
parents:
diff changeset
    67
    aClass == Object ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
    68
	^ self fromFile:((Smalltalk fileNameForClass:aClass name) , '.rs')
48194c26a46c Initial revision
claus
parents:
diff changeset
    69
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
    70
    superPack := self for:aClass superclass.
48194c26a46c Initial revision
claus
parents:
diff changeset
    71
    ^ (self fromFile:((Smalltalk fileNameForClass:aClass name) , '.rs')) merge:superPack
48194c26a46c Initial revision
claus
parents:
diff changeset
    72
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
    73
48194c26a46c Initial revision
claus
parents:
diff changeset
    74
!ResourcePack methodsFor:'merging'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    75
48194c26a46c Initial revision
claus
parents:
diff changeset
    76
merge:anotherPack
48194c26a46c Initial revision
claus
parents:
diff changeset
    77
    anotherPack associationsDo:[:assoc |
48194c26a46c Initial revision
claus
parents:
diff changeset
    78
	self at:(assoc key) put:(assoc value)
48194c26a46c Initial revision
claus
parents:
diff changeset
    79
    ]
48194c26a46c Initial revision
claus
parents:
diff changeset
    80
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
    81
48194c26a46c Initial revision
claus
parents:
diff changeset
    82
!ResourcePack methodsFor:'accessing'!
48194c26a46c Initial revision
claus
parents:
diff changeset
    83
48194c26a46c Initial revision
claus
parents:
diff changeset
    84
dependents:aCollection
48194c26a46c Initial revision
claus
parents:
diff changeset
    85
    dependents := aCollection
48194c26a46c Initial revision
claus
parents:
diff changeset
    86
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    87
48194c26a46c Initial revision
claus
parents:
diff changeset
    88
at:aKey
48194c26a46c Initial revision
claus
parents:
diff changeset
    89
    ^ self at:aKey ifAbsent:[aKey]
48194c26a46c Initial revision
claus
parents:
diff changeset
    90
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    91
48194c26a46c Initial revision
claus
parents:
diff changeset
    92
fileName
48194c26a46c Initial revision
claus
parents:
diff changeset
    93
    ^ fileName
48194c26a46c Initial revision
claus
parents:
diff changeset
    94
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    95
48194c26a46c Initial revision
claus
parents:
diff changeset
    96
fileName:aString
48194c26a46c Initial revision
claus
parents:
diff changeset
    97
    fileName := aString
48194c26a46c Initial revision
claus
parents:
diff changeset
    98
!
48194c26a46c Initial revision
claus
parents:
diff changeset
    99
48194c26a46c Initial revision
claus
parents:
diff changeset
   100
dependents
48194c26a46c Initial revision
claus
parents:
diff changeset
   101
    ^ dependents
48194c26a46c Initial revision
claus
parents:
diff changeset
   102
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   103
48194c26a46c Initial revision
claus
parents:
diff changeset
   104
at:aKey default:default
48194c26a46c Initial revision
claus
parents:
diff changeset
   105
    ^ self at:aKey ifAbsent:[default]
48194c26a46c Initial revision
claus
parents:
diff changeset
   106
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   107
48194c26a46c Initial revision
claus
parents:
diff changeset
   108
array:anArray
48194c26a46c Initial revision
claus
parents:
diff changeset
   109
    ^ anArray collect:[:r | self at:r default:r]
48194c26a46c Initial revision
claus
parents:
diff changeset
   110
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   111
48194c26a46c Initial revision
claus
parents:
diff changeset
   112
string:s
48194c26a46c Initial revision
claus
parents:
diff changeset
   113
    ^ self at:s ifAbsent:[s]
48194c26a46c Initial revision
claus
parents:
diff changeset
   114
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   115
48194c26a46c Initial revision
claus
parents:
diff changeset
   116
string:s with:arg
48194c26a46c Initial revision
claus
parents:
diff changeset
   117
    ^ self string:s withArgs:(Array with:arg)
48194c26a46c Initial revision
claus
parents:
diff changeset
   118
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   119
48194c26a46c Initial revision
claus
parents:
diff changeset
   120
string:s with:arg1 with:arg2
48194c26a46c Initial revision
claus
parents:
diff changeset
   121
    ^ self string:s withArgs:(Array with:arg1 with:arg2)
48194c26a46c Initial revision
claus
parents:
diff changeset
   122
!
48194c26a46c Initial revision
claus
parents:
diff changeset
   123
48194c26a46c Initial revision
claus
parents:
diff changeset
   124
string:s withArgs:argArray
48194c26a46c Initial revision
claus
parents:
diff changeset
   125
    | template expandedString idx start stop next |
48194c26a46c Initial revision
claus
parents:
diff changeset
   126
48194c26a46c Initial revision
claus
parents:
diff changeset
   127
    template := self at:s ifAbsent:[s].
48194c26a46c Initial revision
claus
parents:
diff changeset
   128
    expandedString := ''.
48194c26a46c Initial revision
claus
parents:
diff changeset
   129
    stop := template size.
48194c26a46c Initial revision
claus
parents:
diff changeset
   130
    start := 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   131
    [start < stop] whileTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   132
        idx := template indexOf:$% startingAt:start.
48194c26a46c Initial revision
claus
parents:
diff changeset
   133
        idx == 0 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   134
            ^ expandedString , (template copyFrom:start to:stop)
48194c26a46c Initial revision
claus
parents:
diff changeset
   135
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   136
        "found a %"
48194c26a46c Initial revision
claus
parents:
diff changeset
   137
        next := template at:(idx + 1).
48194c26a46c Initial revision
claus
parents:
diff changeset
   138
        (next == $%) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   139
            expandedString := expandedString , '%'
48194c26a46c Initial revision
claus
parents:
diff changeset
   140
        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   141
            expandedString := expandedString , (argArray at:(next digitValue)) printString
48194c26a46c Initial revision
claus
parents:
diff changeset
   142
        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   143
        start := idx + 2
48194c26a46c Initial revision
claus
parents:
diff changeset
   144
    ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   145
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   146
48194c26a46c Initial revision
claus
parents:
diff changeset
   147
!ResourcePack methodsFor:'file reading'!
48194c26a46c Initial revision
claus
parents:
diff changeset
   148
48194c26a46c Initial revision
claus
parents:
diff changeset
   149
readFromResourceStream:inStream
48194c26a46c Initial revision
claus
parents:
diff changeset
   150
    |lineString rest value ifLevel skipping l name first|
48194c26a46c Initial revision
claus
parents:
diff changeset
   151
48194c26a46c Initial revision
claus
parents:
diff changeset
   152
    ifLevel := 0.
48194c26a46c Initial revision
claus
parents:
diff changeset
   153
    skipping := false.
48194c26a46c Initial revision
claus
parents:
diff changeset
   154
    [inStream atEnd] whileFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   155
        lineString := inStream nextLine.
48194c26a46c Initial revision
claus
parents:
diff changeset
   156
        (lineString notNil and:[lineString isEmpty not]) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   157
            first := lineString at:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   158
            first == $; ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   159
                first == $# ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   160
                    (lineString startsWith:'#if') ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   161
                        skipping ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   162
                            rest := lineString copyFrom:4.
48194c26a46c Initial revision
claus
parents:
diff changeset
   163
                            value := Compiler evaluate:rest.
48194c26a46c Initial revision
claus
parents:
diff changeset
   164
                            (value == #Error) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   165
                                Transcript show:('error in resource:' , lineString).
48194c26a46c Initial revision
claus
parents:
diff changeset
   166
                            ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   167
                            (value == false) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   168
                                skipping := true
48194c26a46c Initial revision
claus
parents:
diff changeset
   169
                            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   170
                        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   171
                        ifLevel := ifLevel + 1
48194c26a46c Initial revision
claus
parents:
diff changeset
   172
                    ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   173
                        (lineString startsWith:'#endif') ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   174
                            ifLevel := ifLevel - 1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   175
                            ifLevel == 0 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   176
                                skipping := false
48194c26a46c Initial revision
claus
parents:
diff changeset
   177
                            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   178
                        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   179
                    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   180
                ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   181
                    skipping ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   182
                        lineString := lineString withoutSeparators.
48194c26a46c Initial revision
claus
parents:
diff changeset
   183
                        name := nil.
48194c26a46c Initial revision
claus
parents:
diff changeset
   184
                        (lineString at:1) == $' ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   185
                            l := lineString indexOf:$' startingAt:2.
48194c26a46c Initial revision
claus
parents:
diff changeset
   186
                            l ~~ 0 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   187
                                name := (lineString copyFrom:2 to:l-1).
48194c26a46c Initial revision
claus
parents:
diff changeset
   188
                                l := l + 1
48194c26a46c Initial revision
claus
parents:
diff changeset
   189
                            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   190
                        ] ifFalse:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   191
                            l := lineString indexOfSeparatorStartingAt:1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   192
                            l ~~ 0 ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   193
                                name := lineString copyFrom:1 to:l-1.
48194c26a46c Initial revision
claus
parents:
diff changeset
   194
                            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   195
                        ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   196
                        name notNil ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   197
                            rest := lineString copyFrom:l.
48194c26a46c Initial revision
claus
parents:
diff changeset
   198
                            value := Compiler evaluate:rest.
48194c26a46c Initial revision
claus
parents:
diff changeset
   199
                            (value == #Error) ifTrue:[
48194c26a46c Initial revision
claus
parents:
diff changeset
   200
                                Transcript show:('error in resource:' , name).
48194c26a46c Initial revision
claus
parents:
diff changeset
   201
                            ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   202
                            self at:name put:value.
48194c26a46c Initial revision
claus
parents:
diff changeset
   203
                        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   204
                    ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   205
                ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   206
            ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   207
        ]
48194c26a46c Initial revision
claus
parents:
diff changeset
   208
    ].
48194c26a46c Initial revision
claus
parents:
diff changeset
   209
! !
48194c26a46c Initial revision
claus
parents:
diff changeset
   210
48194c26a46c Initial revision
claus
parents:
diff changeset
   211
ResourcePack initialize!