Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
893cc958
Commit
893cc958
authored
Aug 31, 1992
by
Dennis Glatting
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
minor documentation changes.
From-SVN: r2007
parent
4037e7bf
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
61 additions
and
98 deletions
+61
-98
gcc/objc/hash.c
+61
-98
No files found.
gcc/objc/hash.c
View file @
893cc958
...
...
@@ -25,10 +25,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
the executable file might be covered by the GNU General Public License. */
/*
$Header: /usr/user/dennis_glatting/ObjC/c-runtime/dispatch
.common/RCS/hash.c,v 0.12 1992/04/13 11:43:08 dennisg Exp dennisg
$
$Author: d
ennisg
$
$Date: 1992/0
4/13 11:43:0
8 $
$Header: /usr/user/dennis_glatting/ObjC/c-runtime/dispatch
/RCS/hash.c,v 0.13 1992/08/18 04:46:58 dglattin Exp
$
$Author: d
glattin
$
$Date: 1992/0
8/18 04:46:5
8 $
$Log: hash.c,v $
* Revision 0.13 1992/08/18 04:46:58 dglattin
* Saving a working version before release.
*
* Revision 0.12 1992/04/13 11:43:08 dennisg
* Check in after array version of run-time works.
* Expect more changes as hash version and other changes are made.
...
...
@@ -110,41 +113,31 @@ hash_new (u_int sizeOfHash, HashFunc aHashFunc, CompareFunc aCompareFunc) {
Cache_t
retCache
;
/* Pass me a value greater
than 0 and a power of 2. */
/* Pass me a value greater than 0 and a power of 2. */
assert
(
sizeOfHash
);
assert
(
!
(
sizeOfHash
&
(
sizeOfHash
-
1
)));
assert
(
!
(
sizeOfHash
&
(
sizeOfHash
-
1
)));
/* Allocate the cache
structure. calloc () insures
its initialization for
default values. */
/* Allocate the cache structure. calloc () insures
its initialization for default values. */
retCache
=
calloc
(
1
,
sizeof
(
Cache
));
assert
(
retCache
);
/* Allocate the array of
buckets for the cache.
calloc() initializes all of
the pointers to NULL. */
/* Allocate the array of buckets for the cache.
calloc() initializes all of the pointers to NULL. */
retCache
->
theNodeTable
=
calloc
(
sizeOfHash
,
sizeof
(
CacheNode_t
));
assert
(
retCache
->
theNodeTable
);
retCache
->
sizeOfHash
=
sizeOfHash
;
/* This should work for all
processor architectures? */
retCache
->
mask
=
(
sizeOfHash
-
1
);
/* This should work for all processor architectures? */
retCache
->
mask
=
(
sizeOfHash
-
1
);
/* Store the hashing function
so that codes can be
computed. */
retCache
->
hashFunc
=
aHashFunc
;
/* Store the hashing function so that codes can be computed. */
retCache
->
hashFunc
=
aHashFunc
;
/* Store the function that
compares hash keys to
determine if they are
equal. */
retCache
->
compareFunc
=
aCompareFunc
;
/* Store the function that compares hash keys to
determine if they are equal. */
retCache
->
compareFunc
=
aCompareFunc
;
return
retCache
;
}
...
...
@@ -156,13 +149,11 @@ hash_delete (Cache_t theCache) {
CacheNode_t
aNode
;
/* Purge all key/value pairs
from the table. */
/* Purge all key/value pairs from the table. */
while
(
aNode
=
hash_next
(
theCache
,
NULL
))
hash_remove
(
theCache
,
aNode
->
theKey
);
/* Release the array of nodes
and the cache itself. */
/* Release the array of nodes and the cache itself. */
free
(
theCache
->
theNodeTable
);
free
(
theCache
);
}
...
...
@@ -177,15 +168,13 @@ hash_add (Cache_t* theCache, void* aKey, void* aValue) {
assert
(
aCacheNode
);
/* Initialize the new node. */
/* Initialize the new node. */
aCacheNode
->
theKey
=
aKey
;
aCacheNode
->
theValue
=
aValue
;
aCacheNode
->
nextNode
=
(
*
(
*
theCache
)
->
theNodeTable
)[
indx
];
/* Debugging.
Check the list for another
key. */
/* Debugging.
Check the list for another key. */
#ifdef DEBUG
{
CacheNode_t
checkHashNode
=
(
*
(
*
theCache
)
->
theNodeTable
)[
indx
];
...
...
@@ -197,47 +186,38 @@ hash_add (Cache_t* theCache, void* aKey, void* aValue) {
}
#endif
/* Install the node as the
first element on the list. */
/* Install the node as the first element on the list. */
(
*
(
*
theCache
)
->
theNodeTable
)[
indx
]
=
aCacheNode
;
/* Bump the number of entries
in the cache. */
/* Bump the number of entries in the cache. */
++
(
*
theCache
)
->
entriesInHash
;
/* Check the hash table's
fullness. We're going
to expand if it is above
the fullness level. */
/* Check the hash table's fullness. We're going
to expand if it is above the fullness level. */
if
(
FULLNESS
(
*
theCache
))
{
/* The hash table has reached
its fullness level. Time to
expand it.
/* The hash table has reached
its fullness level. Time to
expand it.
I'm using a slow method
here but is built on other
primitive functions thereby
increasing its
correctness. */
I'm using a slow method here but is built on other
primitive functions thereby increasing its
correctness. */
CacheNode_t
aNode
=
NULL
;
Cache_t
newCache
=
hash_new
(
EXPANSION
(
*
theCache
),
(
*
theCache
)
->
hashFunc
,
(
*
theCache
)
->
compareFunc
);
(
*
theCache
)
->
hashFunc
,
(
*
theCache
)
->
compareFunc
);
DEBUG_PRINTF
(
stderr
,
"Expanding cache %#x from %d to %d
\n
"
,
*
theCache
,
(
*
theCache
)
->
sizeOfHash
,
newCache
->
sizeOfHash
);
*
theCache
,
(
*
theCache
)
->
sizeOfHash
,
newCache
->
sizeOfHash
);
/* Copy the nodes from the
first hash table to the
new one. */
/* Copy the nodes from the first hash table to the new one. */
while
(
aNode
=
hash_next
(
*
theCache
,
aNode
))
hash_add
(
&
newCache
,
aNode
->
theKey
,
aNode
->
theValue
);
/* Trash the old cache. */
/* Trash the old cache. */
hash_delete
(
*
theCache
);
/* Return a pointer to the new
hash table. */
/* Return a pointer to the new hash table. */
*
theCache
=
newCache
;
}
}
...
...
@@ -250,20 +230,16 @@ hash_remove (Cache_t theCache, void* aKey) {
CacheNode_t
aCacheNode
=
(
*
theCache
->
theNodeTable
)[
indx
];
/* We assume there is an entry
in the table. Error if it
is not. */
/* We assume there is an entry in the table. Error if it is not. */
assert
(
aCacheNode
);
/* Special case. First element
is the key/value pair to be
removed. */
/* Special case. First element is the key/value pair to be removed. */
if
((
*
theCache
->
compareFunc
)(
aCacheNode
->
theKey
,
aKey
))
{
(
*
theCache
->
theNodeTable
)[
indx
]
=
aCacheNode
->
nextNode
;
free
(
aCacheNode
);
}
else
{
/* Otherwise, find the hash
entry. */
/* Otherwise, find the hash
entry. */
CacheNode_t
prevHashNode
=
aCacheNode
;
BOOL
removed
=
NO
;
...
...
@@ -278,8 +254,7 @@ hash_remove (Cache_t theCache, void* aKey) {
assert
(
removed
);
}
/* Decrement the number of
entries in the hash table. */
/* Decrement the number of entries in the hash table. */
--
theCache
->
entriesInHash
;
}
...
...
@@ -290,60 +265,48 @@ hash_next (Cache_t theCache, CacheNode_t aCacheNode) {
CacheNode_t
theCacheNode
=
aCacheNode
;
/* If the scan is being started
then reset the last node
visitied pointer and bucket
index. */
/* If the scan is being started then reset the last node
visitied pointer and bucket index. */
if
(
!
theCacheNode
)
theCache
->
lastBucket
=
0
;
/* If there is a node visited
last then check for another
entry in the same bucket;
Otherwise step to the next
bucket. */
/* If there is a node visited last then check for another
entry in the same bucket; Otherwise step to the next bucket. */
if
(
theCacheNode
)
if
(
theCacheNode
->
nextNode
)
/* There is a node which
follows the last node
returned. Step to that node
and retun it. */
/* There is a node which follows the last node
returned. Step to that node and retun it. */
return
theCacheNode
->
nextNode
;
else
++
theCache
->
lastBucket
;
/* If the list isn't exhausted
then search the buckets for
other nodes. */
/* If the list isn't exhausted then search the buckets for
other nodes. */
if
(
theCache
->
lastBucket
<
theCache
->
sizeOfHash
)
{
/* Scan the remainder of the
buckets looking for an entry
at the head of the list.
Return the first item
found. */
/* Scan the remainder of the buckets looking for an entry
at the head of the list. Return the first item found. */
while
(
theCache
->
lastBucket
<
theCache
->
sizeOfHash
)
if
((
*
theCache
->
theNodeTable
)[
theCache
->
lastBucket
])
return
(
*
theCache
->
theNodeTable
)[
theCache
->
lastBucket
];
else
++
theCache
->
lastBucket
;
/* No further nodes were found
in the hash table. */
/* No further nodes were found in the hash table. */
return
NULL
;
}
else
return
NULL
;
}
/* Given key, return its
value. Return NULL if the
key/value pair isn't in
the hash.
*/
/*
* Given key, return its
value. Return NULL if the
* key/value pair isn't in the hash.
*/
void
*
hash_value_for_key
(
Cache_t
theCache
,
void
*
aKey
)
{
CacheNode_t
aCacheNode
=
(
*
theCache
->
theNodeTable
)[(
*
theCache
->
hashFunc
)(
theCache
,
aKey
)];
(
*
theCache
->
theNodeTable
)[(
*
theCache
->
hashFunc
)(
theCache
,
aKey
)];
void
*
retVal
=
NULL
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment