This file is indexed.

/usr/share/tcltk/xotcl1.6.7-serialize/RecoveryPoint.xotcl is in xotcl 1.6.7-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
# $Id: RecoveryPoint.xotcl,v 1.4 2006/02/18 22:17:33 neumann Exp $

package provide xotcl::scriptCreation::recoveryPoint 0.8
package require XOTcl

namespace eval ::xotcl::scriptCreation::recoveryPoint {
    namespace import ::xotcl::*

    ## fehlt noch: filter, mixins, metadata, ass, assoption, etc
    ## beim recover Class's,Object's proc instproc vars nicht ueberschreiben
    ## filter dann anhaengen etc ...
    ## der Recovery Filter darf durch Object filter "" nicht gelöscht werden

    #
    # filter to ensure that recovering doesn't overwrite 
    # existing objs/classes
    #

    Object instproc recoveryFilter args {
	::set method [self calledproc] 

	switch -- $method {
	    create {
		# don't overwrite objects
		if {![::Object isobject [lindex $args 0]]} {
		    next
		} else {
		    # puts stderr "Recovery Filter: omitting [lindex $args 0]"
		}
	    }
	    proc {
		if {[lsearch [my info procs] [lindex $args 0]] == -1} {
		    next
		} else {
		    # puts stderr "Recovery Filter: omitting proc [self]::[lindex $args 0]"
		}	
	    }
	    instproc {
		if {[lsearch [my info instprocs] [lindex $args 0]] == -1} {
		    next
		} else {
		    # puts stderr "Recovery Filter: omitting instproc [self]::[lindex $args 0]"
		}
	    }
	    set {
		if {[lsearch [my info vars] [lindex $args 0]] == -1} {
		    next
		} else {
		    # puts stderr "Recovery Filter: omitting var [self]::[lindex $args 0]"
		}
	    }
	    default  {next}
	}
    }

    #
    # remove filter from object
    #
    Object instproc filterremove f {
	::set fl [my info filter]
	puts stderr "filterremove on [self] with $f; fullName: [my filtersearch $f]" 
	while {[::set index [lsearch $fl [my filtersearch $f]]] != -1} {
	    ::set fl [lreplace $fl $index $index]
	}
	my filter $fl
    }

    #
    # remove mixin from object
    #
    Object instproc mixinremove m {
	puts stderr "mixinremove on [self] with $m" 
	::set ml [my info mixins]
	while {[::set index [lsearch $ml $m]] != -1} {
	    ::set ml [lreplace $ml $index $index]
	}
	my mixin $ml
    }

    Class RecoveryPoint \
	-parameter {
	    {appendedObjs ""} 
	    {appendedCls ""} 
	    {appendedNamespaces ""} 
	    {withState 0}
	    {appendToFile 0}
	    {definedObjs [list Object \
			      Class \
			      Class::Parameter]}
	    {excludeNames ""}
	}

    #
    # queries the definedObjs variable whether a given object
    # is already defined/predefined or not  
    # -> a way to exclude classes/objs from saving
    #
    RecoveryPoint instproc isDefined {n} {
	my instvar definedObjs
	puts stderr "Checking Defined: $n in $definedObjs"
	if {[lsearch $definedObjs [string trimleft $n :]] == -1} {
	    return 0
	} else {
	    return 1
	}
    }

    RecoveryPoint instproc appendDefined {n} {
	my instvar definedObjs
	lappend definedObjs [string trimleft $n :]
    }

    #
    # check whether an obj/cls/namespace is appended already
    # append obj/cls/namespace 
    #
    foreach method {Obj Cl Namespace} {
				       set r {
					   my instvar {appended${method}s name}}
				       set r [subst -nocommands -nobackslash $r]
				       
				       set s $r
				       append s {
					   if {[lsearch $name [string trimleft $n :]] == -1} {
					       return 0
					   } else {
					       return 1
					   }
				       }

				       RecoveryPoint instproc isAppended$method {n} $s

				       append r {
					   lappend name [string trimleft $n :]
				       }
				       RecoveryPoint instproc append$method {n} $r
				   }
    

    #
    # compare command for lsort  
    #
    RecoveryPoint instproc namespaceDepth {a b} {
	set aCount 0
	set bCount 0
	for {set i 0} {$i < [string length $a]} {incr i} {
	    if {[string index $a $i] eq ":"} {
		incr aCount
	    }
	}
	for {set i 0} {$i < [string length $b]} {incr i} {
	    if {[string index $b $i] eq ":"} {
		incr bCount
	    }
	}
	if {$aCount == $bCount} {
	    return 0
	} elseif {$aCount > $bCount} {
	    return 1
	}
	
	return -1
    } 

    #
    # produces a script containing the current state of 
    # the given obj
    #
    RecoveryPoint instproc stateScript {obj} {
	set script ""
	foreach v [$obj info vars] {
	    if {[lsearch [my set excludeNames] $v] == -1} {
		$obj instvar $v
		if {[array exists $v]} {
		    foreach name [array names $v] {
			set arr ${v}($name)
			set value [$obj set $arr]
			append script "$obj set $arr \"$value\"\n"
		    }
		} else {
		    set value [set $v]
		    append script "$obj set $v \"$value\"\n"
		}
	    }
	}
	return $script
    }

    #
    # produces a script containing the procs of the given obj
    #
    RecoveryPoint instproc procScript {obj} {
	set script ""
	foreach p [$obj info procs] {
	    if {[lsearch [my set excludeNames] $v] == -1} {
		append script \
		    "$obj proc $p \{[$obj info args $p]\} \{[$obj info body $p]\}\n"
	    }
	}
	return $script
    }

