Subversion Repositories tendra.SVN

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 7
Line -... Line 1...
-
 
1
/*
-
 
2
 * Copyright (c) 2002-2006 The TenDRA Project <http://www.tendra.org/>.
-
 
3
 * All rights reserved.
-
 
4
 *
-
 
5
 * Redistribution and use in source and binary forms, with or without
-
 
6
 * modification, are permitted provided that the following conditions are met:
-
 
7
 *
-
 
8
 * 1. Redistributions of source code must retain the above copyright notice,
-
 
9
 *    this list of conditions and the following disclaimer.
-
 
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
-
 
11
 *    this list of conditions and the following disclaimer in the documentation
-
 
12
 *    and/or other materials provided with the distribution.
-
 
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
-
 
14
 *    may be used to endorse or promote products derived from this software
-
 
15
 *    without specific, prior written permission.
-
 
16
 *
-
 
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
-
 
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-
 
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-
 
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
-
 
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-
 
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-
 
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-
 
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-
 
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-
 
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-
 
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
28
 *
-
 
29
 * $Id$
-
 
30
 */
1
/*
31
/*
2
    		 Crown Copyright (c) 1997
32
    		 Crown Copyright (c) 1997
3
    
33
 
4
    This TenDRA(r) Computer Program is subject to Copyright
34
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
35
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
36
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
37
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
38
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
39
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
40
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
41
    shall be deemed to be acceptance of the following conditions:-
12
    
42
 
13
        (1) Its Recipients shall ensure that this Notice is
43
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
44
        reproduced upon any copies or amended versions of it;
15
    
45
 
16
        (2) Any amended version of it shall be clearly marked to
46
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
47
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
48
        for the relevant amendment or amendments;
19
    
49
 
20
        (3) Its onward transfer from a recipient to another
50
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
51
        party shall be deemed to be that party's acceptance of
22
        these conditions;
52
        these conditions;
23
    
53
 
24
        (4) DERA gives no warranty or assurance as to its
54
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
55
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
56
        no liability whatsoever in relation to any use to which
27
        it may be put.
57
        it may be put.
28
*/
58
*/
Line 64... Line 94...
64
#include "solve-cycles.h"
94
#include "solve-cycles.h"
65
 
95
 
66
/*--------------------------------------------------------------------------*/
96
/*--------------------------------------------------------------------------*/
67
 
97
 
68
ShapeTableP
98
ShapeTableP
69
shape_table_create PROTO_Z ()
99
shape_table_create(void)
70
{
100
{
71
    ShapeTableP table = ALLOCATE (ShapeTableT);
101
    ShapeTableP table = ALLOCATE(ShapeTableT);
72
    unsigned    i;
102
    unsigned    i;
73
 
103
 
74
    for (i = 0; i < SHAPE_TABLE_SIZE; i ++) {
104
    for (i = 0; i < SHAPE_TABLE_SIZE; i++) {
75
	table->contents [i] = NIL (ShapeEntryP);
105
	table->contents[i] = NIL(ShapeEntryP);
76
    }
106
    }
77
    table->token_entry = NIL (ShapeEntryP);
107
    table->token_entry = NIL(ShapeEntryP);
78
    table->tag_entry   = NIL (ShapeEntryP);
108
    table->tag_entry   = NIL(ShapeEntryP);
79
    return (table);
109
    return(table);
80
}
110
}
81
 
111
 
82
ShapeEntryP
112
ShapeEntryP
83
shape_table_add PROTO_N ((table, key))
113
shape_table_add(ShapeTableP table,			 NStringP    key)
84
		PROTO_T (ShapeTableP table X
-
 
85
			 NStringP    key)
-
 
86
{
114
{
87
    unsigned     hash_value = (nstring_hash_value (key) % SHAPE_TABLE_SIZE);
115
    unsigned     hash_value = (nstring_hash_value(key)% SHAPE_TABLE_SIZE);
88
    ShapeEntryP *entryp     = &(table->contents [hash_value]);
116
    ShapeEntryP *entryp     = & (table->contents[hash_value]);
89
    ShapeEntryP  entry;
117
    ShapeEntryP  entry;
90
 
118
 
91
    while ((entry = *entryp) != NIL (ShapeEntryP)) {
119
    while ((entry = *entryp) != NIL(ShapeEntryP)) {
92
	if (nstring_equal (key, shape_entry_key (entry))) {
120
	if (nstring_equal(key, shape_entry_key(entry))) {
93
	    return (entry);
121
	    return(entry);
94
	}
122
	}
95
	entryp = shape_entry_next_ref (entry);
123
	entryp = shape_entry_next_ref(entry);
96
    }
124
    }
97
    entry   = shape_entry_create (key);
125
    entry   = shape_entry_create(key);
98
    *entryp = entry;
126
    *entryp = entry;
99
    return (entry);
127
    return(entry);
100
}
128
}
101
 
129
 
