• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/ap/gpl/amule/wxWidgets-2.8.12/contrib/include/wx/deprecated/
1/////////////////////////////////////////////////////////////////////////////
2// Name:        wxexpr.h
3// Purpose:     Prolog-like file I/O, used by resource system.
4// Author:      Julian Smart
5// Modified by:
6// Created:     01/02/97
7// RCS-ID:      $Id: wxexpr.h 35650 2005-09-23 12:56:45Z MR $
8// Copyright:   (c) Julian Smart
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_WXEXPRH__
13#define _WX_WXEXPRH__
14
15#include "wx/deprecated/setup.h"
16
17#if wxUSE_PROLOGIO
18
19#include "wx/defs.h"
20#include "wx/string.h"
21
22#include "wx/list.h"
23#include "wx/hash.h"
24
25#include "wx/deprecated/expr.h"
26
27#include <stdio.h>
28
29// Compatibility
30#define PrologExpr wxExpr
31#define PrologDatabase wxExprDatabase
32#define proioErrorHandler wxExprErrorHandler
33#define PROIO_ERROR_GENERAL 1
34#define PROIO_ERROR_SYNTAX  2
35#define PrologNull wxExprNull
36#define PrologInteger wxExprInteger
37#define PrologReal wxExprReal
38#define PrologWord wxExprWord
39#define PrologString wxExprString
40#define PrologList wxExprList
41#define PrologType wxExprType
42
43// Error types
44#define WXEXPR_ERROR_GENERAL 1
45#define WXEXPR_ERROR_SYNTAX  2
46
47// Error handler function definition. If app returns true,
48// carry on processing.
49typedef bool (*wxExprErrorHandler) (int errorType, char *msg);
50
51WXDLLIMPEXP_DATA_DEPRECATED(extern wxExprErrorHandler) currentwxExprErrorHandler;
52
53
54typedef enum {
55    wxExprNull,
56    wxExprInteger,
57    wxExprReal,
58    wxExprWord,
59    wxExprString,
60    wxExprList
61} wxExprType;
62
63class WXDLLIMPEXP_DEPRECATED wxExprDatabase;
64
65class WXDLLIMPEXP_DEPRECATED wxExpr
66{
67 public:
68  wxObject *client_data;
69  wxExprType type;
70  union {
71    long integer;
72    wxChar *word;
73    wxChar *string;
74    double real;
75    wxExpr *first;  // If is a list expr, points to the first node
76    } value;
77
78  wxExpr *next;     // If this is a node in a list, points to the next node
79  wxExpr *last;     // If is a list expr, points to the last node
80
81  wxExpr(wxExprType the_type, wxChar *word_or_string, bool allocate);
82  wxExpr(const wxString& functor);      // Assume this is a new clause - pass functor
83  wxExpr(wxExprType the_type, const wxString& word_or_string = wxT(""));
84  wxExpr(long the_integer);
85  wxExpr(double the_real);
86  wxExpr(wxList *the_list);
87  ~wxExpr(void);
88
89  inline wxExprType Type(void) const { return type; }
90  inline long IntegerValue(void) const
91  {
92    if (type == wxExprInteger)
93      return value.integer;
94    else if (type == wxExprReal)
95      return (long)value.real;
96    else return 0;
97  }
98
99  inline double RealValue(void) const {
100    if (type == wxExprReal)
101      return value.real;
102    else if (type == wxExprInteger)
103      return (double)value.integer;
104    else return (double)0.0;
105  }
106
107  inline wxString WordValue(void) const {
108    if (type == wxExprWord)
109      return value.word;
110    else if (type == wxExprString)
111      return wxString(value.string);
112    else return wxString(wxT(""));
113  }
114
115  inline wxString StringValue(void) const {
116    if (type == wxExprString)
117      return wxString(value.string);
118    else if (type == wxExprWord)
119      return wxString(value.word);
120    else return wxString(wxT(""));
121  }
122
123  // Get nth arg of clause (starting from 1)
124  wxExpr *Arg(wxExprType type, int arg) const;
125
126  // Return nth argument of a list expression (starting from zero)
127  wxExpr *Nth(int arg) const;
128
129  // Returns the number of elements in a list expression
130  int Number(void) const;
131
132  // Make a clone
133  wxExpr *Copy(void) const;
134
135  wxExpr *GetAttributeValueNode(const wxString& word) const;  // Use only for a clause or list
136  wxExpr *AttributeValue(const wxString& word) const;  // Use only for a clause
137  wxString Functor(void) const;                     // Only for a clause
138  bool IsFunctor(const wxString& s) const;                     // Only for a clause
139  void WriteClause(FILE* stream);  // Write this expression as a top-level clause
140  void WriteExpr(FILE* stream);    // Write as any other subexpression
141
142  // Append an expression to a list
143  void Append(wxExpr *expr);
144  // Insert at beginning of list
145  void Insert(wxExpr *expr);
146
147  // Get first expr in list
148  inline wxExpr *GetFirst(void) const { return ((type == wxExprList) ? value.first : (wxExpr*)NULL); }
149
150  // Get next expr if this is a node in a list
151  inline wxExpr *GetNext(void) const { return next; }
152
153  // Get last expr in list
154  inline wxExpr *GetLast(void) const { return ((type == wxExprList) ? last : (wxExpr*)NULL); }
155
156  // This should really be called SetAttributeValue since any existing
157  // attribute-value is deleted first.
158  void AddAttributeValue(const wxString& attribute, long value);
159  void AddAttributeValue(const wxString& attribute, double value);
160  void AddAttributeValueWord(const wxString& attribute, const wxString& value);
161  void AddAttributeValueString(const wxString& attribute, const wxString& value);
162  void AddAttributeValue(const wxString& attribute, wxList *value);
163  void AddAttributeValue(const wxString& attribute, wxExpr *value);
164  void AddAttributeValueStringList(const wxString& attribute, wxList *string_list);
165
166  void DeleteAttributeValue(const wxString& attribute);
167
168  bool GetAttributeValue(const wxString& att, int& var) const;
169  bool GetAttributeValue(const wxString& att, long& var) const;
170  bool GetAttributeValue(const wxString& att, float& var) const;
171  bool GetAttributeValue(const wxString& att, double& var) const;
172  bool GetAttributeValue(const wxString& att, wxString& var) const;  // Word OR string -> string
173  bool GetAttributeValue(const wxString& att, wxExpr **var) const;
174
175  // Compatibility with old PrologIO
176  inline void AssignAttributeValue(wxChar *att, int *var) const { GetAttributeValue(att, *var); }
177  inline void AssignAttributeValue(wxChar *att, long *var) const { GetAttributeValue(att, *var); }
178  inline void AssignAttributeValue(wxChar *att, float *var) const { GetAttributeValue(att, *var); }
179  inline void AssignAttributeValue(wxChar *att, double *var) const { GetAttributeValue(att, *var); }
180  inline void AssignAttributeValue(wxChar *att, wxExpr **var) const { GetAttributeValue(att, var); }
181  void AssignAttributeValue(wxChar *att, wxChar **var) const ;  // Word OR string -> string
182
183  // Add string items to list if the list attribute exists
184  bool GetAttributeValueStringList(const wxString& att, wxList *var) const;
185
186  // Associate other data with this expression, e.g. when reading in a
187  // number of linked items - store C++ object pointer with the expression
188  // so we can index into the wxExpr database and fish out the pointer.
189  inline void SetClientData(wxObject *data) { client_data = data; }
190  inline wxObject *GetClientData(void) const { return client_data; }
191
192    DECLARE_NO_COPY_CLASS(wxExpr)
193};
194
195class WXDLLIMPEXP_DEPRECATED wxExprDatabase: public wxList
196{
197private:
198    wxNode *position;              // Where we are in a search
199    wxHashTable *hash_table;
200    wxString attribute_to_hash;
201
202public:
203    int noErrors;
204
205    wxExprDatabase(wxExprErrorHandler handler = 0);
206
207    // Use hashing on both the functor, and the attribute of
208    // specified type (wxExprString or wxExprInteger) and name.
209    // So to find node 45
210    // (i.e. match the clause node(id=45, ...))
211    // it usually requires 1 look-up: the keys for functor and attribute
212    // are added together.
213    // Obviously if the attribute was missing in a clause, it would
214    // fail to be found by this method, but could be retrieved by a
215    // linear search using BeginFind and FindClauseByFunctor,
216    // or just searching through the list as per usual.
217
218    wxExprDatabase(wxExprType type, const wxString& attribute, int size = 500,
219            wxExprErrorHandler handler = 0);
220
221    ~wxExprDatabase(void);
222
223    void BeginFind(void) ;          // Initialise a search
224    wxExpr *FindClause(long id) ;  // Find a term based on an integer id attribute
225    // e.g. node(id=23, type=rectangle, ....).
226
227    // Find on basis of attribute/value pairs, e.g. type=rectangle
228    // This doesn't use hashing; it's a linear search.
229    wxExpr *FindClause(const wxString& word, const wxString& value);
230    wxExpr *FindClause(const wxString& word, long value);
231    wxExpr *FindClause(const wxString& word, double value);
232    wxExpr *FindClauseByFunctor(const wxString& functor);
233
234    wxExpr *HashFind(const wxString& functor, const wxString& value) const;
235    wxExpr *HashFind(const wxString& functor, long value) const;
236
237    void Append(wxExpr *expr);  // Does cleverer things if hashing is on
238    void ClearDatabase(void);
239    inline int GetErrorCount() const { return noErrors; }
240    bool Read(const wxString& filename);
241    bool ReadFromString(const wxString& buffer);
242    bool Write(const wxString& fileName);
243    bool Write(FILE* stream);
244
245    // Compatibility
246    inline bool ReadProlog(wxChar *filename) { return Read(wxString(filename)); }
247    inline bool ReadPrologFromString(char *buffer)
248    {
249        return ReadFromString(wxString(buffer, wxConvLibc));
250    }
251    inline void WriteProlog(FILE* stream) { Write(stream); }
252
253private:
254    DECLARE_DYNAMIC_CLASS(wxExprDatabase)
255    DECLARE_NO_COPY_CLASS(wxExprDatabase)
256};
257
258// Function call-style interface - some more convenience wrappers/unwrappers
259
260// Make a call
261WXDLLIMPEXP_DEPRECATED wxExpr* wxExprMakeCall(const wxString& functor ...);
262
263#define wxExprMakeInteger(x) (new wxExpr((long)x))
264#define wxExprMakeReal(x) (new wxExpr((double)x))
265#define wxExprMakeString(x) (new wxExpr(wxExprString, x))
266#define wxExprMakeWord(x)   (new wxExpr(wxExprWord, x))
267#define wxExprMake(x)       (new wxExpr(x))
268
269// Checks functor
270WXDLLIMPEXP_DEPRECATED bool wxExprIsFunctor(wxExpr *expr, const wxString& functor);
271
272// Temporary variable for communicating between wxexpr.cpp and YACC/LEX
273WXDLLIMPEXP_DATA_DEPRECATED(extern wxExprDatabase*) thewxExprDatabase;
274
275// YACC/LEX can leave memory lying around...
276extern "C" WXDLLIMPEXP_DEPRECATED int wxExprCleanUp();
277
278#endif // wxUSE_PROLOGIO
279
280#endif // _WX_WXEXPRH__
281
282