    #
    # produces a script containing the instprocs of the given class
    #
    RecoveryPoint instproc instprocScript {cl} {
	set script ""
	foreach p [$cl info instprocs] {
	    if {[lsearch [my set excludeNames] $v] == -1} {
		append script \
		    "$cl instproc $p \{[$cl info instargs $p]\} \{[$cl info instbody $p]\}\n"
	    }
	}
	return $script
    }

    #
    # append parent obj/classes/namespaces of an object completly
    #

    RecoveryPoint instproc appendParents {name} {
	# puts stderr "Recovery -- appendParents $name "
	set p ""
	set script ""

	set n $name
	while {[set np [namespace parent ::$n]] != "::"} {
	    lappend p $np
	    set n $np
	}    
	set p [lsort -command {[self] namespaceDepth} $p]

	foreach n $p {
	    if {[Object isobject $n]} {
		if {[$n isclass]} {
		    append script [my classScript $n]
		} else {
		    append script [my objectScript $n]
		}
	    } else {
		if {![my isAppendedNamespace $n]} {
		    append script "namespace eval $n \{\}\n"
		    # puts stderr "Recovery -- Appending Namespace: $n"
		    my appendedNamespace $n
		}        
	    }
	}
	return $script
    }


    #
    # produces a script recovering the given obj with all children
    # without state
    #
    RecoveryPoint instproc objectScript {obj} {
	# puts stderr "Recovery -- Object Script $obj"
	my instvar withState
	set script ""
	if {![my isDefined $obj] && 
	    ![my isAppendedObj $obj]} {
	    # if the object's class is not yet appended => do it now
	    set objClass [$obj info class]
	    append script [my classScript $objClass]

	    # append all parent namespaces
	    append script [my appendParents $obj]

	    # append the obj
	    append script "$objClass $obj\n"
	    append script [my procScript $obj]
	    if {$withState == 1} {
		append script [my stateScript $obj]
	    }
	    # puts stderr "Recovery -- Appending Object: $obj"
	    my appendObj $obj

	    # append its children
	    foreach o [$obj info children] {
		append script [my objectScript $o]
	    }
	}
	return $script
    }

    #
    # produces a script recovering the given class with all children
    # without state
    #
    RecoveryPoint instproc classScript {cl} {
	# puts stderr "Recovery -- Class Script $cl"
	my instvar withState
	set script ""
	if {![my isDefined $cl] &&
	    ![my isAppendedCl $cl]} { 
	    # if the class's meta-class is not yet appended => do it now
	    set metaClass [$cl info class]
	    append script [my classScript $metaClass]

	    # append all parent namespaces
	    append script [my appendParents $cl]

	    # append the class
	    append script "$metaClass $cl"

	    set sl [$cl info superclass]
	    if {$sl ne ""} {
		append script " -superclass \{$sl\}\n"
	    } else {
		append script "\n"
	    }

	    append script [my instprocScript $cl]
	    append script [my procScript $cl]

	    if {$withState == 1} {
		append script [my stateScript $cl]
	    }

	    # puts stderr "Recovery -- Appending Class: $cl \n $script"
	    my appendCl $cl

	    # append children
	    set children [$cl info children]
	    set classChildren [$cl info classchildren]

	    foreach c $children {
		if {[lsearch $classChildren $c] != -1} {
		    append script [my classScript $c]
		} else {
		    append script [my objectScript $c]
		}
	    }
	}
	return $script
    }

    #
    # produces a script recovering the given class and all subclasses 
    # with all their children and all instances
    #
    #
    RecoveryPoint instproc hierarchyScript {cl} {
	set script [my classScript $cl]
	set sortedInstances \
	    [lsort -command {[self] namespaceDepth} [$cl info instances]]

	foreach o $sortedInstances {
	    append script [my objectScript $o]
	}

	foreach c [$cl info subclass] {
	    append script [my hierarchyScript $c]
	}

	return $script
    }

    #
    # saves a script to a file
    #
    RecoveryPoint instproc saveScript {filename script} {
	my instvar appendToFile
	if {$appendToFile} {
	    set mode a
	} else {
	    set mode w
	}
	set f [open $filename $mode]
	puts $f $script
	close $f
    }

    #
    # load a script from a file
    #
    RecoveryPoint instproc loadScript {filename} {
	set f [open $filename r]
	set r [read $f]
	close $f
	return $r
    }

    #
    # produce methods to save/recover an object script to/from a file 
    # with/without state/only state
    #

    foreach method {
	Object ObjectState ObjectWithState Class ClassWithState \
	    Hierarchy HierarchyWithState
    } {
       set s {
	   my set withState
       }

       if {[regexp {(.*)WithState} $method _ m]} {
	   set call $m
	   append s "1"
       } else {
	   set call $method
	   append s "0"
       }

       scan $call %c l
       set ::low "[format %c [expr {$l + 32}]][string range $call 1 end]"

       append s {
	   my appendedObjs ""
	   my appendedCls ""
	   my appendedNamespaces ""
       }
       append s "
    foreach a \$args \{"
       set r {      
	   set script [my ${low}Script }
	   set r [subst -nocommands -nobackslash $r]
	   append s $r
	   append s {$a] 
	   my saveScript $filename $script}
       append s "
    \}
  "

       RecoveryPoint instproc save$method {filename args} $s
   }

    RecoveryPoint instproc recover {filename} {
	set r [my loadScript $filename]
	Object filterappend recoveryFilter
	# puts stderr "RecoveryFilter appended for $filename" 
	eval $r
	Object filterremove recoveryFilter
	# puts stderr "RecoveryFilter removed for $filename" 
	return
    }

    namespace export RecoveryPoint
}

namespace import ::xotcl::scriptCreation::recoveryPoint::*