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