162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef LKC_H
762306a36Sopenharmony_ci#define LKC_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <assert.h>
1062306a36Sopenharmony_ci#include <stdio.h>
1162306a36Sopenharmony_ci#include <stdlib.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "expr.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifdef __cplusplus
1662306a36Sopenharmony_ciextern "C" {
1762306a36Sopenharmony_ci#endif
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include "lkc_proto.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define SRCTREE "srctree"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#ifndef CONFIG_
2462306a36Sopenharmony_ci#define CONFIG_ "CONFIG_"
2562306a36Sopenharmony_ci#endif
2662306a36Sopenharmony_cistatic inline const char *CONFIG_prefix(void)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	return getenv( "CONFIG_" ) ?: CONFIG_;
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci#undef CONFIG_
3162306a36Sopenharmony_ci#define CONFIG_ CONFIG_prefix()
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ciextern int yylineno;
3462306a36Sopenharmony_civoid zconfdump(FILE *out);
3562306a36Sopenharmony_civoid zconf_starthelp(void);
3662306a36Sopenharmony_ciFILE *zconf_fopen(const char *name);
3762306a36Sopenharmony_civoid zconf_initscan(const char *name);
3862306a36Sopenharmony_civoid zconf_nextfile(const char *name);
3962306a36Sopenharmony_ciint zconf_lineno(void);
4062306a36Sopenharmony_ciconst char *zconf_curname(void);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* confdata.c */
4362306a36Sopenharmony_ciconst char *conf_get_configname(void);
4462306a36Sopenharmony_civoid set_all_choice_values(struct symbol *csym);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* confdata.c and expr.c */
4762306a36Sopenharmony_cistatic inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	assert(len != 0);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	if (fwrite(str, len, count, out) != count)
5262306a36Sopenharmony_ci		fprintf(stderr, "Error in writing or end of file.\n");
5362306a36Sopenharmony_ci}
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci/* util.c */
5662306a36Sopenharmony_cistruct file *file_lookup(const char *name);
5762306a36Sopenharmony_civoid *xmalloc(size_t size);
5862306a36Sopenharmony_civoid *xcalloc(size_t nmemb, size_t size);
5962306a36Sopenharmony_civoid *xrealloc(void *p, size_t size);
6062306a36Sopenharmony_cichar *xstrdup(const char *s);
6162306a36Sopenharmony_cichar *xstrndup(const char *s, size_t n);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci/* lexer.l */
6462306a36Sopenharmony_ciint yylex(void);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct gstr {
6762306a36Sopenharmony_ci	size_t len;
6862306a36Sopenharmony_ci	char  *s;
6962306a36Sopenharmony_ci	/*
7062306a36Sopenharmony_ci	* when max_width is not zero long lines in string s (if any) get
7162306a36Sopenharmony_ci	* wrapped not to exceed the max_width value
7262306a36Sopenharmony_ci	*/
7362306a36Sopenharmony_ci	int max_width;
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_cistruct gstr str_new(void);
7662306a36Sopenharmony_civoid str_free(struct gstr *gs);
7762306a36Sopenharmony_civoid str_append(struct gstr *gs, const char *s);
7862306a36Sopenharmony_civoid str_printf(struct gstr *gs, const char *fmt, ...);
7962306a36Sopenharmony_cichar *str_get(struct gstr *gs);
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci/* menu.c */
8262306a36Sopenharmony_civoid _menu_init(void);
8362306a36Sopenharmony_civoid menu_warn(struct menu *menu, const char *fmt, ...);
8462306a36Sopenharmony_cistruct menu *menu_add_menu(void);
8562306a36Sopenharmony_civoid menu_end_menu(void);
8662306a36Sopenharmony_civoid menu_add_entry(struct symbol *sym);
8762306a36Sopenharmony_civoid menu_add_dep(struct expr *dep);
8862306a36Sopenharmony_civoid menu_add_visibility(struct expr *dep);
8962306a36Sopenharmony_cistruct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
9062306a36Sopenharmony_civoid menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
9162306a36Sopenharmony_civoid menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
9262306a36Sopenharmony_civoid menu_finalize(struct menu *parent);
9362306a36Sopenharmony_civoid menu_set_type(int type);
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ciextern struct menu rootmenu;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cibool menu_is_empty(struct menu *menu);
9862306a36Sopenharmony_cibool menu_is_visible(struct menu *menu);
9962306a36Sopenharmony_cibool menu_has_prompt(struct menu *menu);
10062306a36Sopenharmony_ciconst char *menu_get_prompt(struct menu *menu);
10162306a36Sopenharmony_cistruct menu *menu_get_parent_menu(struct menu *menu);
10262306a36Sopenharmony_cibool menu_has_help(struct menu *menu);
10362306a36Sopenharmony_ciconst char *menu_get_help(struct menu *menu);
10462306a36Sopenharmony_ciint get_jump_key_char(void);
10562306a36Sopenharmony_cistruct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head);
10662306a36Sopenharmony_civoid menu_get_ext_help(struct menu *menu, struct gstr *help);
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/* symbol.c */
10962306a36Sopenharmony_civoid sym_clear_all_valid(void);
11062306a36Sopenharmony_cistruct symbol *sym_choice_default(struct symbol *sym);
11162306a36Sopenharmony_cistruct property *sym_get_range_prop(struct symbol *sym);
11262306a36Sopenharmony_ciconst char *sym_get_string_default(struct symbol *sym);
11362306a36Sopenharmony_cistruct symbol *sym_check_deps(struct symbol *sym);
11462306a36Sopenharmony_cistruct symbol *prop_get_symbol(struct property *prop);
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cistatic inline tristate sym_get_tristate_value(struct symbol *sym)
11762306a36Sopenharmony_ci{
11862306a36Sopenharmony_ci	return sym->curr.tri;
11962306a36Sopenharmony_ci}
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistatic inline struct symbol *sym_get_choice_value(struct symbol *sym)
12362306a36Sopenharmony_ci{
12462306a36Sopenharmony_ci	return (struct symbol *)sym->curr.val;
12562306a36Sopenharmony_ci}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cistatic inline bool sym_is_choice(struct symbol *sym)
12862306a36Sopenharmony_ci{
12962306a36Sopenharmony_ci	return sym->flags & SYMBOL_CHOICE ? true : false;
13062306a36Sopenharmony_ci}
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_cistatic inline bool sym_is_choice_value(struct symbol *sym)
13362306a36Sopenharmony_ci{
13462306a36Sopenharmony_ci	return sym->flags & SYMBOL_CHOICEVAL ? true : false;
13562306a36Sopenharmony_ci}
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_cistatic inline bool sym_is_optional(struct symbol *sym)
13862306a36Sopenharmony_ci{
13962306a36Sopenharmony_ci	return sym->flags & SYMBOL_OPTIONAL ? true : false;
14062306a36Sopenharmony_ci}
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cistatic inline bool sym_has_value(struct symbol *sym)
14362306a36Sopenharmony_ci{
14462306a36Sopenharmony_ci	return sym->flags & SYMBOL_DEF_USER ? true : false;
14562306a36Sopenharmony_ci}
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci#ifdef __cplusplus
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci#endif
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci#endif /* LKC_H */
152