diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-10 11:28:17 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-01-10 11:28:17 -0500 |
| commit | f28b1c8aaa97a68028bb894bffb1690185c62b01 (patch) | |
| tree | 4dfd0e1dff2324ed70e2365d2314ff3ec7f7c751 /scripts | |
| parent | 0c05384a5a1af2352b8c244cf32f480ba6cbf024 (diff) | |
| parent | 39177ec36236fb71257e51d0d198437b84170911 (diff) | |
Merge branch 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6
* 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6:
nconf: handle comment entries within choice/endchoice
kconfig: fix warning
kconfig: Make expr_copy() take a const argument
kconfig: simplify select-with-unmet-direct-dependency warning
kconfig: add more S_INT and S_HEX consistency checks
kconfig: fix `zconfdebug' extern declaration
kconfig/conf: merge duplicate switch's case
kconfig: fix typos
kbuild/gconf: add dummy inline for bind_textdomain_codeset()
kbuild/nconf: fix spaces damage
kconfig: nuke second argument of conf_write_symbol()
kconfig: do not define AUTOCONF_INCLUDED
kconfig: the day kconfig warns about "select"-abuse has come
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/kconfig/conf.c | 2 | ||||
| -rw-r--r-- | scripts/kconfig/confdata.c | 27 | ||||
| -rw-r--r-- | scripts/kconfig/expr.c | 44 | ||||
| -rw-r--r-- | scripts/kconfig/expr.h | 3 | ||||
| -rw-r--r-- | scripts/kconfig/lkc.h | 7 | ||||
| -rw-r--r-- | scripts/kconfig/menu.c | 15 | ||||
| -rw-r--r-- | scripts/kconfig/nconf.c | 10 | ||||
| -rw-r--r-- | scripts/kconfig/symbol.c | 8 |
8 files changed, 84 insertions, 32 deletions
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 5459a38be866..659326c3e895 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c | |||
| @@ -529,8 +529,6 @@ int main(int ac, char **av) | |||
| 529 | } | 529 | } |
| 530 | break; | 530 | break; |
| 531 | case savedefconfig: | 531 | case savedefconfig: |
| 532 | conf_read(NULL); | ||
| 533 | break; | ||
| 534 | case silentoldconfig: | 532 | case silentoldconfig: |
| 535 | case oldaskconfig: | 533 | case oldaskconfig: |
| 536 | case oldconfig: | 534 | case oldconfig: |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 9df80114b47b..61c35bf2d9cb 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
| @@ -440,12 +440,11 @@ static void conf_write_string(bool headerfile, const char *name, | |||
| 440 | fputs("\"\n", out); | 440 | fputs("\"\n", out); |
| 441 | } | 441 | } |
| 442 | 442 | ||
| 443 | static void conf_write_symbol(struct symbol *sym, enum symbol_type type, | 443 | static void conf_write_symbol(struct symbol *sym, FILE *out, bool write_no) |
| 444 | FILE *out, bool write_no) | ||
| 445 | { | 444 | { |
| 446 | const char *str; | 445 | const char *str; |
| 447 | 446 | ||
| 448 | switch (type) { | 447 | switch (sym->type) { |
| 449 | case S_BOOLEAN: | 448 | case S_BOOLEAN: |
| 450 | case S_TRISTATE: | 449 | case S_TRISTATE: |
| 451 | switch (sym_get_tristate_value(sym)) { | 450 | switch (sym_get_tristate_value(sym)) { |
| @@ -532,7 +531,7 @@ int conf_write_defconfig(const char *filename) | |||
| 532 | goto next_menu; | 531 | goto next_menu; |
| 533 | } | 532 | } |
| 534 | } | 533 | } |
| 535 | conf_write_symbol(sym, sym->type, out, true); | 534 | conf_write_symbol(sym, out, true); |
| 536 | } | 535 | } |
| 537 | next_menu: | 536 | next_menu: |
| 538 | if (menu->list != NULL) { | 537 | if (menu->list != NULL) { |
| @@ -561,7 +560,6 @@ int conf_write(const char *name) | |||
| 561 | const char *basename; | 560 | const char *basename; |
| 562 | const char *str; | 561 | const char *str; |
| 563 | char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1]; | 562 | char dirname[PATH_MAX+1], tmpname[PATH_MAX+1], newname[PATH_MAX+1]; |
| 564 | enum symbol_type type; | ||
| 565 | time_t now; | 563 | time_t now; |
| 566 | int use_timestamp = 1; | 564 | int use_timestamp = 1; |
| 567 | char *env; | 565 | char *env; |
| @@ -633,14 +631,8 @@ int conf_write(const char *name) | |||
| 633 | if (!(sym->flags & SYMBOL_WRITE)) | 631 | if (!(sym->flags & SYMBOL_WRITE)) |
| 634 | goto next; | 632 | goto next; |
| 635 | sym->flags &= ~SYMBOL_WRITE; | 633 | sym->flags &= ~SYMBOL_WRITE; |
| 636 | type = sym->type; | ||
| 637 | if (type == S_TRISTATE) { | ||
| 638 | sym_calc_value(modules_sym); | ||
| 639 | if (modules_sym->curr.tri == no) | ||
| 640 | type = S_BOOLEAN; | ||
| 641 | } | ||
| 642 | /* Write config symbol to file */ | 634 | /* Write config symbol to file */ |
| 643 | conf_write_symbol(sym, type, out, true); | 635 | conf_write_symbol(sym, out, true); |
| 644 | } | 636 | } |
| 645 | 637 | ||
| 646 | next: | 638 | next: |
| @@ -833,8 +825,7 @@ int conf_write_autoconf(void) | |||
| 833 | " * Automatically generated C config: don't edit\n" | 825 | " * Automatically generated C config: don't edit\n" |
| 834 | " * %s\n" | 826 | " * %s\n" |
| 835 | " * %s" | 827 | " * %s" |
| 836 | " */\n" | 828 | " */\n", |
| 837 | "#define AUTOCONF_INCLUDED\n", | ||
| 838 | rootmenu.prompt->text, ctime(&now)); | 829 | rootmenu.prompt->text, ctime(&now)); |
| 839 | 830 | ||
| 840 | for_all_symbols(i, sym) { | 831 | for_all_symbols(i, sym) { |
| @@ -843,7 +834,7 @@ int conf_write_autoconf(void) | |||
| 843 | continue; | 834 | continue; |
| 844 | 835 | ||
| 845 | /* write symbol to config file */ | 836 | /* write symbol to config file */ |
| 846 | conf_write_symbol(sym, sym->type, out, false); | 837 | conf_write_symbol(sym, out, false); |
| 847 | 838 | ||
| 848 | /* update autoconf and tristate files */ | 839 | /* update autoconf and tristate files */ |
| 849 | switch (sym->type) { | 840 | switch (sym->type) { |
| @@ -946,7 +937,7 @@ static void randomize_choice_values(struct symbol *csym) | |||
| 946 | int cnt, def; | 937 | int cnt, def; |
| 947 | 938 | ||
| 948 | /* | 939 | /* |
| 949 | * If choice is mod then we may have more items slected | 940 | * If choice is mod then we may have more items selected |
| 950 | * and if no then no-one. | 941 | * and if no then no-one. |
| 951 | * In both cases stop. | 942 | * In both cases stop. |
| 952 | */ | 943 | */ |
| @@ -1042,10 +1033,10 @@ void conf_set_all_new_symbols(enum conf_def_mode mode) | |||
| 1042 | 1033 | ||
| 1043 | /* | 1034 | /* |
| 1044 | * We have different type of choice blocks. | 1035 | * We have different type of choice blocks. |
| 1045 | * If curr.tri equal to mod then we can select several | 1036 | * If curr.tri equals to mod then we can select several |
| 1046 | * choice symbols in one block. | 1037 | * choice symbols in one block. |
| 1047 | * In this case we do nothing. | 1038 | * In this case we do nothing. |
| 1048 | * If curr.tri equal yes then only one symbol can be | 1039 | * If curr.tri equals yes then only one symbol can be |
| 1049 | * selected in a choice block and we set it to yes, | 1040 | * selected in a choice block and we set it to yes, |
| 1050 | * and the rest to no. | 1041 | * and the rest to no. |
| 1051 | */ | 1042 | */ |
diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index 330e7c0048a8..001003452f68 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c | |||
| @@ -64,7 +64,7 @@ struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) | |||
| 64 | return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; | 64 | return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | struct expr *expr_copy(struct expr *org) | 67 | struct expr *expr_copy(const struct expr *org) |
| 68 | { | 68 | { |
| 69 | struct expr *e; | 69 | struct expr *e; |
| 70 | 70 | ||
| @@ -1013,6 +1013,48 @@ int expr_compare_type(enum expr_type t1, enum expr_type t2) | |||
| 1013 | #endif | 1013 | #endif |
| 1014 | } | 1014 | } |
| 1015 | 1015 | ||
| 1016 | static inline struct expr * | ||
| 1017 | expr_get_leftmost_symbol(const struct expr *e) | ||
| 1018 | { | ||
| 1019 | |||
| 1020 | if (e == NULL) | ||
| 1021 | return NULL; | ||
| 1022 | |||
| 1023 | while (e->type != E_SYMBOL) | ||
| 1024 | e = e->left.expr; | ||
| 1025 | |||
| 1026 | return expr_copy(e); | ||
| 1027 | } | ||
| 1028 | |||
| 1029 | /* | ||
| 1030 | * Given expression `e1' and `e2', returns the leaf of the longest | ||
| 1031 | * sub-expression of `e1' not containing 'e2. | ||
| 1032 | */ | ||
| 1033 | struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2) | ||
| 1034 | { | ||
| 1035 | struct expr *ret; | ||
| 1036 | |||
| 1037 | switch (e1->type) { | ||
| 1038 | case E_OR: | ||
| 1039 | return expr_alloc_and( | ||
| 1040 | expr_simplify_unmet_dep(e1->left.expr, e2), | ||
| 1041 | expr_simplify_unmet_dep(e1->right.expr, e2)); | ||
| 1042 | case E_AND: { | ||
| 1043 | struct expr *e; | ||
| 1044 | e = expr_alloc_and(expr_copy(e1), expr_copy(e2)); | ||
| 1045 | e = expr_eliminate_dups(e); | ||
| 1046 | ret = (!expr_eq(e, e1)) ? e1 : NULL; | ||
| 1047 | expr_free(e); | ||
| 1048 | break; | ||
| 1049 | } | ||
| 1050 | default: | ||
| 1051 | ret = e1; | ||
| 1052 | break; | ||
| 1053 | } | ||
| 1054 | |||
| 1055 | return expr_get_leftmost_symbol(ret); | ||
| 1056 | } | ||
| 1057 | |||
| 1016 | void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) | 1058 | void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) |
| 1017 | { | 1059 | { |
| 1018 | if (!e) { | 1060 | if (!e) { |
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index e57826ced380..3d238db49764 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h | |||
| @@ -192,7 +192,7 @@ struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e | |||
| 192 | struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); | 192 | struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); |
| 193 | struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); | 193 | struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); |
| 194 | struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); | 194 | struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); |
| 195 | struct expr *expr_copy(struct expr *org); | 195 | struct expr *expr_copy(const struct expr *org); |
| 196 | void expr_free(struct expr *e); | 196 | void expr_free(struct expr *e); |
| 197 | int expr_eq(struct expr *e1, struct expr *e2); | 197 | int expr_eq(struct expr *e1, struct expr *e2); |
| 198 | void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); | 198 | void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); |
| @@ -207,6 +207,7 @@ struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2); | |||
| 207 | struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); | 207 | struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); |
| 208 | void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); | 208 | void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); |
| 209 | struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); | 209 | struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); |
| 210 | struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2); | ||
| 210 | 211 | ||
| 211 | void expr_fprint(struct expr *e, FILE *out); | 212 | void expr_fprint(struct expr *e, FILE *out); |
| 212 | struct gstr; /* forward */ | 213 | struct gstr; /* forward */ |
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 3f7240df0f3b..febf0c94d558 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | static inline const char *gettext(const char *txt) { return txt; } | 14 | static inline const char *gettext(const char *txt) { return txt; } |
| 15 | static inline void textdomain(const char *domainname) {} | 15 | static inline void textdomain(const char *domainname) {} |
| 16 | static inline void bindtextdomain(const char *name, const char *dir) {} | 16 | static inline void bindtextdomain(const char *name, const char *dir) {} |
| 17 | static inline char *bind_textdomain_codeset(const char *dn, char *c) { return c; } | ||
| 17 | #endif | 18 | #endif |
| 18 | 19 | ||
| 19 | #ifdef __cplusplus | 20 | #ifdef __cplusplus |
| @@ -67,10 +68,12 @@ struct kconf_id { | |||
| 67 | enum symbol_type stype; | 68 | enum symbol_type stype; |
| 68 | }; | 69 | }; |
| 69 | 70 | ||
| 71 | #ifdef YYDEBUG | ||
| 72 | extern int zconfdebug; | ||
| 73 | #endif | ||
| 74 | |||
| 70 | int zconfparse(void); | 75 | int zconfparse(void); |
| 71 | void zconfdump(FILE *out); | 76 | void zconfdump(FILE *out); |
| 72 | |||
| 73 | extern int zconfdebug; | ||
| 74 | void zconf_starthelp(void); | 77 | void zconf_starthelp(void); |
| 75 | FILE *zconf_fopen(const char *name); | 78 | FILE *zconf_fopen(const char *name); |
| 76 | void zconf_initscan(const char *name); | 79 | void zconf_initscan(const char *name); |
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 5f77dcb8977e..5fdf10dc1d8a 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c | |||
| @@ -203,7 +203,7 @@ void menu_add_option(int token, char *arg) | |||
| 203 | } | 203 | } |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2) | 206 | static int menu_validate_number(struct symbol *sym, struct symbol *sym2) |
| 207 | { | 207 | { |
| 208 | return sym2->type == S_INT || sym2->type == S_HEX || | 208 | return sym2->type == S_INT || sym2->type == S_HEX || |
| 209 | (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); | 209 | (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); |
| @@ -221,6 +221,15 @@ static void sym_check_prop(struct symbol *sym) | |||
| 221 | prop_warn(prop, | 221 | prop_warn(prop, |
| 222 | "default for config symbol '%s'" | 222 | "default for config symbol '%s'" |
| 223 | " must be a single symbol", sym->name); | 223 | " must be a single symbol", sym->name); |
| 224 | if (prop->expr->type != E_SYMBOL) | ||
| 225 | break; | ||
| 226 | sym2 = prop_get_symbol(prop); | ||
| 227 | if (sym->type == S_HEX || sym->type == S_INT) { | ||
| 228 | if (!menu_validate_number(sym, sym2)) | ||
| 229 | prop_warn(prop, | ||
| 230 | "'%s': number is invalid", | ||
| 231 | sym->name); | ||
| 232 | } | ||
| 224 | break; | 233 | break; |
| 225 | case P_SELECT: | 234 | case P_SELECT: |
| 226 | sym2 = prop_get_symbol(prop); | 235 | sym2 = prop_get_symbol(prop); |
| @@ -240,8 +249,8 @@ static void sym_check_prop(struct symbol *sym) | |||
| 240 | if (sym->type != S_INT && sym->type != S_HEX) | 249 | if (sym->type != S_INT && sym->type != S_HEX) |
| 241 | prop_warn(prop, "range is only allowed " | 250 | prop_warn(prop, "range is only allowed " |
| 242 | "for int or hex symbols"); | 251 | "for int or hex symbols"); |
| 243 | if (!menu_range_valid_sym(sym, prop->expr->left.sym) || | 252 | if (!menu_validate_number(sym, prop->expr->left.sym) || |
| 244 | !menu_range_valid_sym(sym, prop->expr->right.sym)) | 253 | !menu_validate_number(sym, prop->expr->right.sym)) |
| 245 | prop_warn(prop, "range is invalid"); | 254 | prop_warn(prop, "range is invalid"); |
| 246 | break; | 255 | break; |
| 247 | default: | 256 | default: |
diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index 272a987f23e0..db56377393d7 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c | |||
| @@ -248,7 +248,7 @@ search_help[] = N_( | |||
| 248 | "Only relevant lines are shown.\n" | 248 | "Only relevant lines are shown.\n" |
| 249 | "\n\n" | 249 | "\n\n" |
| 250 | "Search examples:\n" | 250 | "Search examples:\n" |
| 251 | "Examples: USB = > find all symbols containing USB\n" | 251 | "Examples: USB => find all symbols containing USB\n" |
| 252 | " ^USB => find all symbols starting with USB\n" | 252 | " ^USB => find all symbols starting with USB\n" |
| 253 | " USB$ => find all symbols ending with USB\n" | 253 | " USB$ => find all symbols ending with USB\n" |
| 254 | "\n"); | 254 | "\n"); |
| @@ -1266,9 +1266,13 @@ static void conf_choice(struct menu *menu) | |||
| 1266 | if (child->sym == sym_get_choice_value(menu->sym)) | 1266 | if (child->sym == sym_get_choice_value(menu->sym)) |
| 1267 | item_make(child, ':', "<X> %s", | 1267 | item_make(child, ':', "<X> %s", |
| 1268 | _(menu_get_prompt(child))); | 1268 | _(menu_get_prompt(child))); |
| 1269 | else | 1269 | else if (child->sym) |
| 1270 | item_make(child, ':', " %s", | 1270 | item_make(child, ':', " %s", |
| 1271 | _(menu_get_prompt(child))); | 1271 | _(menu_get_prompt(child))); |
| 1272 | else | ||
| 1273 | item_make(child, ':', "*** %s ***", | ||
| 1274 | _(menu_get_prompt(child))); | ||
| 1275 | |||
| 1272 | if (child->sym == active){ | 1276 | if (child->sym == active){ |
| 1273 | last_top_row = top_row(curses_menu); | 1277 | last_top_row = top_row(curses_menu); |
| 1274 | selected_index = i; | 1278 | selected_index = i; |
| @@ -1334,7 +1338,7 @@ static void conf_choice(struct menu *menu) | |||
| 1334 | break; | 1338 | break; |
| 1335 | 1339 | ||
| 1336 | child = item_data(); | 1340 | child = item_data(); |
| 1337 | if (!child || !menu_is_visible(child)) | 1341 | if (!child || !menu_is_visible(child) || !child->sym) |
| 1338 | continue; | 1342 | continue; |
| 1339 | switch (res) { | 1343 | switch (res) { |
| 1340 | case ' ': | 1344 | case ' ': |
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index af6e9f3de950..a796c95fe8a0 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c | |||
| @@ -351,12 +351,16 @@ void sym_calc_value(struct symbol *sym) | |||
| 351 | } | 351 | } |
| 352 | calc_newval: | 352 | calc_newval: |
| 353 | if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) { | 353 | if (sym->dir_dep.tri == no && sym->rev_dep.tri != no) { |
| 354 | struct expr *e; | ||
| 355 | e = expr_simplify_unmet_dep(sym->rev_dep.expr, | ||
| 356 | sym->dir_dep.expr); | ||
| 354 | fprintf(stderr, "warning: ("); | 357 | fprintf(stderr, "warning: ("); |
| 355 | expr_fprint(sym->rev_dep.expr, stderr); | 358 | expr_fprint(e, stderr); |
| 356 | fprintf(stderr, ") selects %s which has unmet direct dependencies (", | 359 | fprintf(stderr, ") selects %s which has unmet direct dependencies (", |
| 357 | sym->name); | 360 | sym->name); |
| 358 | expr_fprint(sym->dir_dep.expr, stderr); | 361 | expr_fprint(sym->dir_dep.expr, stderr); |
| 359 | fprintf(stderr, ")\n"); | 362 | fprintf(stderr, ")\n"); |
| 363 | expr_free(e); | ||
| 360 | } | 364 | } |
| 361 | newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); | 365 | newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); |
| 362 | } | 366 | } |
| @@ -686,7 +690,7 @@ const char *sym_get_string_default(struct symbol *sym) | |||
| 686 | switch (sym->type) { | 690 | switch (sym->type) { |
| 687 | case S_BOOLEAN: | 691 | case S_BOOLEAN: |
| 688 | case S_TRISTATE: | 692 | case S_TRISTATE: |
| 689 | /* The visibility imay limit the value from yes => mod */ | 693 | /* The visibility may limit the value from yes => mod */ |
| 690 | val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri); | 694 | val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri); |
| 691 | break; | 695 | break; |
| 692 | default: | 696 | default: |
