2 * Copyright (C) 2007-2008 Benjamin Otte <otte@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301 USA
20 #ifndef _SWFDEC_AS_TYPES_H_
21 #define _SWFDEC_AS_TYPES_H_
23 #include <glib-object.h>
24 #include <swfdec/swfdec_as_string_value.h>
28 /* fundamental types */
30 SWFDEC_AS_TYPE_UNDEFINED
= 0,
31 SWFDEC_AS_TYPE_NULL
= 1,
32 SWFDEC_AS_TYPE_BOOLEAN
= 2,
33 SWFDEC_AS_TYPE_INT
= 3, /* unimplemented, but reserved if someone wants it */
34 SWFDEC_AS_TYPE_NUMBER
= 4,
35 SWFDEC_AS_TYPE_STRING
= 5,
36 SWFDEC_AS_TYPE_OBJECT
= 6,
37 SWFDEC_AS_TYPE_MOVIE
= 7
40 typedef struct _SwfdecAsContext SwfdecAsContext
;
41 typedef struct _SwfdecAsDebugger SwfdecAsDebugger
;
42 typedef struct _SwfdecAsDoubleValue SwfdecAsDoubleValue
;
43 typedef struct _SwfdecAsFrame SwfdecAsFrame
;
44 typedef struct _SwfdecAsFunction SwfdecAsFunction
;
45 typedef struct _SwfdecAsGcable SwfdecAsGcable
;
46 typedef struct _SwfdecAsObject SwfdecAsObject
;
47 typedef struct _SwfdecAsRelay SwfdecAsRelay
;
48 typedef struct _SwfdecAsScope SwfdecAsScope
;
49 typedef struct _SwfdecAsStack SwfdecAsStack
;
50 typedef gsize SwfdecAsValue
;
51 typedef void (* SwfdecAsNative
) (SwfdecAsContext
* context
,
52 SwfdecAsObject
* thisp
,
55 SwfdecAsValue
* retval
);
56 typedef struct _SwfdecGcObject SwfdecGcObject
;
57 typedef struct _SwfdecScript SwfdecScript
;
60 /* IMPORTANT: a SwfdecAsValue memset to 0 is a valid undefined value */
61 #define SWFDEC_AS_VALUE_TYPE_BITS (3)
62 #define SWFDEC_AS_VALUE_TYPE_MASK ((1 << SWFDEC_AS_VALUE_TYPE_BITS) - 1)
63 #define SWFDEC_AS_VALUE_VALUE_MASK (~SWFDEC_AS_VALUE_TYPE_MASK)
65 #define SWFDEC_AS_VALUE_GET_TYPE(val) (*(val) & SWFDEC_AS_VALUE_TYPE_MASK)
66 #define SWFDEC_AS_VALUE_GET_VALUE(val) GSIZE_TO_POINTER (*(val) & SWFDEC_AS_VALUE_VALUE_MASK)
67 #define SWFDEC_AS_VALUE_COMBINE(val, type) (GPOINTER_TO_SIZE (val) | type)
69 #define SWFDEC_AS_VALUE_UNDEFINED SWFDEC_AS_VALUE_COMBINE (NULL, SWFDEC_AS_TYPE_UNDEFINED)
70 #define SWFDEC_AS_VALUE_IS_UNDEFINED(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_UNDEFINED)
71 #define SWFDEC_AS_VALUE_SET_UNDEFINED(val) *(val) = SWFDEC_AS_VALUE_UNDEFINED
73 #define SWFDEC_AS_VALUE_FALSE SWFDEC_AS_VALUE_COMBINE(NULL, SWFDEC_AS_TYPE_BOOLEAN)
74 #define SWFDEC_AS_VALUE_TRUE SWFDEC_AS_VALUE_COMBINE(GSIZE_TO_POINTER (1 << SWFDEC_AS_VALUE_TYPE_BITS), SWFDEC_AS_TYPE_BOOLEAN)
75 #define SWFDEC_AS_VALUE_IS_BOOLEAN(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_BOOLEAN)
76 #define SWFDEC_AS_VALUE_GET_BOOLEAN(val) (SWFDEC_AS_VALUE_GET_VALUE (val) != NULL)
77 #define SWFDEC_AS_VALUE_FROM_BOOLEAN(b) (b ? SWFDEC_AS_VALUE_TRUE : SWFDEC_AS_VALUE_FALSE)
78 #define SWFDEC_AS_VALUE_SET_BOOLEAN(val,b) G_STMT_START { \
79 gboolean __tmp = (b); \
80 g_assert (__tmp == TRUE || __tmp == FALSE); \
81 *(val) = SWFDEC_AS_VALUE_FROM_BOOLEAN(__tmp); \
84 struct _SwfdecAsDoubleValue
{
85 SwfdecAsGcable
* next
;
89 #define SWFDEC_AS_VALUE_IS_NUMBER(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_NUMBER)
90 #define SWFDEC_AS_VALUE_GET_NUMBER(val) (((SwfdecAsDoubleValue *) SWFDEC_AS_VALUE_GET_VALUE(val))->number)
92 #define SWFDEC_AS_VALUE_IS_STRING(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_STRING)
93 #define SWFDEC_AS_VALUE_GET_STRING(val) (((SwfdecAsStringValue *) SWFDEC_AS_VALUE_GET_VALUE(val))->string)
94 #define SWFDEC_AS_VALUE_FROM_STRING(s) SWFDEC_AS_VALUE_COMBINE (((guint8 *) (s) - G_STRUCT_OFFSET (SwfdecAsStringValue, string)), SWFDEC_AS_TYPE_STRING)
95 #define SWFDEC_AS_VALUE_SET_STRING(val,s) G_STMT_START { \
96 *(val) = SWFDEC_AS_VALUE_FROM_STRING (s); \
99 #define SWFDEC_AS_VALUE_NULL SWFDEC_AS_VALUE_COMBINE (NULL, SWFDEC_AS_TYPE_NULL)
100 #define SWFDEC_AS_VALUE_IS_NULL(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_NULL)
101 #define SWFDEC_AS_VALUE_SET_NULL(val) *(val) = SWFDEC_AS_VALUE_NULL
103 #define SWFDEC_AS_VALUE_IS_OBJECT(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_OBJECT)
104 #define SWFDEC_AS_VALUE_GET_OBJECT(val) ((SwfdecAsObject *) SWFDEC_AS_VALUE_GET_VALUE (val))
105 #define SWFDEC_AS_VALUE_FROM_OBJECT(o) SWFDEC_AS_VALUE_COMBINE (o, SWFDEC_AS_TYPE_OBJECT)
106 #define SWFDEC_AS_VALUE_SET_OBJECT(val,o) G_STMT_START { \
107 SwfdecAsObject *__o = (o); \
108 g_assert (__o != NULL); \
109 g_assert (!__o->movie); \
110 *(val) = SWFDEC_AS_VALUE_FROM_OBJECT (__o); \
114 #define swfdec_as_value_set_integer(cx, val, i) swfdec_as_value_set_number((cx), (val), (int) (i))
115 void swfdec_as_value_set_number (SwfdecAsContext
* context
,
116 SwfdecAsValue
* value
,
119 /* value conversion functions */
120 gboolean
swfdec_as_value_to_boolean (SwfdecAsContext
* context
,
121 const SwfdecAsValue
* value
);
122 int swfdec_as_value_to_integer (SwfdecAsContext
* context
,
123 const SwfdecAsValue
* value
);
124 double swfdec_as_value_to_number (SwfdecAsContext
* context
,
125 const SwfdecAsValue
* value
);
126 SwfdecAsObject
*swfdec_as_value_to_object (SwfdecAsContext
* context
,
127 const SwfdecAsValue
* value
);
128 void swfdec_as_value_to_primitive (SwfdecAsValue
* value
);
129 const char * swfdec_as_value_to_string (SwfdecAsContext
* context
,
130 SwfdecAsValue value
);
132 /* special conversion functions */
133 const char * swfdec_as_integer_to_string (SwfdecAsContext
* context
,
135 int swfdec_as_double_to_integer (double d
);
136 const char * swfdec_as_double_to_string (SwfdecAsContext
* context
,
138 const char * swfdec_as_str_concat (SwfdecAsContext
* cx
,
142 /* variable get/set */
143 void swfdec_as_value_get_variable (SwfdecAsContext
* cx
,
144 const SwfdecAsValue
* val
,
146 SwfdecAsValue
* ret
);