Compare commits
6 Commits
dac983b684
...
925077d55e
| Author | SHA1 | Date | |
|---|---|---|---|
| 925077d55e | |||
| 32d6a029dd | |||
| 0f155c80be | |||
| 4680597065 | |||
| 792aed13ae | |||
| 08b1edd7a7 |
@@ -14,17 +14,6 @@ extern "C" {
|
||||
struct GroundScope;
|
||||
typedef struct GroundScope GroundScope;
|
||||
|
||||
/*
|
||||
* Stores data associated with an error thrown during Ground execution.
|
||||
*/
|
||||
typedef struct GroundError {
|
||||
char* what;
|
||||
char* type;
|
||||
struct GroundInstruction* where;
|
||||
size_t line;
|
||||
bool hasLine;
|
||||
} GroundError;
|
||||
|
||||
// Creates a GroundValue containing (in), with type ERROR.
|
||||
GroundValue createErrorGroundValue(GroundError in);
|
||||
|
||||
|
||||
@@ -11,13 +11,14 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <uthash.h>
|
||||
|
||||
typedef enum GroundInstType {
|
||||
IF, JUMP, END, INPUT, PRINT, PRINTLN, SET, GETTYPE, EXISTS, SETLIST, SETLISTAT, GETLISTAT, GETLISTSIZE, LISTAPPEND, GETSTRSIZE, GETSTRCHARAT, ADD, SUBTRACT, MULTIPLY, DIVIDE, EQUAL, INEQUAL, NOT, GREATER, LESSER, STOI, STOD, TOSTRING, FUN, RETURN, ENDFUN, PUSHARG, CALL, STRUCT, ENDSTRUCT, INIT, USE, EXTERN, CREATELABEL, PAUSE, DROP
|
||||
IF, JUMP, END, INPUT, PRINT, PRINTLN, SET, GETTYPE, EXISTS, SETLIST, SETLISTAT, GETLISTAT, GETLISTSIZE, LISTAPPEND, GETSTRSIZE, GETSTRCHARAT, ADD, SUBTRACT, MULTIPLY, DIVIDE, EQUAL, INEQUAL, NOT, GREATER, LESSER, STOI, STOD, TOSTRING, FUN, RETURN, ENDFUN, PUSHARG, CALL, STRUCT, ENDSTRUCT, INIT, USE, EXTERN, CREATELABEL, PAUSE, DROP, ERRORCMD
|
||||
} GroundInstType;
|
||||
|
||||
typedef enum GroundValueType {
|
||||
INT, DOUBLE, STRING, CHAR, BOOL, LIST, FUNCTION, CUSTOM, NONE
|
||||
INT, DOUBLE, STRING, CHAR, BOOL, LIST, FUNCTION, STRUCTVAL, CUSTOM, ERROR, NONE
|
||||
} GroundValueType;
|
||||
|
||||
typedef enum GroundArgType {
|
||||
@@ -41,6 +42,17 @@ typedef struct List {
|
||||
struct GroundValue* values;
|
||||
} List;
|
||||
|
||||
/*
|
||||
* Stores data associated with an error thrown during Ground execution.
|
||||
*/
|
||||
typedef struct GroundError {
|
||||
char* what;
|
||||
char* type;
|
||||
struct GroundInstruction* where;
|
||||
size_t line;
|
||||
bool hasLine;
|
||||
} GroundError;
|
||||
|
||||
/*
|
||||
* Stores literal values created in a Ground program.
|
||||
*/
|
||||
@@ -53,8 +65,10 @@ typedef struct GroundValue {
|
||||
char charVal;
|
||||
bool boolVal;
|
||||
List listVal;
|
||||
GroundError errorVal;
|
||||
struct GroundFunction* fnVal;
|
||||
void* customVal;
|
||||
struct GroundStruct* structVal;
|
||||
struct GroundObject* customVal;
|
||||
} data;
|
||||
} GroundValue;
|
||||
|
||||
@@ -115,6 +129,39 @@ typedef struct GroundFunction {
|
||||
size_t startLine;
|
||||
} GroundFunction;
|
||||
|
||||
/*
|
||||
* Field for a GroundStruct
|
||||
*/
|
||||
typedef struct GroundStructField {
|
||||
char id[64];
|
||||
GroundValue value;
|
||||
UT_hash_handle hh;
|
||||
} GroundStructField;
|
||||
|
||||
/*
|
||||
* Represents a Ground struct.
|
||||
*/
|
||||
typedef struct GroundStruct {
|
||||
GroundStructField* fields;
|
||||
size_t size;
|
||||
} GroundStruct;
|
||||
|
||||
/*
|
||||
* Field for a GroundObject
|
||||
*/
|
||||
typedef struct GroundObjectField {
|
||||
char id[64];
|
||||
GroundValue value;
|
||||
UT_hash_handle hh;
|
||||
} GroundObjectField;
|
||||
|
||||
/*
|
||||
* Represents an initialised Ground struct.
|
||||
*/
|
||||
typedef struct GroundObject {
|
||||
GroundObjectField* fields;
|
||||
} GroundObject;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -133,6 +180,9 @@ GroundValue groundCreateValue(GroundValueType type, ...);
|
||||
|
||||
GroundProgram groundParseFile(const char* code);
|
||||
|
||||
GroundStruct groundCreateStruct();
|
||||
void groundAddFieldToStruct(GroundStruct* gstruct, char* name, GroundValue field);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
152
libs/math/math.c
152
libs/math/math.c
@@ -1,5 +1,12 @@
|
||||
#include <groundext.h>
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <limits.h>
|
||||
#include <float.h>
|
||||
|
||||
|
||||
GroundValue ground_sin(GroundScope* scope, List args) {
|
||||
return groundCreateValue(
|
||||
@@ -21,19 +28,15 @@ GroundValue ground_tan(GroundScope* scope, List args) {
|
||||
}
|
||||
|
||||
GroundValue rad_to_deg(GroundScope* scope, List args) {
|
||||
double radians = args.values[0].data.doubleVal;
|
||||
|
||||
return groundCreateValue(
|
||||
DOUBLE,
|
||||
radians * (180.0 / M_PI)
|
||||
args.values[0].data.doubleVal * (180.0 / M_PI)
|
||||
);
|
||||
}
|
||||
GroundValue deg_to_rad(GroundScope* scope, List args) {
|
||||
double deg = args.values[0].data.doubleVal;
|
||||
|
||||
return groundCreateValue(
|
||||
DOUBLE,
|
||||
deg * (M_PI / 180.0)
|
||||
args.values[0].data.doubleVal * (M_PI / 180.0)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -62,16 +65,149 @@ GroundValue ground_sqrt(GroundScope* scope, List args) {
|
||||
);
|
||||
}
|
||||
|
||||
GroundValue ground_abs(GroundScope* scope, List args) {
|
||||
return groundCreateValue(
|
||||
DOUBLE,
|
||||
abs(args.values[0].data.doubleVal)
|
||||
);
|
||||
}
|
||||
GroundValue ground_min(GroundScope* scope, List args) {
|
||||
double a = args.values[0].data.doubleVal;
|
||||
double b = args.values[1].data.doubleVal;
|
||||
|
||||
return groundCreateValue(
|
||||
DOUBLE,
|
||||
(a < b) ? a : b
|
||||
);
|
||||
}
|
||||
GroundValue ground_max(GroundScope* scope, List args) {
|
||||
double a = args.values[0].data.doubleVal;
|
||||
double b = args.values[1].data.doubleVal;
|
||||
|
||||
return groundCreateValue(
|
||||
DOUBLE,
|
||||
(a > b) ? a : b
|
||||
);
|
||||
}
|
||||
GroundValue ground_clamp(GroundScope* scope, List args) {
|
||||
double number = args.values[0].data.doubleVal;
|
||||
double min = args.values[1].data.doubleVal;
|
||||
double max = args.values[2].data.doubleVal;
|
||||
|
||||
if (number < min) number = min;
|
||||
if (number > max) number = max;
|
||||
|
||||
return groundCreateValue(
|
||||
DOUBLE,
|
||||
number
|
||||
);
|
||||
}
|
||||
|
||||
GroundValue ground_round(GroundScope* scope, List args) {
|
||||
double x = args.values[0].data.doubleVal;
|
||||
|
||||
if (x >= 0.0)
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
(long long)(x + 0.5)
|
||||
);
|
||||
else
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
(long long)(x - 0.5)
|
||||
);
|
||||
}
|
||||
GroundValue ground_floor(GroundScope* scope, List args) {
|
||||
double x = args.values[0].data.doubleVal;
|
||||
|
||||
if (x >= (double)LLONG_MAX) return groundCreateValue(INT, LLONG_MAX);
|
||||
if (x <= (double)LLONG_MIN) return groundCreateValue(INT, LLONG_MIN);
|
||||
|
||||
long long i = (long long)x; // truncates toward zero
|
||||
|
||||
if (x < 0 && x != (double)i) {
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
i-1
|
||||
);
|
||||
}
|
||||
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
i
|
||||
);
|
||||
}
|
||||
GroundValue ground_ceil(GroundScope* scope, List args) {
|
||||
double x = args.values[0].data.doubleVal;
|
||||
|
||||
if (x >= (double)LLONG_MAX) return groundCreateValue(INT, LLONG_MAX);
|
||||
if (x <= (double)LLONG_MIN) return groundCreateValue(INT, LLONG_MIN);
|
||||
|
||||
|
||||
long long i = (long long)x; // truncates toward zero
|
||||
|
||||
if (x > 0 && x != (double)i) {
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
i+1
|
||||
);
|
||||
}
|
||||
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
i
|
||||
);
|
||||
}
|
||||
|
||||
GroundValue ground_random(GroundScope* scope, List args) {
|
||||
int64_t min = args.values[0].data.intVal;
|
||||
int64_t max = args.values[1].data.intVal;
|
||||
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
min + rand() % (max - min)
|
||||
);
|
||||
}
|
||||
GroundValue ground_random_double(GroundScope* scope, List args) {
|
||||
double min = args.values[0].data.doubleVal;
|
||||
double max = args.values[1].data.doubleVal;
|
||||
|
||||
return groundCreateValue(
|
||||
DOUBLE,
|
||||
min + (double)rand() / RAND_MAX * (max - min)
|
||||
);
|
||||
}
|
||||
GroundValue ground_random_set_seed(GroundScope* scope, List args) {
|
||||
srand(args.values[0].data.intVal);
|
||||
return groundCreateValue(
|
||||
INT,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
void ground_init(GroundScope* scope) {
|
||||
srand((unsigned)time(NULL) ^ (unsigned)clock());
|
||||
|
||||
groundAddNativeFunction(scope, "math_Sin", ground_sin, DOUBLE, 1, DOUBLE, "radians");
|
||||
groundAddNativeFunction(scope, "math_Cos", ground_cos, DOUBLE, 1, DOUBLE, "radians");
|
||||
groundAddNativeFunction(scope, "math_Tan", ground_tan, DOUBLE, 1, DOUBLE, "radians");
|
||||
|
||||
groundAddNativeFunction(scope, "math_DegreesToRadians", deg_to_rad, DOUBLE, 1, DOUBLE, "degrees");
|
||||
groundAddNativeFunction(scope, "math_RadiansToDegrees", rad_to_deg, DOUBLE, 1, DOUBLE, "radians");
|
||||
|
||||
groundAddNativeFunction(scope, "math_Modulos", ground_modulos, DOUBLE, 2, DOUBLE, "number1", DOUBLE, "number2");
|
||||
groundAddNativeFunction(scope, "math_Pow", ground_pow, DOUBLE, 2, DOUBLE, "number1", DOUBLE, "number2");
|
||||
|
||||
groundAddNativeFunction(scope, "math_Sqrt", ground_sqrt, DOUBLE, 1, DOUBLE, "number");
|
||||
|
||||
groundAddNativeFunction(scope, "math_Abs", ground_abs, DOUBLE, 1, DOUBLE, "number");
|
||||
groundAddNativeFunction(scope, "math_Min", ground_min, DOUBLE, 2, DOUBLE, "number1", DOUBLE, "number2");
|
||||
groundAddNativeFunction(scope, "math_Max", ground_max, DOUBLE, 2, DOUBLE, "number1", DOUBLE, "number2");
|
||||
groundAddNativeFunction(scope, "math_Clamp", ground_clamp, DOUBLE, 2, DOUBLE, "number", DOUBLE, "min", DOUBLE, "max");
|
||||
|
||||
groundAddNativeFunction(scope, "math_Round", ground_round, INT, 1, DOUBLE, "number");
|
||||
groundAddNativeFunction(scope, "math_Floor", ground_floor, INT, 1, DOUBLE, "number");
|
||||
groundAddNativeFunction(scope, "math_Ceil", ground_ceil, INT, 1, DOUBLE, "number");
|
||||
|
||||
groundAddNativeFunction(scope, "math_Random", ground_random, INT, 2, INT, "min", INT, "max");
|
||||
groundAddNativeFunction(scope, "math_RandomDouble", ground_random_double, DOUBLE, 2, DOUBLE, "min", DOUBLE, "max");
|
||||
groundAddNativeFunction(scope, "math_RandomSetSeed", ground_random_set_seed, INT, 1, INT, "seed");
|
||||
}
|
||||
@@ -78,19 +78,15 @@ GroundValue groundCreateValue(GroundValueType type, ...) {
|
||||
*gv.data.structVal = va_arg(args, GroundStruct);
|
||||
return gv;
|
||||
}
|
||||
case CUSTOM: {
|
||||
// FIXME do this later lmao
|
||||
return createNoneGroundValue();
|
||||
break;
|
||||
}
|
||||
case ERROR: {
|
||||
return createErrorGroundValue(va_arg(args, GroundError));
|
||||
break;
|
||||
}
|
||||
case NONE: {
|
||||
return createNoneGroundValue();
|
||||
break;
|
||||
}
|
||||
case ERROR:
|
||||
case CUSTOM: {
|
||||
// FIXME
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return createNoneGroundValue();
|
||||
|
||||
Reference in New Issue
Block a user