This file is indexed.

/usr/share/xcrysden/Tcl/groupSel.tcl is in xcrysden-data 1.5.60-1build3.

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
#############################################################################
# Author:                                                                   #
# ------                                                                    #
#  Anton Kokalj                                  Email: Tone.Kokalj@ijs.si  #
#  Department of Physical and Organic Chemistry  Phone: x 386 1 477 3523    #
#  Jozef Stefan Institute                          Fax: x 386 1 477 3811    #
#  Jamova 39, SI-1000 Ljubljana                                             #
#  SLOVENIA                                                                 #
#                                                                           #
# Source: $XCRYSDEN_TOPDIR/Tcl/groupSel.tcl                                       
# ------                                                                    #
# Copyright (c) 1996-2014 by Anton Kokalj                                   #
#############################################################################

proc group_sel { w type groups } {
    global groupsel n_groupsel done but_press

    # this Procedure "select" and return a GROUP (point, line, plane, 
    #                                             space group)
    #
    # w  - name of toplevel widget
    # ^
    # type  - name for type of group (point, line, plane, space )
    #
    # groups  - list of groups
    # ^^^^^^
    # groupsel  - selected group
    # ^^^^^^^^

    # groupsel is global; proc group_sel wait unit $but_press is TRUE 
    # and then exit; gropusel is returned
    if ![info exists groupsel ] {set groupsel {}}
    set but_press 0
    xcToplevel $w "Select a $type group" "Selection" . 120 70 1
    
    # make a top_frame & bottom_frame
    frame $w.top -relief raised -bd 1
    pack $w.top -side top -fill both 
    frame $w.bot -relief raised -bd 1
    pack $w.bot -side bottom -fill both 
    
    # name of widget goes in the top frame
    label $w.top.lab -text "Select a $type group" 
    pack $w.top.lab -side top -expand 1 -fill both -padx 5m -pady 5m
    
    # in the top of BOTTOM frame will be an ENTRY for selected group;
    # bellow will be "selection listbox"
    label $w.top.label -text "Group:" -padx 0

    
    #------------------------------------------------------
    # take care of this ENTRY and groupsel textvariable
    #------------------------------------------------------
    entry $w.top.entry -relief sunken -textvariable groupsel
    focus $w.top.entry

    # make LEFT & RIGHT frame in bottom frame;
    # in LEFT goes LISTBOX;
    # in RIGHT go OK & CANCEL buttons
    frame $w.bot.left
    frame $w.bot.right
    frame $w.bot.right.ok
    set ok [button $w.bot.right.ok.ok -text OK -command [list group_sel_ok $groups]]
    set can [button $w.bot.right.can -text Cancel \
	    -command [list group_sel_cancel $w]]
   
    # now we'll create LISTBOX; it's ScrolledListbox2 from the book of
    # Brent B. Welch
    ScrolledListbox2 $w.bot.left.lb -width 20 -height 20 -setgrid true

    # now we'll pack what we create so far
    pack $w.top.label -side left -pady 10 -padx 5
    pack $w.top.entry -side left -fill x -expand true -pady 10 -padx 5
    pack $w.bot.left -side left -fill both
    pack $w.bot.right -side left -fill both    
    pack $w.bot.right.ok $can -side top -padx 10 -pady 5
    pack $ok -padx 4 -pady 4
    
    # now we'll create a bindings for ENTRY
    bind $w.top.entry <Return> "set done 1" 
    # now we'll create BINDINGs for this LISTBOX
    bind $w.bot.left.lb.list <ButtonPress-1> {GroupSelectStart %W %y}
    bind $w.bot.left.lb.list <ButtonRelease-1> \
	    [list GroupSelectEnd %W %y]

    # now we'll insert the GROUPS in the listbox;
    # GROUPS variable holds all groups 
    eval {$w.bot.left.lb.list insert 0} $groups 

 
    # wait unit $done is specefied
    tkwait variable but_press
    destroy $w
    return $groupsel
}
#-----------------------------
# END OF GROUP_SEL PROC
#-----------------------------


#------------------------------------
# here are auxiliary procs
#------------------------------------


proc GroupSelectStart { w y } {
    $w select anchor [$w nearest $y]
}

proc GroupSelectEnd { w y } {
    global groupsel

    # $w is the name of listbox widget who contains groups
    # $y is the vertical position of "selection"
    
    $w select anchor [$w nearest $y]
    # nline is index of selected line
    set nline [$w curselection]
    set groupsel [$w get $nline]
    # now we must get rid of seq_num: (ex. 20:   GROUP)
    #                        ^^^^^^^       ^^^
    # i=position/index of the first caracter og group which is 4 more than
    # index of :
    # j=lenght_of$groupsel
    set i [expr [string first : $groupsel] + 4]
    set j [string length $groupsel]
    # assing "pure" group to groupsel 
    set groupsel [string range $groupsel $i $j]
    }


proc group_sel_cancel { w } {
    global groupsel but_press
    set groupsel {}
    set but_press 1
}

proc group_sel_ok { groups } {
    global groupsel n_groupsel done but_press err
    # $groups is a list of groups

    # err is used by contrl_var variable
    set err 0

    # translate $groupsel to UPPER CASE
    set groupsel [string toupper $groupsel]

    # check if specified group is OK
    # $groups contanins "inpurities" (ex.{  5:   P 1 1 2        }), 
    # but $groupsel could also contains white_space inpurity

    set ok 0
    set n 1
    # pure the groupsel
    # NOTE: this REGEXP is extremly complex, but it looks that it works
    regexp {(([A-Z0-9] )|[A-Z0-9\/\-])+[A-Z0-9]} $groupsel groupsel

    foreach word $groups {
	# pure the $word
	set last [ string length $word ]
	set word [ string range $word 5 $last ]
	regexp {(([A-Z0-9] )|[A-Z0-9\/\-])+[A-Z0-9]} $word word	
	if { $groupsel == $word } {
	    set ok 1
	    set n_groupsel $n
	}
	incr n
    }
    
    # if "ok" is still is still 0, it maybe not a standard group; 
    # but that is just for crystals
    if { $ok == 0 } { 
	set ok [IsNotStandardGroup $groupsel] 
	set n_groupsel 999
    }

    if { $ok == 0} {
	# specefied group is WRONG
	dialog .group_sel_warning Warning \
		"Group \"$groupsel\" is false. You probably mistype the group.\
		Try again or select one from the list" warning 0 OK
	set err 1
    } else {
	# group is OK
	# we have selected; so $done will be set to 1
	set done 1	
	#this is used for GROUP_SEL PROC
	set but_press 1
    }
}



#############################################################################
# this proc is used when non-standard group is used that is not on 
# $space_group list; we check if it is valid and which parameters are needed
# for it!!!
proc IsNotStandardGroup {group} {
    global class inp system
    
    set par(1) 11.00111
    set par(2) 22.00222
    set par(3) 33.00333
    set par(4) 44.00444
    set par(5) 55.00555
    set par(6) 66.00666

    set cla    {}
    set cl(1)  A
    set cl(2)  B
    set cl(3)  C
    set cl(4)  ALFA
    set cl(5)  BETA
    set cl(6)  GAMMA
 
    set    input "EOF"
    append input "XCrySDen 1.0\n"
    append input "CRYSTAL\n"
    append input "1 0 0\n"
    append input "$group\n"
    append input "$par(1) $par(2) $par(3) $par(4) $par(5) $par(6)\n"
    append input "1\n"
    append input "1 0.0 0.0 0.0\n"
    append input "STOP\n"
    append input "XCrySDen 1.0\n"
    append input "EOF"
    set nlat 0
    set num  ""

    cd $system(SCRDIR)
    set output [RunAndGetC95Output $system(c95_integrals) {} $input]
    xcDebug "output: \n$output"
	
    # check if error occured

    set is_error 0
    if { [string match *ERROR* $output] } { 	
	set is_error 1
	if { ($system(c95_version) == "06" || $system(c95_version) == "09" || $system(c95_version) == "14" ) && [string match "*STOP KEYWORD - EXECUTION STOPS*" $output] } {
	    # OK, we don't have error
	    set is_error 0
	}
    }
    
    if { $is_error } {
	return 0
    } else {
	set output [split $output \n]
	foreach line $output {
	    if [string match "*CRYSTAL FAMILY*" $line] {
		set inp(CRY_FAM)    [lrange $line 3 end]
	    }
	    if [string match "*CRYSTAL CLASS*" $line] {
		set inp(CRY_CLASS)  [lrange $line 6 end]
	    }
	    # LATTICE PARAMETERS
	    if { $nlat == 2 } {
		for {set i 1} {$i <= 6} {incr i} {
		    set ii [expr $i - 1]
		    set re($i) [lindex $line $ii]
		    for {set j 1} {$j <= 6} {incr j} {
			if { $re($i) == $par($j) } {
			    append cla "$cl($i) "			
			    # delete element that was found from "par" array
			    set par($j) ""
			}
		    }
		}
		incr nlat
	    }
	    if { $nlat == 1 } {
		incr nlat
	    }
	    if { [string match "*ICE PAR*" $line] && $nlat == 0 } {
		incr nlat
	    }
	}

	if { ! [info exists cla] } {
	    tk_messageBox -message "Ups! This is a bug in the program. Please
report it to: tone.kokalj@ijs.si with the detailed explanation what yoy were doing and if possible also Email the CRYSTAL input file you have been working on when the error occured !\n\nThe application will exit now." -type ok -icon info
	    exit_pr immediately
	}

	foreach item $cla {
	    if { $item == "A" || $item == "B" || $item == "C" } {
		append class1 "$item "
	    } else {
		append class2 "$item "
	    }
	}
	# get rid of last space-character in class1 & class2 
	set class1 [string trimright $class1 " "]
	if [info exists class2] { set class2 [string trimright $class2 " "] }
	set class ""
	lappend class $class1
	if [info exists class2] { lappend class $class2 }

	#set class [list $class]
	puts stdout "GROUP: $group CLASS: $class"
	return 1
    }
}