/simpletypesystem/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/simpletypesystem/trunk
43 by Gustav Hartvigsson
* Code cleanup
1
#include "Box.h"
49 by Gustav Hartvigsson
* started work SBox (Untested).
2
#include <stdlib.h>
3
61 by Gustav Hartvigsson
* Made the code more easy to read.
4
struct
5
SBoxPrivate {
49 by Gustav Hartvigsson
* started work SBox (Untested).
6
  sboolean                      free_data;
7
  SType                         object_type;
62 by Gustav Hartvigsson
* General documentation clean up.
8
  FreeFunc                      free_func;
9
  union {
10
    SObject *                   m_sobject;
11
    spointer                    m_ptr;
12
    sboolean                    m_sboolean;
13
    int                         m_int;
14
    long                        m_long;
15
    short                       m_short;
16
    char                        m_char;
17
    wchar_t                     m_wchar;
18
    unsigned int                m_uint;
19
    unsigned long               m_ulong;
20
    unsigned short              m_ushort;
21
    char *                      m_string;
22
    wchar_t *                   m_wstring;
23
  } data;
49 by Gustav Hartvigsson
* started work SBox (Untested).
24
};
25
61 by Gustav Hartvigsson
* Made the code more easy to read.
26
void
27
s_method_box_free (SBox * self);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
28
char *
29
s_method_box_to_string (SBox * self);
49 by Gustav Hartvigsson
* started work SBox (Untested).
30
31
/* Private function to allocate and set methods to the SBox.
32
 */
