This file is indexed.

/usr/include/gpsim/symbol.h is in gpsim-dev 0.29.0-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
   Copyright (C) 1998 T. Scott Dattalo

This file is part of the libgpsim library of gpsim

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, see 
<http://www.gnu.org/licenses/lgpl-2.1.html>.
*/

//
// symbol.h
//
// gpsim Symbol Table
//
// The symbol table provides an interface to all named gpsim objects.
// Symbols can be added either automatically (i.e. gpsim adds global
// symbols for its own use), by Modules and Processors, or by users.
// In all cases, symbols placed into the symbol table are available
// for expressions, breakpoints, or querying.
//
// Implementation details:
//
// The gpsim symbol table relies heavily on the STL map. A map is
// created for each gpsim Module. An additional map is created for the
// global symbols. Each one of these maps can be accessed via the
// Module or via the Module name. The global symbols belong to no
// Module, however the map holding them is named '__global__'.
// 
// In addition, there is another map for holding all of the
// Modules. This map together with all of the Module symbol tables
// form a two-level hierarchical symbol table.
//
// At the global scope (e.g. the command line), symbols are referred
// to by:
//
//      ModuleName.ModuleSymbolName
// 
// For example, p16f873.foo refers to the symbol 'foo' in the p16f873
// module.
//
// A notion of a 'current module' exists. This feature is not fully
// implemented, but currently the most recently loaded Processor is
// designated as the current module. Symbols in the current module can
// be referenced with just the '.' scoping operator. For example, if 
// p16f873 is the current module, then typing '.foo' will display
// p16f873.foo. 
//
// The symbol table avoids interpreting or operating on the data it
// stores. For example, only the object's name is ever
// referenced. Clients wishing for specialized symbol manipulation are
// required to do the appropriate type casting. A mechanism based on
// the STL 'for_each' algorithm is provided to assist iterating
// through all of the symbols.


#ifndef __SYMBOL_H__
#define __SYMBOL_H__

#include <algorithm>
#include <string>
#include <map>
#include "exports.h"

using namespace std;

// Forward definitions
class gpsimObject;
class Integer;
class Value;
class Module;
class SymbolTable_t;
class SymbolTable;

typedef  map<const char *, Module *> ModuleList_t;
typedef  map<const string, SymbolTable_t *> MSymbolTable_t;
typedef void (*PFN_ForEachModule)(const pair<string, SymbolTable_t *> &st);
typedef void (*PFN_ForEachSymbol)(const pair<string, gpsimObject *> &sym);
typedef pair<string, SymbolTable_t *> SymbolTableEntry_t;
typedef pair<string, gpsimObject *> SymbolEntry_t;

//************************************************************************
// SymbolTable_t
// 
// A gpsim symbol table is an STL map of gpsimObject pointers that are keyed with
// by the object's name.
//

class SymbolTable_t : protected map<string, gpsimObject *>
{
  // The SymbolTable class has access to all map<>'s methods.
  friend class SymbolTable;
public:

  int addSymbol(gpsimObject *, string *AliasedName=0);
  int removeSymbol(gpsimObject *);
  int removeSymbol(const string &);
  int deleteSymbol(const string &);
  gpsimObject *findSymbol(const string &);

  /// ForEachModuleSymbolTable -- thin wrapper around map<>'s for_each() algorithm.
  /// The pointer to the function passed must be declared like:
  /// void MyForEach(const SymbolEntry_t &sym) { /* do something with sym */ }
  /// Then invoked the algorithm by:
  ///   ASymbolTable.ForEachModuleSymbolTable(MyForEach);

  inline void ForEachSymbolTable(PFN_ForEachSymbol forEach)
  {
    for_each(begin(), end(),  forEach);
  }
protected:
  // stiFound an iterator that points to the most recently found symbol.
  SymbolTable_t::iterator stiFound;
};


//************************************************************************
//

class SymbolTable
{
public:
  SymbolTable();
  ~SymbolTable();

  /// Globally scoped symbols are added and removed here
  int addSymbol(gpsimObject *);
  int removeSymbol(gpsimObject *);
  int removeSymbol(const string &);
  int deleteSymbol(const string &);

  /// Each Module maintains its own symbol table. If the module wants
  /// its symbols to be accessed at the global scope, then the module
  /// has to add itself to the table.

  void addModule(Module *);
  void removeModule(Module *);
  void listModules(); // ugh

  /// find - search for a particular symbol
  gpsimObject *find(string);
  gpsimObject *findObject(gpsimObject *);

  ///
  void ForEachModule(PFN_ForEachModule forEach);

  /// Convenience functions for finding a symbol of a particular type:
  Value         *findValue(string);
  Integer       *findInteger(string);
  Module        *findModule(string);
protected:
  MSymbolTable_t MSymbolTables;
};



#if defined(_WIN32)
#if !defined(IN_MODULE) 
extern SymbolTable  gSymbolTable;
#endif
// we are in Windows: don't access the symbol table object directly!
LIBGPSIM_EXPORT SymbolTable & globalSymbolTable();
#else
// we are in gpsim: use of getSymbolTable() is recommended,
// even if it can be accessed directly.
extern SymbolTable gSymbolTable;
inline SymbolTable &globalSymbolTable()
{
  return gSymbolTable;
}
#endif



#endif  //  __SYMBOL_H__