source: git/kernel/structs.h @ bafaec0

spielwiese
Last change on this file since bafaec0 was 2300ae, checked in by Hans Schönemann <hannes@…>, 14 years ago
lib_types moved to mod_raw.h git-svn-id: file:///usr/local/Singular/svn/trunk@12678 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 19.8 KB
Line 
1#ifndef STRUCTS_H
2#define STRUCTS_H
3/****************************************
4*  Computer Algebra System SINGULAR     *
5****************************************/
6/* $Id$ */
7/*
8* ABSTRACT
9*/
10
11/* for memset: */
12#include <string.h>
13#ifdef HAVE_RINGS
14#include <si_gmp.h>
15#endif
16
17
18/* standard types */
19#ifdef HAVE_RINGS
20typedef unsigned long NATNUMBER;
21typedef MP_INT *int_number;
22#endif
23#if (SIZEOF_LONG == 8)
24typedef int BOOLEAN;
25/* testet on x86_64, gcc 3.4.6: 2 % */
26/* testet on IA64, gcc 3.4.6: 1 % */
27#else
28/* testet on athlon, gcc 2.95.4: 1 % */
29typedef short BOOLEAN;
30#endif
31
32typedef void * Sy_reference;
33#define ADDRESS Sy_reference
34#define BITSET  unsigned int
35
36#if defined(SI_CPU_I386) || defined(SI_CPU_X86_64)
37  // the following settings seems to be better on i386 and x86_64 processors
38  // define if a*b is with mod instead of tables
39  #define HAVE_MULT_MOD
40  // #define HAVE_GENERIC_ADD
41  // #ifdef HAVE_MULT_MOD
42  // #define HAVE_DIV_MOD
43  // #endif
44#elif defined(SI_CPU_IA64)
45  // the following settings seems to be better on itanium processors
46  // #define HAVE_MULT_MOD
47  #define HAVE_GENERIC_ADD
48  // #ifdef HAVE_MULT_MOD
49  // #define HAVE_DIV_MOD
50  // #endif
51#elif defined(SI_CPU_SPARC)
52  // #define HAVE_GENERIC_ADD
53  #define HAVE_MULT_MOD
54  #ifdef HAVE_MULT_MOD
55  #define HAVE_DIV_MOD
56  #endif
57#elif defined(SI_CPU_PPC)
58  // the following settings seems to be better on ppc processors
59  // testet on: ppc_Linux, 740/750 PowerMac G3, 512k L2 cache
60  #define HAVE_MULT_MOD
61  // #ifdef HAVE_MULT_MOD
62  // #define HAVE_DIV_MOD
63  // #endif
64#endif
65
66#if SIZEOF_LONG == 4
67typedef long long int64;
68#elif SIZEOF_LONG == 8
69typedef long int64;
70#else
71#error int64 undefined
72#endif
73
74
75enum n_coeffType
76{
77  n_unknown=0,
78  n_Zp,
79  n_Q,
80  n_R,
81  n_GF,
82  n_long_R,
83  n_Zp_a,
84  n_Q_a,
85  n_long_C
86#ifdef HAVE_RINGS
87  ,n_Z,
88  n_Zm,
89  n_Zpn,
90  n_Z2n
91#endif
92};
93
94// #ifdef HAVE_PLURAL
95enum nc_type
96{
97  nc_error = -1, // Something's gone wrong!
98  nc_general = 0, /* yx=q xy+... */
99  nc_skew, /*1*/ /* yx=q xy */
100  nc_comm, /*2*/ /* yx= xy */
101  nc_lie,  /*3*/ /* yx=xy+... */
102  nc_undef, /*4*/  /* for internal reasons */
103
104  nc_exterior /*5*/ // Exterior Algebra(SCA): yx= -xy & (!:) x^2 = 0
105};
106// #endif
107
108struct snumber;
109typedef struct snumber *   number;
110typedef number (*numberfunc)(number a,number b);
111typedef number (*nMapFunc)(number a);
112
113/* C++-part */
114#ifdef __cplusplus
115class ip_smatrix;
116class idrec;
117class intvec;
118class sleftv;
119class slists;
120class sattr;
121class skStrategy;
122class ssyStrategy;
123class procinfo;
124class kBucket;
125class sBucket;
126class CPolynomialSummator;
127class CGlobalMultiplier;
128class CFormulaPowerMultiplier;
129#endif
130
131struct n_Procs_s;
132struct sip_sring;
133struct sip_link;
134struct spolynom;
135struct _ssubexpr;
136struct _sssym;
137struct sip_command;
138struct sip_package;
139struct s_si_link_extension;
140
141// forward for ideals.h:
142struct sip_sideal;
143struct sip_smap;
144typedef struct sip_smap *         map;
145typedef struct sip_sideal *       ideal;
146
147
148typedef struct  n_Procs_s  n_Procs_s;
149
150// #ifdef HAVE_PLURAL
151struct nc_struct;
152typedef struct nc_struct   nc_struct;
153// #endif
154
155typedef struct _ssubexpr   sSubexpr;
156typedef struct _sssym      ssym;
157typedef struct spolyrec    polyrec;
158typedef struct sip_sring   ip_sring;
159typedef struct sip_link    ip_link;
160typedef struct sip_command ip_command;
161typedef struct sip_package ip_package;
162
163/* the pointer types */
164typedef char *             char_ptr;
165typedef int  *             int_ptr;
166typedef short *            short_ptr;
167typedef ip_sring *         ring;
168typedef int                idtyp;
169typedef polyrec *          poly;
170typedef poly *             polyset;
171typedef union uutypes      utypes;
172typedef ip_command *       command;
173typedef struct s_si_link_extension *si_link_extension;
174typedef polyrec *   napoly;
175
176#ifdef __cplusplus
177typedef idrec *            idhdl;
178typedef ip_smatrix *       matrix;
179typedef ip_link *          si_link;
180typedef sleftv *           leftv;
181typedef slists *           lists;
182typedef sSubexpr *         Subexpr;
183typedef sattr *            attr;
184typedef skStrategy *       kStrategy;
185typedef ip_package *       package;
186typedef ssyStrategy *      syStrategy;
187typedef procinfo *         procinfov;
188typedef kBucket*           kBucket_pt;
189typedef sBucket*           sBucket_pt;
190typedef struct p_Procs_s p_Procs_s;
191
192struct n_Procs_s
193{
194   n_Procs_s* next;
195   // the union stuff
196   // Zp:
197   int npPrimeM;
198   int npPminus1M;
199   #ifdef HAVE_DIV_MOD
200   unsigned short *npInvTable;
201   #endif
202   #if !defined(HAVE_DIV_MOD) || !defined(HAVE_MULT_MOD)
203   unsigned short *npExpTable;
204   unsigned short *npLogTable;
205   #endif
206   // Zp_a, Q_a
207
208   // general stuff
209   numberfunc nMult, nSub ,nAdd ,nDiv, nIntDiv, nIntMod, nExactDiv;
210   number  (*cfInit)(int i,const ring r);
211   number  (*nPar)(int i);
212   int     (*nParDeg)(number n);
213   int     (*nSize)(number n);
214   int     (*n_Int)(number &n, const ring r);
215#ifdef HAVE_RINGS
216   int     (*nDivComp)(number a,number b);
217   BOOLEAN (*nIsUnit)(number a);
218   number  (*nGetUnit)(number a);
219   number  (*nExtGcd)(number a, number b, number *s, number *t);
220#endif
221   number  (*nNeg)(number a);
222   number  (*nInvers)(number a);
223   number  (*nCopy)(number a);
224   number  (*cfCopy)(number a, const ring r);
225   number  (*nRePart)(number a);
226   number  (*nImPart)(number a);
227   void    (*cfWrite)(number &a, const ring r);
228   const char *  (*nRead)(const char * s, number * a);
229   void    (*nNormalize)(number &a);
230   BOOLEAN (*nGreater)(number a,number b),
231#ifdef HAVE_RINGS
232           (*nDivBy)(number a, number b),
233#endif
234           (*nEqual)(number a,number b),
235           (*nIsZero)(number a),
236           (*nIsOne)(number a),
237           (*nIsMOne)(number a),
238           (*nGreaterZero)(number a);
239   void    (*nPower)(number a, int i, number * result);
240   number  (*cfGetDenom)(number &n, const ring r);
241   number  (*cfGetNumerator)(number &n, const ring r);
242   number  (*nGcd)(number a, number b, const ring r);
243   number  (*nLcm)(number a, number b, const ring r);
244   void    (*cfDelete)(number * a, const ring r);
245   nMapFunc (*cfSetMap)(const ring src, const ring dst);
246   char *  (*nName)(number n);
247   void    (*nInpMult)(number &a, number b, ring r);
248#ifdef LDEBUG
249   BOOLEAN (*nDBTest)(number a, const char *f,const int l);
250#endif
251
252   number nNULL; /* the 0 as constant */
253   int     char_flag;
254   int     ref;
255   n_coeffType type;
256   short   nChar;
257};
258
259/* the function pointer types */
260
261typedef long     (*pLDegProc)(poly p, int *length, ring r);
262typedef long     (*pFDegProc)(poly p, ring r);
263typedef void     (*p_SetmProc)(poly p, const ring r);
264
265typedef enum
266{
267  ro_dp, // ordering is a degree ordering
268  ro_wp, // ordering is a weighted degree ordering
269  ro_wp64, // ordering is a weighted64 degree ordering
270  ro_wp_neg, // ordering is a weighted degree ordering
271             // with possibly negative weights
272  ro_cp,    // ordering duplicates variables
273  ro_syzcomp, // ordering indicates "subset" of component number (ringorder_S)
274  ro_syz, // ordering  with component number >syzcomp is lower (ringorder_s)
275  ro_isTemp, ro_is, // Induced Syzygy (Schreyer) ordering (and prefix data placeholder dummy) (ringorder_IS)
276  ro_none
277}
278ro_typ;
279
280// ordering is a degree ordering
281struct sro_dp
282{
283  short place;  // where degree is stored (in L):
284  short start;  // bounds of ordering (in E):
285  short end;
286};
287typedef struct sro_dp sro_dp;
288
289// ordering is a weighted degree ordering
290struct sro_wp
291{
292  short place;  // where weighted degree is stored (in L)
293  short start;  // bounds of ordering (in E)
294  short end;
295  int *weights; // pointers into wvhdl field
296};
297typedef struct sro_wp sro_wp;
298
299// ordering is a weighted degree ordering
300struct sro_wp64
301{
302    short place;  // where weighted degree is stored (in L)
303    short start;  // bounds of ordering (in E)
304    short end;
305    int64 *weights64; // pointers into wvhdl field
306};
307typedef struct sro_wp64 sro_wp64;
308
309// ordering duplicates variables
310struct sro_cp
311{
312  short place;  // where start is copied to (in E)
313  short start;  // bounds of sources of copied variables (in E)
314  short end;
315};
316typedef struct sro_cp sro_cp;
317
318// ordering indicates "subset" of component number
319struct sro_syzcomp
320{
321  short place;  // where the index is stored (in L)
322  long *ShiftedComponents; // pointer into index field
323  int* Components;
324#ifdef PDEBUG
325  long length;
326#endif
327};
328typedef struct sro_syzcomp sro_syzcomp;
329
330// ordering  with component number >syzcomp is lower
331struct sro_syz
332{
333  short place;       // where the index is stored (in L)
334  int limit;         // syzcomp
335  int* syz_index;    // mapping Component -> SyzIndex for Comp <= limit
336  int  curr_index;   // SyzIndex for Component > limit
337};
338
339typedef struct sro_syz sro_syz;
340// Induced Syzygy (Schreyer) ordering is built inductively as follows:
341// we look for changes made by ordering blocks which are between prefix/suffix markers:
342// that is: which variables where placed by them and where (judging by v)
343
344// due to prefix/suffix nature we need some placeholder:
345// prefix stores here initial state
346// suffix cleares this up
347struct sro_ISTemp
348{
349  short start; // 1st member SHOULD be short "place"
350  int   suffixpos;
351  int*  pVarOffset; // copy!
352};
353
354// So this is the actuall thing!
355// suffix uses last sro_ISTemp (cleares it up afterwards) and
356// creates this block
357struct sro_IS
358{
359  short start, end;  // which part of L we want to want to update...
360  int*  pVarOffset; // same as prefix!
361
362  int limit; // first referenced component
363
364  // reference poly set?? // Should it be owned by ring?!!!
365  ideal F; // reference leading (module)-monomials set. owned by ring...
366  const intvec* componentWeights; // component weights! owned by ring...
367};
368
369typedef struct sro_IS sro_IS;
370typedef struct sro_ISTemp sro_ISTemp;
371
372#ifndef OM_ALLOC_H
373struct omBin_s;
374#endif
375
376struct sro_ord
377{
378  ro_typ  ord_typ;
379  int     order_index; // comes from r->order[order_index]
380  union
381  {
382     sro_dp dp;
383     sro_wp wp;
384     sro_wp64 wp64;
385     sro_cp cp;
386     sro_syzcomp syzcomp;
387     sro_syz syz;
388     sro_IS is;
389     sro_ISTemp isTemp;
390  } data;
391};
392
393#ifdef HAVE_PLURAL
394// NC pProcs:
395typedef poly (*mm_Mult_p_Proc_Ptr)(const poly m, poly p, const ring r);
396typedef poly (*mm_Mult_pp_Proc_Ptr)(const poly m, const poly p, const ring r);
397
398typedef ideal (*GB_Proc_Ptr)(const ideal F, const ideal Q, const intvec *w, const intvec *hilb, kStrategy strat);
399
400typedef poly (*SPoly_Proc_Ptr)(const poly p1, const poly p2, const ring r);
401typedef poly (*SPolyReduce_Proc_Ptr)(const poly p1, poly p2, const ring r);
402
403typedef void (*bucket_Proc_Ptr)(kBucket_pt b, poly p, number *c);
404
405struct nc_pProcs
406{
407public:
408  mm_Mult_p_Proc_Ptr                    mm_Mult_p;
409  mm_Mult_pp_Proc_Ptr                   mm_Mult_pp;
410
411  bucket_Proc_Ptr                       BucketPolyRed;
412  bucket_Proc_Ptr                       BucketPolyRed_Z;
413
414  SPoly_Proc_Ptr                        SPoly;
415  SPolyReduce_Proc_Ptr                  ReduceSPoly;
416
417  GB_Proc_Ptr                           GB;
418//                                         GlobalGB, // BBA
419//                                         LocalGB;  // MORA
420};
421
422
423struct nc_struct
424{
425  nc_type type;
426  //ring basering; // the ring C,D,.. live in (commutative ring with this NC structure!)
427
428  // initial data: square matrices rVar() x rVar()
429  // logically: upper triangular!!!
430  // TODO: eliminate this waste of memory!!!!
431  matrix C; 
432  matrix D;
433
434  // computed data:
435  matrix *MT; // size 0.. (rVar()*rVar()-1)/2
436  matrix COM;
437  int *MTsize; // size 0.. (rVar()*rVar()-1)/2
438
439  // IsSkewConstant indicates whethere coeffs C_ij are all equal,
440  // effective together with nc_type=nc_skew
441  int IsSkewConstant;
442
443  private:
444    // internal data for different implementations
445    // if dynamic => must be deallocated in destructor (nc_rKill!)
446    union
447    {
448      struct
449      {
450        // treat variables from iAltVarsStart till iAltVarsEnd as alternating vars.
451        // these variables should have odd degree, though that will not be checked
452        // iAltVarsStart, iAltVarsEnd are only used together with nc_type=nc_exterior
453        // 1 <= iAltVarsStart <= iAltVarsEnd <= r->N
454        unsigned int iFirstAltVar, iLastAltVar; // = 0 by default
455
456        // for factors of super-commutative algebras we need
457        // the part of general quotient ideal modulo squares!   
458        ideal idSCAQuotient; // = NULL by default. // must be deleted in Kill!
459      } sca;
460    } data;
461
462    CGlobalMultiplier* m_Multiplier;
463    CFormulaPowerMultiplier* m_PowerMultiplier;
464
465  public:
466   
467    inline nc_type& ncRingType() { return (type); };
468    inline nc_type ncRingType() const { return (type); };
469
470    inline unsigned int& FirstAltVar() 
471        { assume(ncRingType() == nc_exterior); return (data.sca.iFirstAltVar); };
472    inline unsigned int& LastAltVar () 
473        { assume(ncRingType() == nc_exterior); return (data.sca.iLastAltVar ); };
474
475    inline unsigned int FirstAltVar() const 
476        { assume(ncRingType() == nc_exterior); return (data.sca.iFirstAltVar); };
477    inline unsigned int LastAltVar () const 
478        { assume(ncRingType() == nc_exterior); return (data.sca.iLastAltVar ); };
479
480    inline ideal& SCAQuotient() 
481        { assume(ncRingType() == nc_exterior); return (data.sca.idSCAQuotient); };
482
483    inline CGlobalMultiplier* GetGlobalMultiplier() const
484        { assume(ncRingType() != nc_exterior); return (m_Multiplier); };
485
486    inline CGlobalMultiplier*& GetGlobalMultiplier()
487        { assume(ncRingType() != nc_exterior); return (m_Multiplier); };
488
489
490    inline CFormulaPowerMultiplier* GetFormulaPowerMultiplier() const
491        { assume(ncRingType() != nc_exterior); return (m_PowerMultiplier); };
492
493    inline CFormulaPowerMultiplier*& GetFormulaPowerMultiplier()
494        { assume(ncRingType() != nc_exterior); return (m_PowerMultiplier); };
495   
496  public:
497    nc_pProcs p_Procs; // NC procedures.
498
499};
500#endif
501
502struct sip_sring
503{
504// each entry must have a description and a procedure defining it,
505// general ordering: pointer/structs, long, int, short, BOOLEAN/char/enum
506// general defining procedures: rInit, rComplete, interpreter, ??
507  idhdl      idroot; /* local objects , interpreter*/
508  int*       order;  /* array of orderings, rInit/rSleftvOrdering2Ordering */
509  int*       block0; /* starting pos., rInit/rSleftvOrdering2Ordering*/
510  int*       block1; /* ending pos., rInit/rSleftvOrdering2Ordering*/
511  char**     parameter; /* names of parameters, rInit */
512  number     minpoly;  /* for Q_a/Zp_a, rInit */
513  ideal      minideal;
514  int**      wvhdl;  /* array of weight vectors, rInit/rSleftvOrdering2Ordering */
515  char **    names;  /* array of variable names, rInit */
516
517  // what follows below here should be set by rComplete, _only_
518  long      *ordsgn;  /* array of +/- 1 (or 0) for comparing monomials */
519                       /*  ExpL_Size entries*/
520
521  // is NULL for lp or N == 1, otherwise non-NULL (with OrdSize > 0 entries) */
522  sro_ord*   typ;   /* array of orderings + sizes, OrdSize entries */
523  /* if NegWeightL_Size > 0, then NegWeightL_Offset[0..size_1] is index of longs
524  in ExpVector whose values need an offset due to negative weights */
525  /* array of NegWeigtL_Size indicies */
526  int*      NegWeightL_Offset;
527
528  int*     VarOffset;
529
530  ideal      qideal; /* extension to the ring structure: qring, rInit */
531
532  int*     firstwv;
533
534  struct omBin_s*   PolyBin; /* Bin from where monoms are allocated */
535#ifdef HAVE_RINGS
536  unsigned int  ringtype;  /* cring = 0 => coefficient field, cring = 1 => coeffs from Z/2^m */
537  int_number    ringflaga; /* Z/(ringflag^ringflagb)=Z/nrnModul*/
538  unsigned long ringflagb;
539  unsigned long nr2mModul;  /* Z/nr2mModul */
540  int_number    nrnModul;
541#endif
542  unsigned long options; /* ring dependent options */
543
544  int        ch;  /* characteristic, rInit */
545  int        ref; /* reference counter to the ring, interpreter */
546
547  short      float_len; /* additional char-flags, rInit */
548  short      float_len2; /* additional char-flags, rInit */
549
550  short      N;      /* number of vars, rInit */
551
552  short      P;      /* number of pars, rInit */
553  short      OrdSgn; /* 1 for polynomial rings, -1 otherwise, rInit */
554
555  short     firstBlockEnds;
556#ifdef HAVE_PLURAL
557  short     real_var_start, real_var_end;
558#endif
559
560#ifdef HAVE_SHIFTBBA
561  short          isLPring; /* 0 for non-letterplace rings, otherwise the number of LP blocks, at least 1, known also as lV */
562#endif
563
564  BOOLEAN   VectorOut;
565  BOOLEAN   ShortOut;
566  BOOLEAN   CanShortOut;
567  BOOLEAN   LexOrder; // TRUE if the monomial ordering has polynomial and power series blocks
568  BOOLEAN   MixedOrder; // TRUE for global/local mixed orderings, FALSE otherwise
569
570  BOOLEAN   ComponentOrder; // ???
571
572  // what follows below here should be set by rComplete, _only_
573  // contains component, but no weight fields in E */
574  short      ExpL_Size; // size of exponent vector in long
575  short      CmpL_Size; // portions which need to be compared
576  /* number of long vars in exp vector:
577     long vars are those longs in the exponent vector which are
578     occupied by variables, only */
579  short      VarL_Size;
580  short      BitsPerExp; /* number of bits per exponent */
581  short      ExpPerLong; /* maximal number of Exponents per long */
582  short      pCompIndex; /* p->exp.e[pCompIndex] is the component */
583  short      pOrdIndex; /* p->exp[pOrdIndex] is pGetOrd(p) */
584  short      OrdSize; /* size of ord vector (in sro_ord) */
585
586  /* if >= 0, long vars in exp vector are consecutive and start there
587     if <  0, long vars in exp vector are not consecutive */
588  short     VarL_LowIndex;
589  // number of exponents in r->VarL_Offset[0]
590  // is minimal number of exponents in a long var
591  short     MinExpPerLong;
592
593  short     NegWeightL_Size;
594  /* array of size VarL_Size,
595     VarL_Offset[i] gets i-th long var in exp vector */
596  int*      VarL_Offset;
597
598  /* mask for getting single exponents */
599  unsigned long bitmask;
600  /* mask used for divisiblity tests */
601  unsigned long divmask; // rComplete
602
603  p_Procs_s*    p_Procs; // rComplete/p_ProcsSet
604
605  /* FDeg and LDeg */
606  pFDegProc     pFDeg; // rComplete/rSetDegStuff
607  pLDegProc     pLDeg; // rComplete/rSetDegStuff
608
609  /* as it was determined by rComplete */
610  pFDegProc     pFDegOrig;
611  /* and as it was determined before rOptimizeLDeg */
612  pLDegProc     pLDegOrig;
613
614  p_SetmProc    p_Setm;
615  n_Procs_s*    cf;
616  ring          algring;
617#ifdef HAVE_PLURAL
618  private:
619    nc_struct*    _nc; // private
620  public:
621    inline const nc_struct* GetNC() const { return _nc; }; // public!!!
622    inline nc_struct*& GetNC() { return _nc; }; // public!!!
623#endif
624};
625
626#endif /* __cplusplus */
627
628
629
630/*
631**  7. runtime procedures/global data
632*/
633
634/* 7.1 C-routines : */
635
636
637#ifdef __cplusplus
638extern "C" {
639#endif
640void  m2_end(int i) __attribute__((noreturn));
641#ifdef __cplusplus
642}
643#endif
644
645/* 7.2 C++-routines : */
646
647#ifdef __cplusplus
648int   inits(void);
649int   IsPrime(int i);
650#ifdef buildin_rand
651extern int siSeed;
652int siRand();
653#endif
654#endif
655
656#define loop for(;;)
657
658#ifndef ABS
659#define ABS(x) ((x)<0?(-(x)):(x))
660#endif
661
662#if defined(__cplusplus)
663static inline int si_max(const int a, const int b)  { return (a>b) ? a : b; }
664static inline int si_min(const int a, const int b)  { return (a<b) ? a : b; }
665static inline long si_max(const long a, const long b)  { return (a>b) ? a : b; }
666static inline long si_min(const long a, const long b)  { return (a<b) ? a : b; }
667#else
668#define si_max(A,B) ((A) > (B) ? (A) : (B))
669#define si_min(A,B) ((A) < (B) ? (A) : (B))
670#endif
671
672extern struct omBin_s* char_ptr_bin;
673extern struct omBin_s* sleftv_bin;
674
675#ifdef __cplusplus
676union uutypes
677{
678  int           i;
679  ring          uring;
680  poly          p;
681  number        n;
682  ideal         uideal;
683  map           umap;
684  matrix        umatrix;
685  char *        ustring;
686  intvec *      iv;
687  lists         l;
688  si_link       li;
689  package       pack;
690  procinfo *    pinf;
691};
692
693class idrec
694{
695  public:
696  /* !! do not change the first 6 entries !! (see subexpr.h: sleftv) */
697  idhdl      next;
698  const char *id;
699  utypes     data;
700  attr       attribute;
701  BITSET     flag;
702  idtyp      typ;
703
704  short      lev;
705  short      ref;
706  int        id_i;
707
708  idrec() { memset(this,0,sizeof(*this)); }
709  idhdl get(const char * s, int lev);
710  idhdl set(const char * s, int lev, idtyp t, BOOLEAN init=TRUE);
711  char * String();
712//  ~idrec();
713};
714
715#endif
716
717#endif
718
Note: See TracBrowser for help on using the repository browser.