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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sfx.c

?? 一些常用的數據結構庫
?? C
?? 第 1 頁 / 共 2 頁
字號:
	int ch = get_next_skip_ws(expr);	/*	 * Determine what the next bit of input is: parenthesized type name,	 * expression, unary expression or what?  Speculative parsing is used	 * to test several hypotheses.  For example,  something like	 * (X)(Y) ^ 1 is seen, it will be turned, by subsequent iterations of	 * this loop, into the codes: parambig, parambig, other.	 */	if (ch == '(') {	    int istype = speculate(chk_typename, expr, &type, ')');	    int iscomma = speculate(chk_comma, expr, &comma, ')');	    switch (istype << 1 | iscomma) {	    case 0:		ch = get_next_skip_ws(expr);		if (ch == ')')		    peek = other; /* empty parentheses */		else		    syntax_error();		break;	    case 1:		peek = parexpr;		break;	    case 2:		peek = partype;		break;	    case 3:		peek = parambig;		break;	    }	    put_back(expr, ch);	} else if (ch == 0) {	    peek = other;	} else {	    put_back(expr, ch);	    if (speculate(chk_unary, expr, &unr, 0)) {		peek = (ch == '+' || ch == '-' || ch == '*' || ch == '&') ? plunary : unary;	    } else {		peek = other;	    }	}	/*	 * Okay, now we have an idea what is coming in the input. We make some	 * sensible decision based on this and the thing we parsed previously.	 * Either the parsing continues to grab more parenthesized things, or	 * some decision is made to parse out the suffix material sensibly and	 * terminate.  Backtracking is used up to two elements back. For	 * example in the case of (X)(Y) ^ 1 (parambig, parambig, other) it's	 * necessary, upon seeing ^ 1 (other) to go back to second to last	 * ambigous parenthesized element (X) and terminate by parsing the	 * (X)(Y) as a postfix expression. It cannot be a cast, because ^1	 * isn't an expression.  Unary expressions that start with + or -	 * create an interesting ambiguity.  Is (X)(Y) + 1 the addition of 1 to	 * the result of the call to function X with parameter Y? Or is it the	 * unary expression + 1 cast to type Y and X? The safer assumption is	 * to go with the function call hypothesis, since that's the	 * interpretation that may have side effects. 	 */	switch (curr) {	case parexpr:		/* impossible cases */	case other:	case unary:	case plunary:	    assert (0);	    syntax_error();	    /* notreached */	case partype:	    switch (peek) {	    case parexpr:	/* cast in front of parenthesized expression */		chk_postfix(expr);		return;	    case partype:	/* compounding cast: keep looping */		break;	    case parambig:	/* type or expr: keep looping */		break;	    case unary:	    case plunary:		chk_unary(expr);		return;	    case other:		/* cast in front of non-expression! */		syntax_error();		/* notreached */	    }	    break;	case parambig:	    switch (peek) {	    case parexpr:	/* function call */		assign_context(expr, &cur_expr);		chk_postfix(expr);		return;	    case partype:	/* compounding cast: keep looping */		break;	    case parambig:	/* type or expr: keep looping */		break;	    case unary:		chk_unary(expr);		return;	    case plunary:	/* treat unary expr with + or - as additive */	    case other:		if (old == parambig) {		    /* reparse two expression-like things in a row as call */		    assign_context(expr, &old_expr);		    chk_postfix(expr);		    return;		}		/* reparse expression followed by non-parenthesized 		   stuff as postfix expression */		assign_context(expr, &cur_expr);		chk_postfix(expr);		return;		/* need more context */	    }	    break;	}	old = curr;	curr = peek;	assign_context(&old_expr, &cur_expr);	assign_context(&cur_expr, expr);	assign_context(expr, &type);    }}static void chk_multiplicative(context_t *expr){    for (;;) {	int ch;	chk_cast(expr);	ch = get_next_skip_ws(expr);	if ((ch != '*' && ch != '/' && ch != '%') || peek_next(expr) == '=') {	    put_back(expr, ch);	    break;	}    }}static void chk_additive(context_t *expr){    for (;;) {	int ch;	chk_multiplicative(expr);	ch = get_next_skip_ws(expr);	if ((ch != '+' && ch != '-') || peek_next(expr) == '=') {	    put_back(expr, ch);	    break;	}    }}static void chk_shift(context_t *expr){    for (;;) {	int ch;	chk_additive(expr);	ch = get_next_skip_ws(expr);	if (ch != '<' && ch != '>') {	    put_back(expr, ch);	    break;	}	if (ch == '<' && peek_next(expr) != '<') {	    put_back(expr, ch);	    break;	}	if (ch == '>' && peek_next(expr) != '>') {	    put_back(expr, ch);	    break;	}	get_next(expr);	if (peek_next(expr) == '=') {	    put_back(expr, ch);	    put_back(expr, ch);	    break;	}    }}static void chk_relational(context_t *expr){    for (;;) {	int ch;	chk_shift(expr);	ch = get_next_skip_ws(expr);		if (ch != '<' && ch != '>') {	    put_back(expr, ch);	    break;	}	if (ch == '<' && peek_next(expr) == '<') {	    put_back(expr, ch);	    break;	}	if (ch == '>' && peek_next(expr) == '>') {	    put_back(expr, ch);	    break;	}	if (peek_next(expr) == '=')	    get_next(expr);    }}static void chk_equality(context_t *expr){    for (;;) {	int ch;	chk_relational(expr);	ch = get_next_skip_ws(expr);	if ((ch != '!' && ch != '=') || peek_next(expr) != '=') {	    put_back(expr, ch);	    break;	}	match_hard(expr, '=');    }}static void chk_and(context_t *expr){    for (;;) {	int ch;	chk_equality(expr);	ch = get_next_skip_ws(expr);	if (ch != '&' || peek_next(expr) == '&' || peek_next(expr) == '=') {	    put_back(expr, ch);	    break;	}    }}static void chk_exclusive_or(context_t *expr){    for (;;) {	int ch;	chk_and(expr);	ch = get_next_skip_ws(expr);	if (ch != '^' || peek_next(expr) == '=') {	    put_back(expr, ch);	    break;	}    }}static void chk_inclusive_or(context_t *expr){    for (;;) {	int ch;	chk_exclusive_or(expr);	ch = get_next_skip_ws(expr);	if (ch != '|' || peek_next(expr) == '|' || peek_next(expr) == '=') {	    put_back(expr, ch);	    break;	}    }}static void chk_logical_and(context_t *expr){    for (;;) {	int ch;	chk_inclusive_or(expr);	ch = get_next_skip_ws(expr);	if (ch != '&' || peek_next(expr) != '&') {	    put_back(expr, ch);	    break;	}	match_hard(expr, '&');    }}static void chk_logical_or(context_t *expr){    for (;;) {	int ch;	chk_logical_and(expr);	ch = get_next_skip_ws(expr);	if (ch != '|' || peek_next(expr) != '|') {	    put_back(expr, ch);	    break;	}	match_hard(expr, '|');    }}static void chk_conditional(context_t *expr){    for (;;) {	int ch;	chk_logical_or(expr);	ch = get_next_skip_ws(expr);	if (ch != '?') {	    put_back(expr, ch);	    break;	}	chk_comma(expr);		skip_ws(expr);	match_hard(expr, ':');    }}static void chk_assignment(context_t *expr){    for (;;) {	int ch;	chk_conditional(expr);	ch = get_next_skip_ws(expr);	switch (ch) {	case '=':	    break;	case '*': case '/': case '%':	case '+': case '-': case '&':	case '^': case '|':	    match_hard(expr, '=');	    break;	case '<':	    match_hard(expr, '<');	    match_hard(expr, '=');	    break;	case '>':	    match_hard(expr, '>');	    match_hard(expr, '=');	    break;	case 0:	default:	    put_back(expr, ch);	    return;	}	set_effect(expr, sfx_certain);    }}static void chk_comma(context_t *expr){    for (;;) {	int ch;	chk_assignment(expr);	ch = get_next_skip_ws(expr);	if (ch != ',') {	    put_back(expr, ch);	    break;	}    }}/* * This function returns 1 if the expression is successfully parsed, * or 0 if there is a syntax error. *  * The object pointed to by eff is set to indicate the side effect ranking of * the parsed expression: sfx_none, sfx_potential and sfx_certain.  These * rankins mean, respectively, that there are no side effects, that there are * potential side effects, or that there certainly are side effects. */int sfx_determine(const char *expr, sfx_rating_t *eff){    static const except_id_t catch[] = { { SFX_EX, XCEPT_CODE_ANY } };    except_t *ex;    context_t ctx;    volatile int retval = 1;    if (!except_init())	return 0;    init_context(&ctx, (const unsigned char *) expr);    except_try_push(catch, 1, &ex);    if (ex == 0) {	chk_comma(&ctx);	skip_ws(&ctx);	if (peek_next(&ctx) != 0)	    syntax_error();    } else {	/* exception caught */	retval = 0;    }    except_try_pop();    *eff = ctx.eff;    except_deinit();    return retval;}#ifdef KAZLIB_POSIX_THREADSstatic pthread_once_t cache_init;static pthread_mutex_t cache_mutex = PTHREAD_MUTEX_INITIALIZER;#define init_once(X, Y) pthread_once(X, Y)#define lock_cache() pthread_mutex_lock(&cache_mutex)#define unlock_cache() pthread_mutex_unlock(&cache_mutex)#elsestatic int cache_init;static void init_once(int *once, void (*func)(void)){    if (*once == 0) {	func();	*once = 1;    }}#define lock_cache()#define unlock_cache()#endifstatic hash_t *cache;extern hash_t *hash_create(hashcount_t, hash_comp_t, hash_fun_t);static void init_cache(void){    cache = hash_create(HASHCOUNT_T_MAX, 0, 0);}static int lookup_cache(const char *expr, sfx_rating_t *rating){    hnode_t *cache_node;    init_once(&cache_init, init_cache);    lock_cache();    cache_node = hash_lookup(cache, expr);    unlock_cache();    if (cache_node != 0) {	sfx_entry_t *cache_entry = hnode_get(cache_node);	*rating = cache_entry->eff;	return 1;    }    return 0;}static int cache_result(const char *expr, sfx_rating_t rating){    int result = 0;    hnode_t *cache_node;    init_once(&cache_init, init_cache);    if (cache == 0)	goto bail;    lock_cache();    cache_node = hash_lookup(cache, expr);    if (!cache_node) {	sfx_entry_t *cache_entry = malloc(sizeof *cache_entry);	if (cache_entry == 0)	    goto bail_unlock;	hnode_init(&cache_entry->node, cache_entry);	cache_entry->expr = expr;	cache_entry->eff = rating;	hash_insert(cache, &cache_entry->node, expr);    } else {	sfx_entry_t *cache_entry = hnode_get(cache_node);	cache_entry->eff = rating;	result = 1;    }    result = 1;    bail_unlock:    unlock_cache();bail:    return result;}void sfx_check(const char *expr, const char *file, unsigned long line){    sfx_rating_t eff;    int success = lookup_cache(expr, &eff);    if (!success) {	success = sfx_determine(expr, &eff);	cache_result(expr, eff);    }    if (!success) {	fprintf(stderr, "%s:%ld: syntax error in expression \"%s\"\n",		file, line, expr);    } else if (eff == sfx_potential) {	fprintf(stderr, "%s:%ld: expression \"%s\" may have side effects\n",		file, line, expr);    } else if (eff == sfx_certain) {	fprintf(stderr, "%s:%ld: expression \"%s\" has side effects\n",		file, line, expr);    } else {	return;    }}int sfx_declare(const char *expr, sfx_rating_t eff){    return cache_result(expr, eff);}#ifdef KAZLIB_TEST_MAIN#include <stdlib.h>int main(int argc, char **argv){    char expr_buf[256];    char *expr, *ptr;    sfx_rating_t eff;    for (;;) {	if (argc < 2) {	    expr = expr_buf;	    if (fgets(expr_buf, sizeof expr_buf, stdin) == 0)		break;	    if ((ptr = strchr(expr_buf, '\n')) != 0)		*ptr = 0;	} else {	    expr = (argv++)[1];	    if (!expr)		break;	}	if (!sfx_determine(expr, &eff)) {	    printf("expression '%s' has a syntax error\n", expr);	    return EXIT_FAILURE;	}	switch (eff) {	case sfx_none:	    printf("expression '%s' has no side effects\n", expr);	    break;	case sfx_potential:	    printf("expression '%s' may have side effects\n", expr);	    break;	case sfx_certain:	    printf("expression '%s' has side effects\n", expr);	    break;	}    }    return 0;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲欧美一级| 国产午夜精品久久久久久久 | 亚洲精品日韩综合观看成人91| 福利一区二区在线| 精品成人一区二区三区| 亚洲精品日日夜夜| 欧美久久久久免费| 亚洲不卡av一区二区三区| 欧美精选在线播放| 日本午夜精品视频在线观看| 精品久久国产97色综合| 久88久久88久久久| 欧美午夜精品久久久久久超碰| 亚洲自拍另类综合| 欧美片在线播放| 韩国精品免费视频| 欧美一区二区三区性视频| 毛片一区二区三区| 精品少妇一区二区| 成人黄色网址在线观看| 国产三级久久久| 成人免费观看男女羞羞视频| 国产视频一区在线播放| 国产99久久久国产精品潘金网站| 国产日韩欧美在线一区| 91一区在线观看| 夜夜夜精品看看| 久久影视一区二区| av成人老司机| 亚洲精品国久久99热| 5566中文字幕一区二区电影| 精品系列免费在线观看| 亚洲视频一二三| 欧美日韩成人综合在线一区二区| 久久精品国产久精国产| 久久久久国产精品厨房| 91福利国产成人精品照片| 久久超级碰视频| 亚洲天堂成人在线观看| 精品乱人伦小说| eeuss国产一区二区三区| 亚洲人成7777| 国产欧美va欧美不卡在线| 日本高清免费不卡视频| 国产一区二区视频在线| 亚洲六月丁香色婷婷综合久久| 精品久久久久久久久久久久包黑料| 成人激情图片网| 亚洲午夜激情av| 综合久久给合久久狠狠狠97色 | 精品久久人人做人人爽| 91久久线看在观草草青青| 精品影院一区二区久久久| 国产精品国产三级国产三级人妇 | 亚洲区小说区图片区qvod| 欧美电影一区二区| av在线不卡电影| 久久精品国产99国产精品| 亚洲一区中文在线| 欧美一区二区福利视频| 欧美视频中文字幕| 99re热视频这里只精品| 国产成人免费在线观看| 久久精品国产一区二区三| 日本成人在线不卡视频| 亚洲一区视频在线| 欧美国产一区二区| 精品精品欲导航| 欧美精品欧美精品系列| 91极品视觉盛宴| 9色porny自拍视频一区二区| 成人午夜精品一区二区三区| 免费观看日韩av| 蜜臀av在线播放一区二区三区| 亚洲影视在线观看| 一区二区三区四区国产精品| 国产精品美日韩| 欧美xxxxxxxxx| 日韩精品一区二区三区中文不卡| 欧美三级电影一区| 欧美美女激情18p| 欧美三片在线视频观看| 7777女厕盗摄久久久| 在线亚洲欧美专区二区| 欧美三级欧美一级| 欧美在线观看视频一区二区| 99久久免费精品| 成人激情开心网| 久久国产精品区| 国产精品123区| 国产99久久久国产精品潘金 | 成人动漫一区二区在线| 成人精品一区二区三区四区| 国产一区二区在线影院| 国产成人福利片| 国产aⅴ精品一区二区三区色成熟| 丁香婷婷综合激情五月色| 国产成人精品1024| 精品一区二区成人精品| 国产盗摄一区二区| 国产激情一区二区三区四区| 色婷婷久久久久swag精品| 在线观看精品一区| 欧美妇女性影城| 日韩欧美国产系列| 久久精品久久综合| 日韩精品电影在线| 日本午夜一本久久久综合| 亚洲另类中文字| 国产精品欧美一区喷水| 国产精品网友自拍| 一区二区三区在线观看视频| 免费xxxx性欧美18vr| 日韩三级在线观看| 91婷婷韩国欧美一区二区| 日本欧美韩国一区三区| 色综合久久88色综合天天免费| 日韩一区二区免费高清| 欧美一区二区三区人| 精品久久久久久久一区二区蜜臀| 日韩欧美一区二区视频| 久久9热精品视频| 精品一区二区在线播放| 国产日韩欧美精品一区| 色婷婷久久综合| 欧美xxx久久| 国产精品久久久久国产精品日日| 国产日韩欧美制服另类| 午夜精品123| 首页亚洲欧美制服丝腿| 国产91在线观看丝袜| 在线不卡免费av| 一区二区三区在线观看欧美| 久久国产精品99久久人人澡| 色婷婷国产精品久久包臀| 国产亚洲美州欧州综合国| 亚洲精品一区二区三区福利| 日本va欧美va瓶| 欧美日韩国产电影| 蜜桃精品在线观看| 91香蕉视频mp4| 一二三区精品福利视频| 91在线无精精品入口| 欧美成va人片在线观看| 亚洲国产精品精华液网站| 国产成人av电影在线| 欧美亚洲动漫精品| 一区二区国产盗摄色噜噜| 岛国精品在线观看| 91精品国产麻豆| 一区二区三区欧美视频| 欧美伊人久久久久久久久影院| 欧美电影免费观看完整版| 天堂一区二区在线| 国产a精品视频| 精品人伦一区二区色婷婷| 亚洲综合在线五月| 91蜜桃在线观看| 日韩美女主播在线视频一区二区三区| 久久久久久亚洲综合| 国产欧美一区二区三区在线老狼| 午夜精品成人在线视频| 91女厕偷拍女厕偷拍高清| 日韩av网站在线观看| 国产亚洲成aⅴ人片在线观看| av成人免费在线观看| 一级精品视频在线观看宜春院| 欧美日韩精品一区二区天天拍小说 | 激情另类小说区图片区视频区| 欧美亚洲国产bt| 亚洲一区在线视频观看| 国产福利不卡视频| 精品国产一区二区精华| 国产精品免费av| 成人精品小蝌蚪| 国产三级久久久| 国产美女精品人人做人人爽| 精品少妇一区二区三区在线视频| 亚洲123区在线观看| 欧美精品1区2区3区| 亚洲视频一二区| 99re亚洲国产精品| 一区二区三区在线观看欧美| 成人丝袜视频网| 亚洲精品国产一区二区精华液| 国产精品91xxx| 一区在线观看免费| 国产一区二区三区| 亚洲图片激情小说| 一本到三区不卡视频| 亚洲一区国产视频| 欧美日韩国产综合视频在线观看| 亚洲高清视频中文字幕| 欧美午夜精品一区| 午夜精品123| 欧美一级理论片| 另类成人小视频在线| 国产午夜精品福利| 欧美日韩精品高清| 偷拍一区二区三区四区|