File: queue.tcl

package info (click to toggle)
grass 6.0.2-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 40,044 kB
  • ctags: 31,303
  • sloc: ansic: 321,125; tcl: 25,676; sh: 11,176; cpp: 10,098; makefile: 5,025; fortran: 1,846; yacc: 493; lex: 462; perl: 133; sed: 1
file content (64 lines) | stat: -rw-r--r-- 1,771 bytes parent folder | download | duplicates (6)
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

proc Q_init {size {addproc  Nv_mapPanel} {rmproc Nv_closePanel}} {
    for {set i 0; set queue {}} {$i < $size} {incr i} {
       set queue [concat $queue open]}
    set Q [St_create {next maxsize currsize addproc rmproc queue} \
		      0 $size 0 $addproc $rmproc $queue]
    return $Q
}

# add an item to the Q, if necessary bumping items of lower priority;
# return position where it was added
proc Q_add {Q name } { 

    set next [St_get $Q next]
    set size [St_get $name size] 
    set maxsize [St_get $Q maxsize]
    set addproc [St_get $Q addproc]
    for {set i 0} {$i < $size} {} {
        set index [expr ($next + $i)]
        if {$index >= $maxsize} {
            set index 0
            set next 0
            set i 0
        }

        set queue [St_get $Q queue]
	set tmp [lindex $queue $index]
	if [string compare open $tmp] { 
	    Q_remove $Q $tmp
	    incr i [St_get $tmp size]
	} else {incr i}
    }
        set queue [St_get $Q queue]

    for {set i $next} {$i < [expr $next + $size]} {incr i} {
	set queue [lreplace $queue $i $i $name]
    }
    $addproc  [St_get $name window] $name  [expr $next  + 1]
    St_set $Q next [expr ($next + $size)%$maxsize]
    St_set $Q queue $queue

    return $next
}
# remove an item from the Q
proc Q_remove {Q name} {
    set queue [St_get $Q queue]
    set rmproc [St_get $Q rmproc]
    set size [St_get $name size]
    set index [lsearch $queue $name]
    for {set i $index} {$i < [expr $index + $size]} {incr i} {
	    set queue [lreplace $queue $i $i open]
    }
    $rmproc [St_get $name window]
    St_set $Q queue $queue
        set queue [St_get $Q queue]
}

proc Q_get_pos {Q name} {

    set queue [St_get $Q queue]
    set pos [lsearch $queue $name]
    if {$pos >= 0} {incr pos}
    return $pos
}