^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef LKC_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define LKC_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "expr.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifdef __cplusplus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) extern "C" {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "lkc_proto.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define SRCTREE "srctree"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifndef PACKAGE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define PACKAGE "linux"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #ifndef CONFIG_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define CONFIG_ "CONFIG_"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) static inline const char *CONFIG_prefix(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) return getenv( "CONFIG_" ) ?: CONFIG_;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #undef CONFIG_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define CONFIG_ CONFIG_prefix()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) enum conf_def_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) def_default,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) def_yes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) def_mod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) def_y2m,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) def_m2y,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) def_no,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) def_random
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) extern int yylineno;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) void zconfdump(FILE *out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) void zconf_starthelp(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) FILE *zconf_fopen(const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) void zconf_initscan(const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) void zconf_nextfile(const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) int zconf_lineno(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) const char *zconf_curname(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* confdata.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) const char *conf_get_configname(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) void sym_set_change_count(int count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) void sym_add_change_count(int count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) bool conf_set_all_new_symbols(enum conf_def_mode mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) void conf_rewrite_mod_or_yes(enum conf_def_mode mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) void set_all_choice_values(struct symbol *csym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* confdata.c and expr.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) assert(len != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) if (fwrite(str, len, count, out) != count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) fprintf(stderr, "Error in writing or end of file.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* util.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) struct file *file_lookup(const char *name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) void *xmalloc(size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) void *xcalloc(size_t nmemb, size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) void *xrealloc(void *p, size_t size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) char *xstrdup(const char *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) char *xstrndup(const char *s, size_t n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) /* lexer.l */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) int yylex(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct gstr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) size_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) char *s;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * when max_width is not zero long lines in string s (if any) get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * wrapped not to exceed the max_width value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) int max_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) struct gstr str_new(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) void str_free(struct gstr *gs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) void str_append(struct gstr *gs, const char *s);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) void str_printf(struct gstr *gs, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) const char *str_get(struct gstr *gs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* menu.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) void _menu_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) void menu_warn(struct menu *menu, const char *fmt, ...);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) struct menu *menu_add_menu(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) void menu_end_menu(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) void menu_add_entry(struct symbol *sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) void menu_add_dep(struct expr *dep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) void menu_add_visibility(struct expr *dep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) void menu_add_option_modules(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) void menu_add_option_defconfig_list(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) void menu_add_option_allnoconfig_y(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) void menu_finalize(struct menu *parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) void menu_set_type(int type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) extern struct menu rootmenu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) bool menu_is_empty(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) bool menu_is_visible(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) bool menu_has_prompt(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) const char *menu_get_prompt(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct menu *menu_get_root_menu(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) struct menu *menu_get_parent_menu(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) bool menu_has_help(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) const char *menu_get_help(struct menu *menu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) void menu_get_ext_help(struct menu *menu, struct gstr *help);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* symbol.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) void sym_clear_all_valid(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) struct symbol *sym_choice_default(struct symbol *sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct property *sym_get_range_prop(struct symbol *sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) const char *sym_get_string_default(struct symbol *sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct symbol *sym_check_deps(struct symbol *sym);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) struct symbol *prop_get_symbol(struct property *prop);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) static inline tristate sym_get_tristate_value(struct symbol *sym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) return sym->curr.tri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) static inline struct symbol *sym_get_choice_value(struct symbol *sym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) return (struct symbol *)sym->curr.val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return sym_set_tristate_value(chval, yes);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static inline bool sym_is_choice(struct symbol *sym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) return sym->flags & SYMBOL_CHOICE ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) static inline bool sym_is_choice_value(struct symbol *sym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) return sym->flags & SYMBOL_CHOICEVAL ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static inline bool sym_is_optional(struct symbol *sym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) return sym->flags & SYMBOL_OPTIONAL ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static inline bool sym_has_value(struct symbol *sym)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) return sym->flags & SYMBOL_DEF_USER ? true : false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #ifdef __cplusplus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #endif /* LKC_H */