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

📄 cbrowser2.c

📁 linux 下的源代码分析阅读器 red hat公司新版
💻 C
字号:
/*Copyright (c) 2000, Red Hat, Inc.This file is part of Source-Navigator.Source-Navigator is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License as publishedby the Free Software Foundation; either version 2, or (at your option)any later version.Source-Navigator is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public License alongwith Source-Navigator; see the file COPYING.  If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330, Boston,MA 02111-1307, USA.*//* * cbrowser2.c * * Copyright (C) 1998 Cygnus Solutions * * Description: * Pass #2 of the C/C++ parser, this pass will generate xrefs that are * processed by dbimp. */#include "dbutils.h"#include <setjmp.h>#include <signal.h>#include "longstr.h"#include <tcl.h>#ifdef __MSVC__#include <io.h>#endif/* Not used, but we need to define one due to us linking against libcpp2. */Tcl_Encoding encoding = NULL;extern	int	optind;#ifdef WIN32typedef const char	*ARGTYPE;#elsetypedef char	*ARGTYPE;#endif /* WIN32 */extern ARGTYPE	optarg;extern	char	*filename_g;extern	int	yylineno,yycharno;extern	int	report_local_vars;extern	int	yyfd;extern	jmp_buf	BAD_IMPL_jmp_buf;extern FILE *cross_ref_fp;static	int	killed;#define	TTY_TRACE	0	/* Normally 0 */#if TTY_TRACEstatic	FILE	*tty;#endif /* TTY_TRACE */static	voidmy_panic(int sign){	killed = -1;	fprintf(stderr,"cbrowser2 panic; signal %d received",sign);	if (filename_g)	{		fprintf(stderr,", in file: %s, at line: %d column: %d\n",			filename_g,yylineno,yycharno);	}	fprintf(stderr,"\n");	fflush(stderr);#ifdef SIGABRT	signal(SIGABRT,SIG_IGN);#endif /* SIGABRT */	abort();}static  voidterm_catch(int sign){	signal(sign,term_catch);	killed = TRUE;#if TTY_TRACE	if (tty)	{		fprintf(tty,"Received signal: %d (pid: %d)\n",			sign,(int)getpid());	}#endif /* TTY_TRACE */}static voidset_signals(){#ifdef SIGHUP	signal(SIGHUP,my_panic);#endif /* SIGHUP */#ifdef SIGINT	signal(SIGINT,term_catch);#endif /* SIGINT */#ifdef SIGQUIT	signal(SIGQUIT,my_panic);#endif /* SIGQUIT */#ifdef SIGILL	signal(SIGILL,my_panic);#endif /* SIGILL */#ifdef SIGABRT	signal(SIGABRT,my_panic);#endif /* SIGABRT */#ifdef SIGBUS	signal(SIGBUS,my_panic);#endif /* SIGBUS */#ifdef SIGSEGV	signal(SIGSEGV,my_panic);#endif /* SIGSEGV */#ifdef SIGSYS	signal(SIGSYS,my_panic);#endif /* SIGSYS */#ifdef SIGPIPE	signal(SIGPIPE,term_catch);#endif /* SIGPIPE */#ifdef SIGTERM	signal(SIGTERM,term_catch);#endif /* SIGTERM */#ifdef SIGURG	signal(SIGURG,term_catch);#endif /* SIGURG */#ifdef SIGXCPU	signal(SIGXCPU,my_panic);#endif /* SIGXCPU */#ifdef SIGXFSZ	signal(SIGXFSZ,my_panic);#endif /* SIGXFSZ */#ifdef SIGUSR1	signal(SIGUSR1,my_panic);#endif /* SIGUSR1 */#ifdef SIGUSR2	signal(SIGUSR2,my_panic);#endif /* SIGUSR2 */#ifdef SIGPROF	signal(SIGPROF,my_panic);#endif /* SIGPROF */#ifdef SIGDANGER	signal(SIGDANGER,my_panic);#endif /* SIGDANGER */#ifdef SIGPRE	signal(SIGPRE,my_panic);#endif /* SIGPRE */}#define	MAX_MACRO_FILES 500void Paf_Cpp_Cross_Ref_Clean();intmain(int argc, char **argv){        char    *data;        char    *key;	char	*bufp;	char	save_c;	long	type;	int	linenum;        char    cpp_xref[10];        int     cpp_xref_length;	ARGTYPE	cache = NULL;	ARGTYPE	cross_cache = NULL;	char  *db_prefix = NULL;	FILE	*logfp = NULL;	FILE	*infp = NULL;	ARGTYPE	xref_file = NULL;	int	first_xref = TRUE;	ARGTYPE omode = NULL;	int	set_sgns = FALSE;	LongString	buf;	ARGTYPE macro_file[MAX_MACRO_FILES];	int macro_file_num = 0;	LongStringInit(&buf,0);	Tcl_FindExecutable(argv[0]);#if !WIN32 && TTY_TRACE	tty = fopen("/dev/tty","w");#endif /* !WIN32 && TTY_TRACE */	while((type = getopt(argc,argv,"lc:C:O:M:sm:n:")) != EOF)	{		switch (type)		{		case 'c':			cache = optarg;			break;		case 'C':			cross_cache = optarg;			break;		case 'l':			report_local_vars = TRUE;			break;		case 'M':			omode = optarg;			break;		case 's':			set_sgns = FALSE;			break;		case 'm':			if (macro_file_num < MAX_MACRO_FILES - 1)			{				macro_file[macro_file_num++] = optarg;			}			MacroReadFile(optarg);			break;		case 'n':			db_prefix = optarg;			break;		}	}	if (optind < argc)	{		xref_file = argv[optind];	}	if (!xref_file || !db_prefix)	{		fprintf(stderr, "Usage: %s ?-l? ?-m macrofile? -n db_prefix xref_file\n",			argv[0]);		fflush(stderr);		exit(2);	}	if (set_sgns)		set_signals();	killed = FALSE;	if (xref_file)	{		FILE	*in;		in = fopen(xref_file,"r");		if (in) {			infp = in;		} else {		    fprintf(stderr, "xref_file \"%s\" does not exist\n", xref_file);		    exit(3);		}	}        Paf_db_init_tables(db_prefix,cache,cross_cache);	/*SN_DBIMP is set interactive in the tcl init procedure!*/	if (getenv("SN_DBIMP"))	{		char    tmp[MAXPATHLEN];		char    *e;		e = getenv("TMPDIR");		sprintf(tmp,"%s/cbrowser2_%lu.tmp",			e ? e : "/tmp",			(unsigned long)getpid());		logfp = fopen(tmp,"w+");		if (logfp)		{			chmod(tmp,0666);			fprintf(logfp,"#cbrowser2 (pid: %lu) started\n",				(unsigned long)getpid());			fprintf(logfp,"local_vars: %d\n",				report_local_vars);			if (macro_file_num)			{				int cou;				for (cou = 0; cou < macro_file_num; cou++)				{					fprintf(logfp,"macro file %d: <%s>\n",						cou + 1,						macro_file[cou]);				}			}			fflush(logfp);		}	}	linenum = 0;	type = -999;	switch (setjmp(BAD_IMPL_jmp_buf))	{	case PAF_PANIC_SOFT:		killed = TRUE;		fprintf(stderr,"cbrowser2 (soft) panic");		if (filename_g)		{			fprintf(stderr,", in file: %s, at line: %d column: %d\n",				filename_g,yylineno,yycharno);		}		fprintf(stderr,"\n");		fflush(stderr);		break;	case PAF_PANIC_SIMPLE:		killed = TRUE;		break;	case PAF_PANIC_EMERGENCY:		killed = -1;		fprintf(stderr,"Run time error: %s\n",strerror(errno));		fflush(stderr);		break;	}        cross_ref_fp = stdout;        snprintf(cpp_xref, sizeof(cpp_xref), "%d;", PAF_CROSS_REF_CPP);        cpp_xref_length = strlen(cpp_xref);	while (!killed && (bufp = buf.fgets(&buf,infp)))	{		if (logfp)		{			fputs(bufp,logfp);			fputs("\n",logfp);			fflush(logfp);		}		if (strncmp(bufp, cpp_xref, cpp_xref_length) == 0) {			if (first_xref) {				first_xref = FALSE;				open_tables_for_cross_ref();			}			Paf_insert_cross_ref_qry(bufp);		} else {			fprintf(stdout, "%s\n", bufp);			continue;		}	}#if TTY_TRACE	if (tty)	{		fprintf(tty,"END (pid: %d) killed: %d eof: %d\n",			(int)getpid(),killed,feof(infp));	}#endif /* TTY_TRACE */	buf.free(&buf);	if (!first_xref)	{		Paf_Cpp_Cross_Ref_Clean();	}	if (Paf_db_close_tables() == -1)	{		fprintf(stderr,"Database closing error: %s\n",strerror(errno));		fflush(stderr);		killed = -1;	}	if (yyfd >= 0)	{		close(yyfd);		yyfd = -1;	}	fclose(infp);	if (logfp)	{		fprintf(logfp,"#cbrowser2 (pid: %lu) exited with status %d\n",                    (unsigned long)getpid(), (killed == -1 ? 2 : 0));		fclose(logfp);	}	exit(killed == -1 ? 2 : 0);	return 0;}

⌨️ 快捷键说明

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