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

📄 c.c

📁 代码检索工具GLOBAL源码。可用来浏览分析LINUX源码。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (c) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 *	Tama Communications Corporation * * This file is part of GNU GLOBAL. * * GNU GLOBAL is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GNU GLOBAL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA. */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <ctype.h>#ifdef HAVE_LIMITS_H#include <limits.h>#endif#include <stdio.h>#ifdef STDC_HEADERS#include <stdlib.h>#endif#ifdef HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#include "gctags.h"#include "defined.h"#include "die.h"#include "strbuf.h"#include "strlimcpy.h"#include "token.h"#include "c_res.h"static void C_family(const char *, int);static void process_attribute(int);static int function_definition(int, char *);static void condition_macro(int, int);static int seems_datatype(const char *);#define IS_TYPE_QUALIFIER(c)	((c) == C_CONST || (c) == C_RESTRICT || (c) == C_VOLATILE)#define DECLARATIONS    0#define RULES           1#define PROGRAMS        2#define TYPE_C		0#define TYPE_LEX	1#define TYPE_YACC	2/* * #ifdef stack. */#define MAXPIFSTACK	100static struct {	short start;		/* level when #if block started */	short end;		/* level when #if block end */	short if0only;		/* #if 0 or notdef only */} stack[MAXPIFSTACK], *cur;static int piflevel;		/* condition macro level */static int level;		/* brace level *//* * yacc: read yacc file and pickup tag entries. */voidyacc(file)	const char *file;{	C_family(file, TYPE_YACC);}/* * C: read C file and pickup tag entries. */voidC(file)	const char *file;{	C_family(file, TYPE_C);}/* *	i)	file	source file *	i)	type	TYPE_C, TYPE_YACC, TYPE_LEX */static voidC_family(file, type)	const char *file;	int type;{	int c, cc;	int savelevel;	int target;	int startmacro, startsharp;	const char *interested = "{}=;";	STRBUF *sb = strbuf_open(0);	/*	 * yacc file format is like the following.	 *	 * declarations	 * %%	 * rules	 * %%	 * programs	 *	 */	int yaccstatus = (type == TYPE_YACC) ? DECLARATIONS : PROGRAMS;	int inC = (type == TYPE_YACC) ? 0 : 1;	/* 1 while C source */	level = piflevel = 0;	savelevel = -1;	target = (sflag) ? SYM : (rflag) ? REF : DEF;	startmacro = startsharp = 0;	if (!opentoken(file))		die("'%s' cannot open.", file);	cmode = 1;			/* allow token like '#xxx' */	crflag = 1;			/* require '\n' as a token */	if (type == TYPE_YACC)		ymode = 1;		/* allow token like '%xxx' */	while ((cc = nexttoken(interested, c_reserved_word)) != EOF) {		switch (cc) {		case SYMBOL:		/* symbol	*/			if (inC && peekc(0) == '('/* ) */) {				if (isnotfunction(token)) {					if (target == REF && defined(token))						PUT(token, lineno, sp);				} else if (level > 0 || startmacro) {					if (target == REF) {						if (defined(token))							PUT(token, lineno, sp);					} else if (target == SYM) {						if (!defined(token))							PUT(token, lineno, sp);					}				} else if (level == 0 && !startmacro && !startsharp) {					char arg1[MAXTOKEN], savetok[MAXTOKEN], *saveline;					int savelineno = lineno;					strlimcpy(savetok, token, sizeof(savetok));					strbuf_reset(sb);					strbuf_puts(sb, sp);					saveline = strbuf_value(sb);					arg1[0] = '\0';					/*					 * Guile function entry using guile-snarf is like follows:					 *					 * SCM_DEFINE (scm_list, "list", 0, 0, 1, 					 *           (SCM objs),					 *            "Return a list containing OBJS, the arguments to `list'.")					 * #define FUNC_NAME s_scm_list					 * {					 *   return objs;					 * }					 * #undef FUNC_NAME					 *					 * We should assume the first argument as a function name instead of 'SCM_DEFINE'.					 */					if (function_definition(target, arg1)) {						if (!strcmp(savetok, "SCM_DEFINE") && *arg1)							strlimcpy(savetok, arg1, sizeof(savetok));						if (target == DEF)							PUT(savetok, savelineno, saveline);					} else {						if (target == REF && defined(savetok))							PUT(savetok, savelineno, saveline);					}				}			} else {				if (dflag) {					if (target == REF) {						if (defined(token))							PUT(token, lineno, sp);					} else if (target == SYM) {						if (!defined(token))							PUT(token, lineno, sp);					}				} else {					if (target == SYM)						PUT(token, lineno, sp);				}			}			break;		case '{':  /* } */			DBG_PRINT(level, "{"); /* } */			if (yaccstatus == RULES && level == 0)				inC = 1;			++level;			if (bflag && atfirst) {				if (wflag && level != 1)					warning("forced level 1 block start by '{' at column 0 [+%d %s].", lineno, curfile); /* } */				level = 1;			}			break;			/* { */		case '}':			if (--level < 0) {				if (wflag)					warning("missing left '{' [+%d %s].", lineno, curfile); /* } */				level = 0;			}			if (eflag && atfirst) {				if (wflag && level != 0) /* { */					warning("forced level 0 block end by '}' at column 0 [+%d %s].", lineno, curfile);				level = 0;			}			if (yaccstatus == RULES && level == 0)				inC = 0;			/* { */			DBG_PRINT(level, "}");			break;		case '\n':			if (startmacro && level != savelevel) {				if (wflag)					warning("different level before and after #define macro. reseted. [+%d %s].", lineno, curfile);				level = savelevel;			}			startmacro = startsharp = 0;			break;		case YACC_SEP:		/* %% */			if (level != 0) {				if (wflag)					warning("forced level 0 block end by '%%' [+%d %s].", lineno, curfile);				level = 0;			}			if (yaccstatus == DECLARATIONS) {				if (target == DEF)					PUT("yyparse", lineno, sp);				yaccstatus = RULES;			} else if (yaccstatus == RULES)				yaccstatus = PROGRAMS;			inC = (yaccstatus == PROGRAMS) ? 1 : 0;			break;		case YACC_BEGIN:	/* %{ */			if (level != 0) {				if (wflag)					warning("forced level 0 block end by '%%{' [+%d %s].", lineno, curfile);				level = 0;			}			if (inC == 1 && wflag)				warning("'%%{' appeared in C mode. [+%d %s].", lineno, curfile);			inC = 1;			break;		case YACC_END:		/* %} */			if (level != 0) {				if (wflag)					warning("forced level 0 block end by '%%}' [+%d %s].", lineno, curfile);				level = 0;			}			if (inC == 0 && wflag)				warning("'%%}' appeared in Yacc mode. [+%d %s].", lineno, curfile);			inC = 0;			break;		case YACC_UNION:	/* %union {...} */			if (yaccstatus == DECLARATIONS && target == DEF)				PUT("YYSTYPE", lineno, sp);			break;		/*		 * #xxx		 */		case SHARP_DEFINE:		case SHARP_UNDEF:			startmacro = 1;			savelevel = level;			if ((c = nexttoken(interested, c_reserved_word)) != SYMBOL) {				pushbacktoken();				break;			}			if (peekc(1) == '('/* ) */) {				if (target == DEF)					PUT(token, lineno, sp);				while ((c = nexttoken("()", c_reserved_word)) != EOF && c != '\n' && c != /* ( */ ')')					if (c == SYMBOL && target == SYM)						PUT(token, lineno, sp);				if (c == '\n')					pushbacktoken();			} else {				if (dflag) {					if (target == DEF)						PUT(token, lineno, sp);				} else {					if (target == SYM)						PUT(token, lineno, sp);				}			}			break;		case SHARP_IMPORT:		case SHARP_INCLUDE:		case SHARP_INCLUDE_NEXT:		case SHARP_ERROR:		case SHARP_LINE:		case SHARP_PRAGMA:		case SHARP_WARNING:		case SHARP_IDENT:		case SHARP_SCCS:			while ((c = nexttoken(interested, c_reserved_word)) != EOF && c != '\n')				;			break;		case SHARP_IFDEF:		case SHARP_IFNDEF:		case SHARP_IF:		case SHARP_ELIF:		case SHARP_ELSE:		case SHARP_ENDIF:			condition_macro(cc, target);			break;		case SHARP_SHARP:		/* ## */			(void)nexttoken(interested, c_reserved_word);			break;		case C_STRUCT:			c = nexttoken(interested, c_reserved_word);			if (c == '{' /* } */) {				pushbacktoken();				break;			}			if (c == SYMBOL)				if (target == SYM)					PUT(token, lineno, sp);			break;		/* control statement check */		case C_BREAK:		case C_CASE:		case C_CONTINUE:		case C_DEFAULT:		case C_DO:		case C_ELSE:		case C_FOR:		case C_GOTO:		case C_IF:		case C_RETURN:		case C_SWITCH:		case C_WHILE:			if (wflag && !startmacro && level == 0)				warning("Out of function. %8s [+%d %s]", token, lineno, curfile);			break;		case C_TYPEDEF:			if (tflag) {				char savetok[MAXTOKEN];				int savelineno = 0;				int typedef_savelevel = level;				savetok[0] = 0;				/* skip type qualifiers */				do {					c = nexttoken("{}(),;", c_reserved_word);				} while (IS_TYPE_QUALIFIER(c) || c == '\n');

⌨️ 快捷键说明

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