DataType.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "DataType.h"
  2. #define ARRAY_NAME 20
  3. #define ARRAY_FACTOR 10
  4. static char arrayName[ARRAY_NAME];
  5. static const char* dtGetBaseName(DataType dt) {
  6. switch(dt) {
  7. case DT_INT: return "int";
  8. case DT_FLOAT: return "float";
  9. case DT_BOOL: return "bool";
  10. default: return "";
  11. }
  12. }
  13. static const char* dtGetArrayName(DataType dt) {
  14. int dimension = dt % ARRAY_FACTOR;
  15. DataType real = (dt / ARRAY_FACTOR) - 1;
  16. const char* name = dtGetBaseName(real);
  17. if(name[0] == '\0' || dimension <= 0 || dimension > dtMaxDimensions()) {
  18. return "unknown";
  19. }
  20. int index = 0;
  21. while(index < (ARRAY_NAME - 1) && name[index] != '\0') {
  22. arrayName[index] = name[index];
  23. index++;
  24. }
  25. while(index < (ARRAY_NAME - 1) && dimension > 0) {
  26. arrayName[index] = '*';
  27. index++;
  28. dimension--;
  29. }
  30. arrayName[index] = '\0';
  31. return arrayName;
  32. }
  33. const char* dtGetName(DataType dt) {
  34. const char* name = dtGetBaseName(dt);
  35. if(name[0] == '\0') {
  36. return dtGetArrayName(dt);
  37. }
  38. return name;
  39. }
  40. int dtGetSize(DataType dt) {
  41. switch(dt) {
  42. case DT_INT: return sizeof(int);
  43. case DT_FLOAT: return sizeof(float);
  44. case DT_BOOL: return sizeof(bool);
  45. default:
  46. if(dt >= 1000) {
  47. return 0;
  48. }
  49. return sizeof(int);
  50. }
  51. }
  52. DataType dtArray(DataType dt, int dimensions) {
  53. return (dt + 1) * ARRAY_FACTOR + dimensions;
  54. }
  55. DataType dtStruct(int id) {
  56. return 1000 + id;
  57. }
  58. int dtMaxDimensions() {
  59. return ARRAY_FACTOR - 1;
  60. }
  61. bool dtIsArray(DataType dt) {
  62. return dt > ARRAY_FACTOR;
  63. }