forked from ground/cground
Merge branch 'master' into unstable
This commit is contained in:
@@ -14,17 +14,6 @@ extern "C" {
|
|||||||
struct GroundScope;
|
struct GroundScope;
|
||||||
typedef struct GroundScope 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.
|
// Creates a GroundValue containing (in), with type ERROR.
|
||||||
GroundValue createErrorGroundValue(GroundError in);
|
GroundValue createErrorGroundValue(GroundError in);
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,14 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <uthash.h>
|
||||||
|
|
||||||
typedef enum GroundInstType {
|
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;
|
} GroundInstType;
|
||||||
|
|
||||||
typedef enum GroundValueType {
|
typedef enum GroundValueType {
|
||||||
INT, DOUBLE, STRING, CHAR, BOOL, LIST, FUNCTION, CUSTOM, NONE
|
INT, DOUBLE, STRING, CHAR, BOOL, LIST, FUNCTION, STRUCTVAL, CUSTOM, ERROR, NONE
|
||||||
} GroundValueType;
|
} GroundValueType;
|
||||||
|
|
||||||
typedef enum GroundArgType {
|
typedef enum GroundArgType {
|
||||||
@@ -41,6 +42,17 @@ typedef struct List {
|
|||||||
struct GroundValue* values;
|
struct GroundValue* values;
|
||||||
} List;
|
} 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.
|
* Stores literal values created in a Ground program.
|
||||||
*/
|
*/
|
||||||
@@ -53,8 +65,10 @@ typedef struct GroundValue {
|
|||||||
char charVal;
|
char charVal;
|
||||||
bool boolVal;
|
bool boolVal;
|
||||||
List listVal;
|
List listVal;
|
||||||
|
GroundError errorVal;
|
||||||
struct GroundFunction* fnVal;
|
struct GroundFunction* fnVal;
|
||||||
void* customVal;
|
struct GroundStruct* structVal;
|
||||||
|
struct GroundObject* customVal;
|
||||||
} data;
|
} data;
|
||||||
} GroundValue;
|
} GroundValue;
|
||||||
|
|
||||||
@@ -115,6 +129,39 @@ typedef struct GroundFunction {
|
|||||||
size_t startLine;
|
size_t startLine;
|
||||||
} GroundFunction;
|
} 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
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -133,6 +180,9 @@ GroundValue groundCreateValue(GroundValueType type, ...);
|
|||||||
|
|
||||||
GroundProgram groundParseFile(const char* code);
|
GroundProgram groundParseFile(const char* code);
|
||||||
|
|
||||||
|
GroundStruct groundCreateStruct();
|
||||||
|
void groundAddFieldToStruct(GroundStruct* gstruct, char* name, GroundValue field);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
152
libs/math/math.c
152
libs/math/math.c
@@ -1,5 +1,12 @@
|
|||||||
#include <groundext.h>
|
#include <groundext.h>
|
||||||
#include <math.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) {
|
GroundValue ground_sin(GroundScope* scope, List args) {
|
||||||
return groundCreateValue(
|
return groundCreateValue(
|
||||||
@@ -21,19 +28,15 @@ GroundValue ground_tan(GroundScope* scope, List args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GroundValue rad_to_deg(GroundScope* scope, List args) {
|
GroundValue rad_to_deg(GroundScope* scope, List args) {
|
||||||
double radians = args.values[0].data.doubleVal;
|
|
||||||
|
|
||||||
return groundCreateValue(
|
return groundCreateValue(
|
||||||
DOUBLE,
|
DOUBLE,
|
||||||
radians * (180.0 / M_PI)
|
args.values[0].data.doubleVal * (180.0 / M_PI)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
GroundValue deg_to_rad(GroundScope* scope, List args) {
|
GroundValue deg_to_rad(GroundScope* scope, List args) {
|
||||||
double deg = args.values[0].data.doubleVal;
|
|
||||||
|
|
||||||
return groundCreateValue(
|
return groundCreateValue(
|
||||||
DOUBLE,
|
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) {
|
void ground_init(GroundScope* scope) {
|
||||||
|
srand((unsigned)time(NULL) ^ (unsigned)clock());
|
||||||
|
|
||||||
groundAddNativeFunction(scope, "math_Sin", ground_sin, DOUBLE, 1, DOUBLE, "radians");
|
groundAddNativeFunction(scope, "math_Sin", ground_sin, DOUBLE, 1, DOUBLE, "radians");
|
||||||
groundAddNativeFunction(scope, "math_Cos", ground_cos, 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_Tan", ground_tan, DOUBLE, 1, DOUBLE, "radians");
|
||||||
|
|
||||||
groundAddNativeFunction(scope, "math_DegreesToRadians", deg_to_rad, DOUBLE, 1, DOUBLE, "degrees");
|
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_RadiansToDegrees", rad_to_deg, DOUBLE, 1, DOUBLE, "radians");
|
||||||
|
|
||||||
groundAddNativeFunction(scope, "math_Modulos", ground_modulos, DOUBLE, 2, DOUBLE, "number1", DOUBLE, "number2");
|
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_Pow", ground_pow, DOUBLE, 2, DOUBLE, "number1", DOUBLE, "number2");
|
||||||
|
|
||||||
groundAddNativeFunction(scope, "math_Sqrt", ground_sqrt, DOUBLE, 1, DOUBLE, "number");
|
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);
|
*gv.data.structVal = va_arg(args, GroundStruct);
|
||||||
return gv;
|
return gv;
|
||||||
}
|
}
|
||||||
case CUSTOM: {
|
|
||||||
// FIXME do this later lmao
|
|
||||||
return createNoneGroundValue();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ERROR: {
|
|
||||||
return createErrorGroundValue(va_arg(args, GroundError));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case NONE: {
|
case NONE: {
|
||||||
return createNoneGroundValue();
|
return createNoneGroundValue();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ERROR:
|
||||||
|
case CUSTOM: {
|
||||||
|
// FIXME
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return createNoneGroundValue();
|
return createNoneGroundValue();
|
||||||
|
|||||||
Reference in New Issue
Block a user