/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 {
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
10
    SObject *                    m_sobject;
11
    spointer                     m_ptr;
12
    sboolean                     m_sboolean;
13
    sint                         m_int;
14
    slong                        m_long;
15
    sshort                       m_short;
16
    schar                        m_char;
17
    wchar_t                      m_wchar; /*< @depricated */
18
    suchar                       m_uchar;
19
    suint                        m_uint;
20
    sulong                       m_ulong;
21
    sushort                      m_ushort;
22
    schar *                      m_string;
23
    wchar_t *                    m_wstring; /*< @depricated */
24
    suchar *                     m_ustring;
62 by Gustav Hartvigsson
* General documentation clean up.
25
  } data;
49 by Gustav Hartvigsson
* started work SBox (Untested).
26
};
27
61 by Gustav Hartvigsson
* Made the code more easy to read.
28
void
29
s_method_box_free (SBox * self);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
30
char *
31
s_method_box_to_string (SBox * self);
49 by Gustav Hartvigsson
* started work SBox (Untested).
32
33
/* Private function to allocate and set methods to the SBox.
34
 */
61 by Gustav Hartvigsson
* Made the code more easy to read.
35
SBox *
36
internal_s_box_new () {
49 by Gustav Hartvigsson
* started work SBox (Untested).
37
  SBox * self = malloc (sizeof (SBox));
38
  SBoxClass * klass = malloc (sizeof (SBoxClass));
39
  s_object_initialize (S_OBJECT (self), "SBox");
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
40
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
41
  s_object_set_class (S_OBJECT (self),
42
                      S_OBJECT_CLASS (klass));
43
  s_object_set_free_method (S_OBJECT (self),
44
                            FREE_METHOD (s_method_box_free));
45
  s_object_set_to_string_method (S_OBJECT (self),
46
                                 TO_STRING_FUNC (s_method_box_to_string));
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
47
62 by Gustav Hartvigsson
* General documentation clean up.
48
  self->priv->free_func = NULL;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
49
62 by Gustav Hartvigsson
* General documentation clean up.
50
  return self;
51
}
52
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
53
/* set the error if
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
54
 */
55
void
56
internal_s_box_set_err_on_missmatch (SBox * self,
57
                                     SType expeted_type,
58
                                     SError * err) {
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
59
104 by Gustav Hartvigsson
* Passing arguments can not be initialised from within a function...
60
  assert (err != NULL);
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
61
  if (self->priv->object_type != expeted_type) {
104 by Gustav Hartvigsson
* Passing arguments can not be initialised from within a function...
62
    s_error_append (err, S_ERROR_TYPE_ERROR, s_string_new_fmt (
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
63
                                    "(SBox) Type missmatch:\n"
64
                                    "Expected type: %s"
65
                                    "Type held: %s",
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
66
                                    s_type_get_name (expeted_type),
67
                                    s_type_get_name (self->priv->object_type)
68
                                    ),
69
                                    S_ERROR_GET_DEFAULT_DOMAIN);
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
70
  }
71
}
72
62 by Gustav Hartvigsson
* General documentation clean up.
73
SBox *
74
s_box_new_pointer (spointer object) {
75
  SBox * self = internal_s_box_new ();
76
  self->priv->data.m_ptr = object;
77
  self->priv->object_type = S_TYPE_POINTER;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
78
62 by Gustav Hartvigsson
* General documentation clean up.
79
  return self;
80
}
81
82
SBox *
83
s_box_new_sobject (SObject * object) {
84
  SBox * self = internal_s_box_new ();
85
  self->priv->data.m_sobject = object;
86
  self->priv->object_type = S_TYPE_OBJECT;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
87
62 by Gustav Hartvigsson
* General documentation clean up.
88
  return self;
89
}
90
91
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
92
s_box_new_int (sint i) {
62 by Gustav Hartvigsson
* General documentation clean up.
93
  SBox * self = internal_s_box_new ();
94
  self->priv->data.m_int = i;
95
  self->priv->object_type = S_TYPE_INT;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
96
62 by Gustav Hartvigsson
* General documentation clean up.
97
  return self;
98
}
99
100
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
101
s_box_new_long (slong l) {
62 by Gustav Hartvigsson
* General documentation clean up.
102
  SBox * self = internal_s_box_new ();
103
  self->priv->data.m_long = l;
104
  self->priv->object_type = S_TYPE_LONG;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
105
62 by Gustav Hartvigsson
* General documentation clean up.
106
  return self;
107
}
108
109
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
110
s_box_new_short (sshort s) {
62 by Gustav Hartvigsson
* General documentation clean up.
111
  SBox * self = internal_s_box_new ();
112
  self->priv->data.m_short = s;
113
  self->priv->object_type = S_TYPE_SHORT;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
114
62 by Gustav Hartvigsson
* General documentation clean up.
115
  return self;
116
}
117
118
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
119
s_box_new_char (schar c) {
62 by Gustav Hartvigsson
* General documentation clean up.
120
  SBox * self = internal_s_box_new ();
121
  self->priv->data.m_char = c;
122
  self->priv->object_type = S_TYPE_CHAR;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
123
62 by Gustav Hartvigsson
* General documentation clean up.
124
  return self;
125
}
126
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
127
62 by Gustav Hartvigsson
* General documentation clean up.
128
SBox *
129
s_box_new_wchar (wchar_t wc) {
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
130
62 by Gustav Hartvigsson
* General documentation clean up.
131
  SBox * self = internal_s_box_new ();
132
  self->priv->data.m_wchar = wc;
133
  self->priv->object_type = S_TYPE_WCHAR;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
134
62 by Gustav Hartvigsson
* General documentation clean up.
135
  return self;
136
}
137
138
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
139
s_box_new_uint (suint ui) {
62 by Gustav Hartvigsson
* General documentation clean up.
140
  SBox * self = internal_s_box_new ();
141
  self->priv->data.m_uint = ui;
142
  self->priv->object_type = S_TYPE_UINT;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
143
62 by Gustav Hartvigsson
* General documentation clean up.
144
  return self;
145
}
146
147
148
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
149
s_box_new_ulong (sulong ul) {
62 by Gustav Hartvigsson
* General documentation clean up.
150
  SBox * self = internal_s_box_new ();
151
  self->priv->data.m_ulong = ul;
152
  self->priv->object_type = S_TYPE_ULONG;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
153
62 by Gustav Hartvigsson
* General documentation clean up.
154
  return self;
155
}
156
157
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
158
s_box_new_ushort (sushort us)  {
62 by Gustav Hartvigsson
* General documentation clean up.
159
  SBox * self = internal_s_box_new ();
160
  self->priv->data.m_ushort = us;
161
  self->priv->object_type = S_TYPE_USHORT;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
162
62 by Gustav Hartvigsson
* General documentation clean up.
163
  return self;
164
}
165
166
SBox *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
167
s_box_new_string (schar * s) {
62 by Gustav Hartvigsson
* General documentation clean up.
168
  SBox * self = internal_s_box_new ();
169
  self->priv->data.m_string = s;
170
  self->priv->object_type = S_TYPE_STRING;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
171
62 by Gustav Hartvigsson
* General documentation clean up.
172
  return self;
173
}
174
175
SBox *
176
s_box_new_wstring (wchar_t * ws) {
177
  SBox * self = internal_s_box_new ();
178
  self->priv->data.m_wstring = ws;
179
  self->priv->object_type = S_TYPE_WSTRING;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
180
62 by Gustav Hartvigsson
* General documentation clean up.
181
  return self;
182
}
61 by Gustav Hartvigsson
* Made the code more easy to read.
183
184
void
185
s_box_free (SBox * self) {
49 by Gustav Hartvigsson
* started work SBox (Untested).
186
  s_object_free (S_OBJECT (self));
187
}
188
61 by Gustav Hartvigsson
* Made the code more easy to read.
189
void
190
s_box_set_free_data_on_free (SBox * self, sboolean free_data) {
62 by Gustav Hartvigsson
* General documentation clean up.
191
  self->priv->free_data = free_data;
49 by Gustav Hartvigsson
* started work SBox (Untested).
192
}
193
61 by Gustav Hartvigsson
* Made the code more easy to read.
194
void
195
s_box_set_free_func (SBox * self, FreeFunc free_func) {
62 by Gustav Hartvigsson
* General documentation clean up.
196
  self->priv->free_func = free_func;
49 by Gustav Hartvigsson
* started work SBox (Untested).
197
}
198
62 by Gustav Hartvigsson
* General documentation clean up.
199
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
200
201
/* *********************
202
   ****** Getters ******
203
   ********************* */
62 by Gustav Hartvigsson
* General documentation clean up.
204
spointer *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
205
s_box_get_pointer (SBox * self, SError * err) {
206
  internal_s_box_set_err_on_missmatch (self, S_TYPE_POINTER, err);
207
  if (err) {
208
    return NULL;
209
  }
210
  return self->priv->data.m_ptr;
211
}
62 by Gustav Hartvigsson
* General documentation clean up.
212
213
SObject *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
214
s_box_get_sobject (SBox * self, SError * err) {
215
  internal_s_box_set_err_on_missmatch (self, S_TYPE_OBJECT, err);
216
  if (err) {
217
    return NULL;
218
  }
219
  return self->priv->data.m_sobject;
220
}
221
222
223
sint
224
s_box_get_int (SBox * self, SError * err)  {
225
  internal_s_box_set_err_on_missmatch (self, S_TYPE_INT, err);
226
  if (err) {
227
    return 0;
228
  }
229
  return self->priv->data.m_int;
230
}
231
232
233
slong
234
s_box_get_long (SBox * self, SError * err)  {
235
  internal_s_box_set_err_on_missmatch (self, S_TYPE_LONG, err);
236
  if (err) {
237
    return 0;
238
  }
239
  return self->priv->data.m_long;
240
}
241
242
sshort
243
s_box_get_short (SBox * self, SError * err) {
244
  internal_s_box_set_err_on_missmatch (self, S_TYPE_SHORT, err);
245
  if (err) {
246
    return 0;
247
  }
248
  return self->priv->data.m_short;
249
}
250
251
schar
252
s_box_get_char (SBox * self, SError * err)  {
253
  internal_s_box_set_err_on_missmatch (self, S_TYPE_CHAR, err);
254
  if (err) {
255
    return 0;
256
  }
257
  return self->priv->data.m_char;
258
}
62 by Gustav Hartvigsson
* General documentation clean up.
259
260
wchar_t
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
261
s_box_get_wchar (SBox * self, SError * err)  {
262
  internal_s_box_set_err_on_missmatch (self, S_TYPE_WCHAR, err);
263
  if (err) {
264
    return 0;
265
  }
266
  return self->priv->data.m_wchar;
267
}
268
269
suint
270
s_box_get_uint (SBox * self, SError * err)  {
271
  internal_s_box_set_err_on_missmatch (self, S_TYPE_UINT, err);
272
  if (err) {
273
    return 0;
274
  }
275
  return self->priv->data.m_uint;
276
}
277
278
sulong
279
s_box_get_ulong (SBox * self, SError * err)  {
280
  internal_s_box_set_err_on_missmatch (self, S_TYPE_ULONG, err);
281
  if (err) {
282
    return 0;
283
  }
284
  return self->priv->data.m_ulong;
285
}
286
287
sushort
288
s_box_get_ushort (SBox * self, SError * err)  {
289
  internal_s_box_set_err_on_missmatch (self, S_TYPE_USHORT, err);
290
  if (err) {
291
    return 0;
292
  }
293
  return self->priv->data.m_ushort;
294
}
295
296
schar *
297
s_box_get_string (SBox * self, SError * err)  {
298
  internal_s_box_set_err_on_missmatch (self, S_TYPE_STRING, err);
299
  if (err) {
300
    return NULL;
301
  }
302
  return self->priv->data.m_string;
303
}
62 by Gustav Hartvigsson
* General documentation clean up.
304
305
wchar_t *
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
306
s_box_get_wstring (SBox * self, SError * err)  {
307
  internal_s_box_set_err_on_missmatch (self, S_TYPE_WSTRING, err);
308
  if (err) {
309
    return NULL;
310
  }
311
  return self->priv->data.m_wstring;
312
}
313
314
suchar *
315
s_box_get_ustring (SBox * self, SError * err)  {
316
  internal_s_box_set_err_on_missmatch (self, S_TYPE_USTRING, err);
317
  if (err) {
318
    return NULL;
319
  }
320
  return self->priv->data.m_ustring;
321
}
62 by Gustav Hartvigsson
* General documentation clean up.
322
61 by Gustav Hartvigsson
* Made the code more easy to read.
323
void
324
s_method_box_free (SBox * self) {
49 by Gustav Hartvigsson
* started work SBox (Untested).
325
  SBoxClass * klass = S_BOX_CLASS (s_object_get_class(S_OBJECT(self)));
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
326
49 by Gustav Hartvigsson
* started work SBox (Untested).
327
  SBoxPrivate * priv = self->priv;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
328
62 by Gustav Hartvigsson
* General documentation clean up.
329
  FreeFunc free_func = priv->free_func;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
330
49 by Gustav Hartvigsson
* started work SBox (Untested).
331
  if (priv->free_data) {
332
    switch (priv->object_type) {
333
      case S_TYPE_OBJECT:
62 by Gustav Hartvigsson
* General documentation clean up.
334
        s_object_free (priv->data.m_sobject);
49 by Gustav Hartvigsson
* started work SBox (Untested).
335
        break;
336
      case S_TYPE_POINTER:
337
        if (free_func) {
62 by Gustav Hartvigsson
* General documentation clean up.
338
          free_func (priv->data.m_ptr);
49 by Gustav Hartvigsson
* started work SBox (Untested).
339
        } else {
62 by Gustav Hartvigsson
* General documentation clean up.
340
          free (priv->data.m_ptr);
49 by Gustav Hartvigsson
* started work SBox (Untested).
341
        }
342
        break;
343
      case S_TYPE_STRING:
62 by Gustav Hartvigsson
* General documentation clean up.
344
        free (priv->data.m_string);
49 by Gustav Hartvigsson
* started work SBox (Untested).
345
        break;
346
      case S_TYPE_WSTRING:
62 by Gustav Hartvigsson
* General documentation clean up.
347
        free (priv->data.m_wstring);
49 by Gustav Hartvigsson
* started work SBox (Untested).
348
        break;
349
      default:
350
        s_warn_print ("[SBox] free_data was set despite not being an object"
351
                      "that can be freed.");
352
    }
353
  }
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
354
49 by Gustav Hartvigsson
* started work SBox (Untested).
355
  free (self->priv);
356
  free (klass);
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
357
49 by Gustav Hartvigsson
* started work SBox (Untested).
358
}
359
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
360
char *
361
s_method_box_to_string (SBox * self) {
362
  char * ret_val = NULL;
103 by Gustav Hartvigsson
* General cleanup/make it pritty.
363
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
364
  switch (self->priv->object_type) {
365
    case (S_TYPE_INT):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
366
      ret_val = s_string_new_fmt ("(SBox, Char: %i)",
367
                                  self->priv->data.m_int);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
368
      break;
369
    case (S_TYPE_CHAR):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
370
      ret_val = s_string_new_fmt ("(SBox, Char: %c)",
371
                                  self->priv->data.m_char);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
372
      break;
373
    case (S_TYPE_LONG):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
374
      ret_val = s_string_new_fmt ("(SBox, Long: %li)",
375
                                  self->priv->data.m_long);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
376
      break;
377
    case (S_TYPE_OBJECT):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
378
      ret_val = s_string_new_fmt ("(SBox, SObject: %s)",
379
                                  s_object_to_string(
380
                                                   self->priv->data.m_sobject));
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
381
      break;
382
    case (S_TYPE_POINTER):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
383
      ret_val = s_string_new_fmt ("(SBox, Pointer: %lli)",
384
                                  self->priv->data.m_ptr);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
385
      break;
386
    case (S_TYPE_SHORT):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
387
      ret_val = s_string_new_fmt ("(SBox, Short: %hi)",
388
                                  self->priv->data.m_short);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
389
      break;
390
    case (S_TYPE_STRING):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
391
      ret_val = s_string_new_fmt ("(SBox, String: \"%s\")",
392
                                  self->priv->data.m_string);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
393
      break;
394
    case (S_TYPE_UINT):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
395
      ret_val = s_string_new_fmt ("(SBox, Unsigned Int: %u)",
396
                                  self->priv->data.m_uint);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
397
      break;
398
    case (S_TYPE_ULONG):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
399
      ret_val = s_string_new_fmt ("(SBox, Unsigned Long: %lu)",
400
                                  self->priv->data.m_ulong);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
401
      break;
402
    case (S_TYPE_USHORT):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
403
      ret_val = s_string_new_fmt ("(SBox, Unsigned Short: %hu)",
404
                                  self->priv->data.m_ushort);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
405
      break;
406
    case (S_TYPE_WCHAR):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
407
      ret_val = s_string_new_fmt ("(SBox, Wide Char: %lc)",
408
                                  self->priv->data.m_wchar);
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
409
      break;
410
    case (S_TYPE_WSTRING):
72 by Gustav Hartvigsson
* Added our own types for stability and shit and giggles.
411
      ret_val = s_string_new_fmt ("(SBox, Wide String: %s)",
412
                                  s_wstring_to_string (
413
                                                   self->priv->data.m_wstring));
414
      break;
415
    case (S_TYPE_USTRING):
416
      ret_val = s_string_new_fmt ("(SBox, U String: %s)",
417
                                  s_ustring_to_string (
418
                                                   self->priv->data.m_ustring));
419
      break;
63 by Gustav Hartvigsson
* Working on SMatrix to finish it off.
420
    default:
421
      s_err_print ("THIS SHOULD NOT BE ALBE TO BE REACHED.");
422
  }
423
  return ret_val;
424
}
43 by Gustav Hartvigsson
* Code cleanup
425