162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/* Generate kernel symbol version hashes.
362306a36Sopenharmony_ci   Copyright 1996, 1997 Linux International.
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci   New implementation contributed by Richard Henderson <rth@tamu.edu>
662306a36Sopenharmony_ci   Based on original work by Bjorn Ekwall <bj0rn@blox.se>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci   This file is part of the Linux modutils.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef MODUTILS_GENKSYMS_H
1362306a36Sopenharmony_ci#define MODUTILS_GENKSYMS_H 1
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <stdio.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cienum symbol_type {
1862306a36Sopenharmony_ci	SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION,
1962306a36Sopenharmony_ci	SYM_ENUM_CONST
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cienum symbol_status {
2362306a36Sopenharmony_ci	STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct string_list {
2762306a36Sopenharmony_ci	struct string_list *next;
2862306a36Sopenharmony_ci	enum symbol_type tag;
2962306a36Sopenharmony_ci	int in_source_file;
3062306a36Sopenharmony_ci	char *string;
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistruct symbol {
3462306a36Sopenharmony_ci	struct symbol *hash_next;
3562306a36Sopenharmony_ci	const char *name;
3662306a36Sopenharmony_ci	enum symbol_type type;
3762306a36Sopenharmony_ci	struct string_list *defn;
3862306a36Sopenharmony_ci	struct symbol *expansion_trail;
3962306a36Sopenharmony_ci	struct symbol *visited;
4062306a36Sopenharmony_ci	int is_extern;
4162306a36Sopenharmony_ci	int is_declared;
4262306a36Sopenharmony_ci	enum symbol_status status;
4362306a36Sopenharmony_ci	int is_override;
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_citypedef struct string_list **yystype;
4762306a36Sopenharmony_ci#define YYSTYPE yystype
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciextern int cur_line;
5062306a36Sopenharmony_ciextern char *cur_filename;
5162306a36Sopenharmony_ciextern int in_source_file;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct symbol *find_symbol(const char *name, enum symbol_type ns, int exact);
5462306a36Sopenharmony_cistruct symbol *add_symbol(const char *name, enum symbol_type type,
5562306a36Sopenharmony_ci			  struct string_list *defn, int is_extern);
5662306a36Sopenharmony_civoid export_symbol(const char *);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_civoid free_node(struct string_list *list);
5962306a36Sopenharmony_civoid free_list(struct string_list *s, struct string_list *e);
6062306a36Sopenharmony_cistruct string_list *copy_node(struct string_list *);
6162306a36Sopenharmony_cistruct string_list *copy_list_range(struct string_list *start,
6262306a36Sopenharmony_ci				    struct string_list *end);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciint yylex(void);
6562306a36Sopenharmony_ciint yyparse(void);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_civoid error_with_pos(const char *, ...) __attribute__ ((format(printf, 1, 2)));
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/*----------------------------------------------------------------------*/
7062306a36Sopenharmony_ci#define xmalloc(size) ({ void *__ptr = malloc(size);		\
7162306a36Sopenharmony_ci	if(!__ptr && size != 0) {				\
7262306a36Sopenharmony_ci		fprintf(stderr, "out of memory\n");		\
7362306a36Sopenharmony_ci		exit(1);					\
7462306a36Sopenharmony_ci	}							\
7562306a36Sopenharmony_ci	__ptr; })
7662306a36Sopenharmony_ci#define xstrdup(str)  ({ char *__str = strdup(str);		\
7762306a36Sopenharmony_ci	if (!__str) {						\
7862306a36Sopenharmony_ci		fprintf(stderr, "out of memory\n");		\
7962306a36Sopenharmony_ci		exit(1);					\
8062306a36Sopenharmony_ci	}							\
8162306a36Sopenharmony_ci	__str; })
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#endif				/* genksyms.h */
84