]>
Commit | Line | Data |
---|---|---|
885824d3 | 1 | /* |
28bf4b0b | 2 | ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001. |
885824d3 | 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 | ||
28bf4b0b | 37 | typedef struct s_smemberInfo { |
885824d3 | 38 | lsymbol name; |
39 | sort sort; | |
40 | /*@reldef@*/ lsymbol sortname; /* useful for sort_imports (yuk!) */ | |
28bf4b0b | 41 | /*@null@*/ /*@dependent@*/ struct s_smemberInfo *next; |
885824d3 | 42 | } smemberInfo; |
43 | ||
44 | /*@constant null smemberInfo *smemberInfo_undefined; @*/ | |
45 | # define smemberInfo_undefined ((smemberInfo *)NULL) | |
46 | ||
28bf4b0b | 47 | typedef struct |
885824d3 | 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 */ | |
28bf4b0b | 95 | } *sortNode; |
885824d3 | 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, int p_pointers) /*@*/ ; | |
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_msgstream@*/ ; | |
156 | ||
28bf4b0b | 157 | extern bool sort_equal (sort p_s1, sort p_s2) /*@*/ ; |
885824d3 | 158 | extern sort sort_fromLsymbol (lsymbol p_sortid) /*@modifies internalState@*/ ; |
159 | ||
28bf4b0b | 160 | extern void sort_import (inputStream p_imported, ltoken p_tok, mapping p_map) |
161 | /*@modifies p_imported, internalState@*/ ; | |
885824d3 | 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 |