DataType.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "DataType.h"
  5. #define ARRAY_NAME 30
  6. static int typeNameIndex = 0;
  7. static int typeNameSwap = 0;
  8. static char typeName[2][ARRAY_NAME];
  9. static void dtAppend(const char* s) {
  10. int index = 0;
  11. while(typeNameIndex < (ARRAY_NAME - 1) && s[index] != '\0') {
  12. typeName[typeNameSwap][typeNameIndex] = s[index];
  13. index++;
  14. typeNameIndex++;
  15. }
  16. typeName[typeNameSwap][typeNameIndex] = '\0';
  17. }
  18. const char* dtGetName(Structs* sts, DataType dt) {
  19. typeNameSwap = !typeNameSwap;
  20. typeNameIndex = 0;
  21. if(dt.structId > 0) {
  22. dtAppend(sts->data[dt.structId - 1].name);
  23. } else {
  24. switch(dt.type) {
  25. case DT_INT: dtAppend("int"); break;
  26. case DT_FLOAT: dtAppend("float"); break;
  27. case DT_BOOL: dtAppend("bool"); break;
  28. default: dtAppend("unknown");
  29. }
  30. }
  31. for(unsigned int i = 0; i < dt.pointers; i++) {
  32. dtAppend("*");
  33. }
  34. if(dt.reference) {
  35. dtAppend("&");
  36. }
  37. return typeName[typeNameSwap];
  38. }
  39. int dtGetSize(DataType dt) {
  40. switch(dtAsInt(dt)) {
  41. case DT_INT: return sizeof(int);
  42. case DT_FLOAT: return sizeof(float);
  43. case DT_BOOL: return sizeof(bool);
  44. default:
  45. if(dt.structId > 0) {
  46. return 0;
  47. }
  48. return sizeof(int);
  49. }
  50. }
  51. DataType dtInt() {
  52. DataType dt = {DT_INT, 0, 0, 0};
  53. return dt;
  54. }
  55. DataType dtFloat() {
  56. DataType dt = {DT_FLOAT, 0, 0, 0};
  57. return dt;
  58. }
  59. DataType dtBool() {
  60. DataType dt = {DT_BOOL, 0, 0, 0};
  61. return dt;
  62. }
  63. DataType dtVoid() {
  64. DataType dt = {DT_VOID, 0, 0, 0};
  65. return dt;
  66. }
  67. DataType dtStruct(Struct* st) {
  68. DataType dt = {DT_STRUCT, 0, 0, st->id};
  69. return dt;
  70. }
  71. DataType dtToReference(DataType dt) {
  72. dt.reference = 1;
  73. return dt;
  74. }
  75. DataType dtToArray(DataType dt, int dimension) {
  76. dt.pointers = dimension;
  77. return dt;
  78. }
  79. bool dtCompare(DataType a, DataType b) {
  80. return dtAsInt(a) == dtAsInt(b);
  81. }
  82. int dtMaxDimensions() {
  83. return 15;
  84. }
  85. unsigned int dtAsInt(DataType dt) {
  86. unsigned int i;
  87. memcpy(&i, &dt, sizeof(dt));
  88. return i;
  89. }
  90. bool dtIsArray(DataType dt) {
  91. return dt.pointers > 0;
  92. }
  93. void stAddVariable(Struct* st, const char* name, DataType type) {
  94. int index = st->amount;
  95. st->amount++;
  96. st->vars = realloc(st->vars, sizeof(StructVariable) * st->amount);
  97. st->vars[index].name = name;
  98. st->vars[index].type = type;
  99. }
  100. void stsInit(Structs* sts) {
  101. sts->capacity = 4;
  102. sts->entries = 0;
  103. sts->data = malloc(sizeof(Struct) * sts->capacity);
  104. }
  105. void stsDelete(Structs* sts) {
  106. for(int i = 0; i < sts->entries; i++) {
  107. free(sts->data[i].vars);
  108. }
  109. free(sts->data);
  110. }
  111. Struct* stsSearch(Structs* sts, const char* name) {
  112. for(int i = 0; i < sts->entries; i++) {
  113. if(strcmp(sts->data[i].name, name) == 0) {
  114. return sts->data + i;
  115. }
  116. }
  117. return NULL;
  118. }
  119. Struct* stsAdd(Structs* sts, const char* name) {
  120. if(sts->entries >= sts->capacity) {
  121. sts->capacity *= 2;
  122. sts->data = realloc(sts->data, sizeof(Struct) * sts->capacity);
  123. }
  124. int index = sts->entries++;
  125. sts->data[index].id = index;
  126. sts->data[index].amount = 0;
  127. sts->data[index].name = name;
  128. sts->data[index].vars = NULL;
  129. return sts->data + index;
  130. }