Return to man_hash.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.20, 2010/05/15 22:49:58 | version 1.29, 2014/12/01 08:05:52 | ||
---|---|---|---|
|
|
||
/* $Id$ */ | /* $Id$ */ | ||
/* | /* | ||
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se> | * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> | ||
* | * | ||
* Permission to use, copy, modify, and distribute this software for any | * Permission to use, copy, modify, and distribute this software for any | ||
* purpose with or without fee is hereby granted, provided that the above | * purpose with or without fee is hereby granted, provided that the above | ||
|
|
||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
*/ | */ | ||
#ifdef HAVE_CONFIG_H | |||
#include "config.h" | #include "config.h" | ||
#endif | |||
#include <sys/types.h> | #include <sys/types.h> | ||
#include <assert.h> | #include <assert.h> | ||
#include <ctype.h> | #include <ctype.h> | ||
#include <limits.h> | #include <limits.h> | ||
#include <stdlib.h> | |||
#include <string.h> | #include <string.h> | ||
#include "man.h" | |||
#include "libman.h" | #include "libman.h" | ||
#define HASH_DEPTH 6 | #define HASH_DEPTH 6 | ||
#define HASH_ROW(x) do { \ | #define HASH_ROW(x) do { \ | ||
if (isupper((u_char)(x))) \ | if (isupper((unsigned char)(x))) \ | ||
(x) -= 65; \ | (x) -= 65; \ | ||
else \ | else \ | ||
(x) -= 97; \ | (x) -= 97; \ | ||
|
|
||
* macro (the integer value of the enum stored as a char to save a bit | * macro (the integer value of the enum stored as a char to save a bit | ||
* of space). | * of space). | ||
*/ | */ | ||
static u_char table[26 * HASH_DEPTH]; | static unsigned char table[26 * HASH_DEPTH]; | ||
/* | /* | ||
* XXX - this hash has global scope, so if intended for use as a library | * XXX - this hash has global scope, so if intended for use as a library | ||
* with multiple callers, it will need re-invocation protection. | * with multiple callers, it will need re-invocation protection. | ||
|
|
||
memset(table, UCHAR_MAX, sizeof(table)); | memset(table, UCHAR_MAX, sizeof(table)); | ||
assert(/* LINTED */ | assert(MAN_MAX < UCHAR_MAX); | ||
MAN_MAX < UCHAR_MAX); | |||
for (i = 0; i < (int)MAN_MAX; i++) { | for (i = 0; i < (int)MAN_MAX; i++) { | ||
x = man_macronames[i][0]; | x = man_macronames[i][0]; | ||
assert(isalpha((u_char)x)); | assert(isalpha((unsigned char)x)); | ||
HASH_ROW(x); | HASH_ROW(x); | ||
for (j = 0; j < HASH_DEPTH; j++) | for (j = 0; j < HASH_DEPTH; j++) | ||
if (UCHAR_MAX == table[x + j]) { | if (UCHAR_MAX == table[x + j]) { | ||
table[x + j] = (u_char)i; | table[x + j] = (unsigned char)i; | ||
break; | break; | ||
} | } | ||
|
|
||
} | } | ||
} | } | ||
enum mant | enum mant | ||
man_hash_find(const char *tmp) | man_hash_find(const char *tmp) | ||
{ | { | ||
|
|
||
if ('\0' == (x = tmp[0])) | if ('\0' == (x = tmp[0])) | ||
return(MAN_MAX); | return(MAN_MAX); | ||
if ( ! (isalpha((u_char)x))) | if ( ! (isalpha((unsigned char)x))) | ||
return(MAN_MAX); | return(MAN_MAX); | ||
HASH_ROW(x); | HASH_ROW(x); |