Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0+ */
  2/* utils.h
  3 * 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 512
 12#define MAXKEYVAL 160
 13#define HASHSIZE 101
 14#define is_shift -3
 15#define is_spk -2
 16#define is_input -1
 17
 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	else
 37		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}