102
ShapeEntryP
130
ShapeEntryP
103
shape_table_get PROTO_N ((table, key))
131
shape_table_get(ShapeTableP table,			 NStringP    key)
104
		PROTO_T (ShapeTableP table X
-
 
105
			 NStringP    key)
-
 
106
{
132
{
107
    unsigned    hash_value = (nstring_hash_value (key) % SHAPE_TABLE_SIZE);
133
    unsigned    hash_value = (nstring_hash_value(key)% SHAPE_TABLE_SIZE);
108
    ShapeEntryP entry      = (table->contents [hash_value]);
134
    ShapeEntryP entry      = (table->contents[hash_value]);
109
 
135
 
110
    while (entry) {
136
    while (entry) {
111
	if (nstring_equal (key, shape_entry_key (entry))) {
137
	if (nstring_equal(key, shape_entry_key(entry))) {
112
	    return (entry);
138
	    return(entry);
113
	}
139
	}
114
	entry = shape_entry_next (entry);
140
	entry = shape_entry_next(entry);
115
    }
141
    }
116
    return (NIL (ShapeEntryP));
142
    return(NIL(ShapeEntryP));
117
}
143
}
118
 
144
 
119
ShapeEntryP
145
ShapeEntryP
120
shape_table_get_token_entry PROTO_N ((table))
146
shape_table_get_token_entry(ShapeTableP table)
121
			    PROTO_T (ShapeTableP table)
-
 
122
{
147
{
123
    if (table->token_entry == NIL (ShapeEntryP)) {
148
    if (table->token_entry == NIL(ShapeEntryP)) {
124
	NStringT nstring;
149
	NStringT nstring;
125
 
150
 
126
	nstring_copy_cstring (&nstring, "token");
151
	nstring_copy_cstring(&nstring, "token");
127
	table->token_entry = shape_table_get (table, &nstring);
152
	table->token_entry = shape_table_get(table, &nstring);
128
	nstring_destroy (&nstring);
153
	nstring_destroy(&nstring);
129
    }
154
    }
130
    return (table->token_entry);
155
    return(table->token_entry);
131
}
156
}
132
 
157
 
133
ShapeEntryP
158
ShapeEntryP
134
shape_table_get_tag_entry PROTO_N ((table))
159
shape_table_get_tag_entry(ShapeTableP table)
135
			  PROTO_T (ShapeTableP table)
-
 
136
{
160
{
137
    if (table->tag_entry == NIL (ShapeEntryP)) {
161
    if (table->tag_entry == NIL(ShapeEntryP)) {
138
	NStringT nstring;
162
	NStringT nstring;
139
 
163
 
140
	nstring_copy_cstring (&nstring, "tag");
164
	nstring_copy_cstring(&nstring, "tag");
141
	table->tag_entry = shape_table_get (table, &nstring);
165
	table->tag_entry = shape_table_get(table, &nstring);
142
	nstring_destroy (&nstring);
166
	nstring_destroy(&nstring);
143
    }
167
    }
144
    return (table->tag_entry);
168
    return(table->tag_entry);
145
}
169
}
146
 
170
 
147
void
171
void
148
shape_table_iter PROTO_N ((table, proc, closure))
172
shape_table_iter(ShapeTableP table, void (*proc)(ShapeEntryP, GenericP),
149
		 PROTO_T (ShapeTableP table X
-
 
150
			  void      (*proc) PROTO_S ((ShapeEntryP, GenericP)) X
-
 
151
			  GenericP    closure)
173
		 GenericP closure)
152
{
174
{
153
    unsigned i;
175
    unsigned i;
154
 
176
 
155
    for (i = 0; i < SHAPE_TABLE_SIZE; i ++) {
177
    for (i = 0; i < SHAPE_TABLE_SIZE; i++) {
156
	ShapeEntryP entry = (table->contents [i]);
178
	ShapeEntryP entry = (table->contents[i]);
157
 
179
 
158
	while (entry) {
180
	while (entry) {
159
	    (*proc) (entry, closure);
181
	   (*proc)(entry, closure);
160
	    entry = shape_entry_next (entry);
182
	    entry = shape_entry_next(entry);
161
	}
183
	}
162
    }
184
    }
163
}
185
}
164
 
186
 
165
void
187
void
166
shape_table_deallocate PROTO_N ((table))
188
shape_table_deallocate(ShapeTableP table)
167
		       PROTO_T (ShapeTableP table)
-
 
168
{
189
{
169
    unsigned i;
190
    unsigned i;
170
 
191
 
171
    for (i = 0; i < SHAPE_TABLE_SIZE; i ++) {
192
    for (i = 0; i < SHAPE_TABLE_SIZE; i++) {
172
	ShapeEntryP entry = (table->contents [i]);
193
	ShapeEntryP entry = (table->contents[i]);
173
 
194
 
174
	while (entry) {
195
	while (entry) {
175
	    entry = shape_entry_deallocate (entry);
196
	    entry = shape_entry_deallocate(entry);
176
	}
197
	}
177
    }
198
    }
178
}
199
}
179

200

180
/*
201
/*