/tags/SN-6.0/snavigator/parsers/cpp/cpplib/cp_symbol.c

https://gitlab.com/OpenSourceMirror/sourcenav · C · 315 lines · 231 code · 55 blank · 29 comment · 16 complexity · bab80ddfd0055874d0b852b879c263b5 MD5 · raw file

  1. /*
  2. Copyright (c) 2000, Red Hat, Inc.
  3. This file is part of Source-Navigator.
  4. Source-Navigator is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License as published
  6. by the Free Software Foundation; either version 2, or (at your option)
  7. any later version.
  8. Source-Navigator is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License along
  13. with Source-Navigator; see the file COPYING. If not, write to
  14. the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
  15. MA 02111-1307, USA.
  16. */
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <tcl.h>
  21. #include "symbol.h"
  22. #include "srchtbl.h"
  23. #undef TRACE
  24. #ifndef Malloc
  25. extern void *Malloc( int );
  26. #endif /* Malloc */
  27. #define False 0
  28. #define True (!False)
  29. typedef struct sSymbol sSymbol_t, *Symbol_t;
  30. typedef struct sDatasp sDatasp_t, *Datasp_t;
  31. struct sSymtab
  32. {
  33. SearchTable *ptable;
  34. void (*pfFree)(void *);
  35. };
  36. struct sSymbol
  37. {
  38. char *name;
  39. Datasp_t Datasp;
  40. };
  41. struct sDatasp
  42. {
  43. int iNiveau;
  44. void *pvData;
  45. Datasp_t DataspNext;
  46. };
  47. static Symbol_t SymbolCreate( char *name, void *pvData, int iNiveau );
  48. static void SymbolDestroy( Symbol_t Symbol, void (*pfFree)(void *));
  49. static Datasp_t DataspCreate( void *pvData, int iNiveau );
  50. static void DataspDestroy( Datasp_t Datasp, void (*pfFree)(void *));
  51. static Symbol_t SymbolInsert( Symtab_t Symtab, Symbol_t Symbol );
  52. static void f_EntryDestroy( SearchEntry *pentry );
  53. static void SymbolPrint( Symbol_t Symbol, int tab );
  54. static Symtab_t Symtab_g;
  55. extern int SymtabInsert( Symtab_t Symtab, char *name, void *pvData, int iNiveau )
  56. {
  57. Symbol_t Symbol;
  58. Symbol_t SymbolOld;
  59. Symtab_g = Symtab;
  60. #ifdef TRACE
  61. printf( "SymbolInsert: %s\n", name );
  62. #endif
  63. Symbol = SymbolCreate( name, pvData, iNiveau );
  64. if(( SymbolOld = SymbolInsert( Symtab, Symbol )))
  65. {
  66. Datasp_t Datasp;
  67. #ifdef TRACE
  68. printf( "SymbolInsert: old value: %s niveau: %d\n", name, iNiveau );
  69. #endif
  70. SymbolDestroy( Symbol, (void(*)(void*)) 0 );
  71. Datasp = DataspCreate( pvData, iNiveau );
  72. Datasp->DataspNext = SymbolOld->Datasp;
  73. SymbolOld->Datasp = Datasp;
  74. Symtab_g = 0;
  75. return True;
  76. }
  77. else
  78. {
  79. #ifdef TRACE
  80. printf( "SymbolInsert: new value: %s niveau: %d\n", name, iNiveau );
  81. #endif
  82. Symtab_g = 0;
  83. return True;
  84. }
  85. }
  86. static Symbol_t SymbolCreate( char *name, void *pvData, int iNiveau )
  87. {
  88. Symbol_t Symbol = (Symbol_t) Malloc( sizeof( Symbol[0] ));
  89. Symbol->name = name;
  90. Symbol->Datasp = DataspCreate( pvData, iNiveau );
  91. return Symbol;
  92. }
  93. static Datasp_t DataspCreate( void *pvData, int iNiveau )
  94. {
  95. Datasp_t Datasp = (Datasp_t) Malloc( sizeof( Datasp[0] ));
  96. Datasp->pvData = pvData;
  97. Datasp->iNiveau = iNiveau;
  98. Datasp->DataspNext = 0;
  99. return Datasp;
  100. }
  101. static void SymbolDestroy( Symbol_t Symbol, void (*pfFree)(void *))
  102. {
  103. if( Symbol )
  104. {
  105. DataspDestroy( Symbol->Datasp, pfFree );
  106. ckfree( (char*)Symbol );
  107. }
  108. }
  109. static void DataspDestroy( Datasp_t Datasp, void (*pfFree)(void *))
  110. {
  111. if( Datasp )
  112. {
  113. if( pfFree && Datasp->pvData )
  114. {
  115. (*pfFree)( Datasp->pvData );
  116. }
  117. DataspDestroy( Datasp->DataspNext, pfFree );
  118. ckfree( (char*)Datasp );
  119. }
  120. }
  121. static Symbol_t SymbolInsert( Symtab_t Symtab, Symbol_t Symbol )
  122. {
  123. SearchEntry entry;
  124. SearchEntry *pentry;
  125. entry.key = Symbol->name;
  126. entry.key_len = strlen( Symbol->name );
  127. if(( pentry = Symtab->ptable->search( &(Symtab->ptable), entry )))
  128. {
  129. return (Symbol_t) pentry->data;
  130. }
  131. entry.data = (void *) Symbol;
  132. entry.data_len = sizeof(Symbol);
  133. entry.flag = 0;
  134. Symtab->ptable->add( &(Symtab->ptable), entry );
  135. return 0;
  136. }
  137. extern void *SymtabFind( Symtab_t Symtab, char *name )
  138. {
  139. SearchEntry entry;
  140. SearchEntry *pentry;
  141. Symtab_g = Symtab;
  142. entry.key = name;
  143. entry.key_len = strlen( name );
  144. if(( pentry = Symtab->ptable->search( &(Symtab->ptable), entry )))
  145. {
  146. Symbol_t Symbol = (Symbol_t) pentry->data;
  147. Symtab_g = 0;
  148. return Symbol->Datasp->pvData;
  149. }
  150. else
  151. {
  152. Symtab_g = 0;
  153. return 0;
  154. }
  155. }
  156. extern Symtab_t SymtabCreate( void (*pfFree)(void *))
  157. {
  158. Symtab_t Symtab = (Symtab_t) Malloc( sizeof( Symtab[0] ));
  159. Symtab->ptable = SearchTableCreate( 100
  160. , SEARCH_BTREE_TABLE
  161. , f_EntryDestroy );
  162. Symtab->pfFree = pfFree;
  163. return Symtab;
  164. }
  165. extern void SymtabDestroy( Symtab_t Symtab )
  166. {
  167. if( Symtab )
  168. {
  169. Symtab_g = Symtab;
  170. Symtab->ptable->destroy(&(Symtab->ptable));
  171. ckfree( (char*)Symtab );
  172. Symtab_g = 0;
  173. }
  174. }
  175. extern void SymtabClear( Symtab_t Symtab )
  176. {
  177. if( Symtab )
  178. {
  179. Symtab_g = Symtab;
  180. Symtab->ptable->destroy(&(Symtab->ptable));
  181. Symtab->ptable = SearchTableCreate( 100
  182. , SEARCH_BTREE_TABLE
  183. , f_EntryDestroy );
  184. Symtab_g = 0;
  185. }
  186. }
  187. static void f_EntryDestroy( SearchEntry *pentry )
  188. {
  189. Symbol_t Symbol = (Symbol_t) pentry->data;
  190. SymbolDestroy( Symbol, Symtab_g->pfFree );
  191. }
  192. extern void SymtabPrint( Symtab_t Symtab, int tab )
  193. {
  194. if( Symtab )
  195. {
  196. int iCount;
  197. SearchEntry *pentry;
  198. for( iCount = 0
  199. ; ( pentry = Symtab->ptable->seq(&(Symtab->ptable), iCount ))
  200. ; iCount++ )
  201. {
  202. Symbol_t Symbol = (Symbol_t) pentry->data;
  203. SymbolPrint( Symbol, tab );
  204. }
  205. }
  206. }
  207. static void SymbolPrint( Symbol_t Symbol, int tab )
  208. {
  209. printf( "%*.*sSymbol: %s\n"
  210. , 4 * tab
  211. , 4 * tab
  212. , ""
  213. , Symbol->name
  214. );
  215. }
  216. extern void SymtabNiveauDestroy( Symtab_t Symtab, int iNiveau )
  217. {
  218. if( Symtab )
  219. {
  220. int iCount;
  221. SearchEntry *pentry;
  222. Symtab_g = Symtab;
  223. for( iCount = 0
  224. ; ( pentry = Symtab->ptable->seq(&(Symtab->ptable), iCount ))
  225. ; iCount++ )
  226. {
  227. Symbol_t Symbol = (Symbol_t) pentry->data;
  228. if( Symbol->Datasp->iNiveau > iNiveau )
  229. {
  230. Datasp_t Datasp = Symbol->Datasp;
  231. Symbol->Datasp = Datasp->DataspNext;
  232. if( Symbol->Datasp == 0 )
  233. {
  234. SearchEntry entry;
  235. entry.key = Symbol->name;
  236. entry.key_len = strlen( Symbol->name );
  237. entry.flag = 0;
  238. Symtab->ptable->delete( &(Symtab->ptable), entry );
  239. iCount--;
  240. }
  241. /* a Datasp-t csak a Symbol torlese utan szabad torolni, mert
  242. a Symbol->name a Datasp->pvData alatt is megvan, es ott torlodik.
  243. Igy ha a Datasp-t torlom, akkor a Symbol->name a levegobe mutat.
  244. 22.01.98 rigo
  245. */
  246. Datasp->DataspNext = 0;
  247. DataspDestroy( Datasp, Symtab->pfFree );
  248. }
  249. }
  250. Symtab_g = 0;
  251. }
  252. }