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

📄 abrowser.c

📁 这是一个Linux下的集成开发环境
💻 C
📖 第 1 页 / 共 4 页
字号:
 * Lex input file for the Source-Navigator PowerPC assembly parser. */#line 36 "abrowser.l"#include <ctype.h>#include <stdio.h>#include "snptools.h"#include "lexinput.h"#undef yywrap#define YY_SKIP_YYWRAP#undef YY_INPUT#define YY_INPUT(buf,r,ms) (r = sn_encoded_input(buf, ms))enum { unknown, text, data };static char *p;				/* general purpose pointer */static char group[] = "asm";static struct {  char name[512];  long line;  long column;  int length;  unsigned char flag;} last_label = { "", 0, 0, 0, 0 };static int current_context = unknown;voidemit_func_defn(){  last_label.line = sn_pop_line();  last_label.column = sn_pop_column();  sn_insert_symbol(SN_FUNC_DEF, NULL, last_label.name, sn_current_file(), 		   last_label.line, last_label.column, sn_line(), 0,		   0, NULL, NULL, NULL, NULL,		   last_label.line, last_label.column, last_label.line,		   last_label.column + last_label.length - 1);}/* * Flush any function definitions that might be outstanding (ie. if its * label appears _last_ in a file.  When we reach EOF, check to see if its * defn needs to be flushed to the database.  Normally the occurence of * another label causes the defn to be stored. *  * Return 1 so flex will keep playing. */intyywrap(){  if (last_label.flag > 0) {    emit_func_defn();    last_label.flag = 0;  }  return(1);}/* * This function removes any trailing .[0-9]+ extensions that a compiler * might add to the symbol name to indicate that it is a static.  We are * more concerned with its real name than its storage class, so we'll drop * the numeric extension here. */staticvoid drop_numeric_extn(char *text){  if (strchr(text, '.') != NULL) {    text += strlen(text) - 1;    while (isdigit(*text) != 0) {      *text = '\0';      text--;    }    if (*text == '.') {      *text = '\0';      text--;    }  }}#define COMMENT 1/* Macros after this point can all be overridden by user definitions in * section 1. */#ifndef YY_SKIP_YYWRAP#ifdef __cplusplusextern "C" int yywrap YY_PROTO(( void ));#elseextern int yywrap YY_PROTO(( void ));#endif#endif#ifndef YY_NO_UNPUTstatic void yyunput YY_PROTO(( int c, char *buf_ptr ));#endif#ifndef yytext_ptrstatic void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));#endif#ifdef YY_NEED_STRLENstatic int yy_flex_strlen YY_PROTO(( yyconst char * ));#endif#ifndef YY_NO_INPUT#ifdef __cplusplusstatic int yyinput YY_PROTO(( void ));#elsestatic int input YY_PROTO(( void ));#endif#endif#if YY_STACK_USEDstatic int yy_start_stack_ptr = 0;static int yy_start_stack_depth = 0;static int *yy_start_stack = 0;#ifndef YY_NO_PUSH_STATEstatic void yy_push_state YY_PROTO(( int new_state ));#endif#ifndef YY_NO_POP_STATEstatic void yy_pop_state YY_PROTO(( void ));#endif#ifndef YY_NO_TOP_STATEstatic int yy_top_state YY_PROTO(( void ));#endif#else#define YY_NO_PUSH_STATE 1#define YY_NO_POP_STATE 1#define YY_NO_TOP_STATE 1#endif#ifdef YY_MALLOC_DECLYY_MALLOC_DECL#else#if __STDC__#ifndef __cplusplus#include <stdlib.h>#endif#else/* Just try to get by without declaring the routines.  This will fail * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) * or sizeof(void*) != sizeof(int). */#endif#endif/* Amount of stuff to slurp up with each read. */#ifndef YY_READ_BUF_SIZE#define YY_READ_BUF_SIZE 8192#endif/* Copy whatever the last rule matched to the standard output. */#ifndef ECHO/* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )#endif/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL, * is returned in "result". */#ifndef YY_INPUT#define YY_INPUT(buf,result,max_size) \	if ( yy_current_buffer->yy_is_interactive ) \		{ \		int c = '*', n; \		for ( n = 0; n < max_size && \			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \			buf[n] = (char) c; \		if ( c == '\n' ) \			buf[n++] = (char) c; \		if ( c == EOF && ferror( yyin ) ) \			YY_FATAL_ERROR( "input in flex scanner failed" ); \		result = n; \		} \	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \		  && ferror( yyin ) ) \		YY_FATAL_ERROR( "input in flex scanner failed" );#endif/* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */#ifndef yyterminate#define yyterminate() return YY_NULL#endif/* Number of entries by which start-condition stack grows. */#ifndef YY_START_STACK_INCR#define YY_START_STACK_INCR 25#endif/* Report a fatal error. */#ifndef YY_FATAL_ERROR#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )#endif/* Default declaration of generated scanner - a define so the user can * easily add parameters. */#ifndef YY_DECL#define YY_DECL int yylex YY_PROTO(( void ))#endif/* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */#ifndef YY_USER_ACTION#define YY_USER_ACTION#endif/* Code executed at the end of each rule. */#ifndef YY_BREAK#define YY_BREAK break;#endif#define YY_RULE_SETUP \	if ( yyleng > 0 ) \		yy_current_buffer->yy_at_bol = \				(yytext[yyleng - 1] == '\n'); \	YY_USER_ACTIONYY_DECL	{	register yy_state_type yy_current_state;	register char *yy_cp = NULL, *yy_bp = NULL;	register int yy_act;#line 134 "abrowser.l"	if ( yy_init )		{		yy_init = 0;#ifdef YY_USER_INIT		YY_USER_INIT;#endif		if ( ! yy_start )			yy_start = 1;	/* first start state */		if ( ! yyin )			yyin = stdin;		if ( ! yyout )			yyout = stdout;		if ( ! yy_current_buffer )			yy_current_buffer =				yy_create_buffer( yyin, YY_BUF_SIZE );		yy_load_buffer_state();		}	while ( 1 )		/* loops until end-of-file is reached */		{		yy_cp = yy_c_buf_p;		/* Support of yytext. */		*yy_cp = yy_hold_char;		/* yy_bp points to the position in yy_ch_buf of the start of		 * the current run.		 */		yy_bp = yy_cp;		yy_current_state = yy_start;		yy_current_state += YY_AT_BOL();yy_match:		do			{			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];			if ( yy_accept[yy_current_state] )				{				yy_last_accepting_state = yy_current_state;				yy_last_accepting_cpos = yy_cp;				}			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )				{				yy_current_state = (int) yy_def[yy_current_state];				if ( yy_current_state >= 118 )					yy_c = yy_meta[(unsigned int) yy_c];				}			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];			++yy_cp;			}		while ( yy_base[yy_current_state] != 282 );yy_find_action:		yy_act = yy_accept[yy_current_state];		if ( yy_act == 0 )			{ /* have to back up */			yy_cp = yy_last_accepting_cpos;			yy_current_state = yy_last_accepting_state;			yy_act = yy_accept[yy_current_state];			}		YY_DO_BEFORE_ACTION;do_action:	/* This label is used only to access EOF actions. */		switch ( yy_act )	{ /* beginning of action switch */			case 0: /* must back up */			/* undo the effects of YY_DO_BEFORE_ACTION */			*yy_cp = yy_hold_char;			yy_cp = yy_last_accepting_cpos;			yy_current_state = yy_last_accepting_state;			goto yy_find_action;case 1:YY_RULE_SETUP#line 136 "abrowser.l"/* eat string literals */ 	YY_BREAKcase 2:YY_RULE_SETUP#line 138 "abrowser.l"{  for (p = yytext; !isspace(*p); sn_advance_column(1), p++);  for (; isspace(*p); sn_advance_column(1), p++);}	YY_BREAKcase 3:YY_RULE_SETUP#line 143 "abrowser.l"{  current_context = text;  sn_advance_column(yyleng);}	YY_BREAKcase 4:YY_RULE_SETUP#line 148 "abrowser.l"{  current_context = data;  sn_advance_column(yyleng);}	YY_BREAKcase 5:YY_RULE_SETUP#line 153 "abrowser.l"{  /* walk over the indentation (if any) */  for (p = yytext; isspace(*p); sn_advance_column(1), p++);  /* walk over the jump instruction mneumonic */  for (; !isspace(*p); sn_advance_column(1), p++);  /* walk over the whitespace between the opcode and the operand */  for (; isspace(*p); sn_advance_column(1), p++);  /* this is a candidate function if it is not a local label */  if (strncmp(p, ".L", strlen(".L")) != 0 &&      strncmp(last_label.name, ".L", strlen(".L")) != 0)  {    drop_numeric_extn(p);    sn_insert_xref(SN_REF_TO_FUNCTION, SN_FUNC_DEF, SN_REF_SCOPE_GLOBAL,                 NULL, last_label.name, NULL, NULL, p, NULL,                  sn_current_file(), sn_line(), SN_REF_PASS);  }  sn_advance_column(yyleng);}	YY_BREAKcase 6:YY_RULE_SETUP#line 178 "abrowser.l"{  for (p = yytext; !isspace(*p); sn_advance_column(1), p++);  for (; isspace(*p); sn_advance_column(1), p++);  sn_insert_symbol(SN_MACRO_DEF, NULL, p, sn_current_file(), sn_line(),                   sn_column(), sn_line(), sn_column() + (yytext + yyleng - p),                   0, NULL, NULL, NULL, NULL, sn_line(), sn_column(),                   sn_line(), sn_column() + (yytext + yyleng - p));  sn_advance_column(yytext + yyleng - p);}	YY_BREAKcase 7:YY_RULE_SETUP#line 190 "abrowser.l"{  char * x = (char *) strstr(yytext, ",");  char * y = x;  while (*x)  {    if (isspace(*x))      {	x++; break;      }    else      {	x--;      }  }  sn_advance_column(x - yytext);  *y = 0;  sn_insert_symbol(SN_CONS_DEF, NULL, x, sn_current_file(), sn_line(),                   sn_column(), sn_line(), sn_column() + y - x, 0, NULL,                   NULL, NULL, NULL, sn_line(), sn_column(), sn_line(),                   sn_column() + y - x);  sn_advance_column(y - x + 1); /* add one to jump over the trailing comma */}	YY_BREAKcase 8:YY_RULE_SETUP#line 215 "abrowser.l"{  char * x = (char *) strstr(yytext, ",");  char * y = x;  while (*x)  {    if (isspace(*x))    {      x++;      break;    }    else    {      x--;    }  }  sn_advance_column(x - yytext);    *y = 0;  sn_insert_symbol(SN_GLOB_VAR_DEF, NULL, x, sn_current_file(), sn_line(),                   sn_column(), sn_line(), sn_column() + y - x, 0, NULL,                   NULL, NULL, NULL, sn_line(), sn_column(), sn_line(),                   sn_column() + y - x);  sn_advance_column(y - x + 1); /* jump over comma also */}	YY_BREAKcase 9:YY_RULE_SETUP#line 242 "abrowser.l"{  char * x = (char *) yytext;  while (*x)  {    if (*x == ' ' || *x == '\t' || *x == ':')      break;    else      x++;  }  *x = 0;   if (last_label.flag > 0) {    emit_func_defn();    last_label.flag = 0;  }  if (strncmp(yytext, ".L", strlen(".L")) != 0 &&      strncmp(yytext, "gcc2_compiled", strlen("gcc2_compiled")) != 0)  {    /* we now have a suitable label to store in the database */    drop_numeric_extn(yytext);    switch (current_context) {    case text:      /* don't insert into the database! just flag the scanner to insert	 the label name in last_buf the next time we detect a label of	 _any_ kind. */#if 0      assert(last_label.flag != 1);#endif      sn_push_line();      sn_push_column();      last_label.length = yyleng;      last_label.flag = 1;      break;

⌨️ 快捷键说明

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