Fixed floating point number support

This commit is contained in:
Maciej Samborski 2024-10-12 15:20:13 +02:00
parent f9fa4ce612
commit df957fa078
2 changed files with 60 additions and 18 deletions

56
da.h
View File

@ -19,6 +19,7 @@ enum daFields {
typedef void * dynarr; typedef void * dynarr;
GenericReturn _daCreate(size_t initCapacity, size_t type, size_t size); GenericReturn _daCreate(size_t initCapacity, size_t type, size_t size);
GenericReturn _daPushLit(dynarr * da, size_t item); GenericReturn _daPushLit(dynarr * da, size_t item);
GenericReturn _daPushFlt(dynarr * da, float item);
GenericReturn _daPushStr(dynarr * da, const char * str); GenericReturn _daPushStr(dynarr * da, const char * str);
GenericReturn daCopy(dynarr da); GenericReturn daCopy(dynarr da);
GenericReturn daResize(dynarr da); GenericReturn daResize(dynarr da);
@ -44,9 +45,12 @@ void daBzero(dynarr da);
#define daCreate(type, cap) _daCreate(cap, sizeof(type), 0) #define daCreate(type, cap) _daCreate(cap, sizeof(type), 0)
#define daPush(da, item) _Generic((item), \ #define daPush(da, item) _Generic((item), \
char *: _daPushStr, \ char *: _daPushStr, \
float: _daPushFlt, \
double: _daPushFlt, \
default: _daPushLit \ default: _daPushLit \
)((void *)&da, item) )((void *)&da, item)
#define daPop(da, item) _daPop(da, &item) #define daPop(da, item) _daPop(da, &item)
#define daGet(da, index) (da[index])
#endif // DA_H_ #endif // DA_H_
@ -106,23 +110,6 @@ GenericReturn daResize(dynarr da)
return ehanValue(newArr); return ehanValue(newArr);
} }
GenericReturn _daPush(dynarr * da, void * item)
{
if (daSize(*da) >= daCap(*da))
{
GenericReturn temp = daResize(*da);
if (ehanCheck(temp))
return ehanError(resultError(temp));
*da = resultGeneric(dynarr, temp);
}
memcpy((char *)(*da) + daSize(*da) * daType(*da), item, daType(*da));
*daField(*da, SIZE) += 1;
return ehanValue(0);
}
GenericReturn _daPushLit(dynarr * da, size_t item) GenericReturn _daPushLit(dynarr * da, size_t item)
{ {
if (daSize(*da) >= daCap(*da)) if (daSize(*da) >= daCap(*da))
@ -135,7 +122,6 @@ GenericReturn _daPushLit(dynarr * da, size_t item)
*da = resultGeneric(dynarr, temp); *da = resultGeneric(dynarr, temp);
} }
//TODO: Rewrite this
switch (daType(*da)) switch (daType(*da))
{ {
case 1: { case 1: {
@ -154,10 +140,44 @@ GenericReturn _daPushLit(dynarr * da, size_t item)
*(long long int *)((char *)*da + daType(*da) * daSize(*da)) = item; *(long long int *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break; } break;
default:
return ehanError("Wrong type size");
}
*daField(*da, SIZE) += 1;
return ehanValue(0);
}
GenericReturn _daPushFlt(dynarr * da, float item)
{
if (daSize(*da) >= daCap(*da))
{
GenericReturn temp = daResize(*da);
if (ehanCheck(temp))
return ehanError(resultError(temp));
*da = resultGeneric(dynarr, temp);
}
switch (daType(*da))
{
case 4: {
*(float *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break;
case 8: {
*(double *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break;
case 16: { case 16: {
*(long double *)((char *)*da + daType(*da) * daSize(*da)) = item; *(long double *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break; } break;
default:
return ehanError("Wrong type size");
} }
*daField(*da, SIZE) += 1; *daField(*da, SIZE) += 1;
return ehanValue(0); return ehanValue(0);

View File

@ -1,3 +1,4 @@
#include <stdio.h>
#define DA_IMPLEMENTATION #define DA_IMPLEMENTATION
#include "da.h" #include "da.h"
@ -101,8 +102,29 @@ int main(void)
daPop(da3, str); daPop(da3, str);
printf("%s\n", str); printf("%s\n", str);
printf("----------\n");
printf("DA4\n");
printf("----------\n");
dynarr(double) da4 = daCreate(double, 1).val;
daPush(da4, 69.692343);
printf("float: %F\n", da4[0]);
printf("----------\n");
printf("DA5\n");
printf("----------\n");
dynarr(char *) da5 = daCreate(char *, 1).val;
daPush(da5, "Hello, ");
daPush(da5, "World!");
DLog("%s%s\n", da5[0], da5[1]);
cleanup: cleanup:
daFree(da5);
daFree(da4);
daFree(da3); daFree(da3);
free(message); free(message);
daFree(da2); daFree(da2);