2 ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001.
3 ** See ../LICENSE for license information.
13 /*@constant observer char *BEGINSORTTABLE;@*/
14 # define BEGINSORTTABLE "%LCLSortTable"
16 /*@constant observer char *SORTTABLEEND;@*/
17 # define SORTTABLEEND "%LCLSortTableEnd"
37 typedef struct s_smemberInfo {
40 /*@reldef@*/ lsymbol sortname; /* useful for sort_imports (yuk!) */
41 /*@null@*/ /*@dependent@*/ struct s_smemberInfo *next;
44 /*@constant null smemberInfo *smemberInfo_undefined; @*/
45 # define smemberInfo_undefined ((smemberInfo *)NULL)
51 /* Handle for this sort in the table of known sorts */
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)
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.
69 /*@reldef@*/ lsymbol tag;
70 /*@reldef@*/ bool realtag;
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.
82 ** Only for VECTOR sort, gives its array sort,
83 ** not used otherwise.
86 /*@reldef@*/ sort objSort;
88 /* First member of struct, union, or enum */
89 /*@null@*/ smemberInfo *members;
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 */
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) /*@*/ ;
108 extern void sort_destroyMod (void) /*@modifies internalState@*/ ;
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) /*@*/ ;
115 extern sort sort_makeStr (ltoken p_opttagid) /*@*/ ;
116 extern sort sort_makeUnion (ltoken p_opttagid) /*@*/ ;
117 extern sort sort_makeEnum (ltoken p_opttagid) /*@*/ ;
120 sort_updateStr (sort p_strSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
121 /*@modifies internalState@*/ ;
123 sort_updateUnion (sort p_unionSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
124 /*@modifies internalState@*/ ;
126 sort_updateEnum (sort p_enumSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
127 /*@modifies internalState@*/ ;
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@*/ ;
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@*/ ;
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@*/ ;
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@*/ ;
152 # define sort_isNoSort(s) ((s) == 0)
153 /* assume NOSORTHANDLE is #define to 0 in sort.c */
155 extern /*@unused@*/ void sort_printStats(void) /*@modifies g_msgstream@*/ ;
157 extern bool sort_equal (sort p_s1, sort p_s2) /*@*/ ;
158 extern sort sort_fromLsymbol (lsymbol p_sortid) /*@modifies internalState@*/ ;
160 extern void sort_import (inputStream p_imported, ltoken p_tok, mapping p_map)
161 /*@modifies p_imported, internalState@*/ ;
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;
174 # error "Multiple include"