![]() ![]() | ![]() |
version 1.8, 2009/06/10 20:18:43 | version 1.14, 2009/09/17 07:41:28 | ||
---|---|---|---|
|
|
||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
*/ | */ | ||
#include <assert.h> | #include <assert.h> | ||
#include <limits.h> | |||
#include <stdlib.h> | #include <stdlib.h> | ||
#include <string.h> | #include <string.h> | ||
#include "libman.h" | #include "libman.h" | ||
static u_char table[26 * 6]; | |||
/* ARGUSED */ | /* | ||
* XXX - this hash has global scope, so if intended for use as a library | |||
* with multiple callers, it will need re-invocation protection. | |||
*/ | |||
void | void | ||
man_hash_free(void *htab) | man_hash_init(void) | ||
{ | { | ||
free(htab); | |||
} | |||
/* ARGUSED */ | |||
void * | |||
man_hash_alloc(void) | |||
{ | |||
int *htab; | |||
int i, j, x; | int i, j, x; | ||
htab = calloc(26 * 5, sizeof(int)); | memset(table, UCHAR_MAX, sizeof(table)); | ||
if (NULL == htab) | |||
return(NULL); | |||
for (i = 1; i < MAN_MAX; i++) { | for (i = 0; i < MAN_MAX; i++) { | ||
x = man_macronames[i][0]; | x = man_macronames[i][0]; | ||
assert((x >= 65 && x <= 90) || | assert((x >= 65 && x <= 90) || | ||
(x >= 97 && x <= 122)); | (x >= 97 && x <= 122)); | ||
x -= (x <= 90) ? 65 : 97; | x -= (x <= 90) ? 65 : 97; | ||
x *= 5; | x *= 6; | ||
for (j = 0; j < 5; j++) | for (j = 0; j < 6; j++) | ||
if (0 == htab[x + j]) { | if (UCHAR_MAX == table[x + j]) { | ||
htab[x + j] = i; | table[x + j] = (u_char)i; | ||
break; | break; | ||
} | } | ||
assert(j < 6); | |||
assert(j < 5); | |||
} | } | ||
return((void *)htab); | |||
} | } | ||
int | int | ||
man_hash_find(const void *arg, const char *tmp) | man_hash_find(const char *tmp) | ||
{ | { | ||
int x, i, tok; | int x, i, tok; | ||
const int *htab; | |||
htab = (const int *)arg; | |||
if (0 == (x = tmp[0])) | if (0 == (x = tmp[0])) | ||
return(MAN_MAX); | return(MAN_MAX); | ||
if ( ! ((x >= 65 && x <= 90) || (x >= 97 && x <= 122))) | if ( ! ((x >= 65 && x <= 90) || (x >= 97 && x <= 122))) | ||
return(MAN_MAX); | return(MAN_MAX); | ||
x -= (x <= 90) ? 65 : 97; | x -= (x <= 90) ? 65 : 97; | ||
x *= 5; | x *= 6; | ||
for (i = 0; i < 5; i++) { | for (i = 0; i < 6; i++) { | ||
if (0 == (tok = htab[x + i])) | if (UCHAR_MAX == (tok = table[x + i])) | ||
return(MAN_MAX); | return(MAN_MAX); | ||
if (0 == strcmp(tmp, man_macronames[tok])) | if (0 == strcmp(tmp, man_macronames[tok])) | ||
return(tok); | return(tok); | ||
|
|
||
return(MAN_MAX); | return(MAN_MAX); | ||
} | } | ||