avdl_struct_table.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include "avdl_struct_table.h"
  5. struct struct_table_entry struct_table[DD_STRUCT_TABLE_TOTAL];
  6. int struct_table_current = 0;
  7. // initialise the struct table index to no tables
  8. void struct_table_init() {
  9. struct_table_current = -1;
  10. // Engine's initial structs and their members
  11. struct_table_push("dd_world", 0);
  12. struct_table_push_member("create", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  13. struct_table_push_member("onload", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  14. struct_table_push_member("update", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  15. struct_table_push_member("resize", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  16. struct_table_push_member("draw", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  17. struct_table_push_member("key_input", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  18. struct_table_push_member("mouse_input", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  19. struct_table_push_member("clean", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  20. struct_table_push("dd_matrix", 0);
  21. struct_table_push("dd_mesh", 0);
  22. struct_table_push_member("draw", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  23. struct_table_push_member("clean", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  24. struct_table_push_member("set_primitive", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  25. struct_table_push_member("load", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  26. struct_table_push_member("copy", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  27. struct_table_push("dd_meshColour", "dd_mesh");
  28. struct_table_push_member("set_colour", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  29. struct_table_push("dd_meshRising", "dd_meshColour");
  30. struct_table_push_member("set_animation_max", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  31. struct_table_push_member("set_animation_current", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  32. struct_table_push("dd_meshTexture", "dd_meshColour");
  33. struct_table_push_member("preloadTexture", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  34. struct_table_push_member("applyTexture", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  35. struct_table_push_member("loadTexture", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  36. struct_table_push_member("set_primitive_texcoords", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  37. struct_table_push_member("copyTexture", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  38. struct_table_push("dd_sound", 0);
  39. struct_table_push_member("load", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  40. struct_table_push_member("clean", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  41. struct_table_push_member("play", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  42. struct_table_push_member("playLoop", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  43. struct_table_push_member("stop", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  44. struct_table_push_member("setVolume", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  45. struct_table_push("dd_vec3", 0);
  46. struct_table_push_member("set", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  47. struct_table_push_member("getX", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  48. struct_table_push_member("getY", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  49. struct_table_push_member("getZ", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  50. struct_table_push("dd_string3d", 0);
  51. struct_table_push_member("setAlign", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  52. struct_table_push_member("setColorFront", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  53. struct_table_push_member("setColorBack", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  54. struct_table_push_member("draw", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  55. struct_table_push_member("drawInt", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  56. struct_table_push_member("drawLimit", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  57. struct_table_push_member("clean", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  58. struct_table_push("avdl_program", 0);
  59. struct_table_push_member("clean", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  60. struct_table_push_member("setVertexShader", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  61. struct_table_push_member("setFragmentShader", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  62. struct_table_push_member("useProgram", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  63. struct_table_push("avdl_particle_system", 0);
  64. struct_table_push_member("assignAsset", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  65. struct_table_push_member("update", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  66. struct_table_push_member("draw", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  67. struct_table_push_member("setDelay", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  68. struct_table_push_member("setParticleLife", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  69. struct_table_push_member("setParticleSpeed", DD_VARIABLE_TYPE_FUNCTION, 0, 0);
  70. //struct_table_push("dd_gamejolt_response_struct", 0);
  71. }
  72. // push a new struct to the table
  73. int struct_table_push(const char *structname, const char *parentname) {
  74. // check for max number of structs
  75. if (struct_table_current+1 > DD_STRUCT_TABLE_TOTAL) {
  76. printf("struct_table_add: max number of struct tables reached\n");
  77. exit(-1);
  78. }
  79. // increment counter
  80. struct_table_current++;
  81. // set the values of the new struct
  82. struct struct_table_entry *newStruct = &struct_table[struct_table_current];
  83. strncpy(newStruct->name, structname, DD_STRUCT_TABLE_NAME_SIZE -1);
  84. newStruct->name[DD_STRUCT_TABLE_NAME_SIZE-1] = '\0';
  85. newStruct->member_total = 0;
  86. newStruct->parent = -1;
  87. // if a parent name was given, check if it exists, and assign as parent of the new struct
  88. if (parentname) {
  89. for (int i = 0; i < struct_table_current; i++) {
  90. if (strcmp(struct_table[i].name, parentname) == 0) {
  91. newStruct->parent = i;
  92. break;
  93. }
  94. }
  95. // no parent was found, this is an error!
  96. if (newStruct->parent < 0) {
  97. printf("error: struct_table_push: no parent found with name '%s'\n", parentname);
  98. exit(-1);
  99. }
  100. }
  101. // return the index of the new struct
  102. return struct_table_current;
  103. }
  104. /* push a new member to the last pushed struct
  105. * get a reference to the last pushed struct
  106. * check if there is space in the struct
  107. * add a new member to it
  108. */
  109. struct struct_table_entry_member *struct_table_push_member(const char *name, enum dd_variable_type type, const char *nametype, int isRef) {
  110. struct struct_table_entry *currentStruct = &struct_table[struct_table_current];
  111. if (currentStruct->member_total+1 >= DD_STRUCT_TABLE_MEMBER_TOTAL) {
  112. printf("struct_table_push_member: struct '%s': maximum number of members reached\n", currentStruct->name);
  113. exit(-1);
  114. }
  115. struct struct_table_entry_member *newMember = &currentStruct->members[currentStruct->member_total];
  116. newMember->type = type;
  117. strncpy(newMember->name, name, DD_STRUCT_TABLE_NAME_SIZE -1);
  118. newMember->name[DD_STRUCT_TABLE_NAME_SIZE-1] = '\0';
  119. newMember->arrayCount = 1;
  120. newMember->isRef = isRef;
  121. if (nametype) {
  122. strncpy(newMember->nametype, nametype, DD_STRUCT_TABLE_NAME_SIZE -1);
  123. newMember->nametype[DD_STRUCT_TABLE_NAME_SIZE-1] = '\0';
  124. }
  125. else {
  126. newMember->nametype[0] = '\0';
  127. }
  128. currentStruct->member_total++;
  129. return &currentStruct->members[currentStruct->member_total -1];
  130. }
  131. void struct_table_push_member_array(const char *name, enum dd_variable_type type, const char *nametype, int arrayCount, int isRef) {
  132. struct struct_table_entry_member *newMember = struct_table_push_member(name, type, nametype, isRef);
  133. newMember->arrayCount = arrayCount;
  134. }
  135. void struct_table_pop() {
  136. struct struct_table_entry *currentTable = &struct_table[struct_table_current];
  137. if (currentTable->member_total > 0) {
  138. currentTable->member_total--;
  139. }
  140. }
  141. /* print all structs and their members
  142. * this is meant for debug only
  143. */
  144. void struct_table_print() {
  145. printf("struct table start\n");
  146. for (int i = 0; i <= struct_table_current; i++) {
  147. struct struct_table_entry *s = &struct_table[i];
  148. printf("struct: %s", s->name);
  149. if (s->parent >= 0) {
  150. printf(":%s", struct_table_get_name(s->parent));
  151. }
  152. printf("\n");
  153. for (int j = 0; j < s->member_total; j++) {
  154. struct struct_table_entry_member *m = &s->members[j];
  155. printf(" member: %s\n", m->name);
  156. }
  157. }
  158. printf("struct table end\n");
  159. }
  160. // return the name of the struct on index, make sure index is in bounds
  161. const char *struct_table_get_name(int index) {
  162. if (index < 0 || index > struct_table_current) {
  163. printf("error: struct_table_get_name: index out of bounds: %d\n", index);
  164. exit(-1);
  165. }
  166. return struct_table[index].name;
  167. }
  168. const char *struct_table_get_member_name(int structIndex, int memberIndex) {
  169. return struct_table[structIndex].members[memberIndex].name;
  170. }
  171. int struct_table_getMemberArrayCount(int structIndex, int memberIndex) {
  172. return struct_table[structIndex].members[memberIndex].arrayCount;
  173. }
  174. int struct_table_getMemberIsRef(int structIndex, int memberIndex) {
  175. return struct_table[structIndex].members[memberIndex].isRef;
  176. }
  177. enum dd_variable_type struct_table_get_member_type(int structIndex, int memberIndex) {
  178. return struct_table[structIndex].members[memberIndex].type;
  179. }
  180. int struct_table_get_member(int structIndex, const char *membername) {
  181. for (int i = 0; i < struct_table[structIndex].member_total; i++) {
  182. struct struct_table_entry_member *m = &struct_table[structIndex].members[i];
  183. if (strcmp(m->name, membername) == 0) {
  184. return i;
  185. }
  186. }
  187. return -1;
  188. }
  189. int struct_table_is_member_primitive(int structIndex, int memberIndex) {
  190. struct struct_table_entry_member *m = &struct_table[structIndex].members[memberIndex];
  191. return m->type != DD_VARIABLE_TYPE_STRUCT;
  192. }
  193. int struct_table_is_member_primitive_string(int structIndex, const char *membername) {
  194. if (struct_table_has_member(structIndex, membername)) {
  195. int memberId = struct_table_get_member(structIndex, membername);
  196. struct struct_table_entry_member *m = &struct_table[structIndex].members[memberId];
  197. return m->type != DD_VARIABLE_TYPE_STRUCT;
  198. }
  199. else
  200. if (struct_table[structIndex].parent >= 0) {
  201. return struct_table_is_member_primitive_string(struct_table[structIndex].parent, membername);
  202. }
  203. return 0;
  204. }
  205. int struct_table_has_member(int structIndex, const char *membername) {
  206. if (structIndex < 0 || structIndex > struct_table_current) {
  207. printf("error: struct_table_has_member: index out of bounds: %d for member '%s'\n", structIndex, membername);
  208. exit(-1);
  209. }
  210. struct struct_table_entry *e = &struct_table[structIndex];
  211. for (int i = 0; i < e->member_total; i++) {
  212. struct struct_table_entry_member *m = &e->members[i];
  213. if (strcmp(m->name, membername) == 0) {
  214. return 1;
  215. }
  216. }
  217. return 0;
  218. }
  219. int struct_table_has_member_parent(int structIndex, const char *membername) {
  220. if (structIndex < 0 || structIndex > struct_table_current) {
  221. printf("error: struct_table_has_member: index out of bounds: %d for member '%s'\n", structIndex, membername);
  222. exit(-1);
  223. }
  224. // has member
  225. if (struct_table_has_member(structIndex, membername)) {
  226. return 1;
  227. }
  228. // maybe parent has member ?
  229. if (struct_table[structIndex].parent >= 0) {
  230. return struct_table_has_member_parent(struct_table[structIndex].parent, membername);
  231. }
  232. // doesn't have member
  233. return 0;
  234. }
  235. static int parent_level;
  236. static int parent_level_current;
  237. static int struct_table_is_member_parent_search(int structIndex, const char *membername) {
  238. if (structIndex < 0 || structIndex > struct_table_current) {
  239. printf("error: struct_table_is_member_parent: index out of bounds: %d\n", structIndex);
  240. exit(-1);
  241. }
  242. parent_level++;
  243. struct struct_table_entry *t = &struct_table[structIndex];
  244. // is member of this struct
  245. if (struct_table_has_member(structIndex, membername)) {
  246. parent_level_current = parent_level;
  247. }
  248. if (t->parent == -1) {
  249. return parent_level_current;
  250. }
  251. //return -1;
  252. return struct_table_is_member_parent_search(t->parent, membername);
  253. }
  254. int struct_table_is_member_parent(int structIndex, const char *membername) {
  255. parent_level_current = -1;
  256. parent_level = -1;
  257. return struct_table_is_member_parent_search(structIndex, membername);
  258. }
  259. int struct_table_get_index(const char *structname) {
  260. if (!structname) {
  261. return -1;
  262. }
  263. for (int i = 0; i <= struct_table_current; i++) {
  264. if (strcmp(struct_table[i].name, structname) == 0) {
  265. return i;
  266. }
  267. }
  268. return -1;
  269. }
  270. int struct_table_get_member_scope(int structIndex, int memberIndex) {
  271. if (structIndex < 0 || structIndex > struct_table_current) {
  272. printf("error: struct_table_get_member_scope: index out of bounds: %d\n", structIndex);
  273. exit(-1);
  274. }
  275. struct struct_table_entry_member *m = &struct_table[structIndex].members[memberIndex];
  276. if (m->type == DD_VARIABLE_TYPE_STRUCT) {
  277. return struct_table_get_index(m->nametype);
  278. }
  279. printf("struct_table_get_member_scope: error: '%s' of '%s' is not struct\n", m->name, struct_table_get_name(structIndex));
  280. exit(-1);
  281. }
  282. int struct_table_get_member_scope_string(int structIndex, const char *membername) {
  283. if (structIndex < 0 || structIndex > struct_table_current) {
  284. printf("error: struct_table_get_member_scope_string: index out of bounds: %d\n", structIndex);
  285. exit(-1);
  286. }
  287. if (struct_table_has_member(structIndex, membername)) {
  288. int memberIndex = struct_table_get_member(structIndex, membername);
  289. struct struct_table_entry_member *m = &struct_table[structIndex].members[memberIndex];
  290. if (m->type == DD_VARIABLE_TYPE_STRUCT) {
  291. return struct_table_get_index(m->nametype);
  292. }
  293. printf("struct_table_get_member_scope: error: '%s' of '%s' is not struct\n", m->name, struct_table_get_name(structIndex));
  294. exit(-1);
  295. }
  296. else
  297. if (struct_table[structIndex].parent) {
  298. return struct_table_get_member_scope_string(struct_table[structIndex].parent, membername);
  299. }
  300. printf("failed searching for %d %s\n", structIndex, membername);
  301. struct_table_print();
  302. printf("struct_table_get_member_scope: error: \n");
  303. exit(-1);
  304. }
  305. int struct_table_get_parent(int structIndex) {
  306. return struct_table[structIndex].parent;
  307. }
  308. unsigned int struct_table_get_member_total(int structIndex) {
  309. return struct_table[structIndex].member_total;
  310. }
  311. char *struct_table_get_member_nametype(int structIndex, int memberIndex) {
  312. return struct_table[structIndex].members[memberIndex].nametype;
  313. }
  314. int struct_table_count() {
  315. return struct_table_current+1;
  316. }
  317. int struct_table_exists(const char *structname) {
  318. if (!structname) {
  319. printf("struct_table_exists: no struct given\n");
  320. exit(-1);
  321. }
  322. for (int i = 0; i <= struct_table_current; i++) {
  323. if (strcmp(struct_table[i].name, structname) == 0) {
  324. return 1;
  325. }
  326. }
  327. return 0;
  328. }