Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
2.1 kB · 102 lines
C
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103/* 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){ unsigned char *pn = (unsigned char *)name; 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;}