xref: /plan9/sys/src/cmd/gs/src/inameidx.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1999 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: inameidx.h,v 1.4 2002/02/21 22:24:53 giles Exp $ */
18 /* Name index definitions */
19 
20 #ifndef inameidx_INCLUDED
21 #  define inameidx_INCLUDED
22 
23 #include "gconfigv.h"		/* defines EXTEND_NAMES */
24 
25 /*
26  * The name table machinery has two slightly different configurations:
27  * a faster one that limits the total number of names to 64K and allows
28  * names up to 16K in size, and a slightly slower one that limits
29  * the total to 4M and restricts names to 256 characters.
30  */
31 #ifndef EXTEND_NAMES		/* # of bits beyond 16 */
32 #  define EXTEND_NAMES 0
33 #endif
34 
35 /* Define the size of a name sub-table. */
36 #define NT_LOG2_SUB_SIZE (8 + (EXTEND_NAMES / 2))
37 # define NT_SUB_SIZE (1 << NT_LOG2_SUB_SIZE)
38 # define NT_SUB_INDEX_MASK (NT_SUB_SIZE - 1)
39 
40 /*
41  * Define the first few entries of the name table.  Entry 0 is left unused.
42  * The entry with count = 1 is the entry for the 0-length name.
43  * The next NT_1CHAR_SIZE entries (in count order) are 1-character names.
44  */
45 #define NT_1CHAR_SIZE 128
46 #define NT_1CHAR_FIRST 2
47 #define NT_1CHAR_NAMES_DATA\
48    0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\
49   16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\
50   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\
51   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\
52   64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,\
53   80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,\
54   96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,\
55  112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
56 
57 /* ---------------- Name count/index mapping ---------------- */
58 
59 /*
60  * We scramble the assignment order within a sub-table, so that
61  * dictionary lookup doesn't have to scramble the index.
62  * The scrambling algorithm must have three properties:
63  *      - It must map 0 to 0;
64  *      - It must only scramble the sub-table index;
65  *      - It must be a permutation on the sub-table index.
66  * Something very simple works just fine.
67  */
68 #define NAME_COUNT_TO_INDEX_FACTOR 23
69 #define name_count_to_index(cnt)\
70   (((cnt) & (-NT_SUB_SIZE)) +\
71    (((cnt) * NAME_COUNT_TO_INDEX_FACTOR) & NT_SUB_INDEX_MASK))
72 /*
73  * The reverse permutation requires finding a number R such that
74  * NAME_COUNT_TO_INDEX_FACTOR * R = 1 mod NT_SUB_SIZE.
75  * The value given below works for NT_SUB_SIZE any power of 2 up to 4096.
76  * This is not currently used anywhere.
77  */
78 #define NAME_INDEX_TO_COUNT_FACTOR 1959
79 #define name_index_to_count(nidx)\
80   (((nidx) & (-NT_SUB_SIZE)) +\
81    (((nidx) * NAME_INDEX_TO_COUNT_FACTOR) & NT_SUB_INDEX_MASK))
82 
83 #endif /* inameidx_INCLUDED */
84