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

📄 cpp.c

📁 代码检索工具GLOBAL源码。可用来浏览分析LINUX源码。
💻 C
📖 第 1 页 / 共 2 页
字号:
		case CPP_GOTO:		case CPP_IF:		case CPP_RETURN:		case CPP_SWITCH:		case CPP_TRY:		case CPP_WHILE:			if (wflag && !startmacro && level == 0)				warning("Out of function. %8s [+%d %s]", token, lineno, curfile);			break;		case CPP_TYPEDEF:			if (tflag) {				char savetok[MAXTOKEN];				int savelineno = 0;				int typedef_savelevel = level;				savetok[0] = 0;				/* skip CV qualifiers */				do {					c = nexttoken("{}(),;", cpp_reserved_word);				} while (IS_CV_QUALIFIER(c) || c == '\n');				if (wflag && c == EOF) {					warning("unexpected eof. [+%d %s]", lineno, curfile);					break;				} else if (c == CPP_ENUM || c == CPP_STRUCT || c == CPP_UNION) {					char *interest_enum = "{},;";					int c_ = c;					c = nexttoken(interest_enum, cpp_reserved_word);					/* read enum name if exist */					if (c == SYMBOL) {						if (target == SYM)							PUT(token, lineno, sp);						c = nexttoken(interest_enum, cpp_reserved_word);					}					for (; c != EOF; c = nexttoken(interest_enum, cpp_reserved_word)) {						switch (c) {						case SHARP_IFDEF:						case SHARP_IFNDEF:						case SHARP_IF:						case SHARP_ELIF:						case SHARP_ELSE:						case SHARP_ENDIF:							condition_macro(c, target);							continue;						default:							break;						}						if (c == ';' && level == typedef_savelevel) {							if (savetok[0] && target == DEF)								PUT(savetok, savelineno, sp);							break;						} else if (c == '{')							level++;						else if (c == '}') {							if (--level == typedef_savelevel)								break;						} else if (c == SYMBOL) {							if (c_ == CPP_ENUM) {								if (target == DEF && level > typedef_savelevel)									PUT(token, lineno, sp);								if (target == SYM && level == typedef_savelevel)									PUT(token, lineno, sp);							} else {								if (target == REF) {									if (level > typedef_savelevel && defined(token))										PUT(token, lineno, sp);								} else if (target == SYM) {									if (!defined(token))										PUT(token, lineno, sp);								} else if (target == DEF) {									/* save lastest token */									strlimcpy(savetok, token, sizeof(savetok));									savelineno = lineno;								}							}						}					}					if (c == ';')						break;					if (wflag && c == EOF) {						warning("unexpected eof. [+%d %s]", lineno, curfile);						break;					}				} else if (c == SYMBOL) {					if (target == REF && defined(token))						PUT(token, lineno, sp);					if (target == SYM && !defined(token))						PUT(token, lineno, sp);				}				savetok[0] = 0;				while ((c = nexttoken("(),;", cpp_reserved_word)) != EOF) {					switch (c) {					case SHARP_IFDEF:					case SHARP_IFNDEF:					case SHARP_IF:					case SHARP_ELIF:					case SHARP_ELSE:					case SHARP_ENDIF:						condition_macro(c, target);						continue;					default:						break;					}					if (c == '(')						level++;					else if (c == ')')						level--;					else if (c == SYMBOL) {						if (level > typedef_savelevel) {							if (target == SYM)								PUT(token, lineno, sp);						} else {							/* put latest token if any */							if (savetok[0]) {								if (target == SYM)									PUT(savetok, savelineno, sp);							}							/* save lastest token */							strlimcpy(savetok, token, sizeof(savetok));							savelineno = lineno;						}					} else if (c == ',' || c == ';') {						if (savetok[0]) {							if (target == DEF)								PUT(savetok, lineno, sp);							savetok[0] = 0;						}					}					if (level == typedef_savelevel && c == ';')						break;				}				if (wflag) {					if (c == EOF)						warning("unexpected eof. [+%d %s]", lineno, curfile);					else if (level != typedef_savelevel)						warning("() block unmatched. (last at level %d.)[+%d %s]", level, lineno, curfile);				}			}			break;		case CPP___ATTRIBUTE__:			process_attribute(target);			break;		default:			break;		}	}	strbuf_close(sb);	if (wflag) {		if (level != 0)			warning("{} block unmatched. (last at level %d.)[+%d %s]", level, lineno, curfile);		if (piflevel != 0)			warning("#if block unmatched. (last at level %d.)[+%d %s]", piflevel, lineno, curfile);	}	closetoken();}/* * process_attribute: skip attributes in __attribute__((...)). * *	r)	target type */static voidprocess_attribute(target)	int target;{	int brace = 0;	int c;	/*	 * Skip '...' in __attribute__((...))	 * but pick up symbols in it.	 */	while ((c = nexttoken("()", cpp_reserved_word)) != EOF) {		if (c == '(')			brace++;		else if (c == ')')			brace--;		else if (c == SYMBOL) {			if (target == REF) {				if (defined(token))					PUT(token, lineno, sp);			} else if (target == SYM) {				if (!defined(token))					PUT(token, lineno, sp);			}		}		if (brace == 0)			break;	}}/* * function_definition: return if function definition or not. * *	r)	target type */static intfunction_definition(target)	int target;{	int c;	int brace_level;	brace_level = 0;	while ((c = nexttoken("()", cpp_reserved_word)) != EOF) {		switch (c) {		case SHARP_IFDEF:		case SHARP_IFNDEF:		case SHARP_IF:		case SHARP_ELIF:		case SHARP_ELSE:		case SHARP_ENDIF:			condition_macro(c, target);			continue;		default:			break;		}		if (c == '('/* ) */)			brace_level++;		else if (c == /* ( */')') {			if (--brace_level == 0)				break;		}		/* pick up symbol */		if (c == SYMBOL) {			if (target == REF) {				if (seems_datatype(token) && defined(token))					PUT(token, lineno, sp);			} else if (target == SYM) {				if (!seems_datatype(token) || !defined(token))					PUT(token, lineno, sp);			}		}	}	if (c == EOF)		return 0;	if (peekc(0) == ';') {		(void)nexttoken(";", NULL);		return 0;	}	brace_level = 0;	while ((c = nexttoken(",;[](){}=", cpp_reserved_word)) != EOF) {		switch (c) {		case SHARP_IFDEF:		case SHARP_IFNDEF:		case SHARP_IF:		case SHARP_ELIF:		case SHARP_ELSE:		case SHARP_ENDIF:			condition_macro(c, target);			continue;		case CPP___ATTRIBUTE__:			process_attribute(target);			continue;		default:			break;		}		if (c == '('/* ) */ || c == '[')			brace_level++;		else if (c == /* ( */')' || c == ']')			brace_level--;		else if (brace_level == 0 && (c == ';' || c == ','))			break;		else if (c == '{' /* } */) {			pushbacktoken();			return 1;		} else if (c == /* { */'}')			break;		else if (c == '=')			break;		/* pick up symbol */		if (c == SYMBOL) {			if (target == REF) {				if (seems_datatype(token) && defined(token))					PUT(token, lineno, sp);			} else if (target == SYM) {				if (!seems_datatype(token) || !defined(token))					PUT(token, lineno, sp);			}		}	}	return 0;}/* * condition_macro:  * *	i)	cc	token *	i)	target	current target */static voidcondition_macro(cc, target)	int cc;	int target;{	cur = &pifstack[piflevel];	if (cc == SHARP_IFDEF || cc == SHARP_IFNDEF || cc == SHARP_IF) {		DBG_PRINT(piflevel, "#if");		if (++piflevel >= MAXPIFSTACK)			die("#if pifstack over flow. [%s]", curfile);		++cur;		cur->start = level;		cur->end = -1;		cur->if0only = 0;		if (peekc(0) == '0')			cur->if0only = 1;		else if ((cc = nexttoken(NULL, cpp_reserved_word)) == SYMBOL && !strcmp(token, "notdef"))			cur->if0only = 1;		else			pushbacktoken();	} else if (cc == SHARP_ELIF || cc == SHARP_ELSE) {		DBG_PRINT(piflevel - 1, "#else");		if (cur->end == -1)			cur->end = level;		else if (cur->end != level && wflag)			warning("uneven level. [+%d %s]", lineno, curfile);		level = cur->start;		cur->if0only = 0;	} else if (cc == SHARP_ENDIF) {		int minus = 0;		--piflevel;		if (piflevel < 0) {			minus = 1;			piflevel = 0;		}		DBG_PRINT(piflevel, "#endif");		if (minus) {			if (wflag)				warning("#if block unmatched. reseted. [+%d %s]", lineno, curfile);		} else {			if (cur->if0only)				level = cur->start;			else if (cur->end != -1) {				if (cur->end != level && wflag)					warning("uneven level. [+%d %s]", lineno, curfile);				level = cur->end;			}		}	}	while ((cc = nexttoken(NULL, cpp_reserved_word)) != EOF && cc != '\n') {                if (cc == SYMBOL && strcmp(token, "defined") != 0) {			if (target == REF) {				if (dflag && defined(token))		                        PUT(token, lineno, sp);			} else if (target == SYM) {				if (!dflag || !defined(token))		                	PUT(token, lineno, sp);			}		}	}}/* * seems_datatype: decide whether or not it is a data type. * *	i)	token	token *	r)		0: not data type, 1: data type */static intseems_datatype(token)	const char *token;{	int length = strlen(token);	const char *p = token + length;	if (length > 2 && strcmp(p - 2, "_t") == 0)		return 1;	for (p = token; *p; p++)		if (islower(*p))			return 0;	return 1;}

⌨️ 快捷键说明

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