language

some fools attempt at an interpreted language
Log | Files | Refs | README

var.c (8803B)


      1 #include <stdlib.h>
      2 #include <stdio.h>
      3 
      4 #include "var.h"
      5 #include "object.h"
      6 #include "bc.h"
      7 
      8 #include "helper.h"
      9 
     10 void init_var_track()
     11 {
     12 	for (int i = 0; i < MAXIMUM_TRACKING_VARS; i++)
     13 	{
     14 		VAR_TRACK.vars[i] = NULL;
     15 	}
     16 }
     17 
     18 void* var_data_alloc_TYPE(b_type type)
     19 {
     20 	var_data_type* rv = (var_data_type*)malloc(sizeof(var_data_type));
     21 	M_ASSERT(rv);
     22 
     23 	rv->ownership = -1;
     24 	rv->v = type;
     25 
     26 	return rv;
     27 }
     28 
     29 void* var_data_alloc_PLIST(size_t size)
     30 {
     31 	var_data_plist* rv = (var_data_plist*)malloc(sizeof(var_data_plist));
     32 	M_ASSERT(rv);
     33 
     34 	rv->ownership = -1;
     35 	rv->v = (b_type*)malloc(sizeof(b_type)*size);
     36 
     37 	return rv;
     38 }
     39 
     40 void* var_data_alloc_FUNC(b_type type)
     41 {
     42 	var_data_func* rv = (var_data_func*)malloc(sizeof(var_data_func));
     43 	M_ASSERT(rv);
     44 
     45 	rv->ownership = -1;
     46 	rv->type  = type;
     47 	rv->loc   = 0;
     48 	rv->end   = 0;
     49 	rv->size  = 0;
     50 	rv->param = NULL;
     51 
     52 	return rv;
     53 }
     54 
     55 void* var_data_alloc_OBJBLDR(void)
     56 {
     57 	var_data_objbldr* rv = (var_data_objbldr*)malloc(sizeof(var_data_objbldr));
     58 	M_ASSERT(rv);
     59 
     60 	rv->ownership = -1;
     61 	rv->id    = 0;
     62 	rv->loc   = 0;
     63 	rv->end   = 0;
     64 	rv->size  = 0;
     65 	rv->instc = 0;
     66 	rv->param = NULL;
     67 
     68 	return rv;
     69 }
     70 
     71 void* var_data_alloc_G_INT(int value)
     72 {
     73 	var_data_int* rv = (var_data_int*)malloc(sizeof(var_data_int));
     74 	M_ASSERT(rv);
     75 
     76 	rv->ownership = -1;
     77 	rv->v = value;
     78 
     79 	return rv;
     80 }
     81 
     82 void* var_data_alloc_G_FLOAT(double value)
     83 {
     84 	var_data_float* rv = (var_data_float*)malloc(sizeof(var_data_float));
     85 	M_ASSERT(rv);
     86 
     87 	rv->ownership = -1;
     88 	rv->v = value;
     89 
     90 	return rv;
     91 }
     92 
     93 void* var_data_alloc_G_CHAR(char value)
     94 {
     95 	var_data_char* rv = (var_data_char*)malloc(sizeof(var_data_char));
     96 	M_ASSERT(rv);
     97 
     98 	rv->ownership = -1;
     99 	rv->v = value;
    100 
    101 	return rv;
    102 }
    103 
    104 void* var_data_alloc_G_STR(size_t size)
    105 {
    106 	var_data_str* rv = (var_data_str*)malloc(sizeof(var_data_str));
    107 	M_ASSERT(rv);
    108 
    109 	rv->ownership = -1;
    110 	rv->size = size;
    111 	rv->v = (char*)malloc(sizeof(char)*size);
    112 
    113 	return rv;
    114 }
    115 
    116 var_cont* var_new(b_type type)
    117 {
    118 	var_cont* new = (var_cont*)malloc(sizeof(var_cont));
    119 	M_ASSERT(new);
    120 
    121 	if (VAR_TRACK.ptr < MAXIMUM_TRACKING_VARS)
    122 		VAR_TRACK.vars[VAR_TRACK.ptr++] = new;
    123 	else // Here's where some properly implemented garbage collector should sit
    124 	{
    125 		VAR_TRACK.ptr = 0;
    126 		VAR_TRACK.vars[VAR_TRACK.ptr++] = new;
    127 	}
    128 
    129 	new->ownership = -1;
    130 
    131 	new->type = type;
    132 
    133 	new->refstat = 0;
    134 	new->data = NULL;
    135 
    136 	return new;
    137 }
    138 
    139 void var_del(var_cont* var)
    140 {
    141 	if (var->data != NULL)
    142 	{
    143 		var_data* base = (var_data*)var->data;
    144 		if (base->ownership == var->ownership)
    145 		{
    146 			var_data_free(var->data, var->type);
    147 		}
    148 	}
    149 
    150 	free(var);
    151 
    152 	var = NULL;
    153 }
    154 
    155 void var_data_free(void* data, b_type type)
    156 {
    157 	N_ASSERT(data, "var_data_free\n");
    158 
    159 	switch (type)
    160 	{
    161 	case FUNC:
    162 		var_data_free_FUNC(data);
    163 		break;
    164 	case OBJBLDR:
    165 		var_data_free_OBJBLDR(data);
    166 		break;
    167 	case G_STR:
    168 		var_data_free_G_STR(data);
    169 		break;
    170 	case PLIST:
    171 		var_data_free_PLIST(data);
    172 		break;
    173 	case OBJECT:
    174 		object_del(data);
    175 		break;
    176 	default:
    177 		break;
    178 	}
    179 	
    180 	free(data);
    181 
    182 	data = NULL;
    183 }
    184 
    185 void var_data_free_PLIST(void* data)
    186 {
    187 	var_data_plist* d = data;
    188 	free(d->v);
    189 	d->v = NULL;
    190 }
    191 void var_data_free_FUNC(void* data)
    192 {
    193 	var_data_func* d = data;
    194 	free(d->param);
    195 	d->param = NULL;
    196 }
    197 void var_data_free_OBJBLDR(void* data)
    198 {
    199 	var_data_objbldr* d = data;
    200 	free(d->param);
    201 	d->param = NULL;
    202 }
    203 void var_data_free_G_STR(void* data)
    204 {
    205 	var_data_str* d = data;
    206 	free(d->v);
    207 	d->v = NULL;
    208 }
    209 
    210 void var_set(var_cont* var, void* data, b_type type)
    211 {
    212 	if (var == NULL || data == NULL)
    213 		return;
    214 
    215 	ASSERT(var->type == type,
    216 		"Trying to set variable of different type without cast\n");
    217 	
    218 	if (var->data != NULL)
    219 	{
    220 		var_data* base = (var_data*)var->data;
    221 		if (base->ownership == var->ownership)
    222 		{
    223 			var_data_free(var->data, type);
    224 		}
    225 	}
    226 
    227 	if (data != NULL)
    228 	{
    229 		var_data* base = (var_data*)data;
    230 
    231 		if (base->ownership == -1)
    232 		{
    233 			base->ownership = var->ownership;
    234 		}
    235 	}
    236 
    237 
    238 	var->data = data;
    239 }
    240 
    241 b_type var_data_get_TYPE(var_cont* var)
    242 {
    243 	N_ASSERT(var, "var_data_get_TYPE\n");
    244 	ASSERT( var->type == TYPE, "TypeError" );
    245 
    246 	var_data_type* t = var->data;
    247 
    248 	return t->v;
    249 }
    250 
    251 b_type* var_data_get_PLIST(var_cont* var)
    252 {
    253 	N_ASSERT(var, "var_data_get_PLIST\n");
    254 	ASSERT( var->type == PLIST, "TypeError" );
    255 
    256 	N_ASSERT(var->data, "var_data_get_PLIST\n");
    257 
    258 	var_data_plist* t = var->data;
    259 
    260 	return t->v;
    261 }
    262 
    263 var_data_func* var_data_get_FUNC(var_cont* var)
    264 {
    265 	N_ASSERT(var, "var_data_get_FUNC\n");
    266 	ASSERT( var->type == FUNC, "TypeError" );
    267 
    268 	var_data_func* t = var->data;
    269 
    270 	return t;
    271 }
    272 
    273 var_data_objbldr* var_data_get_OBJBLDR(var_cont* var)
    274 {
    275 	N_ASSERT(var, "var_data_get_OBJBLDR\n");
    276 	ASSERT( var->type == OBJBLDR, "TypeError" );
    277 
    278 	var_data_objbldr* t = var->data;
    279 
    280 	return t;
    281 }
    282 
    283 int var_data_get_G_INT(var_cont* var)
    284 {
    285 	N_ASSERT(var, "var_data_get_G_INT\n");
    286 	ASSERT( var->type == G_INT, "TypeError" );
    287 
    288 	N_ASSERT(var->data, "var_data_get_G_INT\n");
    289 
    290 	var_data_int* t = var->data;
    291 
    292 	return t->v;
    293 }
    294 
    295 double var_data_get_G_FLOAT(var_cont* var)
    296 {
    297 	N_ASSERT(var, "var_data_get_G_FLOAT\n");
    298 	ASSERT( var->type == G_FLOAT, "TypeError" );
    299 
    300 	N_ASSERT(var->data, "var_data_get_G_FLOAT\n");
    301 
    302 	var_data_float* t = var->data;
    303 
    304 	return t->v;
    305 }
    306 
    307 char var_data_get_G_CHAR(var_cont* var)
    308 {
    309 	N_ASSERT(var, "var_data_get_G_CHAR\n");
    310 	ASSERT( var->type == G_CHAR, "TypeError" );
    311 
    312 	N_ASSERT(var->data, "var_data_get_G_CHAR\n");
    313 
    314 	var_data_char* t = var->data;
    315 
    316 	return t->v;
    317 }
    318 
    319 char* var_data_get_G_STR(var_cont* var)
    320 {
    321 	N_ASSERT(var, "var_data_get_G_STR\n");
    322 	ASSERT( var->type == G_STR, "TypeError" );
    323 
    324 	N_ASSERT(var->data, "var_data_get_G_STR\n");
    325 
    326 	var_data_str* t = var->data;
    327 
    328 	return t->v;
    329 }
    330 
    331 void* var_data_cpy_G_INT(var_data_int* data)
    332 {
    333 	var_data_int* rv = var_data_alloc_G_INT(data->v);
    334 
    335 	return rv;
    336 }
    337 
    338 void* var_data_cpy_G_FLOAT(var_data_float* data)
    339 {
    340 	var_data_float* rv = var_data_alloc_G_FLOAT(data->v);
    341 
    342 	return rv;
    343 }
    344 
    345 void* var_data_cpy_G_CHAR(var_data_char* data)
    346 {
    347 	var_data_char* rv = var_data_alloc_G_CHAR(data->v);
    348 
    349 	return rv;
    350 }
    351 
    352 void* var_data_cpy_G_STR(var_data_str* data)
    353 {
    354 	var_data_str* rv = var_data_alloc_G_STR(data->size);
    355 
    356 	int i;
    357 	for (i = 0; data->size > i; i++)
    358 	{
    359 		rv->v[i] = data->v[i];
    360 	}
    361 
    362 	return rv;
    363 }
    364 
    365 /* Reconstructs variable into seperate variable container, copies data
    366  *  var_cont* - variable to copy
    367  *
    368  * Returns new variable container
    369  */
    370 var_cont* var_data_cpy(var_cont* var)
    371 {
    372 	N_ASSERT(var, "var_data_cpy\n");
    373 
    374 	var_cont* rv = var_new(var->type);
    375 
    376 	if (var->type == G_INT)
    377 	{
    378 		rv->data = var_data_cpy_G_INT(var->data);
    379 	}
    380 	
    381 	if (var->type == G_FLOAT)
    382 	{
    383 		rv->data = var_data_cpy_G_FLOAT(var->data);
    384 	}
    385 
    386 	if (var->type == G_CHAR)
    387 	{
    388 		rv->data = var_data_cpy_G_CHAR(var->data);
    389 	}
    390 	
    391 	if (var->type == G_STR)
    392 	{
    393 		rv->data = var_data_cpy_G_STR(var->data);
    394 	}
    395 
    396 	if (var->type == OBJECT)
    397 	{
    398 		rv->data = var->data;
    399 	}
    400 
    401 	ASSERT((rv->data != NULL), "ERROR: Could not copy type.\n");
    402 
    403 	return rv;
    404 }
    405 
    406 /* Lovely little function to take bytes and turn it into an integer.
    407  *  int     - sizeof(bytes)
    408  *  byte_t* - array of bytes
    409  */
    410 var_cont* raw_to_int(int size, int start, byte_t* bytes, long ownership)
    411 {
    412 	var_cont* rv = var_new(G_INT);
    413 
    414 	rv->ownership = ownership;
    415 
    416 	int i,
    417 	    data;
    418 	data = 0;
    419 	for ( i = start; i < size; i++)
    420 	{
    421 		data = (data << 8 | bytes[i]);
    422 	}
    423 
    424 	var_set(rv, var_data_alloc_G_INT(data), G_INT);
    425 
    426 	return rv;
    427 }
    428 
    429 /* Byte to b_type.
    430  *  byte_t - value maps to enum b_type
    431  */
    432 var_cont* byte_to_type(byte_t byte, long ownership)
    433 {
    434 	var_cont* rv = var_new(TYPE);
    435 
    436 	rv->ownership = ownership;
    437 
    438 	var_set(rv, var_data_alloc_TYPE((b_type)byte), TYPE);
    439 
    440 	return rv;
    441 }
    442 
    443 /* Converts array of bytes of size n into parameter list
    444  *
    445  *  int     - sizeof(bytes)
    446  *  byte_t* - array of bytes
    447  */
    448 var_cont* raw_to_plist(int n, byte_t* bytes, long ownership)
    449 {
    450 	var_cont* rv = var_new(PLIST);
    451 
    452 	rv->ownership = ownership;
    453 
    454 	var_set(rv, var_data_alloc_PLIST(n), PLIST);
    455 
    456 	b_type* var = var_data_get_PLIST(rv);
    457 
    458 	int i;
    459 
    460 	for (i = 0; i < n; i++)
    461 	{
    462 		var[i] = (b_type)bytes[i];
    463 	}
    464 
    465 	return rv;
    466 }
    467 
    468 /* Converts raw (ascii) string into normal string type
    469  * int     - sizeof(bytes)
    470  * int     - offset
    471  * byte_t* - array of bytes
    472  */
    473 var_cont* raw_to_str(int n, int offset, byte_t* bytes, long ownership)
    474 {
    475 	var_cont* rv = var_new(G_STR);
    476 	rv->ownership = ownership;
    477 	var_data_str* data = var_data_alloc_G_STR(n);
    478 	int i;
    479 	for (i = offset; n > i; i++)
    480 	{
    481 		data->v[i] = (char)bytes[i];
    482 	}
    483 
    484 	var_set(rv, data, G_STR);
    485 
    486 	return rv;
    487 }
    488 
    489 /* Raw variable to var_cont
    490  *
    491  *  int     - sizeof(bytes)
    492  *  byte_t* - array of bytes
    493  */
    494 var_cont* raw_to_var(int n, byte_t* bytes, long ownership)
    495 {
    496 	N_ASSERT(bytes, "raw_to_var\n");
    497 
    498 	b_type type = (b_type)bytes[0];
    499 
    500 	var_cont* rv;
    501 
    502 	if (type == G_INT)
    503 	{
    504 		rv = raw_to_int(n, 1, bytes, ownership);
    505 	} else
    506 	if (type == G_STR)
    507 	{
    508 		rv = raw_to_str(n, 1, bytes, ownership);
    509 	} else
    510 	{
    511 		printf("Type {%x} is not a seralizeable type\n", type);
    512 	}
    513 
    514 	N_ASSERT(rv, "raw_to_var");
    515 
    516 	return rv;
    517 }
    518