]> andersk Git - splint.git/blob - src/Headers/sort.h
8e2073bce93734df821870b0bd2e754ff8026208
[splint.git] / src / Headers / sort.h
1 /*
2 ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2003.
3 ** See ../LICENSE for license information.
4 **
5 */
6 /*
7 ** sort.h
8 */
9
10 # ifndef sort_H
11 # define sort_H
12
13 /*@constant observer char *BEGINSORTTABLE;@*/
14 # define BEGINSORTTABLE         "%LCLSortTable"
15
16 /*@constant observer char *SORTTABLEEND;@*/
17 # define SORTTABLEEND           "%LCLSortTableEnd"
18
19 typedef enum {
20   SRT_FIRST,
21   SRT_NONE,        
22   SRT_HOF,        
23   SRT_PRIM,
24   SRT_SYN,
25   SRT_PTR,
26   SRT_OBJ,
27   SRT_ARRAY,
28   SRT_VECTOR,
29   SRT_STRUCT,
30   SRT_TUPLE,
31   SRT_UNION,
32   SRT_UNIONVAL,
33   SRT_ENUM,
34   SRT_LAST
35 } sortKind;
36
37 typedef struct s_smemberInfo {
38     lsymbol name;
39     sort sort;
40     /*@reldef@*/ lsymbol sortname; /* useful for sort_imports (yuk!) */
41     /*@null@*/ /*@dependent@*/ struct s_smemberInfo *next;
42 } smemberInfo;
43
44 /*@constant null smemberInfo *smemberInfo_undefined; @*/
45 # define smemberInfo_undefined  ((smemberInfo *)NULL)
46
47 typedef struct 
48 {
49   sortKind      kind;  
50
51   /* Handle for this sort in the table of known sorts */
52   sort          handle; 
53
54   /*
55   ** if SRT_PRIM then name is gotten from LSL traits.
56   **  elseif SRT_SYN then it is derived from a user-given typdef name, add _.
57   **  elseif SRT_NONE then may contain "_error".
58   **  elseif keeps the name of this sort (unique) 
59   */
60   
61   lsymbol       name;    
62
63   /* 
64   ** if {STRUCT, UNION, ENUM} and name field is non-nil
65   ** then it is the tag name.  Kept to make printing and 
66   ** debugging easier, for now.  
67   */
68   
69   /*@reldef@*/ lsymbol tag;
70   /*@reldef@*/ bool realtag; 
71
72   /* 
73   ** if SRT_SYN then keeps handle for synonym sort,  
74   ** elseif {OBJ, PTR, ARRAY, VECTOR} then keeps the element sort.
75   ** elseif {TUPLE, UNIONVAL} then keeps the baseSort which is a
76   ** record or union sort. 
77   */
78
79   sort          baseSort;   
80
81   /*
82   ** Only for VECTOR sort, gives its array sort, 
83   ** not used otherwise. 
84   */
85
86   /*@reldef@*/ sort   objSort; 
87
88   /* First member of struct, union, or enum */
89   /*@null@*/ smemberInfo *members;   
90
91   bool export;   /* TRUE if sort is exported by this spec */
92   bool mutable;  /* TRUE if sort represents a mutable sort */
93   bool abstract; /* TRUE if sort represents an LCL abstract type */
94   bool imported; /* TRUE if sort was imported */
95 } *sortNode;
96
97 extern cstring sort_unparse (sort p_s) /*@*/ ;
98 extern /*@exposed@*/ cstring sort_unparseName (sort p_s) /*@*/ ;
99 extern sort sort_makeSort (ltoken p_t, lsymbol p_n) /*@*/ ;
100 extern sort sort_makeSyn (ltoken p_t, sort p_s, lsymbol p_n) /*@*/ ;
101 extern sort sort_makeFormal (sort p_insort) /*@*/ ;
102 extern sort sort_makeGlobal (sort p_insort) /*@*/ ;
103 extern sort sort_makePtr (ltoken p_t, sort p_baseSort) /*@*/ ;
104 extern sort sort_makePtrN (sort p_s, pointers p_p) /*@*/ ;
105 extern sort sort_makeVal (sort p_sor) /*@*/ ;
106 extern sort sort_makeObj (sort p_sor) /*@*/ ;
107
108 extern void sort_destroyMod (void) /*@modifies internalState@*/ ;
109
110 extern sort sort_makeArr (ltoken p_t, sort p_baseSort) /*@*/ ;
111 extern sort sort_makeVec (ltoken p_t, sort p_arraySort) /*@*/ ;
112 extern sort sort_makeMutable (ltoken p_t, lsymbol p_name) /*@*/ ;
113 extern sort sort_makeImmutable (ltoken p_t, lsymbol p_name) /*@*/ ;
114
115 extern sort sort_makeStr (ltoken p_opttagid) /*@*/ ;
116 extern sort sort_makeUnion (ltoken p_opttagid) /*@*/ ;
117 extern sort sort_makeEnum (ltoken p_opttagid) /*@*/ ;
118
119 extern bool 
120   sort_updateStr (sort p_strSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
121   /*@modifies internalState@*/ ;
122 extern bool
123   sort_updateUnion (sort p_unionSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
124   /*@modifies internalState@*/ ;
125 extern bool 
126   sort_updateEnum (sort p_enumSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
127   /*@modifies internalState@*/ ;
128
129 extern sort sort_makeTuple (ltoken p_t, sort p_strSort) /*@modifies internalState@*/ ;
130 extern sort sort_makeUnionVal (ltoken p_t, sort p_unionSort) /*@modifies internalState@*/ ;
131
132 extern lsymbol sort_getLsymbol (sort p_sor) /*@*/ ;
133 extern /*@observer@*/ char *sort_getName (sort p_s) /*@*/ ;
134 extern /*@observer@*/ sortNode sort_lookup (sort p_sor) /*@*/ ; 
135 extern /*@observer@*/ sortNode sort_quietLookup (sort p_sor) /*@*/ ;
136 extern sort sort_lookupName (lsymbol p_name) /*@*/ ;
137 extern void sort_dump(FILE *p_f, bool p_lco) /*@modifies p_f@*/ ;
138 extern void sort_init(void) /*@modifies internalState@*/ ;
139
140 extern bool sort_compatible(sort p_s1, sort p_s2) /*@*/ ;
141 extern bool sort_compatible_modulo_cstring(sort p_s1, sort p_s2) /*@*/ ;
142 extern sort sort_getUnderlying (sort p_s) /*@*/ ;
143 extern bool sort_mutable (sort p_s) /*@*/ ;
144 extern sort sort_makeNoSort(void) /*@modifies internalState@*/ ;
145
146 extern sort sort_makeHOFSort(sort p_base) /*@*/ ; 
147 extern bool sort_isHOFSortKind(sort p_s) /*@*/ ; 
148 extern bool sort_isNoSort(sort p_s) /*@*/ ;
149 extern bool sort_isValidSort(sort p_s) /*@*/ ;
150 extern bool sort_setExporting (bool p_flag) /*@modifies internalState@*/ ;
151
152 # define sort_isNoSort(s)       ((s) == 0)
153 /* assume NOSORTHANDLE is #define to 0 in sort.c */
154
155 extern /*@unused@*/ void sort_printStats(void) /*@modifies g_warningstream@*/ ;
156
157 extern bool sort_equal (sort p_s1, sort p_s2) /*@*/ ;  
158 extern sort sort_fromLsymbol (lsymbol p_sortid) /*@modifies internalState@*/ ;
159
160 extern void sort_import (inputStream p_imported, ltoken p_tok, mapping p_map)
161    /*@modifies p_imported, internalState@*/ ;
162
163 /*@-namechecks@*/
164 extern sort sort_bool;
165 extern sort sort_capBool;
166 extern sort sort_int;
167 extern sort sort_char;
168 extern sort sort_cstring;
169 extern sort sort_float;
170 extern sort sort_double;
171 /*@=namechecks@*/
172
173 # else
174 # error "Multiple include"
175 # endif
176
177
This page took 0.036815 seconds and 3 git commands to generate.