?? tkgen.c
字號:
default: printf( " }\n" ); break; case token_dep_mbool: modtoyes = 1; case token_dep_bool: printf( "\n" ); for ( tmp = cfg->depend; tmp; tmp = tmp->next ) if ( ! vartable[get_varnum( tmp->name )].global_written ) { global( tmp->name ); } printf( "\tset tmpvar_dep [effective_dep [list" ); for ( tmp = cfg->depend; tmp; tmp = tmp->next ) printf( " $%s", tmp->name ); printf( "]];set %s [sync_bool $%s $tmpvar_dep %d];", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name, modtoyes ); case token_bool: if ( cfg->token == token_bool ) printf( "\n\t" ); printf( "set %s [expr $%s&15]", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); printf( "} else {"); printf( "set %s [expr $%s|16]}\n", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); break; case token_choice_header: printf( "} else {" ); for ( cfg1 = cfg->next; cfg1 != NULL && cfg1->token == token_choice_item; cfg1 = cfg1->next ) printf( "set %s 4;", vartable[cfg1->nameindex].name ); printf( "}\n" ); break; case token_choice_item: fprintf( stderr, "Internal error on token_choice_item\n" ); exit( 1 ); case token_define_bool: case token_define_tristate: if ( ! vartable[get_varnum( cfg->value )].global_written ) { global( cfg->value ); } printf( "set %s $%s }\n", vartable[cfg->nameindex].name, cfg->value ); break; case token_define_hex: case token_define_int: printf( "set %s %s }\n", vartable[cfg->nameindex].name, cfg->value ); break; case token_define_string: printf( "set %s \"%s\" }\n", vartable[cfg->nameindex].name, cfg->value ); break; case token_dep_tristate: printf( "\n" ); for ( tmp = cfg->depend; tmp; tmp = tmp->next ) if ( ! vartable[get_varnum( tmp->name )].global_written ) { global( tmp->name ); } printf( "\tset tmpvar_dep [effective_dep [list" ); for ( tmp = cfg->depend; tmp; tmp = tmp->next ) printf( " $%s", tmp->name ); printf( "]]; set %s [sync_tristate $%s $tmpvar_dep]; ", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); case token_tristate: if ( cfg->token == token_tristate ) printf( "if {($CONFIG_MODULES == 0) && ($%s == 2)} then {set %s 1}; ", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); /* * Or in a bit to the variable - this causes all of the radiobuttons * to be deselected (i.e. not be red). */ printf( "set %s [expr $%s&15]", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); printf( "} else {" ); /* * Clear the disable bit to enable the correct radiobutton. */ printf( "set %s [expr $%s|16]}\n", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); break; case token_hex: case token_int: if ( cfg->value && *cfg->value == '$' ) { int index = get_varnum( cfg->value+1 ); printf( "\n" ); if ( ! vartable[index].global_written ) { global( vartable[index].name ); } printf( "\t" ); } if ( cfg->token == token_hex ) printf( "validate_hex " ); else if ( cfg->token == token_int ) printf( "validate_int " ); printf( "%s \"$%s\" %s}\n", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name, cfg->value ); break; case token_unset: printf( "set %s 4}\n", vartable[cfg->nameindex].name ); break; } }}/* * Generate a line that writes a variable to the output file. */void generate_writeconfig( struct kconfig * cfg ){ struct condition * cond; struct dependency * tmp; int depmod = 2; /* * Generate global declaration for this symbol. */ if ( cfg->token != token_comment ) { if ( cfg->nameindex > 0 && ! vartable[cfg->nameindex].global_written ) { vartable[cfg->nameindex].global_written = 1; global( vartable[cfg->nameindex].name ); } if ( cfg->token == token_define_tristate || cfg->token == token_define_bool ) { if ( ! vartable[get_varnum( cfg->value )].global_written ) { vartable[get_varnum( cfg->value )].global_written = 1; global( cfg->value ); } } else if ( cfg->nameindex <= 0 && cfg->token == token_choice_header ) { printf( "\tglobal tmpvar_%d\n", -(cfg->nameindex) ); } } /* * Generate global declarations for the condition chain. */ for ( cond = cfg->cond; cond != NULL; cond = cond->next ) { switch( cond->op ) { default: break; case op_variable: if ( ! vartable[cond->nameindex].global_written ) { vartable[cond->nameindex].global_written = 1; global( vartable[cond->nameindex].name ); } break; } } /* * Generate indentation. */ printf( "\t" ); /* * Generate the conditional. */ if ( cfg->cond != NULL ) { printf( "if {" ); for ( cond = cfg->cond; cond != NULL; cond = cond->next ) { switch ( cond->op ) { default: break; case op_bang: printf( " ! " ); break; case op_eq: printf( " == " ); break; case op_neq: printf( " != " ); break; case op_and: printf( " && " ); break; case op_and1: printf( " && " ); break; case op_or: printf( " || " ); break; case op_lparen: printf( "(" ); break; case op_rparen: printf( ")" ); break; case op_variable: printf( "$%s", vartable[cond->nameindex].name ); break; case op_constant: if ( strcmp( cond->str, "n" ) == 0 ) printf( "0" ); else if ( strcmp( cond->str, "y" ) == 0 ) printf( "1" ); else if ( strcmp( cond->str, "m" ) == 0 ) printf( "2" ); else if ( strcmp( cond->str, "" ) == 0 ) printf( "4" ); else printf( "\"%s\"", cond->str ); break; } } printf( "} then {" ); } /* * Generate a procedure call to write the value. * This code depends on the write_* procedures in header.tk. */ switch ( cfg->token ) { default: if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; case token_bool: case token_tristate: printf( "write_tristate $cfg $autocfg %s $%s [list $notmod] 2", vartable[cfg->nameindex].name, vartable[cfg->nameindex].name ); if ( cfg->cond != NULL ) printf( " }" ); printf( "\n" ); break; 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( "\twm geometry $w +$winx+$winy\n" );
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -