This file is indexed.

/usr/lib/bash/hashstash.sh is in libbash 0.9.11-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
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#               Do not run this script directly!
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
###########################################################################
# Copyright (c) 2004-2009 Hai Zaar and Gil Ran                            #
#                                                                         #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of version 3 of the GNU General Public License as       #
# published by the Free Software Foundation.                              #
#                                                                         #
###########################################################################
#
# $Date: 2009-05-10 20:08:10 +0300 (Sun, 10 May 2009) $
# $Author: hai-zaar $
#
# Set of fuctions that implement hash data structure. 
# Each hash can have both keys and subhashes. 
# WARNING:
#	You can not have key and subhash with the same name. 
#	Its because, we do not have actual data types. I.e. you can call
#	hashGet on hash with its subhash as key - it will return list of subhash's keys.
#
# Hash Variables
#	The hash variable is transparent to the user of these functions. 
#	Such variables should be used only through the functions.
# 	Each "hash variable" holds a list of keys.
# 	For example: The variable for the hash DIR that holds the `keys' `etc' `bin' `lib'
#	will be: _HASH_DIRS_=" etc bin lib "
# 	Notice that before and _after_  every key there must be a white space (can be more then one).
#
# Key Variables
# 	The key value is held in a variable that is named ${HashName}${Key}_. 
#	Note trailing `_') in ${HashName}.
# 	For example: The value of the key `etc' of the hash DIR will be in the variable _HASH_DIRS_etc_.
# 	Notice that this name can also be the name of a hash named DIRS_etc.
#	The key variable is also transparent to the user of these functions. 
#	These variables should be used only through the functions.
#
# Sub-Hashes
#	A sub-hash is a hash key that holds a keys list.
# 	This way, if you set a hash key value to be a list in the suitable form, 
#	it can be used as a "sub hash".
# 	Use of hashSet ensures that the list will be in the right form.

#-------------------------------------------------------------------------
#EXPORT=hashGet hashSet hashKeys hashDelete hashRemove
#REQUIRE=
#-------------------------------------------------------------------------

# The prefix of the hashes variables. 
# NOTE: Do not name any of your variables _HASH_*
PREFIX="__hash_"

#
# DEBUG=1 - If DEBUG will not be commented, debug printouts will be enabled
#DEBUG=1

###################
#### FUNCTIONS ####
###################

