brintos

brintos / linux-shallow public Read only

0
0
Text · 2.0 KiB · 4ce9a12 Raw
103 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ */2/* utils.h3 * originally written by: Kirk Reiser.4 *5 ** Copyright (C) 2002  Kirk Reiser.6 *  Copyright (C) 2003  David Borowski.7 */8 9#include <stdio.h>10 11#define MAXKEYS 51212#define MAXKEYVAL 16013#define HASHSIZE 10114#define is_shift -315#define is_spk -216#define is_input -117 18struct st_key {19	char *name;20	struct st_key *next;21	int value, shift;22};23 24struct st_key key_table[MAXKEYS];25struct st_key *extra_keys = key_table+HASHSIZE;26char *def_name, *def_val;27FILE *infile;28int lc;29 30char filename[256];31 32static inline void open_input(const char *dir_name, const char *name)33{34	if (dir_name)35		snprintf(filename, sizeof(filename), "%s/%s", dir_name, name);36	else37		snprintf(filename, sizeof(filename), "%s", name);38	infile = fopen(filename, "r");39	if (infile == 0) {40		fprintf(stderr, "can't open %s\n", filename);41		exit(1);42	}43	lc = 0;44}45 46static inline int oops(const char *msg, const char *info)47{48	if (info == NULL)49		info = "";50	fprintf(stderr, "error: file %s line %d\n", filename, lc);51	fprintf(stderr, "%s %s\n", msg, info);52	exit(1);53}54 55static inline struct st_key *hash_name(char *name)56{57	unsigned char *pn = (unsigned char *)name;58	int hash = 0;59 60	while (*pn) {61		hash = (hash * 17) & 0xfffffff;62		if (isupper(*pn))63			*pn = tolower(*pn);64		hash += (int)*pn;65		pn++;66	}67	hash %= HASHSIZE;68	return &key_table[hash];69}70 71static inline struct st_key *find_key(char *name)72{73	struct st_key *this = hash_name(name);74 75	while (this) {76		if (this->name && !strcmp(name, this->name))77			return this;78		this = this->next;79	}80	return this;81}82 83static inline struct st_key *add_key(char *name, int value, int shift)84{85	struct st_key *this = hash_name(name);86 87	if (extra_keys-key_table >= MAXKEYS)88		oops("out of key table space, enlarge MAXKEYS", NULL);89	if (this->name != NULL) {90		while (this->next) {91			if (!strcmp(name, this->name))92				oops("attempt to add duplicate key", name);93			this = this->next;94		}95		this->next = extra_keys++;96		this = this->next;97	}98	this->name = strdup(name);99	this->value = value;100	this->shift = shift;101	return this;102}103