| Commit | Line | Data |
|---|---|---|
| 32c903ac | 1 | /* $Id: man_hash.c,v 1.15 2009/09/23 11:53:45 kristaps Exp $ */ |
| 589e7c1d SW |
2 | /* |
| 3 | * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se> | |
| 4 | * | |
| 5 | * Permission to use, copy, modify, and distribute this software for any | |
| 6 | * purpose with or without fee is hereby granted, provided that the above | |
| 7 | * copyright notice and this permission notice appear in all copies. | |
| 8 | * | |
| 9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
| 10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| 11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
| 12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| 13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| 14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
| 15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| 16 | */ | |
| 17 | #include <sys/types.h> | |
| 18 | ||
| 19 | #include <assert.h> | |
| 20 | #include <limits.h> | |
| 21 | #include <stdlib.h> | |
| 22 | #include <string.h> | |
| 23 | ||
| 24 | #include "libman.h" | |
| 25 | ||
| 26 | static u_char table[26 * 6]; | |
| 27 | ||
| 28 | /* | |
| 29 | * XXX - this hash has global scope, so if intended for use as a library | |
| 30 | * with multiple callers, it will need re-invocation protection. | |
| 31 | */ | |
| 32 | void | |
| 33 | man_hash_init(void) | |
| 34 | { | |
| 35 | int i, j, x; | |
| 36 | ||
| 37 | memset(table, UCHAR_MAX, sizeof(table)); | |
| 38 | ||
| 39 | for (i = 0; i < MAN_MAX; i++) { | |
| 40 | x = man_macronames[i][0]; | |
| 41 | assert((x >= 65 && x <= 90) || | |
| 42 | (x >= 97 && x <= 122)); | |
| 43 | ||
| 44 | x -= (x <= 90) ? 65 : 97; | |
| 45 | x *= 6; | |
| 46 | ||
| 47 | for (j = 0; j < 6; j++) | |
| 48 | if (UCHAR_MAX == table[x + j]) { | |
| 49 | table[x + j] = (u_char)i; | |
| 50 | break; | |
| 51 | } | |
| 52 | assert(j < 6); | |
| 53 | } | |
| 54 | } | |
| 55 | ||
| 56 | int | |
| 57 | man_hash_find(const char *tmp) | |
| 58 | { | |
| 59 | int x, i, tok; | |
| 60 | ||
| 61 | if (0 == (x = tmp[0])) | |
| 62 | return(MAN_MAX); | |
| 63 | if ( ! ((x >= 65 && x <= 90) || (x >= 97 && x <= 122))) | |
| 64 | return(MAN_MAX); | |
| 65 | ||
| 66 | x -= (x <= 90) ? 65 : 97; | |
| 67 | x *= 6; | |
| 68 | ||
| 69 | for (i = 0; i < 6; i++) { | |
| 70 | if (UCHAR_MAX == (tok = table[x + i])) | |
| 71 | return(MAN_MAX); | |
| 72 | if (0 == strcmp(tmp, man_macronames[tok])) | |
| 73 | return(tok); | |
| 74 | } | |
| 75 | ||
| 76 | return(MAN_MAX); | |
| 77 | } |