1    | /***************************************
2    |   $Header: /home/amb/cxref/src/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  | }