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

📄 cp_name.c

📁 这是一个Linux下的集成开发环境
💻 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.*/#include <stdlib.h>#include <stdio.h>#include <string.h>#include <ctype.h>#include <tcl.h>#include "crossrefP.h"static int test = 0;extern Name_t f_NameCreate( char *pcName );extern void f_NameDestroy( Name_t Name );extern Name_t f_Dname( void );extern Name_t Name( void );extern Name_t f_OperatorOrConversionFunctionName( void );extern Name_t f_CompleteClassName( void );extern Name_t f_QualifiedName( void );extern Name_t f_ClassName( void );static Boolean_t f_TemplateArgList( char *pname );/*dname:   name   class_name   name:   identifier   operator_function_name   conversion_function_name   ~ class_name   qualified_namequalified_name:   class_name :: namequalified_class_name:   class_name   class_name :: qualified_class_namecomlpete_class_name:   qualified_class_name   :: qualified_class_name*/extern Name_t f_NameCreate( char *pcName ){   Name_t Name = (Name_t) Malloc( sizeof( Name[0] ));   memset((void *) Name, 0, sizeof( Name[0] ));   Name->iCheck = NAME_CHECK;   if( pcName == 0 )   {      fprintf( stderr, "Error by NameCreate\n" );      fflush( stderr );      Name->pcName = 0;   }   else   {      Name->pcName = SN_StrDup( pcName );#ifdef TRACE      printf( "NameCreate: %d %s Name: (%d)\n", Name->pcName, Name->pcName, Name );#endif   }   return Name;}extern Name_t f_NameDuplicate( Name_t Name ){   Name_t NameDuplicate;   if( Name == 0 )   {      return 0;   }   if( Name->iCheck != NAME_CHECK ) Abort();   NameDuplicate = f_NameCreate( Name->pcName );   return NameDuplicate;}extern void f_NameDestroy( Name_t Name ){   if( Name )   {      if( Name->iCheck != NAME_CHECK ) Abort();      if( Name->pcName )	  {         ckfree( (char*)Name->pcName );		 Name->pcName = NULL;	  }	  /* Mark it as unused!  Zsolt Koppany, 16-jan-98 */	  Name->iCheck = 0;      ckfree( (char*)Name );   }}extern void f_NameCat( Name_t Name1, Name_t Name2 ){   char *pcName = Malloc( strlen( Name1->pcName )                        + strlen( Name2->pcName )                        + 1 );   strcpy( pcName, Name1->pcName );   strcat( pcName, Name2->pcName );   ckfree( (char*)Name1->pcName );   Name1->pcName = pcName;   f_NameDestroy( Name2 );}extern Name_t f_Dname( void ){   Name_t Name1;   Name_t Name2;   int iva1;   int iva2;   Save();   niveau++;   if( test ) printf( "f_Dname: %s\n", ident( 0 ));   Name1 = f_ClassName();   iva1 = iva;   Restore();   Name2 = f_Name();   iva2 = iva;   if( iva2 >= iva1 )   {      f_NameDestroy( Name1 );      niveau--;      iva = iva2;      return Name2;   }   else   {      f_NameDestroy( Name2 );      niveau--;      iva = iva1;      return Name1;   }}extern Name_t f_Name( void ){   Name_t Name;   Name_t Name1;   Save();   niveau++;   if( test ) printf( "f_Name: %s\n", ident( 0 ));   switch( token( 0 ))   {   case SN_IDENTIFIER :      if(( Name = f_QualifiedName()))      {         niveau--;         if( test ) printf( "return OK\n" );         return Name;      }      /* itt szandekosan nincs break ! (rigo) */   case SN_ASM        :   case SN_CATCH      :   case SN_NAMESPACE  :/* case SN_DELETE     : ez sajnos elrontja a deallocation expression-t  *//* case SN_NEW        : ez sajnos elrontja az allocation expression-t   */   case SN_OVERLOAD   :   case SN_TEMPLATE   :   case SN_THIS       :   case SN_THROW      :   case SN_TRY        :   case SN_USING      :      Name = f_NameCreate( ident( 0 ));      step( 1 );      niveau--;      if( test ) printf( "return OK\n" );      return Name;   case SN_OPERATOR  :      if(( Name = f_OperatorOrConversionFunctionName()))      {         niveau--;         if( test ) printf( "return OK\n" );         return Name;      }      else      {         Restore();         niveau--;         if( test ) printf( "return 0\n" );         return 0;      }   case '~'       :      step( 1 );      if(( Name1 = f_ClassName()))      {         Name = f_NameCreate( "~" );         f_NameCat( Name, Name1 );         niveau--;         if( test ) printf( "return OK\n" );         return Name;      }      else      {         Restore();         niveau--;         if( test ) printf( "return 0\n" );         return 0;      }   default        :      Restore();      niveau--;      if( test ) printf( "return 0\n" );      return 0;   }}extern Name_t f_OperatorOrConversionFunctionName( void ){   Name_t Name;   Name_t Name1;   Type_t Type;   char *name;   Save();   niveau++;   if( token( 0 ) != SN_OPERATOR )   {      Restore();      niveau--;      return 0;   }   step( 1 );   switch( token( 0 ))   {   case '@'         : name = "operator@"       ; goto label;   case '+'         : name = "operator+"       ; goto label;   case '-'         : name = "operator-"       ; goto label;   case '*'         : name = "operator*"       ; goto label;   case '/'         : name = "operator/"       ; goto label;   case '%'         : name = "operator%"       ; goto label;   case '^'         : name = "operator^"       ; goto label;   case '&'         : name = "operator&"       ; goto label;   case '|'         : name = "operator|"       ; goto label;   case '~'         : name = "operator~"       ; goto label;   case '!'         : name = "operator!"       ; goto label;   case '<'         : name = "operator<"       ; goto label;   case '>'         : name = "operator>"       ; goto label;   case SN_LS          : name = "operator<<"      ; goto label;   case SN_RS          : name = "operator>>"      ; goto label;   case SN_ANDAND      : name = "operator&&"      ; goto label;   case SN_OROR        : name = "operator||"      ; goto label;   case SN_ARROW       : name = "operator->"      ; goto label;   case SN_ARROWstar   : name = "operator->*"     ; goto label;   case '.'         : name = "operator."       ; goto label;   case SN_DOTstar     : name = "operator.*"      ; goto label;   case SN_ICR         : name = "operator++"      ; goto label;   case SN_DECR        : name = "operator--"      ; goto label;   case SN_LE          : name = "operator<="      ; goto label;   case SN_GE          : name = "operator>="      ; goto label;   case SN_EQ          : name = "operator=="      ; goto label;   case SN_NE          : name = "operator!="      ; goto label;   case '='         : name = "operator="       ; goto label;   case SN_MULTassign  : name = "operator*="      ; goto label;   case SN_DIVassign   : name = "operator/="      ; goto label;   case SN_MODassign   : name = "operator%="      ; goto label;   case SN_PLUSassign  : name = "operator+="      ; goto label;   case SN_MINUSassign : name = "operator-="      ; goto label;   case SN_LSassign    : name = "operator<<="     ; goto label;   case SN_RSassign    : name = "operator>>="     ; goto label;   case SN_ANDassign   : name = "operator&="      ; goto label;   case SN_ERassign    : name = "operator^="      ; goto label;   case SN_ORassign    : name = "operator|="      ; goto label;   case SN_NEW         : name = "operator new"    ; goto label;   case SN_DELETE      : name = "operator delete" ; goto label;   case ','         : name = "operator,"       ; goto label;label:      step( 1 );      niveau--;      return f_NameCreate( name );   case '('         :      if( token( 1 ) == ')' )      {         step( 2 );         niveau--;         return f_NameCreate( "operator()" );      }      else      {         Restore();         niveau--;         return 0;      }         case '['         :      if( token( 1 ) == ']' )      {         step( 2 );         niveau--;         return f_NameCreate( "operator[]" );      }      else      {         Restore();         niveau--;         return 0;      }         default          :      if(( Type = f_ConversionTypeName()))      {         char ac[10000];   /* old: 1000 */         f_TypeToString( Type, ac, 1 );         Name  = f_NameCreate( "operator" );         Name1 = f_NameCreate( ac );         f_NameCat( Name, Name1 );         f_TypeDestroy( Type );         niveau--;         return Name;      }      else      {         Restore();         niveau--;         return 0;      }   }}extern Name_t f_CompleteClassName( void ){   Name_t Name;   Save();   Boolean_t bIsCLCL;   niveau++;   if( token( 0 ) == SN_CLCL )   {      bIsCLCL = True;      step( 1 );   }   else   {      bIsCLCL = False;   }   if(( Name = f_QualifiedClassName()))   {      if( bIsCLCL )      {         char *pcName = Malloc( strlen( Name->pcName ) + 3 );         strcpy( pcName, "::" );         strcat( pcName, Name->pcName );         ckfree( (char*)Name->pcName );         Name->pcName = pcName;      }      niveau--;      return Name;   }   else   {      Restore();      niveau--;      return 0;   }}      extern Name_t f_QualifiedClassName( void ){   Name_t Name;   Name_t Name1;   Save();   niveau++;   if(( Name = f_ClassName()))   {      if( token( 0 ) == SN_CLCL )      {         step( 1 );         if( Name1 = f_QualifiedClassName())         {            char *pcName = Malloc( strlen( Name->pcName )                                 + 2                                 + strlen( Name1->pcName )                                  + 1 );            strcpy( pcName, Name->pcName );            strcat( pcName, "::" );            strcat( pcName, Name1->pcName );            ckfree( (char*)Name->pcName );            Name->pcName = pcName;            f_NameDestroy( Name1 );            niveau--;            return Name;         }         else         {            step( -1 );            niveau--;            return Name;         }      }      else      {         niveau--;         return Name;      }   }   else   {      Restore();      niveau--;      return 0;   }}extern Name_t f_NamespaceName( void ){   char ac[10000];   /* old: 1000 */   Save();      ac[0] = 0;   if( token( 0 ) == SN_CLCL )   {      strcat( ac, "::" );      step( 1 );   }   if( token( 0 ) == SN_IDENTIFIER )   {      strcat( ac, ident( 0 ));      step( 1 );   }   else   {      Restore();      return 0;   }   while( True )   {/*    Save(); */      if( token( 0 ) == SN_CLCL       && token( 1 ) == SN_IDENTIFIER )      {         strcat( ac, "::" );         strcat( ac, ident( 1 ));         step( 2 );      }      else      {         return f_NameCreate( ac );      }   }}extern Name_t f_QualifiedName( void ){   Name_t Name;   Name_t Name1;   Save();   niveau++;   if( test ) printf( "f_QualifiedName: %s\n", ident( 0 ));   if(( Name = f_ClassName()))   {      if( token( 0 ) != SN_CLCL )      {         f_NameDestroy( Name );         Restore();         niveau--;         if( test ) printf( "f_QualifiedName: return 0\n" );         return 0;      }      step( 1 );            if(( Name1 = f_Name()))      {         f_NameCat( Name, f_NameCreate( "::" ));         f_NameCat( Name, Name1 );         niveau--;         if( test ) printf( "f_QualifiedName: return OK\n" );         return Name;      }      else      {         f_NameDestroy( Name );         Restore();         niveau--;         if( test ) printf( "f_QualifiedName: return 0\n" );         return 0;      }   }   else   {      Restore();      niveau--;      if( test ) printf( "f_QualifiedName: return 0\n" );      return 0;   }}extern Name_t f_ClassName( void ){   char *pname;   char ac[10000];   /* old: 1000 */   Save();   niveau++;   if( token( 0 ) == SN_IDENTIFIER )   {      pname = ident( 0 );      step( 1 );      if( token( 0 ) == '<' )      {         strcpy( ac, pname );         pname = ac;         f_TemplateArgList( pname );   /* optionelle template_arg_list */      }      niveau--;      return f_NameCreate( pname );   }   else   {      Restore();      niveau--;      return 0;   }}extern Name_t f_TemplateArgumentList( void ){   int i;   char *pcIdent;   char aname[10000];   /* old: 1000 */   char *pname = aname;   niveau++;   step( 1 );   i = 1;   strcpy( pname, "<" );   while( True )   {      switch( token( 0 ))      {         case '<': i++; break;         case '>': i--; break;         case  0 :            niveau--;            goto end;      }      if( i == 0 )      {         break;      }      pcIdent = ident( 0 );      f_Strcat( pname, pcIdent );      step( 1 );   }end:   strcat( pname, ">" );   step( 1 );   niveau--;   return f_NameCreate( aname );}static Boolean_t f_TemplateArgList( char *pname ){   int iva_from;   Type_t Type;   Expr_t Expr;   Save();   niveau++;   step( 1 );   iva_from = iva;   pname += strlen( pname );   *pname++ = '<';   *pname = 0;   while( True )   {      if(( Type = f_TypeName( ",>" )))      {         f_TypeDestroy( Type );      }      else      {         if(( Expr = f_Expression()))         {            f_ExprDestroy( Expr );         }         else         {            niveau--;            Restore();            return False;         }      }            switch( token( 0 ))      {         case '>':            concat_token( pname, iva_from );            strcat( pname, ">" );            step( 1 );            niveau--;            return True;         case ',':            step( 1 );            break;         case 0:            niveau--;            Restore();            return False;      }   }}extern Name_t f_NameDup( Name_t Name ){   Name_t NameDup = 0;   if( Name )   {      NameDup = f_NameCreate( Name->pcName );   }   return NameDup;}

⌨️ 快捷键说明

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