DataType.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 >= STRUCT_OFFSET) {
  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 STRUCT_OFFSET + id;
  57. }
  58. int dtMaxDimensions() {
  59. return ARRAY_FACTOR - 1;
  60. }
  61. bool dtIsArray(DataType dt) {
  62. return dt > ARRAY_FACTOR && dt < STRUCT_OFFSET;
  63. }
  64. bool dtIsStruct(DataType dt) {
  65. return dt >= STRUCT_OFFSET;
  66. }