2022-06-12 20:22:44 +03:00
/* SPDX-License-Identifier: GPL-2.0+ */
/* utils.h
* originally written by : Kirk Reiser .
*
* * Copyright ( C ) 2002 Kirk Reiser .
* Copyright ( C ) 2003 David Borowski .
*/
# include <stdio.h>
# define MAXKEYS 512
# define MAXKEYVAL 160
# define HASHSIZE 101
# define is_shift -3
# define is_spk -2
# define is_input -1
struct st_key {
char * name ;
struct st_key * next ;
int value , shift ;
} ;
struct st_key key_table [ MAXKEYS ] ;
struct st_key * extra_keys = key_table + HASHSIZE ;
char * def_name , * def_val ;
FILE * infile ;
int lc ;
char filename [ 256 ] ;
static inline void open_input ( const char * dir_name , const char * name )
{
if ( dir_name )
snprintf ( filename , sizeof ( filename ) , " %s/%s " , dir_name , name ) ;
else
snprintf ( filename , sizeof ( filename ) , " %s " , name ) ;
infile = fopen ( filename , " r " ) ;
if ( infile = = 0 ) {
fprintf ( stderr , " can't open %s \n " , filename ) ;
exit ( 1 ) ;
}
lc = 0 ;
}
static inline int oops ( const char * msg , const char * info )
{
if ( info = = NULL )
info = " " ;
fprintf ( stderr , " error: file %s line %d \n " , filename , lc ) ;
fprintf ( stderr , " %s %s \n " , msg , info ) ;
exit ( 1 ) ;
}
static inline struct st_key * hash_name ( char * name )
{
2022-10-17 11:09:36 +03:00
unsigned char * pn = ( unsigned char * ) name ;
2022-06-12 20:22:44 +03:00
int hash = 0 ;
while ( * pn ) {
hash = ( hash * 17 ) & 0xfffffff ;
if ( isupper ( * pn ) )
* pn = tolower ( * pn ) ;
hash + = ( int ) * pn ;
pn + + ;
}
hash % = HASHSIZE ;
return & key_table [ hash ] ;
}
static inline struct st_key * find_key ( char * name )
{
struct st_key * this = hash_name ( name ) ;
while ( this ) {
if ( this - > name & & ! strcmp ( name , this - > name ) )
return this ;
this = this - > next ;
}
return this ;
}
static inline struct st_key * add_key ( char * name , int value , int shift )
{
struct st_key * this = hash_name ( name ) ;
if ( extra_keys - key_table > = MAXKEYS )
oops ( " out of key table space, enlarge MAXKEYS " , NULL ) ;
if ( this - > name ! = NULL ) {
while ( this - > next ) {
if ( ! strcmp ( name , this - > name ) )
oops ( " attempt to add duplicate key " , name ) ;
this = this - > next ;
}
this - > next = extra_keys + + ;
this = this - > next ;
}
this - > name = strdup ( name ) ;
this - > value = value ;
this - > shift = shift ;
return this ;
}