]> andersk Git - splint.git/blame - src/Headers/sort.h
Committing after merging Evan's changes.
[splint.git] / src / Headers / sort.h
CommitLineData
885824d3 1/*
c0de361f 2** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2003.
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
19typedef 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 37typedef 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 47typedef 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
97extern cstring sort_unparse (sort p_s) /*@*/ ;
98extern /*@exposed@*/ cstring sort_unparseName (sort p_s) /*@*/ ;
99extern sort sort_makeSort (ltoken p_t, lsymbol p_n) /*@*/ ;
100extern sort sort_makeSyn (ltoken p_t, sort p_s, lsymbol p_n) /*@*/ ;
101extern sort sort_makeFormal (sort p_insort) /*@*/ ;
102extern sort sort_makeGlobal (sort p_insort) /*@*/ ;
103extern sort sort_makePtr (ltoken p_t, sort p_baseSort) /*@*/ ;
f9264521 104extern sort sort_makePtrN (sort p_s, pointers p_p) /*@*/ ;
885824d3 105extern sort sort_makeVal (sort p_sor) /*@*/ ;
106extern sort sort_makeObj (sort p_sor) /*@*/ ;
107
108extern void sort_destroyMod (void) /*@modifies internalState@*/ ;
109
110extern sort sort_makeArr (ltoken p_t, sort p_baseSort) /*@*/ ;
111extern sort sort_makeVec (ltoken p_t, sort p_arraySort) /*@*/ ;
112extern sort sort_makeMutable (ltoken p_t, lsymbol p_name) /*@*/ ;
113extern sort sort_makeImmutable (ltoken p_t, lsymbol p_name) /*@*/ ;
114
115extern sort sort_makeStr (ltoken p_opttagid) /*@*/ ;
116extern sort sort_makeUnion (ltoken p_opttagid) /*@*/ ;
117extern sort sort_makeEnum (ltoken p_opttagid) /*@*/ ;
118
119extern bool
120 sort_updateStr (sort p_strSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
121 /*@modifies internalState@*/ ;
122extern bool
123 sort_updateUnion (sort p_unionSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
124 /*@modifies internalState@*/ ;
125extern bool
126 sort_updateEnum (sort p_enumSort, /*@null@*/ /*@only@*/ smemberInfo *p_info)
127 /*@modifies internalState@*/ ;
128
129extern sort sort_makeTuple (ltoken p_t, sort p_strSort) /*@modifies internalState@*/ ;
130extern sort sort_makeUnionVal (ltoken p_t, sort p_unionSort) /*@modifies internalState@*/ ;
131
132extern lsymbol sort_getLsymbol (sort p_sor) /*@*/ ;
133extern /*@observer@*/ char *sort_getName (sort p_s) /*@*/ ;
134extern /*@observer@*/ sortNode sort_lookup (sort p_sor) /*@*/ ;
135extern /*@observer@*/ sortNode sort_quietLookup (sort p_sor) /*@*/ ;
136extern sort sort_lookupName (lsymbol p_name) /*@*/ ;
137extern void sort_dump(FILE *p_f, bool p_lco) /*@modifies p_f@*/ ;
138extern void sort_init(void) /*@modifies internalState@*/ ;
139
140extern bool sort_compatible(sort p_s1, sort p_s2) /*@*/ ;
141extern bool sort_compatible_modulo_cstring(sort p_s1, sort p_s2) /*@*/ ;
142extern sort sort_getUnderlying (sort p_s) /*@*/ ;
143extern bool sort_mutable (sort p_s) /*@*/ ;
144extern sort sort_makeNoSort(void) /*@modifies internalState@*/ ;
145
146extern sort sort_makeHOFSort(sort p_base) /*@*/ ;
147extern bool sort_isHOFSortKind(sort p_s) /*@*/ ;
148extern bool sort_isNoSort(sort p_s) /*@*/ ;
149extern bool sort_isValidSort(sort p_s) /*@*/ ;
150extern 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
80489f0a 155extern /*@unused@*/ void sort_printStats(void) /*@modifies g_warningstream@*/ ;
885824d3 156
28bf4b0b 157extern bool sort_equal (sort p_s1, sort p_s2) /*@*/ ;
885824d3 158extern sort sort_fromLsymbol (lsymbol p_sortid) /*@modifies internalState@*/ ;
159
28bf4b0b 160extern void sort_import (inputStream p_imported, ltoken p_tok, mapping p_map)
161 /*@modifies p_imported, internalState@*/ ;
885824d3 162
2a6e9c30 163extern sort g_sortBool;
164extern sort g_sortCapBool;
165extern sort g_sortInt;
166extern sort g_sortChar;
167extern sort g_sortCstring;
168extern sort g_sortFloat;
169extern sort g_sortDouble;
885824d3 170
171# else
172# error "Multiple include"
173# endif
174
175
This page took 0.105931 seconds and 5 git commands to generate.