📄 tkgen.c
字号:
case token_choice_header: /* * This is funky code -- it fails if there were any conditionals. * Fortunately all the conditionals got stripped off somewhere * else. */ { struct kconfig * cfg1; for ( cfg1 = cfg->next; cfg1 != NULL && cfg1->token == token_choice_item; cfg1 = cfg1->next ) { printf("\n\tif { $tmpvar_%d == \"%s\" } then { write_tristate $cfg $autocfg %s 1 [list $notmod] 2 } else { write_tristate $cfg $autocfg %s 0 [list $notmod] 2 }", -(cfg->nameindex), cfg1->label, vartable[cfg1->nameindex].name, vartable[cfg1->nameindex].name ); } } if ( cfg->cond != NULL ) printf( "}" ); printf( "\n" ); break; case token_choice_item: fprintf( stderr, "Internal error on token_choice_item\n" ); exit( 1 ); case token_comment: printf( "write_comment $cfg $autocfg \"%s\"", cfg->label ); if ( cfg->cond != NULL ) printf( "}" ); printf( "\n" ); break; case token_define_bool: case token_define_tristate: if ( cfg->cond == NULL ) { printf( "write_tristate $cfg $autocfg %s $%s [list $notmod] 2\n", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); } else { printf( "write_tristate $cfg $autocfg %s $%s [list $notmod] 2 }\n", vartable[cfg->nameindex].name, cfg->value ); } break; case token_dep_mbool: depmod = 1; case token_dep_bool: case token_dep_tristate: printf( "write_tristate $cfg $autocfg %s $%s [list", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); for ( tmp = cfg->depend; tmp; tmp = tmp->next ) printf( " $%s", tmp->name ); printf( "] %d", depmod ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_define_hex: printf( "write_hex $cfg $autocfg %s %s $notmod", vartable[cfg->nameindex].name, cfg->value ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_define_int: printf( "write_int $cfg $autocfg %s %s $notmod", vartable[cfg->nameindex].name, cfg->value ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_define_string: printf( "write_string $cfg $autocfg %s \"%s\" $notmod", vartable[cfg->nameindex].name, cfg->value ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_hex: printf( "write_hex $cfg $autocfg %s $%s $notmod", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_int: printf( "write_int $cfg $autocfg %s $%s $notmod", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_string: printf( "write_string $cfg $autocfg %s \"$%s\" $notmod", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; }}static void generate_update_var( struct kconfig * scfg, int menu_num ){ struct kconfig * cfg; if ( menu_num>0 ) { printf( "proc update_define_menu%d {} {\n", menu_num ); printf( "\tupdate_define_mainmenu\n" ); } else printf( "proc update_define_mainmenu {} {\n" ); clear_globalflags(); global( "CONFIG_MODULES" ); vartable[ get_varnum( "CONFIG_MODULES" ) ].global_written = 1; for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { if ( cfg->menu_number == menu_num && (cfg->token == token_define_bool || cfg->token == token_define_tristate || cfg->token == token_define_hex || cfg->token == token_define_int || cfg->token == token_define_string || cfg->token == token_unset || cfg->token == token_tristate) ) { if ( ! vartable[cfg->nameindex].global_written ) { vartable[cfg->nameindex].global_written = 1; global( vartable[cfg->nameindex].name ); } } } for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { char tmp[20]; struct kconfig * cfg1; if ( cfg->menu_number == menu_num ) { switch ( cfg->token ) { default: case token_choice_item: break; case token_choice_header: sprintf( tmp, "tmpvar_%d", -(cfg->nameindex) ); global( tmp ); for ( cfg1 = cfg->next; cfg1 != NULL && cfg1->token == token_choice_item; cfg1 = cfg1->next ) { vartable[cfg1->nameindex].global_written = 1; global( vartable[cfg1->nameindex].name ); printf( "\tif {$tmpvar_%d == \"%s\"} then {set %s 1} else {set %s 0}\n", -(cfg->nameindex), cfg1->label, vartable[cfg1->nameindex].name, vartable[cfg1->nameindex].name ); } break; case token_bool: case token_define_bool: case token_define_tristate: case token_define_hex: case token_define_int: case token_define_string: case token_dep_bool: case token_dep_tristate: case token_dep_mbool: case token_int: case token_hex: case token_mainmenu_option: case token_tristate: case token_unset: if ( cfg->cond != NULL ) generate_if( cfg, cfg->cond, menu_num, -2 ); else switch ( cfg->token ) { case token_tristate: printf( "\n\tif {($CONFIG_MODULES == 0)} then {if {($%s == 2)} then {set %s 1}}\n", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); break; case token_define_bool: case token_define_tristate: if ( ! vartable[get_varnum( cfg->value )].global_written ) { vartable[get_varnum( cfg->value )].global_written = 1; global( cfg->value ); } printf( "\tset %s $%s\n", vartable[cfg->nameindex].name, cfg->value ); break; case token_define_hex: case token_define_int: printf( "\tset %s %s\n", vartable[cfg->nameindex].name, cfg->value ); break; case token_define_string: printf( "\tset %s \"%s\"\n", vartable[cfg->nameindex].name, cfg->value ); break; case token_unset: printf( "\tset %s 4\n", vartable[cfg->nameindex].name ); default: break; } } } } printf( "}\n\n\n" );}/* * Generates the end of a menu procedure. */static void end_proc( struct kconfig * scfg, int menu_num ){ struct kconfig * cfg; int i; printf( "\n\n\n" ); printf( "\tfocus $w\n" ); printf( "\tupdate_active\n" ); printf( "\tglobal winx; global winy\n" ); if ( menu_first[menu_num]->menu_number != 0 ) { printf( "\tif {[winfo exists .menu%d] == 0} then ", menu_first[menu_num]->menu_number ); printf( "{menu%d .menu%d \"%s\"}\n", menu_first[menu_num]->menu_number, menu_first[menu_num]->menu_number, menu_first[menu_first[menu_num]->menu_number]->label ); printf( "\tset winx [expr [winfo x .menu%d]+30]; set winy [expr [winfo y .menu%d]+30]\n", menu_first[menu_num]->menu_number, menu_first[menu_num]->menu_number ); } else printf( "\tset winx [expr [winfo x .]+30]; set winy [expr [winfo y .]+30]\n" ); printf( "\tif {[winfo exists $w]} then {wm geometry $w +$winx+$winy}\n" ); /* * Now that the whole window is in place, we need to wait for an "update" * so we can tell the canvas what its virtual size should be. * * Unfortunately, this causes some ugly screen-flashing because the whole * window is drawn, and then it is immediately resized. It seems * unavoidable, though, since "frame" objects won't tell us their size * until after an update, and "canvas" objects can't automatically pack * around frames. Sigh. */ printf( "\tupdate idletasks\n" ); printf( "\tif {[winfo exists $w]} then {$w.config.canvas create window 0 0 -anchor nw -window $w.config.f\n\n" ); printf( "\t$w.config.canvas configure \\\n" ); printf( "\t\t-width [expr [winfo reqwidth $w.config.f] + 1]\\\n" ); printf( "\t\t-scrollregion \"-1 -1 [expr [winfo reqwidth $w.config.f] + 1] \\\n" ); printf( "\t\t\t [expr [winfo reqheight $w.config.f] + 1]\"\n\n" ); /* * If the whole canvas will fit in 3/4 of the screen height, do it; * otherwise, resize to around 1/2 the screen and let us scroll. */ printf( "\tset winy [expr [winfo reqh $w] - [winfo reqh $w.config.canvas]]\n" ); printf( "\tset scry [expr [winfo screenh $w] / 2]\n" ); printf( "\tset maxy [expr [winfo screenh $w] * 3 / 4]\n" ); printf( "\tset canvtotal [expr [winfo reqh $w.config.f] + 2]\n" ); printf( "\tif [expr $winy + $canvtotal < $maxy] {\n" ); printf( "\t\t$w.config.canvas configure -height $canvtotal\n" ); printf( "\t} else {\n" ); printf( "\t\t$w.config.canvas configure -height [expr $scry - $winy]\n" ); printf( "\t\t}\n\t}\n" ); /* * Limit the min/max window size. Height can vary, but not width, * because of the limitations of canvas and our laziness. */ printf( "\tupdate idletasks\n" ); printf( "\tif {[winfo exists $w]} then {\n\twm maxsize $w [winfo width $w] [winfo screenheight $w]\n" ); printf( "\twm minsize $w [winfo width $w] 100\n\n" ); printf( "\twm deiconify $w\n" ); printf( "}\n}\n\n" ); /* * Now we generate the companion procedure for the menu we just * generated. This procedure contains all of the code to * disable/enable widgets based upon the settings of the other * widgets, and will be called first when the window is mapped, * and each time one of the buttons in the window are clicked. */ printf( "proc update_menu%d {} {\n", menu_num ); /* * Clear all of the booleans that are defined in this menu. */ clear_globalflags(); for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { if ( cfg->menu_number == menu_num && cfg->token != token_mainmenu_option && cfg->token != token_choice_item ) { if ( cfg->cond != NULL ) { int i; if ( (cfg->token == token_tristate || cfg->token == token_dep_tristate) && ! vartable[i = get_varnum( "CONFIG_MODULES" )].global_written ) { global( "CONFIG_MODULES" ); vartable[i].global_written = 1; } generate_if( cfg, cfg->cond, cfg->menu_number, cfg->menu_line ); } else { if ( cfg->token == token_tristate ) { if ( ! vartable[cfg->nameindex].global_written ) { vartable[cfg->nameindex].global_written = 1; printf( "\tglobal %s\n", vartable[cfg->nameindex].name ); } if ( ! vartable[i = get_varnum( "CONFIG_MODULES" )].global_written ) { global( "CONFIG_MODULES" ); vartable[i].global_written = 1; } printf( "\n\tif {($CONFIG_MODULES == 1)} then {configure_entry .menu%d.config.f.x%d normal {m}} else {configure_entry .menu%d.config.f.x%d disabled {m}}\n", menu_num, cfg->menu_line, menu_num, cfg->menu_line ); } } } else if ( cfg->token == token_mainmenu_option && cfg->menu_number == menu_num && cfg->cond != NULL ) { generate_if( cfg, cfg->cond, menu_num, cfg->menu_line ); } } printf("}\n\n\n"); generate_update_var( scfg, menu_num );}/* * This is the top level function for generating the tk script. */void dump_tk_script( struct kconfig * scfg ){ int menu_depth; int menu_num [64]; int imenu, i; int top_level_num = 0; struct kconfig * cfg; struct kconfig * cfg1 = NULL; const char * name = "No Name"; /* * Mark begin and end of each menu so I can omit submenus when walking * over a parent menu. */ tot_menu_num = 0; menu_depth = 0; menu_num [0] = 0; for ( cfg = scfg; cfg != NULL; cfg = cfg->next ) { switch ( cfg->token ) { default: break; case token_mainmenu_name:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -