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