2 * Mesa 3-D graphics library
5 * Copyright (C) 2005-2006 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 * \file slang_compile_struct.c
27 * slang front-end compiler
32 #include "slang_utility.h"
33 #include "slang_compile_variable.h"
34 #include "slang_compile_struct.h"
36 /* slang_struct_scope */
38 int slang_struct_scope_construct (slang_struct_scope
*scope
)
40 scope
->structs
= NULL
;
41 scope
->num_structs
= 0;
42 scope
->outer_scope
= NULL
;
46 void slang_struct_scope_destruct (slang_struct_scope
*scope
)
50 for (i
= 0; i
< scope
->num_structs
; i
++)
51 slang_struct_destruct (scope
->structs
+ i
);
52 slang_alloc_free (scope
->structs
);
53 /* do not free scope->outer_scope */
56 int slang_struct_scope_copy (slang_struct_scope
*x
, const slang_struct_scope
*y
)
61 if (!slang_struct_scope_construct (&z
))
63 z
.structs
= (slang_struct
*) slang_alloc_malloc (y
->num_structs
* sizeof (slang_struct
));
64 if (z
.structs
== NULL
)
66 slang_struct_scope_destruct (&z
);
69 for (z
.num_structs
= 0; z
.num_structs
< y
->num_structs
; z
.num_structs
++)
70 if (!slang_struct_construct (&z
.structs
[z
.num_structs
]))
72 slang_struct_scope_destruct (&z
);
75 for (i
= 0; i
< z
.num_structs
; i
++)
76 if (!slang_struct_copy (&z
.structs
[i
], &y
->structs
[i
]))
78 slang_struct_scope_destruct (&z
);
81 z
.outer_scope
= y
->outer_scope
;
82 slang_struct_scope_destruct (x
);
87 slang_struct
*slang_struct_scope_find (slang_struct_scope
*stru
, slang_atom a_name
, int all_scopes
)
91 for (i
= 0; i
< stru
->num_structs
; i
++)
92 if (a_name
== stru
->structs
[i
].a_name
)
93 return &stru
->structs
[i
];
94 if (all_scopes
&& stru
->outer_scope
!= NULL
)
95 return slang_struct_scope_find (stru
->outer_scope
, a_name
, 1);
101 int slang_struct_construct (slang_struct
*stru
)
103 stru
->a_name
= SLANG_ATOM_NULL
;
104 stru
->fields
= (slang_variable_scope
*) slang_alloc_malloc (sizeof (slang_variable_scope
));
105 if (stru
->fields
== NULL
)
107 if (!slang_variable_scope_construct (stru
->fields
))
109 slang_alloc_free (stru
->fields
);
112 stru
->structs
= (slang_struct_scope
*) slang_alloc_malloc (sizeof (slang_struct_scope
));
113 if (stru
->structs
== NULL
)
115 slang_variable_scope_destruct (stru
->fields
);
116 slang_alloc_free (stru
->fields
);
119 if (!slang_struct_scope_construct (stru
->structs
))
121 slang_variable_scope_destruct (stru
->fields
);
122 slang_alloc_free (stru
->fields
);
123 slang_alloc_free (stru
->structs
);
129 void slang_struct_destruct (slang_struct
*stru
)
131 slang_variable_scope_destruct (stru
->fields
);
132 slang_alloc_free (stru
->fields
);
133 slang_struct_scope_destruct (stru
->structs
);
134 slang_alloc_free (stru
->structs
);
137 int slang_struct_copy (slang_struct
*x
, const slang_struct
*y
)
141 if (!slang_struct_construct (&z
))
143 z
.a_name
= y
->a_name
;
144 if (!slang_variable_scope_copy (z
.fields
, y
->fields
))
146 slang_struct_destruct (&z
);
149 if (!slang_struct_scope_copy (z
.structs
, y
->structs
))
151 slang_struct_destruct (&z
);
154 slang_struct_destruct (x
);
159 int slang_struct_equal (const slang_struct
*x
, const slang_struct
*y
)
163 if (x
->fields
->num_variables
!= y
->fields
->num_variables
)
165 for (i
= 0; i
< x
->fields
->num_variables
; i
++)
167 slang_variable
*varx
= &x
->fields
->variables
[i
];
168 slang_variable
*vary
= &y
->fields
->variables
[i
];
170 if (varx
->a_name
!= vary
->a_name
)
172 if (!slang_type_specifier_equal (&varx
->type
.specifier
, &vary
->type
.specifier
))
174 if (varx
->type
.specifier
.type
== slang_spec_array
)
176 /* TODO: compare array sizes */