]> andersk Git - splint.git/blame - src/mapping.c
Fixed all /*@i...@*/ tags (except 1).
[splint.git] / src / mapping.c
CommitLineData
616915dd 1/*
11db3170 2** Splint - annotation-assisted static program checker
c59f5181 3** Copyright (C) 1994-2003 University of Virginia,
616915dd 4** Massachusetts Institute of Technology
5**
6** This program is free software; you can redistribute it and/or modify it
7** under the terms of the GNU General Public License as published by the
8** Free Software Foundation; either version 2 of the License, or (at your
9** option) any later version.
10**
11** This program is distributed in the hope that it will be useful, but
12** WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14** General Public License for more details.
15**
16** The GNU General Public License is available from http://www.gnu.org/ or
17** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18** MA 02111-1307, USA.
19**
155af98d 20** For information on splint: info@splint.org
21** To report a bug: splint-bug@splint.org
11db3170 22** For more information: http://www.splint.org
616915dd 23*/
24/*
25** mapping.c
26**
27** Module for lsymbol maps.
28**
29** AUTHOR:
30** Yang Meng Tan,
31** Massachusetts Institute of Technology
32*/
33
1b8ae690 34# include "splintMacros.nf"
b73d1009 35# include "basic.h"
616915dd 36
37/*@constant int MAPPING_SIZE; @*/
38# define MAPPING_SIZE 127
39
40/* use lower-order bits by masking out higher order bits */
41
42/*@-macrofcndecl@*/
43# define MMASH(key) ((unsigned int) ((key) & MAPPING_SIZE))
44/*@=macrofcndecl@*/
45
46static void mappair_free (/*@null@*/ /*@only@*/ mappair *p)
47{
48 if (p == NULL)
49 {
50 return;
51 }
52 else
53 {
54 mappair_free (p->next);
55 sfree (p);
56 }
57}
58
28bf4b0b 59void mapping_free (/*@only@*/ mapping m)
616915dd 60{
61 int i;
62
63 for (i = 0; i <= MAPPING_SIZE; i++)
64 {
65 mappair_free (m->buckets[i]);
66 }
67
68 sfree (m->buckets);
69 sfree (m);
70}
71
28bf4b0b 72/*@only@*/ mapping
616915dd 73mapping_create (void)
74{
75 int i;
28bf4b0b 76 mapping t = (mapping) dmalloc (sizeof (*t));
616915dd 77
78 t->buckets = (mappair **) dmalloc ((MAPPING_SIZE + 1) * sizeof (*t->buckets));
79 t->count = 0;
80
81 for (i = 0; i <= MAPPING_SIZE; i++)
82 {
83 t->buckets[i] = (mappair *) 0;
84 }
85
86 return t;
87}
88
89lsymbol
28bf4b0b 90mapping_find (mapping t, lsymbol domain)
616915dd 91{
92 mappair *entry;
93 unsigned int key;
94
95 key = MMASH (domain);
96 entry = t->buckets[key];
97 for (; entry != NULL; entry = entry->next)
98 {
99 if (entry->domain == domain)
100 return entry->range;
101 }
102
103 return lsymbol_undefined;
104}
105
106void
28bf4b0b 107mapping_bind (mapping t, lsymbol domain, lsymbol range)
616915dd 108{
109 /* add the binding (domain -> range) to t */
110 /* can assume that the binding is a new one in m, so no need
111 to check. */
112 mappair *entry;
113 mappair *newentry = (mappair *) dmalloc (sizeof (*newentry));
114 unsigned int key;
115
116 key = MMASH (domain);
117 /*@-deparrays@*/ entry = t->buckets[key]; /*@=deparrays@*/
118 newentry->domain = domain;
119 newentry->range = range;
120 newentry->next = entry;
121
122 t->buckets[key] = newentry;
123 t->count++;
124}
This page took 0.078878 seconds and 5 git commands to generate.