61 by Gustav Hartvigsson
* Made the code more easy to read.
33
SBox *
34
internal_s_box_new () {
49 by Gustav Hartvigsson
* started work SBox (Untested).
35
  SBox * self = malloc (sizeof (SBox));
36
  SBoxClass * klass = malloc (sizeof (SBoxClass));
37
  s_object_initialize (S_OBJECT (self), "SBox");
38
  
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
39
  s_object_set_class (S_OBJECT (self),
40
                      S_OBJECT_CLASS (klass));
41
  s_object_set_free_method (S_OBJECT (self),
42
                            FREE_METHOD (s_method_box_free));
43
  s_object_set_to_string_method (S_OBJECT (self),
44
                                 TO_STRING_FUNC (s_method_box_to_string));
49 by Gustav Hartvigsson
* started work SBox (Untested).
45
  
62 by Gustav Hartvigsson
* General documentation clean up.
46
  self->priv->free_func = NULL;
47
  
48
  return self;
49
}
50
51
SBox *
52
s_box_new_pointer (spointer object) {
53
  SBox * self = internal_s_box_new ();
54
  self->priv->data.m_ptr = object;
55
  self->priv->object_type = S_TYPE_POINTER;
56
  
57
  return self;
58
}
59
60
SBox *
61
s_box_new_sobject (SObject * object) {
62
  SBox * self = internal_s_box_new ();
63
  self->priv->data.m_sobject = object;
64
  self->priv->object_type = S_TYPE_OBJECT;
65
  
66
  return self;
67
}
68
69
SBox *
70
s_box_new_int (int i) {
71
  SBox * self = internal_s_box_new ();
72
  self->priv->data.m_int = i;
73
  self->priv->object_type = S_TYPE_INT;
74
  
75
  return self;
76
}
77
78
SBox *
79
s_box_new_long (long l) {
80
  SBox * self = internal_s_box_new ();
81
  self->priv->data.m_long = l;
82
  self->priv->object_type = S_TYPE_LONG;
83
  
84
  return self;
85
}
86
87
SBox *
88
s_box_new_short (short s) {
89
  SBox * self = internal_s_box_new ();
90
  self->priv->data.m_short = s;
91
  self->priv->object_type = S_TYPE_SHORT;
92
  
93
  return self;
94
}
95
96
SBox *
97
s_box_new_char (char c) {
98
  SBox * self = internal_s_box_new ();
99
  self->priv->data.m_char = c;
100
  self->priv->object_type = S_TYPE_CHAR;
101
  
102
  return self;
103
}
104
105
SBox *
106
s_box_new_wchar (wchar_t wc) {
107
  SBox * self = internal_s_box_new ();
108
  self->priv->data.m_wchar = wc;
109
  self->priv->object_type = S_TYPE_WCHAR;
110
  
111
  return self;
112
}
113
114
SBox *
115
s_box_new_uint (unsigned int ui) {
116
  SBox * self = internal_s_box_new ();
117
  self->priv->data.m_uint = ui;
118
  self->priv->object_type = S_TYPE_UINT;
119
  
120
  return self;
121
}
122
123
124
SBox *
125
s_box_new_ulong (unsigned long ul) {
126
  SBox * self = internal_s_box_new ();
127
  self->priv->data.m_ulong = ul;
128
  self->priv->object_type = S_TYPE_ULONG;
129
  
130
  return self;
131
}
132
133
SBox *
134
s_box_new_ushort (unsigned short us)  {
135
  SBox * self = internal_s_box_new ();
136
  self->priv->data.m_ushort = us;
137
  self->priv->object_type = S_TYPE_USHORT;
138
  
139
  return self;
140
}
141
142
SBox *
143
s_box_new_string (char * s) {
144
  SBox * self = internal_s_box_new ();
145
  self->priv->data.m_string = s;
146
  self->priv->object_type = S_TYPE_STRING;
147
  
148
  return self;
149
}
150
151
SBox *
152
s_box_new_wstring (wchar_t * ws) {
153
  SBox * self = internal_s_box_new ();
154
  self->priv->data.m_wstring = ws;
155
  self->priv->object_type = S_TYPE_WSTRING;
156
  
157
  return self;
158
}
61 by Gustav Hartvigsson
* Made the code more easy to read.
159
160
void
161
s_box_free (SBox * self) {
49 by Gustav Hartvigsson
* started work SBox (Untested).
162
  s_object_free (S_OBJECT (self));
163
}
164
61 by Gustav Hartvigsson
* Made the code more easy to read.
165
void
166
s_box_set_free_data_on_free (SBox * self, sboolean free_data) {
62 by Gustav Hartvigsson
* General documentation clean up.
167
  self->priv->free_data = free_data;
49 by Gustav Hartvigsson
* started work SBox (Untested).
168
}
169
61 by Gustav Hartvigsson
* Made the code more easy to read.
170
void
171
s_box_set_free_func (SBox * self, FreeFunc free_func) {
62 by Gustav Hartvigsson
* General documentation clean up.
172
  self->priv->free_func = free_func;
49 by Gustav Hartvigsson
* started work SBox (Untested).
173
}
174
62 by Gustav Hartvigsson
* General documentation clean up.
175
176
spointer *
177
s_box_get_pointer (SBox * self);
178
179
180
SObject *
181
s_box_get_sobject (SBox * self);
182
183
184
int
185
s_box_get_int (SBox * self);
186
187
188
long
189
s_box_get_long (SBox * self);
190
191
192
short
193
s_box_get_short (SBox * self);
194
195
196
char
197
s_box_get_char (SBox * self);
198
199
200
wchar_t
201
s_box_get_wchar (SBox * self);
202
203
unsigned int
204
s_box_get_uint (SBox * self);
205
206
unsigned long
207
s_box_get_ulong (SBox * self);
208
209
unsigned short
210
s_box_get_ushort (SBox * self);
211
212
char *
213
s_box_get_string (SBox * self);
214
215
wchar_t *
216
s_box_get_wstring (SBox * self);
217
61 by Gustav Hartvigsson
* Made the code more easy to read.
218
void
219
s_method_box_free (SBox * self) {
49 by Gustav Hartvigsson
* started work SBox (Untested).
220
  SBoxClass * klass = S_BOX_CLASS (s_object_get_class(S_OBJECT(self)));
221
  
222
  SBoxPrivate * priv = self->priv;
223
  
62 by Gustav Hartvigsson
* General documentation clean up.
224
  FreeFunc free_func = priv->free_func;
49 by Gustav Hartvigsson
* started work SBox (Untested).
225
  
226
  if (priv->free_data) {
227
    switch (priv->object_type) {
228
      case S_TYPE_OBJECT:
62 by Gustav Hartvigsson
* General documentation clean up.
229
        s_object_free (priv->data.m_sobject);
49 by Gustav Hartvigsson
* started work SBox (Untested).
230
        break;
231
      case S_TYPE_POINTER:
232
        if (free_func) {
62 by Gustav Hartvigsson
* General documentation clean up.
233
          free_func (priv->data.m_ptr);
49 by Gustav Hartvigsson
* started work SBox (Untested).
234
        } else {
62 by Gustav Hartvigsson
* General documentation clean up.
235
          free (priv->data.m_ptr);
49 by Gustav Hartvigsson
* started work SBox (Untested).
236
        }
237
        break;
238
      case S_TYPE_STRING:
62 by Gustav Hartvigsson
* General documentation clean up.
239
        free (priv->data.m_string);
49 by Gustav Hartvigsson
* started work SBox (Untested).
240
        break;
241
      case S_TYPE_WSTRING:
62 by Gustav Hartvigsson
* General documentation clean up.
242
        free (priv->data.m_wstring);
49 by Gustav Hartvigsson
* started work SBox (Untested).
243
        break;
244
      default:
245
        s_warn_print ("[SBox] free_data was set despite not being an object"
246
                      "that can be freed.");
247
    }
248
  }
249
  
250
  free (self->priv);
251
  free (klass);
252
  
253
}
254
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
255
char *
256
s_method_box_to_string (SBox * self) {
257
  char * ret_val = NULL;
258
  
259
  switch (self->priv->object_type) {
260
    case (S_TYPE_INT):
261
      ret_val = s_string_new_fmt ("(SBox, Char: %i)", self->priv->data.m_int);
262
      break;
263
    case (S_TYPE_CHAR):
264
      ret_val = s_string_new_fmt ("(SBox, Char: %c)", self->priv->data.m_char);
265
      break;
266
    case (S_TYPE_LONG):
267
      ret_val = s_string_new_fmt ("(SBox, Long: %li)", self->priv->data.m_long);
268
      break;
269
    case (S_TYPE_OBJECT):
270
      ret_val = s_string_new_fmt ("(SBox, SObject: %s)", s_object_to_string(self->priv->data.m_sobject));
271
      break;
272
    case (S_TYPE_POINTER):
273
      ret_val = s_string_new_fmt ("(SBox, Pointer: %lli)", self->priv->data.m_ptr);
274
      break;
275
    case (S_TYPE_SHORT):
276
      ret_val = s_string_new_fmt ("(SBox, Short: %hi)", self->priv->data.m_short);
277
      break;
278
    case (S_TYPE_STRING):
279
      ret_val = s_string_new_fmt ("(SBox, String: \"%s\")", self->priv->data.m_string);
280
      break;
281
    case (S_TYPE_UINT):
282
      ret_val = s_string_new_fmt ("(SBox, Unsigned Int: %u)", self->priv->data.m_uint);
283
      break;
284
    case (S_TYPE_ULONG):
285
      ret_val = s_string_new_fmt ("(SBox, Unsigned Long: %lu)", self->priv->data.m_ulong);
286
      break;
287
    case (S_TYPE_USHORT):
288
      ret_val = s_string_new_fmt ("(SBox, Unsigned Short: %hu)", self->priv->data.m_ushort);
289
      break;
290
    case (S_TYPE_WCHAR):
291
      ret_val = s_string_new_fmt ("(SBox, Wide Char: %lc)", self->priv->data.m_wchar);
292
      break;
293
    case (S_TYPE_WSTRING):
294
      ret_val = s_string_new_fmt ("(SBox, Wide String: %s)", s_wstring_to_string (self->priv->data.m_wstring));
295
    default:
296
      s_err_print ("THIS SHOULD NOT BE ALBE TO BE REACHED.");
297
  }
298
  return ret_val;
299
}
43 by Gustav Hartvigsson
* Code cleanup
300