Beispiel #1
0
static int get_strtoken(void)
{
int ch;
int len=0;

if(!var_prevch)
      {
      for(;;)
              {
              ch=getch();
              if(ch<0) return(V_END);
              if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue;
              break;
              }
      }
      else
      {
      ch=var_prevch;
      var_prevch=0;
      }
      
for(yytext[len++]=ch;;yytext[len++]=ch)
      {
	if(len==T_MAX_STR)
		{
		yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1);
		}
      ch=getch();
      if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break;
      }
yytext[len]=0;        /* terminator */

yylen=len;
return(V_STRING);
}
Beispiel #2
0
static void
set_fac_name_1 (struct tree *t)
{
  for (; t != NULL; t = t->next)
    {
      int prev_len = GLOBALS->fac_name_len_ghw_c_1;

      /* Complete the name.  */
      if(t->name[0]) /* originally (t->name != NULL) when using pointers */
	{
	  int len;

	  len = strlen (t->name) + 1;
	  if (len + GLOBALS->fac_name_len_ghw_c_1 >= GLOBALS->fac_name_max_ghw_c_1)
	    {
	      GLOBALS->fac_name_max_ghw_c_1 *= 2;
	      if (GLOBALS->fac_name_max_ghw_c_1 <= len + GLOBALS->fac_name_len_ghw_c_1)
		GLOBALS->fac_name_max_ghw_c_1 = len + GLOBALS->fac_name_len_ghw_c_1 + 1;
	      GLOBALS->fac_name_ghw_c_1 = realloc_2(GLOBALS->fac_name_ghw_c_1, GLOBALS->fac_name_max_ghw_c_1);
	    }
          if(t->name[0] != '[')
		{
	  	GLOBALS->fac_name_ghw_c_1[GLOBALS->fac_name_len_ghw_c_1] = '.';
	  	/* The NUL is copied, since LEN is 1 + strlen.  */
	  	memcpy (GLOBALS->fac_name_ghw_c_1 + GLOBALS->fac_name_len_ghw_c_1 + 1, t->name, len);
	  	GLOBALS->fac_name_len_ghw_c_1 += len;
		}
		else
		{
	  	memcpy (GLOBALS->fac_name_ghw_c_1 + GLOBALS->fac_name_len_ghw_c_1, t->name, len);
	  	GLOBALS->fac_name_len_ghw_c_1 += (len - 1);
		}
	}

      if (t->t_which >= 0)
	{
        struct symchain *sc = GLOBALS->firstnode;
	struct symbol *s = sc->symbol;

	s->name = strdup_2(GLOBALS->fac_name_ghw_c_1);
	s->n = GLOBALS->nxp_ghw_c_1[t->t_which];
	if(!s->n->nname) s->n->nname = s->name;

	t->t_which = GLOBALS->sym_which_ghw_c_1++; /* patch in gtkwave "which" as node is correct */

	GLOBALS->curnode = GLOBALS->firstnode->next;
	free_2(GLOBALS->firstnode);
	GLOBALS->firstnode = GLOBALS->curnode;
	}

      if (t->child)
	set_fac_name_1 (t->child);

      /* Revert name.  */
      GLOBALS->fac_name_len_ghw_c_1 = prev_len;
      GLOBALS->fac_name_ghw_c_1[GLOBALS->fac_name_len_ghw_c_1] = 0;
    }
}
Beispiel #3
0
static int get_vartoken_patched(int match_kw)
{
int ch;
int i, len=0;
        
if(!var_prevch)
        {
        for(;;)
                {
                ch=getch_patched();
                if(ch<0) { free_2(varsplit); varsplit=NULL; return(V_END); }
                if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue;
                break;   
                }
        }
        else
        {
        ch=var_prevch;
        var_prevch=0;
        }
                 
if(ch=='[') return(V_LB);
if(ch==':') return(V_COLON);
if(ch==']') return(V_RB);
 
for(yytext[len++]=ch;;yytext[len++]=ch)
        {
        if(len==T_MAX_STR)
                {
                yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1);
                }
        ch=getch_patched();
        if(ch<0) { free_2(varsplit); varsplit=NULL; break; }
        if((ch==':')||(ch==']'))
                {
                var_prevch=ch;
                break;
                }
        }