#
# hashSet <Value> <Key> <HashName> [SubHashName [...] ]
#
#	Adds a value to the hash. Value will be the value of the key Key in the hash HashName.
#	For example if you have (or want to define) hash C, which is subhash of hash B, 
#	which is subhash of hash A and C has key ckey1 with value cval1, then you should run:
#		hashSet cval1 ckey1 A B C 
#	
#	Parameters:
#		Value		- The value to set in HashName[Key].
#		Key			- The key for the value Value.
#		HashName 
#		[SubHashName [...] ]
#			A string that contains the name of the hash. 
#			If the hash is a sub hash of another hash, the "father hash" 
#			name MUST BE WRITTEN FIRST, followed by the sub-hash name.
hashSet()
{
	local Value=$1
	local Key=$2
	shift 2
	
	# Parse the key variable name ${PREFIX}_${HashName}_${SubHashName}_..._${Key}_
	# Example: For the parameters "VALUE1 KEY1 DIRS ETC ", the variable name will be _HASH_DIRS_ETC_KEY1_
	local ParamsString="$*"
	local HashName=${PREFIX}${ParamsString// /_}_
	local KeyVarName=${HashName}${Key}_

	# Set the value in the key variable
	test $DEBUG && echo eval "$KeyVarName"'="'$Value'"' 1>&2
	eval "$KeyVarName"'="'$Value'"'

	# Check if the key is not in the keys list
	hashKeys $*
	test $DEBUG && echo retval=$retval 1>&2
	if ! [[ $retval = *" $Key "*  ]] ; then
		# Add the key to the keys list
		test $DEBUG && echo eval $HashName'="${'$HashName'}'" $Key "'"' 1>&2
		eval $HashName'=${'$HashName'}"'" $Key "'"'
	fi
}

#
# $retval hashGet <Key> <HashName> [SubHashName [...] ]
#	Returns the value of Key in HashName in the variable $retval.
#	
#	Parameters:
#		HashName 
#		[SubHashName [...] ]
#			A string that contains the name of the hash.
#			If the hash is a sub hash of another hash, the "father hash" 
#			name MUST BE WRITTEN FIRST, followed by the sub-hash name.
#			See hashSet for example.
#	Key
#		The hash key of the value \c Value.
#
#	Return value:
#		The value of the key Key in the hash HashName.
#		The value is returned in the variable $retval.
hashGet()
{
	local Key=$1
	shift
	
	# Parse the key variable name ${PREFIX}_${HashName}_${SubHashName}_..._${Key}_
	# Example: For the parameters "KEY1 DIRS ETC", the variable name will be _HASH_DIRS_ETC_KEY1_
	local ParamsString="$*"
	local HashName=${PREFIX}${ParamsString// /_}_
	local KeyVarName=${HashName}${Key}_
	
	# Put the value of the key in $retval
	test $DEBUG && echo eval 'retval=${'$KeyVarName'}' 1>&2
	eval 'retval=${'$KeyVarName'}'
}

#
# $retval hashKeys <HashName> [SubHashName [...] ]
#
#	Returns a list of keys of the hash HashName in the variable $retval.
#
#	Parametes:
#		HashName
#		[SubHashName [...] ]
#			A string that contains the name of the hash. 
#			If the hash is a sub hash of another hash, the "father hash" 
#			name MUST BE WRITTEN FIRST, followed by the sub-hash name.
#			See hashSet for example.
#
#	Return value:
#		A list of the keys of the hash HashName.
#		The list is returned in the variable $retval.
hashKeys()
{
	# Parse the hash name ${PREFIX}${HashName}_${SubHashName}_...
	# Example: For the parameters "DIRS ETC" the hash name will be _HASH_DIRS_ETC_
	local ParamsString="$*"
	local HashName=${PREFIX}${ParamsString// /_}_
	
	test $DEBUG && echo eval 'retval=${'$HashName'}' 1>&2
	eval 'retval=${'$HashName'}'
}

#
# hashRemove <Key> <HashName> [SubHashName [...] ]
#
#	Removes the key Key from the hash HashName
#	
#	Parameters:
#		HashName
#		[SubHashName [...] ]
#			A string that contains the name of the hash.
#			If the hash is a sub hash of another hash, the "father hash" 
#			name MUST BE WRITTEN FIRST, followed by the sub-hash name.
#			See hashSet for example.
#		Key
#			The hash key that gets the value Value.
hashRemove()
{
	local Key=$1
	shift
	
	# Parse the hash name ${PREFIX}${HashName}_${SubHashName}_...
	# Example: For the parameters "DIRS ETC" the hash name will be _HASH_DIRS_ETC_
	local ParamsString="$*"
	local HashName=${PREFIX}${ParamsString// /_}_
	local KeyVarName=${HashName}${Key}_

	# unset the key variable
	eval "unset ${KeyVarName}"

	# Remove the key from the hash	
	eval $HashName'=${'$HashName'//' $Key '/}'
}

#
# hashDelete <HashName> [SubHashName [...] ]
#
#	Deletes the hash HashName [ SubHashName [...]]
#	
#	Parameters:
#		HashName
#		[SubHashName [...] ]
#			A string that contains the name of the hash.
#			If the hash is a sub hash of another hash, the "father hash"
#			name MUST BE WRITTEN FIRST, followed by the sub-hash name.
#			See "hashSet" for example.
hashDelete()
{
	# Parse the hash name ${PREFIX}${HashName}_${SubHashName}_...
	# Example: For the parameters "DIRS ETC" the hash name will be _HASH_DIRS_ETC_
	local ParamsString="$*"
	local HashName=${PREFIX}${ParamsString// /_}_

	# unset the hash variable
	unset `eval '${'$HashName'}'`
}