1 | /*************************************** 2 | $Header: /home/amb/cxref/RCS/var.c 1.14 2004/01/10 20:43:06 amb Exp $ 3 | 4 | C Cross Referencing & Documentation tool. Version 1.5f. 5 | 6 | Collects the variable definition stuff. 7 | ******************/ /****************** 8 | Written by Andrew M. Bishop 9 | 10 | This file Copyright 1995,96,97,99,2004 Andrew M. Bishop 11 | It may be distributed under the GNU Public License, version 2, or 12 | any higher version. See section COPYING of the GNU Public license 13 | for conditions under which this file may be redistributed. 14 | ***************************************/ 15 | 16 | /*+ Control the output of debugging information from this file. +*/ 17 | #define DEBUG 0 18 | 19 | #include <stdlib.h> 20 | #include <stdio.h> 21 | #include <string.h> 22 | 23 | #include "memory.h" 24 | #include "datatype.h" 25 | #include "parse-yy.h" 26 | #include "cxref.h" 27 | 28 | /*+ The file that is currently being documented. +*/ 29 | extern File CurFile; 30 | 31 | /*+ When in a header file make a note of which one for the included variables. +*/ 32 | extern int in_header; 33 | 34 | /*+ A list of the variables found at each level of the scope. +*/ 35 | static StringList2 *variable; 36 | 37 | /*+ The number of levels of scope depth allocated. +*/ 38 | static int max_scope=0; 39 | 40 | /*+ The current scope depth. +*/ 41 | static int cur_scope=-1; 42 | 43 | 44 | static Variable NewVariableType(char *name,char *type); 45 | 46 | 47 | /*++++++++++++++++++++++++++++++++++++++ 48 | Function that is called when a variable definition is seen. 49 | 50 | char* name The name of the variable. 51 | 52 | char* type The type of the variable. 53 | 54 | int scope The scope of variable that has been seen. 55 | ++++++++++++++++++++++++++++++++++++++*/ 56 | 57 | void SeenVariableDefinition(char* name,char* type,int scope) 58 | { 59 | Variable var; 60 | int seen=0; 61 | 62 | #if DEBUG 63 | printf("#Var.c# Variable definition for '%s'\n",name); 64 | #endif 65 | 66 | for(var=CurFile->variables;var;var=var->next) 67 | if(!strcmp(var->name,name)) 68 | { 69 | var->scope|=scope; 70 | seen=1; 71 | if(!in_header && var->scope&EXTERN_H) 72 | { 73 | if(var->comment) 74 | Free(var->comment); 75 | var->comment=MallocString(GetCurrentComment()); 76 | var->lineno=parse_line; 77 | } 78 | break; 79 | } 80 | 81 | if(!seen) 82 | { 83 | var=NewVariableType(name,type); 84 | 85 | var->comment=MallocString(GetCurrentComment()); 86 | var->scope=scope; 87 | 88 | var->lineno=parse_line; 89 | 90 | if(in_header && !(scope&EXTERN_H)) 91 | var->incfrom=MallocString(parse_file); 92 | 93 | AddToLinkedList(CurFile->variables,Variable,var); 94 | } 95 | } 96 | 97 | /*++++++++++++++++++++++++++++++++++++++ 98 | Called when a new scope is entered. 99 | ++++++++++++++++++++++++++++++++++++++*/ 100 | 101 | void UpScope(void) 102 | { 103 | cur_scope++; 104 | 105 | #if DEBUG 106 | printf("#Var.c# Scope ++ (%2d)\n",cur_scope); 107 | #endif 108 | 109 | if(cur_scope>=max_scope) 110 | { 111 | if(max_scope==0) 112 | variable=Malloc(16*sizeof(StringList2)); 113 | else 114 | variable=Realloc(variable,(max_scope+16)*sizeof(StringList2)); 115 | max_scope+=16; 116 | } 117 | 118 | variable[cur_scope]=NewStringList2(); 119 | } 120 | 121 | 122 | /*++++++++++++++++++++++++++++++++++++++ 123 | Called when an old scope is exited. 124 | ++++++++++++++++++++++++++++++++++++++*/ 125 | 126 | void DownScope(void) 127 | { 128 | #if DEBUG 129 | printf("#Var.c# Scope -- (%2d)\n",cur_scope); 130 | #endif 131 | 132 | DeleteStringList2(variable[cur_scope]); 133 | 134 | cur_scope--; 135 | } 136 | 137 | 138 | /*++++++++++++++++++++++++++++++++++++++ 139 | Add a variable to the list of known variables. 140 | 141 | char* name The name of the variable. 142 | ++++++++++++++++++++++++++++++++++++++*/ 143 | 144 | void SeenScopeVariable(char* name) 145 | { 146 | #if DEBUG 147 | printf("#Var.c# Scope Variable depth %2d '%s'\n",cur_scope,name); 148 | #endif 149 | 150 | AddToStringList2(variable[cur_scope],name,NULL,0,0); 151 | } 152 | 153 | 154 | /*++++++++++++++++++++++++++++++++++++++ 155 | Check through the scope variables to look for the named one. 156 | 157 | int IsAScopeVariable Returns 1 if the name does refer to a variable that is scoped. 158 | 159 | char* name The name of the variable to search for. 160 | ++++++++++++++++++++++++++++++++++++++*/ 161 | 162 | int IsAScopeVariable(char* name) 163 | { 164 | int i,scope; 165 | 166 | #if DEBUG 167 | printf("#Var.c# Lookup variable '%s'\n",name); 168 | #endif 169 | 170 | for(scope=cur_scope;scope>=0;scope--) 171 | for(i=0;i<variable[scope]->n;i++) 172 | if(!strcmp(variable[scope]->s1[i],name)) 173 | return(1); 174 | 175 | return(0); 176 | } 177 | 178 | 179 | /*++++++++++++++++++++++++++++++++++++++ 180 | Tidy up all of the local variables in case of a problem and abnormal parser termination. 181 | ++++++++++++++++++++++++++++++++++++++*/ 182 | 183 | void ResetVariableAnalyser(void) 184 | { 185 | while(cur_scope>=0) 186 | { 187 | DeleteStringList2(variable[cur_scope]); 188 | cur_scope--; 189 | } 190 | 191 | if(variable) Free(variable); 192 | variable=NULL; 193 | 194 | max_scope=0; 195 | cur_scope=-1; 196 | } 197 | 198 | 199 | /*++++++++++++++++++++++++++++++++++++++ 200 | Create a new variable type. 201 | 202 | Variable NewVariableType Returns a new Variable type. 203 | 204 | char *name The name of the variable. 205 | 206 | char *type The type of the variable. 207 | ++++++++++++++++++++++++++++++++++++++*/ 208 | 209 | static Variable NewVariableType(char *name,char *type) 210 | { 211 | Variable var=(Variable)Calloc(1,sizeof(struct _Variable)); /* clear unused pointers */ 212 | 213 | var->name =MallocString(name); 214 | var->type =MallocString(type); 215 | var->visible=NewStringList2(); 216 | var->used =NewStringList2(); 217 | 218 | return(var); 219 | } 220 | 221 | 222 | /*++++++++++++++++++++++++++++++++++++++ 223 | Delete the specified Variable type. 224 | 225 | Variable var The Variable type to be deleted. 226 | ++++++++++++++++++++++++++++++++++++++*/ 227 | 228 | void DeleteVariableType(Variable var) 229 | { 230 | if(var->comment) Free(var->comment); 231 | if(var->name) Free(var->name); 232 | if(var->type) Free(var->type); 233 | if(var->defined) Free(var->defined); 234 | if(var->incfrom) Free(var->incfrom); 235 | if(var->visible) DeleteStringList2(var->visible); 236 | if(var->used) DeleteStringList2(var->used); 237 | Free(var); 238 | }