yytext[len]=0;  /* terminator */
                
if(match_kw)
for(i=0;i<NUM_VTOKENS;i++)
        {
        if(!strcmp(yytext,vartypes[i]))
                {
                if(ch<0) { free_2(varsplit); varsplit=NULL; }
                return(varenums[i]);
                }
        }

yylen=len;
if(ch<0) { free_2(varsplit); varsplit=NULL; }
return(V_STRING);
}
Beispiel #4
0
static int get_vartoken(int match_kw)
{
int ch;
int i, len=0;

if(varsplit)
        {
        int rc=get_vartoken_patched(match_kw);
        if(rc!=V_END) return(rc);  
        var_prevch=0;
        }
                
if(!var_prevch)  
        {
        for(;;)
                {
                ch=getch();
                if(ch<0) return(V_END);
                if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')) continue;
                break;
                }
        }
        else
        {
        ch=var_prevch;
        var_prevch=0;
        }
                 
if(ch=='[') return(V_LB);
if(ch==':') return(V_COLON);
if(ch==']') return(V_RB);  

if(ch=='#')     /* for MTI System Verilog '$var reg 64 >w #implicit-var###VarElem:ram_di[0.0] [63:0] $end' style declarations */
        {       /* debussy simply escapes until the space */
        yytext[len++]= '\\';
        }
        
for(yytext[len++]=ch;;yytext[len++]=ch)
        {
        if(len==T_MAX_STR)
                {
                yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1);
                }

        ch=getch();  
        if(ch==' ')
                {
                if(match_kw) break;
                if(getch_peek() == '[')
                        {
                        ch = getch();
                        varsplit=yytext+len; /* keep looping so we get the *last* one */
                        continue;
                        }
                }

        if((ch==' ')||(ch=='\t')||(ch=='\n')||(ch=='\r')||(ch<0)) break;
        if((ch=='[')&&(yytext[0]!='\\'))
                {
                varsplit=yytext+len;            /* keep looping so we get the *last* one */
                }
        else
        if(((ch==':')||(ch==']'))&&(!varsplit)&&(yytext[0]!='\\'))
                {
                var_prevch=ch;
                break;
                }
        }
yytext[len]=0;  /* absolute terminator */
if((varsplit)&&(yytext[len-1]==']'))
        {
        char *vst;
        vst=malloc_2(strlen(varsplit)+1);
        strcpy(vst, varsplit);

        *varsplit=0x00;         /* zero out var name at the left bracket */
        len=varsplit-yytext;

        varsplit=vsplitcurr=vst;
        var_prevch=0;
        }
        else
        {
        varsplit=NULL;
        }

if(match_kw)        
for(i=0;i<NUM_VTOKENS;i++)
        {
        if(!strcmp(yytext,vartypes[i]))
                {
                return(varenums[i]);
                }
        }

yylen=len;
return(V_STRING);
}
Beispiel #5
0
/*
 * simple tokenizer
 */
static int get_token(void)
{
int ch;
int i, len=0;
int is_string=0;
char *yyshadow;

for(;;)
	{
	ch=getch();
	if(ch<0) return(T_EOF);
	if(ch<=' ') continue;	/* val<=' ' is a quick whitespace check      */
	break;			/* (take advantage of fact that vcd is text) */
	}
if(ch=='$') 
	{
	yytext[len++]=ch;
	for(;;)
		{
		ch=getch();
		if(ch<0) return(T_EOF);
		if(ch<=' ') continue;
		break;
		}
	}
	else
	{
	is_string=1;
	}

for(yytext[len++]=ch;;yytext[len++]=ch)
	{
	if(len==T_MAX_STR)
		{
		yytext=(char *)realloc_2(yytext, (T_MAX_STR=T_MAX_STR*2)+1);
		}
	ch=getch();
	if(ch<=' ') break;
	}
yytext[len]=0;	/* terminator */

if(is_string) 
	{
	yylen=len;
	return(T_STRING);
	}

yyshadow=yytext;
do
{
yyshadow++;
for(i=0;i<NUM_TOKENS;i++)
        {
        if(!strcmp(yyshadow,tokens[i]))
                {
                return(i);
                }
        }

} while(*yyshadow=='$'); /* fix for RCS ids in version strings */

return(T_UNKNOWN_KEY);
}