The following Tcl code can be found in the cgi-bin/rover/irolo.lib file.
# Interactive rolodex program. Uses database format of rolo. # # Frans Kaashoek # 12/14/95 # # Roverized: Anthony D. Joseph # 1/3/96 # # # In addition to global variables below, irolo has a global variable "display" # that stores the current rolodex entry. record is an array indexed by fields # from fieldVariables. Finally, irolo maintains a global array record that # contains all rolodex entries. # set fieldVariables {name wphone hphone company waddress haddress remarks} set fixedFieldVariables {date} # # Code for manipulating a Rolodex object # class Rolo {ptr time} { set slot(time) $time return [$self unmarshall $ptr] } # # Marshalled Rolo object format: # [] # : # : # method Rolo unmarshall {ptr} { set count 0 while {[string length $ptr] > 0} { set next [string first "\n" $ptr] if {$next == -1} { set next "" } else { set current [string range $ptr 0 [expr $next - 1]] set next [string range $ptr [expr $next + 1] end] set ptr $current } set slot(Names,$count) $ptr incr count if {$next == ""} break set ptr $next } set slot(nrecord) $count return $self } method Rolo commitIdx {name {commit 0}} { Rover_AddLog $self $slot(time) "commit" "$self commitIdx $name 1" set found 0 foreach i [lsort -integer [TwoDArrayNames slot Names]] { if [string match $name $slot(Names,$i)] { set found 1 } } if {$found == 0} { incr slot(nrecord) set count $slot(nrecord) set slot(Names,$count) $name return [$self marshall] } return "" } method Rolo marshall {} { set result "" foreach i [lsort [TwoDArrayNames slot Names]] { set result "${result}$slot(Names,$i)\n" } return $result } # # Return the elts of a Rolo object # method Rolo elts {} { set value {} foreach i [lsort [TwoDArrayNames slot Names]] { lappend value $slot(Names,$i) } return $value } # # Delete an entry in the rolodex. # method Rolo deleteIdx {name {commit 0}} { set found 0 foreach i [lsort -integer [TwoDArrayNames slot Names]] { if [string match $name $slot(Names,$i)] { set found 1 set slot(nrecord) [expr $slot(nrecord) - 1] for {set j $i} {$j < $slot(nrecord)} {incr j} { set next [expr $j + 1] set slot(Names,$j) $slot(Names,$next) } unset slot(Names,$slot(nrecord)) if {$commit == 0} { set slot(dirty) 1 } else { set slot(dirty) 0 } } } Rover_AddLog $self $slot(time) "commit" "$self deleteIdx $name 1" if {$found == 1} { return [$self marshall] } else { return "" } } ############################################################################ ############################################################################ ############################################################################ # # # Code for manipulating a Entry object # class Entry {ptr time} { set slot(time) $time return [$self unmarshall $ptr] } # Format: # [# method Entry unmarshall {ptr} { global fieldVariables fixedFieldVariables foreach field [concat $fieldVariables $fixedFieldVariables] { # puts stderr "ptr is $ptr" if {[string length $ptr] == 0} { set slot($field) "" continue } set next [string first "\n" $ptr] if {$next == -1} { set next "" } else { set current [string range $ptr 0 [expr $next - 1]] set next [string range $ptr [expr $next + 1] end] set ptr $current } set slot($field) $ptr set ptr $next if {$next == ""} break } # Check for user defined fields if {[string length $ptr] == 0} { set slot(nuser) 0 return $self } set i 0 set name 0 while {[string length $ptr] != 0} { set next [string first "\n" $ptr] if {$next == -1} { set next "" } else { set current [string range $ptr 0 [expr $next - 1]] set next [string range $ptr [expr $next + 1] end] set ptr $current } if {$name == 0} { set slot(UserFields,$i) $ptr # Just in case the field itself is null set slot($i) {} incr name } else { set name 0 set slot($i) $ptr incr i } if {$next == ""} break set ptr $next } if {$name != 0} {puts stderr "WARNING! Empty user field $i"} set slot(nuser) $i return $self } method Entry commitEntry {data} { $self unmarshall $data # Set date updated set slot(date) [Rover_CTime $slot(time)] set result [$self marshall] Rover_AddLog $self $slot(time) "commit" "$self commitEntry \{$result\}" return $result } # # Marshall a rolodex entry # method Entry marshall {} { global fieldVariables fixedFieldVariables set result "" foreach field [concat $fieldVariables $fixedFieldVariables] { set result "${result}$slot($field)\n" } for {set i 0} {$i < $slot(nuser)} {incr i} { if [info exists slot($i)] { set result "${result}$slot(UserFields,$i)\n$slot($i)\n" } } return [Rover_TclEscape $result] } method Entry deleteEntry {{commit 0}} { Rover_DbDelete $self Rover_AddLog $self $slot(time) "commit" "$self deleteEntry 1" return "" }# : # : # # # : # : # # # Unmarshall a rolodex record. #