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

📄 cp_symbol.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.*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <tcl.h>#include "symbol.h"#include "srchtbl.h"#undef TRACE#ifndef Mallocextern void *Malloc( int );#endif /* Malloc */#define False 0#define True (!False)typedef struct sSymbol sSymbol_t, *Symbol_t;typedef struct sDatasp sDatasp_t, *Datasp_t;struct sSymtab{   SearchTable *ptable;   void (*pfFree)(void *);};struct sSymbol{   char *name;   Datasp_t Datasp;};struct sDatasp{   int iNiveau;   void *pvData;   Datasp_t DataspNext;};static Symbol_t SymbolCreate( char *name, void *pvData, int iNiveau );static void SymbolDestroy( Symbol_t Symbol, void (*pfFree)(void *));static Datasp_t DataspCreate( void *pvData, int iNiveau );static void DataspDestroy( Datasp_t Datasp, void (*pfFree)(void *));static Symbol_t SymbolInsert( Symtab_t Symtab, Symbol_t Symbol );static void f_EntryDestroy( SearchEntry *pentry );static void SymbolPrint( Symbol_t Symbol, int tab );static Symtab_t Symtab_g;extern int SymtabInsert( Symtab_t Symtab, char *name, void *pvData, int iNiveau ){   Symbol_t Symbol;   Symbol_t SymbolOld;   Symtab_g = Symtab;#ifdef TRACE   printf( "SymbolInsert: %s\n", name );#endif   Symbol = SymbolCreate( name, pvData, iNiveau );   if(( SymbolOld = SymbolInsert( Symtab, Symbol )))   {      Datasp_t Datasp;#ifdef TRACE      printf( "SymbolInsert: old value: %s niveau: %d\n", name, iNiveau );#endif      SymbolDestroy( Symbol, (void(*)(void*)) 0 );      Datasp = DataspCreate( pvData, iNiveau );      Datasp->DataspNext = SymbolOld->Datasp;      SymbolOld->Datasp = Datasp;      Symtab_g = 0;      return True;   }   else   {#ifdef TRACE      printf( "SymbolInsert: new value: %s niveau: %d\n", name, iNiveau );#endif      Symtab_g = 0;      return True;   }}static Symbol_t SymbolCreate( char *name, void *pvData, int iNiveau ){   Symbol_t Symbol = (Symbol_t) Malloc( sizeof( Symbol[0] ));   Symbol->name = name;   Symbol->Datasp = DataspCreate( pvData, iNiveau );   return Symbol;}static Datasp_t DataspCreate( void *pvData, int iNiveau ){   Datasp_t Datasp = (Datasp_t) Malloc( sizeof( Datasp[0] ));   Datasp->pvData     = pvData;   Datasp->iNiveau    = iNiveau;   Datasp->DataspNext = 0;   return Datasp;}static void SymbolDestroy( Symbol_t Symbol, void (*pfFree)(void *)){   if( Symbol )   {      DataspDestroy( Symbol->Datasp, pfFree );      ckfree( (char*)Symbol );   }}static void DataspDestroy( Datasp_t Datasp, void (*pfFree)(void *)){   if( Datasp )   {      if( pfFree && Datasp->pvData )      {         (*pfFree)( Datasp->pvData );      }      DataspDestroy( Datasp->DataspNext, pfFree );      ckfree( (char*)Datasp );   }}static Symbol_t SymbolInsert( Symtab_t Symtab, Symbol_t Symbol ){   SearchEntry entry;   SearchEntry *pentry;   entry.key = Symbol->name;   entry.key_len = strlen( Symbol->name );   if(( pentry = Symtab->ptable->search( &(Symtab->ptable), entry )))   {      return (Symbol_t) pentry->data;   }   entry.data = (void *) Symbol;   entry.data_len = sizeof(Symbol);   entry.flag = 0;   Symtab->ptable->add( &(Symtab->ptable), entry );   return 0;}extern void *SymtabFind( Symtab_t Symtab, char *name ){   SearchEntry entry;   SearchEntry *pentry;   Symtab_g = Symtab;   entry.key = name;   entry.key_len = strlen( name );   if(( pentry = Symtab->ptable->search( &(Symtab->ptable), entry )))   {      Symbol_t Symbol = (Symbol_t) pentry->data;      Symtab_g = 0;      return Symbol->Datasp->pvData;   }   else   {      Symtab_g = 0;      return 0;   }}extern Symtab_t SymtabCreate( void (*pfFree)(void *)){   Symtab_t Symtab = (Symtab_t) Malloc( sizeof( Symtab[0] ));   Symtab->ptable = SearchTableCreate( 100                                     , SEARCH_BTREE_TABLE                                     , f_EntryDestroy );   Symtab->pfFree = pfFree;   return Symtab;}extern void SymtabDestroy( Symtab_t Symtab ){   if( Symtab )   {      Symtab_g = Symtab;      Symtab->ptable->destroy(&(Symtab->ptable));      ckfree( (char*)Symtab );      Symtab_g = 0;   }}extern void SymtabClear( Symtab_t Symtab ){   if( Symtab )   {      Symtab_g = Symtab;      Symtab->ptable->destroy(&(Symtab->ptable));      Symtab->ptable = SearchTableCreate( 100                                        , SEARCH_BTREE_TABLE                                        , f_EntryDestroy );      Symtab_g = 0;   }}static void f_EntryDestroy( SearchEntry *pentry ){   Symbol_t Symbol = (Symbol_t) pentry->data;   SymbolDestroy( Symbol, Symtab_g->pfFree );}extern void SymtabPrint( Symtab_t Symtab, int tab ){   if( Symtab )   {      int iCount;      SearchEntry *pentry;      for( iCount = 0         ; ( pentry = Symtab->ptable->seq(&(Symtab->ptable), iCount ))         ; iCount++ )      {         Symbol_t Symbol = (Symbol_t) pentry->data;         SymbolPrint( Symbol, tab );      }   }}static void SymbolPrint( Symbol_t Symbol, int tab ){   printf( "%*.*sSymbol: %s\n"         , 4 * tab         , 4 * tab         , ""         , Symbol->name         );}extern void SymtabNiveauDestroy( Symtab_t Symtab, int iNiveau ){   if( Symtab )   {      int iCount;      SearchEntry *pentry;      Symtab_g = Symtab;      for( iCount = 0         ; ( pentry = Symtab->ptable->seq(&(Symtab->ptable), iCount ))         ; iCount++ )      {         Symbol_t Symbol = (Symbol_t) pentry->data;         if( Symbol->Datasp->iNiveau > iNiveau )         {            Datasp_t Datasp = Symbol->Datasp;            Symbol->Datasp = Datasp->DataspNext;            if( Symbol->Datasp == 0 )            {	       SearchEntry entry;	       entry.key = Symbol->name;	       entry.key_len = strlen( Symbol->name );	       entry.flag = 0;               Symtab->ptable->delete( &(Symtab->ptable), entry );               iCount--;            }            /* a Datasp-t csak a Symbol torlese utan szabad torolni, mert               a Symbol->name a Datasp->pvData alatt is megvan, es ott torlodik.               Igy ha a Datasp-t torlom, akkor a Symbol->name a levegobe mutat.               22.01.98 rigo            */            Datasp->DataspNext = 0;            DataspDestroy( Datasp, Symtab->pfFree );         }      }      Symtab_g = 0;   }}

⌨️ 快捷键说明

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