亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tkcond.c

?? MAKEFILE 經(jīng)典編寫方法
?? C
字號(hào):
/* * tkcond.c * * Eric Youngdale was the original author of xconfig. * Michael Elizabeth Chastain (mec@shout.net) is the current maintainer. * * This file takes the tokenized statement list and transforms 'if ...' * statements.  For each simple statement, I find all of the 'if' statements * that enclose it, and attach the aggregate conditionals of those 'if' * statements to the cond list of the simple statement. * * 14 January 1999, Michael Elizabeth Chastain, <mec@shout.net> * - Steam-clean this file.  I tested this by generating kconfig.tk for *   every architecture and comparing it character-for-character against *   the output of the old tkparse. * * 07 July 1999, Andrzej M. Krzysztofowicz <ankry@mif.pg.gda.pl> * - kvariables removed; all variables are stored in a single table now * - some elimination of options non-valid for current architecture *   implemented. * - negation (!) eliminated from conditions * * TO DO: * - xconfig is at the end of its life cycle.  Contact <mec@shout.net> if *   you are interested in working on the replacement. */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "tkparse.h"/* * Mark variables which are defined anywhere. */static void mark_variables( struct kconfig * scfg ){    struct kconfig * cfg;    int i;    for ( i = 1; i <= max_varnum; i++ )	vartable[i].defined = 0;    for ( cfg = scfg; cfg != NULL; cfg = cfg->next )    {	if ( cfg->token == token_bool	||   cfg->token == token_choice_item	||   cfg->token == token_define_bool	||   cfg->token == token_define_hex	||   cfg->token == token_define_int	||   cfg->token == token_define_string	||   cfg->token == token_define_tristate	||   cfg->token == token_dep_bool	||   cfg->token == token_dep_mbool	||   cfg->token == token_dep_tristate	||   cfg->token == token_hex	||   cfg->token == token_int	||   cfg->token == token_string	||   cfg->token == token_tristate	||   cfg->token == token_unset )	{	    if ( cfg->nameindex > 0 )	/* paranoid */	    {		vartable[cfg->nameindex].defined = 1;	    }	}    }}static void free_cond( struct condition *cond ){    struct condition *tmp, *tmp1;    for ( tmp = cond; tmp; tmp = tmp1 )    {	tmp1 = tmp->next;	free( (void*)tmp );    }}/* * Remove the bang operator from a condition to avoid priority problems. * "!" has different priorities as "test" command argument and in  * a tk script. */static struct condition * remove_bang( struct condition * condition ){    struct condition * conda, * condb, * prev = NULL;    for ( conda = condition; conda; conda = conda->next )    {	if ( conda->op == op_bang && conda->next &&	   ( condb = conda->next->next ) )	{	    if ( condb->op == op_eq || condb->op == op_neq )	    {		condb->op = (condb->op == op_eq) ? op_neq : op_eq;		conda->op = op_nuked;		if ( prev )		{		    prev->next = conda->next;		}		else		{		    condition = conda->next;		}		conda->next = NULL;		free_cond( conda );		conda = condb;	    }	}	prev = conda;    }    return condition;}/* * Make a new condition chain by joining the current condition stack with * the "&&" operator for glue. */static struct condition * join_condition_stack( struct condition * conditions [],    int depth ){    struct condition * cond_list;    struct condition * cond_last;    int i, is_first = 1;    cond_list = cond_last = NULL;    for ( i = 0; i < depth; i++ )    {	if ( conditions[i]->op == op_false )	{	    struct condition * cnew;	    /* It is always false condition */	    cnew = malloc( sizeof(*cnew) );	    memset( cnew, 0, sizeof(*cnew) );	    cnew->op = op_false;	    cond_list = cond_last = cnew;	    goto join_done;	}    }    for ( i = 0; i < depth; i++ )    {	struct condition * cond;	struct condition * cnew;	int add_paren;	/* omit always true conditions */	if ( conditions[i]->op == op_true )	    continue;	/* if i have another condition, add an '&&' operator */	if ( !is_first )	{	    cnew = malloc( sizeof(*cnew) );	    memset( cnew, 0, sizeof(*cnew) );	    cnew->op = op_and;	    cond_last->next = cnew;	    cond_last = cnew;	}	if ( conditions[i]->op != op_lparen )	{	    /* add a '(' */	    add_paren = 1;	    cnew = malloc( sizeof(*cnew) );	    memset( cnew, 0, sizeof(*cnew) );	    cnew->op = op_lparen;	    if ( cond_last == NULL )		{ cond_list = cond_last = cnew; }	    else		{ cond_last->next = cnew; cond_last = cnew; }	}	else	{	    add_paren = 0;	}	/* duplicate the chain */	for ( cond = conditions [i]; cond != NULL; cond = cond->next )	{	    cnew            = malloc( sizeof(*cnew) );	    cnew->next      = NULL;	    cnew->op        = cond->op;	    cnew->str       = cond->str ? strdup( cond->str ) : NULL;	    cnew->nameindex = cond->nameindex;	    if ( cond_last == NULL )		{ cond_list = cond_last = cnew; }	    else		{ cond_last->next = cnew; cond_last = cnew; }	}	if ( add_paren )	{	    /* add a ')' */	    cnew = malloc( sizeof(*cnew) );	    memset( cnew, 0, sizeof(*cnew) );	    cnew->op = op_rparen;	    cond_last->next = cnew;	    cond_last = cnew;	}	is_first = 0;    }    /*     * Remove duplicate conditions.     */    {	struct condition *cond1, *cond1b, *cond1c, *cond1d, *cond1e, *cond1f;	for ( cond1 = cond_list; cond1 != NULL; cond1 = cond1->next )	{	    if ( cond1->op == op_lparen )	    {		cond1b = cond1 ->next; if ( cond1b == NULL ) break;		cond1c = cond1b->next; if ( cond1c == NULL ) break;		cond1d = cond1c->next; if ( cond1d == NULL ) break;		cond1e = cond1d->next; if ( cond1e == NULL ) break;		cond1f = cond1e->next; if ( cond1f == NULL ) break;		if ( cond1b->op == op_variable		&& ( cond1c->op == op_eq || cond1c->op == op_neq )		&&   cond1d->op == op_constant 		&&   cond1e->op == op_rparen )		{		    struct condition *cond2, *cond2b, *cond2c, *cond2d, *cond2e, *cond2f;		    for ( cond2 = cond1f->next; cond2 != NULL; cond2 = cond2->next )		    {			if ( cond2->op == op_lparen )			{			    cond2b = cond2 ->next; if ( cond2b == NULL ) break;			    cond2c = cond2b->next; if ( cond2c == NULL ) break;			    cond2d = cond2c->next; if ( cond2d == NULL ) break;			    cond2e = cond2d->next; if ( cond2e == NULL ) break;			    cond2f = cond2e->next;			    /* look for match */			    if ( cond2b->op == op_variable			    &&   cond2b->nameindex == cond1b->nameindex			    &&   cond2c->op == cond1c->op			    &&   cond2d->op == op_constant			    &&   strcmp( cond2d->str, cond1d->str ) == 0			    &&   cond2e->op == op_rparen )			    {				/* one of these must be followed by && */				if ( cond1f->op == op_and				|| ( cond2f != NULL && cond2f->op == op_and ) )				{				    /* nuke the first duplicate */				    cond1 ->op = op_nuked;				    cond1b->op = op_nuked;				    cond1c->op = op_nuked;				    cond1d->op = op_nuked;				    cond1e->op = op_nuked;				    if ( cond1f->op == op_and )					cond1f->op = op_nuked;				    else					cond2f->op = op_nuked;				}			    }			}		    }		}	    }	}    }join_done:    return cond_list;}static char * current_arch = NULL;/* * Eliminating conditions with ARCH = <not current>. */static struct condition *eliminate_other_arch( struct condition *list ){    struct condition *cond1a = list, *cond1b = NULL, *cond1c = NULL, *cond1d = NULL;    if ( current_arch == NULL )	current_arch = getenv( "ARCH" );    if ( current_arch == NULL )    {	fprintf( stderr, "error: ARCH undefined\n" );	exit( 1 );    }    if ( cond1a->op == op_variable    && ! strcmp( vartable[cond1a->nameindex].name, "ARCH" ) )    {	cond1b = cond1a->next; if ( cond1b == NULL ) goto done;	cond1c = cond1b->next; if ( cond1c == NULL ) goto done;	cond1d = cond1c->next;	if ( cond1c->op == op_constant && cond1d == NULL )	{	    if ( (cond1b->op == op_eq && strcmp( cond1c->str, current_arch ))	    ||   (cond1b->op == op_neq && ! strcmp( cond1c->str, current_arch )) )	    {		/* This is for another architecture */ 		cond1a->op = op_false;		cond1a->next = NULL;		free_cond( cond1b );		return cond1a;	    }	    else if ( (cond1b->op == op_neq && strcmp( cond1c->str, current_arch ))		 ||   (cond1b->op == op_eq && ! strcmp( cond1c->str, current_arch )) )	    {		/* This is for current architecture */		cond1a->op = op_true;		cond1a->next = NULL;		free_cond( cond1b );		return cond1a;	    }	}	else if ( cond1c->op == op_constant && cond1d->op == op_or )	{	    if ( (cond1b->op == op_eq && strcmp( cond1c->str, current_arch ))	    ||   (cond1b->op == op_neq && ! strcmp( cond1c->str, current_arch )) )	    {		/* This is for another architecture */ 		cond1b = cond1d->next;		cond1d->next = NULL;		free_cond( cond1a );		return eliminate_other_arch( cond1b );	    }	    else if ( (cond1b->op == op_neq && strcmp( cond1c->str, current_arch ))		 || (cond1b->op == op_eq && ! strcmp( cond1c->str, current_arch )) )	    {		/* This is for current architecture */		cond1a->op = op_true;		cond1a->next = NULL;		free_cond( cond1b );		return cond1a;	    }	}	else if ( cond1c->op == op_constant && cond1d->op == op_and )	{	    if ( (cond1b->op == op_eq && strcmp( cond1c->str, current_arch ))	    ||   (cond1b->op == op_neq && ! strcmp( cond1c->str, current_arch )) )	    {		/* This is for another architecture */		int l_par = 0;				for ( cond1c = cond1d->next; cond1c; cond1c = cond1c->next )		{		    if ( cond1c->op == op_lparen )			l_par++;		    else if ( cond1c->op == op_rparen )			l_par--;		    else if ( cond1c->op == op_or && l_par == 0 )		    /* Expression too complex - don't touch */			return cond1a;		    else if ( l_par < 0 )		    {			fprintf( stderr, "incorrect condition: programming error ?\n" );			exit( 1 );		    }		}		cond1a->op = op_false;		cond1a->next = NULL;		free_cond( cond1b );		return cond1a;	    }	    else if ( (cond1b->op == op_neq && strcmp( cond1c->str, current_arch ))		 || (cond1b->op == op_eq && ! strcmp( cond1c->str, current_arch )) )	    {		/* This is for current architecture */		cond1b = cond1d->next;		cond1d->next = NULL;		free_cond( cond1a );		return eliminate_other_arch( cond1b );	    }	}    }    if ( cond1a->op == op_variable && ! vartable[cond1a->nameindex].defined )    {	cond1b = cond1a->next; if ( cond1b == NULL ) goto done;	cond1c = cond1b->next; if ( cond1c == NULL ) goto done;	cond1d = cond1c->next;	if ( cond1c->op == op_constant	&& ( cond1d == NULL || cond1d->op == op_and ) ) /*???*/	{	    if ( cond1b->op == op_eq && strcmp( cond1c->str, "" ) )	    {		cond1a->op = op_false;		cond1a->next = NULL;		free_cond( cond1b );		return cond1a;	    }	}	else if ( cond1c->op == op_constant && cond1d->op == op_or )	{	    if ( cond1b->op == op_eq && strcmp( cond1c->str, "" ) )	    {		cond1b = cond1d->next;		cond1d->next = NULL;		free_cond( cond1a );		return eliminate_other_arch( cond1b );	    }	}    }done:    return list;}/* * This is the main transformation function. */void fix_conditionals( struct kconfig * scfg ){    struct kconfig * cfg;    /*     * Transform op_variable to op_kvariable.     */    mark_variables( scfg );    /*     * Walk the statement list, maintaining a stack of current conditions.     *   token_if      push its condition onto the stack.     *   token_else    invert the condition on the top of the stack.     *   token_endif   pop the stack.     *     * For a simple statement, create a condition chain by joining together     * all of the conditions on the stack.     */    {	struct condition * cond_stack [32];	int depth = 0;	struct kconfig * prev = NULL;	for ( cfg = scfg; cfg != NULL; cfg = cfg->next )	{	    int good = 1;	    switch ( cfg->token )	    {	    default:		break;	    case token_if:		cond_stack [depth++] =		    remove_bang( eliminate_other_arch( cfg->cond ) );		cfg->cond = NULL;		break;	    case token_else:		{		    /*		     * Invert the condition chain.		     *		     * Be careful to transfrom op_or to op_and1, not op_and.		     * I will need this later in the code that removes		     * duplicate conditions.		     */		    struct condition * cond;		    for ( cond  = cond_stack [depth-1];			  cond != NULL;			  cond  = cond->next )		    {			switch( cond->op )			{			default:     break;			case op_and: cond->op = op_or;   break;			case op_or:  cond->op = op_and1; break;			case op_neq: cond->op = op_eq;   break;			case op_eq:  cond->op = op_neq;  break;			case op_true: cond->op = op_false;break;			case op_false:cond->op = op_true; break;			}		    }		}		break;	    case token_fi:		--depth;		break;	    case token_bool:	    case token_choice_item:	    case token_choice_header:	    case token_comment:	    case token_define_bool:	    case token_define_hex:	    case token_define_int:	    case token_define_string:	    case token_define_tristate:	    case token_endmenu:	    case token_hex:	    case token_int:	    case token_mainmenu_option:	    case token_string:	    case token_tristate:	    case token_unset:		cfg->cond = join_condition_stack( cond_stack, depth );		if ( cfg->cond && cfg->cond->op == op_false )		{		    good = 0;		    if ( prev )			prev->next = cfg->next;		    else			scfg = cfg->next;		}		break;	    case token_dep_bool:	    case token_dep_mbool:	    case token_dep_tristate:		/*		 * Same as the other simple statements, plus an additional		 * condition for the dependency.		 */		if ( cfg->cond )		{		    cond_stack [depth] = eliminate_other_arch( cfg->cond );		    cfg->cond = join_condition_stack( cond_stack, depth+1 );		}		else		{		    cfg->cond = join_condition_stack( cond_stack, depth );		}		if ( cfg->cond && cfg->cond->op == op_false )		{		    good = 0;		    if ( prev )			prev->next = cfg->next;		    else			scfg = cfg->next;		}		break;	    }	    if ( good )		prev = cfg;	}    }}#if 0void dump_condition( struct condition *list ){    struct condition *tmp;    for ( tmp = list; tmp; tmp = tmp->next )    {	switch (tmp->op)	{	default:	    break;	case op_variable:	    printf( " %s", vartable[tmp->nameindex].name );	    break;	case op_constant: 	    printf( " %s", tmp->str );	    break;	case op_eq:	    printf( " =" );	    break;	case op_bang:	    printf( " !" );	    break;	case op_neq:	    printf( " !=" );	    break;	case op_and:	case op_and1:	    printf( " -a" );	    break;	case op_or:	    printf( " -o" );	    break;	case op_true:	    printf( " TRUE" );	    break;	case op_false:	    printf( " FALSE" );	    break;	case op_lparen:	    printf( " (" );	    break;	case op_rparen:	    printf( " )" );	    break;	}    }    printf( "\n" );}#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人综合精品三级| 亚洲伦理在线精品| 寂寞少妇一区二区三区| 69堂精品视频| 国产在线乱码一区二区三区| 久久夜色精品一区| 毛片基地黄久久久久久天堂| 日韩精品中午字幕| 丁香六月久久综合狠狠色| 久久精品网站免费观看| 白白色 亚洲乱淫| 一区二区三区不卡视频在线观看| 欧美影院精品一区| 日韩专区在线视频| 精品国产一区二区三区久久影院| 久久精品免费看| 久久久久国产精品人| 一本久道久久综合中文字幕| 亚洲6080在线| 国产日韩欧美精品电影三级在线| 99精品偷自拍| 亚洲成人手机在线| 久久久久久久精| 欧美亚洲动漫制服丝袜| 免费在线观看视频一区| 亚洲国产精品传媒在线观看| 在线免费一区三区| 国产一区二区在线视频| 亚洲最大色网站| 欧美va亚洲va香蕉在线| 成人免费观看av| 日韩电影免费在线看| 国产精品免费视频观看| 欧美日韩中文国产| 粉嫩av一区二区三区在线播放 | 国产自产v一区二区三区c| 国产精品丝袜一区| 91精品国产综合久久久久久漫画| 国产美女av一区二区三区| 亚洲免费av高清| 久久综合久久综合亚洲| 色老汉一区二区三区| 国模套图日韩精品一区二区| 亚洲国产一区在线观看| 久久精品人人做| 欧美高清精品3d| 91在线免费看| 国产河南妇女毛片精品久久久| 亚洲精品免费视频| 久久影院视频免费| 欧美日韩综合不卡| 91麻豆国产在线观看| 国产精品中文字幕一区二区三区| 午夜精品一区在线观看| 亚洲免费成人av| 国产精品免费观看视频| 精品国产91久久久久久久妲己| 欧美在线观看视频一区二区 | 国产成人久久精品77777最新版本| 一区二区三区四区亚洲| 久久久精品一品道一区| 91麻豆精品国产91久久久 | 日本韩国欧美一区二区三区| 精品写真视频在线观看| 日韩二区三区在线观看| 亚洲综合久久久| 亚洲色图视频网站| 日韩美女视频一区二区| 国产精品人妖ts系列视频| 欧美国产一区视频在线观看| 精品国产sm最大网站免费看| 91精品国产91综合久久蜜臀| 欧美性大战久久久久久久蜜臀| 91亚洲精品久久久蜜桃| 懂色av一区二区三区免费看| 久久99国产精品久久99果冻传媒| 日韩av在线免费观看不卡| 亚洲成a人v欧美综合天堂下载| 亚洲一二三四久久| 亚洲国产精品久久一线不卡| 亚洲成人自拍网| 蜜桃在线一区二区三区| 老司机精品视频线观看86| 麻豆91精品视频| 精品中文字幕一区二区小辣椒| 免费在线欧美视频| 激情综合亚洲精品| 国产美女一区二区三区| 粉嫩aⅴ一区二区三区四区 | 亚洲亚洲人成综合网络| 亚洲.国产.中文慕字在线| 三级久久三级久久| 久久精品二区亚洲w码| 国产一区二区福利| 99久久婷婷国产精品综合| 91福利视频在线| 欧美一区二区三区播放老司机| 日韩欧美黄色影院| 久久久午夜精品| 国产精品白丝在线| 亚洲伊人色欲综合网| 日本中文字幕不卡| 国产一区二区免费看| 99视频一区二区| 在线电影院国产精品| 精品欧美乱码久久久久久| 国产精品久久久久久亚洲毛片 | 国产精品无码永久免费888| 国产精品美女一区二区在线观看| 国产精品丝袜一区| 视频一区视频二区在线观看| 精品在线视频一区| 成人av电影在线网| 3d成人动漫网站| 国产女同性恋一区二区| 亚洲午夜久久久久久久久久久| 日韩高清在线观看| 高清不卡一区二区在线| 欧美日韩一区二区三区在线看| 精品国产自在久精品国产| 国产精品护士白丝一区av| 日韩综合小视频| 成人国产精品免费| 在线观看91av| 国产精品传媒入口麻豆| 视频一区二区不卡| av在线这里只有精品| 日韩欧美你懂的| 亚洲色欲色欲www在线观看| 日韩精品视频网站| 暴力调教一区二区三区| 精品国产乱码久久久久久久| 综合精品久久久| 极品少妇一区二区| 欧美精品99久久久**| 中日韩av电影| 奇米影视一区二区三区小说| 91女厕偷拍女厕偷拍高清| 久久影院视频免费| 日本不卡一区二区三区| 在线看不卡av| 一色屋精品亚洲香蕉网站| 美国精品在线观看| 欧美日韩一区三区| 亚洲婷婷综合色高清在线| 国精产品一区一区三区mba桃花| 99国产精品久久久| 国产欧美精品一区| 久久国产视频网| 在线播放/欧美激情| 亚洲码国产岛国毛片在线| 国产成人福利片| 久久亚洲精品国产精品紫薇| 日韩精品亚洲一区| 欧美日产在线观看| 亚洲一区二区高清| 欧美怡红院视频| 一区二区三区成人在线视频| av在线播放不卡| 日本一区二区高清| 国产精品一区在线观看乱码| 日韩一级二级三级精品视频| 亚洲高清免费一级二级三级| 91免费国产在线| 自拍偷拍亚洲激情| 色综合一个色综合亚洲| 国产精品初高中害羞小美女文| 国产在线日韩欧美| 国产亚洲人成网站| 国产凹凸在线观看一区二区| 久久久久国色av免费看影院| 国产一区二区三区四区五区美女 | 国产成人亚洲精品青草天美| 久久久一区二区| 成人国产一区二区三区精品| 国产精品日日摸夜夜摸av| 成年人网站91| 日韩码欧中文字| 欧美影视一区二区三区| 亚洲午夜一二三区视频| 欧美探花视频资源| 日本va欧美va精品| 日韩你懂的在线播放| 美女高潮久久久| 欧美精品一区男女天堂| 国产剧情一区二区| 国产精品福利电影一区二区三区四区 | 男男成人高潮片免费网站| 日韩午夜激情av| 国产一区不卡视频| 国产女主播一区| 欧洲av在线精品| 日韩av一级片| 国产女人水真多18毛片18精品视频| 波多野结衣一区二区三区| 最新不卡av在线| 欧美一级生活片| 成人深夜在线观看| 午夜亚洲福利老司机| 久久综合视频网|