4 /* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004
5 Free Software Foundation, Inc.
6 Written by James Clark (jjc@jclark.com)
8 This file is part of groff.
10 groff is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 2, or (at your option) any later
15 groff is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 You should have received a copy of the GNU General Public License along
21 with groff; see the file COPYING. If not, write to the Free Software
22 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
37 class character_indexer
{
41 int ascii_char_index(unsigned char);
42 int named_char_index(const char *);
43 int numbered_char_index(int);
45 enum { NSMALL
= 256 };
48 int small_number_index
[NSMALL
];
52 character_indexer::character_indexer()
56 for (i
= 0; i
< 256; i
++)
58 for (i
= 0; i
< NSMALL
; i
++)
59 small_number_index
[i
] = -1;
62 character_indexer::~character_indexer()
66 int character_indexer::ascii_char_index(unsigned char c
)
68 if (ascii_index
[c
] < 0)
69 ascii_index
[c
] = next_index
++;
70 return ascii_index
[c
];
73 int character_indexer::numbered_char_index(int n
)
75 if (n
>= 0 && n
< NSMALL
) {
76 if (small_number_index
[n
] < 0)
77 small_number_index
[n
] = next_index
++;
78 return small_number_index
[n
];
80 // Not the most efficient possible implementation.
81 char buf
[INT_DIGITS
+ 3];
83 strcpy(buf
+ 1, i_to_a(n
));
84 return named_char_index(buf
);
87 int character_indexer::named_char_index(const char *s
)
89 int *np
= table
.lookup(s
);
98 static character_indexer indexer
;
100 int font::number_to_index(int n
)
102 return indexer
.numbered_char_index(n
);
105 int font::name_to_index(const char *s
)
107 assert(s
!= 0 && s
[0] != '\0' && s
[0] != ' ');
109 return indexer
.ascii_char_index(s
[0]);
110 /* char128 and \200 are synonyms */
111 if (s
[0] == 'c' && s
[1] == 'h' && s
[2] == 'a' && s
[3] == 'r') {
113 long n
= strtol(s
+ 4, &val
, 10);
114 if (val
!= s
+ 4 && *val
== '\0' && n
>= 0 && n
< 256)
115 return indexer
.ascii_char_index((unsigned char)n
);
117 return indexer
.named_char_index(s
);