⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbol.c

📁 這是一個實時嵌入式作業系統 實作了MCS51 ARM等MCU
💻 C
📖 第 1 页 / 共 2 页
字号:
		case yes:			newval = no;			break;		}		if (sym_set_tristate_value(sym, newval))			break;	} while (oldval != newval);	return newval;}bool sym_string_valid(struct symbol *sym, const char *str){	signed char ch;	switch (sym->type) {	case S_STRING:		return true;	case S_INT:		ch = *str++;		if (ch == '-')			ch = *str++;		if (!isdigit(ch))			return false;		if (ch == '0' && *str != 0)			return false;		while ((ch = *str++)) {			if (!isdigit(ch))				return false;		}		return true;	case S_HEX:		if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))			str += 2;		ch = *str++;		do {			if (!isxdigit(ch))				return false;		} while ((ch = *str++));		return true;	case S_BOOLEAN:	case S_TRISTATE:		switch (str[0]) {		case 'y': case 'Y':		case 'm': case 'M':		case 'n': case 'N':			return true;		}		return false;	default:		return false;	}}bool sym_string_within_range(struct symbol *sym, const char *str){	struct property *prop;	int val;	switch (sym->type) {	case S_STRING:		return sym_string_valid(sym, str);	case S_INT:		if (!sym_string_valid(sym, str))			return false;		prop = sym_get_range_prop(sym);		if (!prop)			return true;		val = strtol(str, NULL, 10);		return val >= strtol(prop->expr->left.sym->name, NULL, 10) &&		       val <= strtol(prop->expr->right.sym->name, NULL, 10);	case S_HEX:		if (!sym_string_valid(sym, str))			return false;		prop = sym_get_range_prop(sym);		if (!prop)			return true;		val = strtol(str, NULL, 16);		return val >= strtol(prop->expr->left.sym->name, NULL, 16) &&		       val <= strtol(prop->expr->right.sym->name, NULL, 16);	case S_BOOLEAN:	case S_TRISTATE:		switch (str[0]) {		case 'y': case 'Y':			return sym_tristate_within_range(sym, yes);		case 'm': case 'M':			return sym_tristate_within_range(sym, mod);		case 'n': case 'N':			return sym_tristate_within_range(sym, no);		}		return false;	default:		return false;	}}bool sym_set_string_value(struct symbol *sym, const char *newval){	const char *oldval;	char *val;	int size;	switch (sym->type) {	case S_BOOLEAN:	case S_TRISTATE:		switch (newval[0]) {		case 'y': case 'Y':			return sym_set_tristate_value(sym, yes);		case 'm': case 'M':			return sym_set_tristate_value(sym, mod);		case 'n': case 'N':			return sym_set_tristate_value(sym, no);		}		return false;	default:		;	}	if (!sym_string_within_range(sym, newval))		return false;	if (sym->flags & SYMBOL_NEW) {		sym->flags &= ~SYMBOL_NEW;		sym_set_changed(sym);	}	oldval = sym->user.val;	size = strlen(newval) + 1;	if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {		size += 2;		sym->user.val = val = malloc(size);		*val++ = '0';		*val++ = 'x';	} else if (!oldval || strcmp(oldval, newval))		sym->user.val = val = malloc(size);	else		return true;	strcpy(val, newval);	free((void *)oldval);	sym_clear_all_valid();	return true;}const char *sym_get_string_value(struct symbol *sym){	tristate val;	switch (sym->type) {	case S_BOOLEAN:	case S_TRISTATE:		val = sym_get_tristate_value(sym);		switch (val) {		case no:			return "n";		case mod:			return "m";		case yes:			return "y";		}		break;	default:		;	}	return (const char *)sym->curr.val;}bool sym_is_changable(struct symbol *sym){	return sym->visible > sym->rev_dep.tri;}struct symbol *sym_lookup(const char *name, int isconst){	struct symbol *symbol;	const char *ptr;	char *new_name;	int hash = 0;	if (name) {		if (name[0] && !name[1]) {			switch (name[0]) {			case 'y': return &symbol_yes;			case 'm': return &symbol_mod;			case 'n': return &symbol_no;			}		}		for (ptr = name; *ptr; ptr++)			hash += *ptr;		hash &= 0xff;		for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {			if (!strcmp(symbol->name, name)) {				if ((isconst && symbol->flags & SYMBOL_CONST) ||				    (!isconst && !(symbol->flags & SYMBOL_CONST)))					return symbol;			}		}		new_name = strdup(name);	} else {		new_name = NULL;		hash = 256;	}	symbol = malloc(sizeof(*symbol));	memset(symbol, 0, sizeof(*symbol));	symbol->name = new_name;	symbol->type = S_UNKNOWN;	symbol->flags = SYMBOL_NEW;	if (isconst)		symbol->flags |= SYMBOL_CONST;	symbol->next = symbol_hash[hash];	symbol_hash[hash] = symbol;	return symbol;}struct symbol *sym_find(const char *name){	struct symbol *symbol = NULL;	const char *ptr;	int hash = 0;	if (!name)		return NULL;	if (name[0] && !name[1]) {		switch (name[0]) {		case 'y': return &symbol_yes;		case 'm': return &symbol_mod;		case 'n': return &symbol_no;		}	}	for (ptr = name; *ptr; ptr++)		hash += *ptr;	hash &= 0xff;	for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {		if (!strcmp(symbol->name, name) &&		    !(symbol->flags & SYMBOL_CONST))				break;	}	return symbol;}struct symbol **sym_re_search(const char *pattern){	struct symbol *sym, **sym_arr = NULL;	int i, cnt, size;	regex_t re;	cnt = size = 0;	/* Skip if empty */	if (strlen(pattern) == 0)		return NULL;	if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))		return NULL;	for_all_symbols(i, sym) {		if (sym->flags & SYMBOL_CONST || !sym->name)			continue;		if (regexec(&re, sym->name, 0, NULL, 0))			continue;		if (cnt + 1 >= size) {			void *tmp = sym_arr;			size += 16;			sym_arr = realloc(sym_arr, size * sizeof(struct symbol *));			if (!sym_arr) {				free(tmp);				return NULL;			}		}		sym_arr[cnt++] = sym;	}	if (sym_arr)		sym_arr[cnt] = NULL;	regfree(&re);	return sym_arr;}struct symbol *sym_check_deps(struct symbol *sym);static struct symbol *sym_check_expr_deps(struct expr *e){	struct symbol *sym;	if (!e)		return NULL;	switch (e->type) {	case E_OR:	case E_AND:		sym = sym_check_expr_deps(e->left.expr);		if (sym)			return sym;		return sym_check_expr_deps(e->right.expr);	case E_NOT:		return sym_check_expr_deps(e->left.expr);	case E_EQUAL:	case E_UNEQUAL:		sym = sym_check_deps(e->left.sym);		if (sym)			return sym;		return sym_check_deps(e->right.sym);	case E_SYMBOL:		return sym_check_deps(e->left.sym);	default:		break;	}	printf("Oops! How to check %d?\n", e->type);	return NULL;}struct symbol *sym_check_deps(struct symbol *sym){	struct symbol *sym2;	struct property *prop;	if (sym->flags & SYMBOL_CHECK_DONE)		return NULL;	if (sym->flags & SYMBOL_CHECK) {		printf("Warning! Found recursive dependency: %s", sym->name);		return sym;	}	sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);	sym2 = sym_check_expr_deps(sym->rev_dep.expr);	if (sym2)		goto out;	for (prop = sym->prop; prop; prop = prop->next) {		if (prop->type == P_CHOICE || prop->type == P_SELECT)			continue;		sym2 = sym_check_expr_deps(prop->visible.expr);		if (sym2)			goto out;		if (prop->type != P_DEFAULT || sym_is_choice(sym))			continue;		sym2 = sym_check_expr_deps(prop->expr);		if (sym2)			goto out;	}out:	if (sym2)		printf(" %s", sym->name);	sym->flags &= ~SYMBOL_CHECK;	return sym2;}struct property *prop_alloc(enum prop_type type, struct symbol *sym){	struct property *prop;	struct property **propp;	prop = malloc(sizeof(*prop));	memset(prop, 0, sizeof(*prop));	prop->type = type;	prop->sym = sym;	prop->file = current_file;	prop->lineno = zconf_lineno();	/* append property to the prop list of symbol */	if (sym) {		for (propp = &sym->prop; *propp; propp = &(*propp)->next)			;		*propp = prop;	}	return prop;}struct symbol *prop_get_symbol(struct property *prop){	if (prop->expr && (prop->expr->type == E_SYMBOL ||			   prop->expr->type == E_CHOICE))		return prop->expr->left.sym;	return NULL;}const char *prop_get_type_name(enum prop_type type){	switch (type) {	case P_PROMPT:		return "prompt";	case P_COMMENT:		return "comment";	case P_MENU:		return "menu";	case P_DEFAULT:		return "default";	case P_CHOICE:		return "choice";	case P_SELECT:		return "select";	case P_RANGE:		return "range";	case P_UNKNOWN:		break;	}	return "unknown";}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -