2015-06-10 15:37:21 -04:00
|
|
|
/* */
|
2011-02-17 02:11:20 -05:00
|
|
|
#include "../interpreter.h"
|
2010-06-13 08:29:45 -04:00
|
|
|
|
|
|
|
|
2013-03-16 03:39:34 -04:00
|
|
|
static int Stdlib_ZeroValue = 0;
|
2010-06-13 08:29:45 -04:00
|
|
|
|
2015-06-10 14:38:54 -04:00
|
|
|
|
2010-06-13 10:39:20 -04:00
|
|
|
void StdlibAtof(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->FP = atof(Param[0]->Val->Pointer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibAtoi(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Integer = atoi(Param[0]->Val->Pointer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibAtol(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Integer = atol(Param[0]->Val->Pointer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibStrtod(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->FP = strtod(Param[0]->Val->Pointer, Param[1]->Val->Pointer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibStrtol(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Integer = strtol(Param[0]->Val->Pointer, Param[1]->Val->Pointer, Param[2]->Val->Integer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibStrtoul(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Integer = strtoul(Param[0]->Val->Pointer, Param[1]->Val->Pointer, Param[2]->Val->Integer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
2010-06-13 08:29:45 -04:00
|
|
|
void StdlibMalloc(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Pointer = malloc(Param[0]->Val->Integer);
|
2010-06-13 08:29:45 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibCalloc(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Pointer = calloc(Param[0]->Val->Integer, Param[1]->Val->Integer);
|
2010-06-13 08:29:45 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibRealloc(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Pointer = realloc(Param[0]->Val->Pointer, Param[1]->Val->Integer);
|
2010-06-13 08:29:45 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibFree(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
free(Param[0]->Val->Pointer);
|
2010-06-13 08:29:45 -04:00
|
|
|
}
|
|
|
|
|
2010-06-13 10:39:20 -04:00
|
|
|
void StdlibRand(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
ReturnValue->Val->Integer = rand();
|
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibSrand(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
srand(Param[0]->Val->Integer);
|
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibAbort(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
ProgramFail(Parser, "abort");
|
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibExit(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2012-09-22 01:11:44 -04:00
|
|
|
PlatformExit(Parser->pc, Param[0]->Val->Integer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibGetenv(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Pointer = getenv(Param[0]->Val->Pointer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibSystem(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
2010-06-13 10:41:03 -04:00
|
|
|
ReturnValue->Val->Integer = system(Param[0]->Val->Pointer);
|
2010-06-13 10:39:20 -04:00
|
|
|
}
|
|
|
|
|
2010-06-13 10:55:18 -04:00
|
|
|
#if 0
|
|
|
|
void StdlibBsearch(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
ReturnValue->Val->Pointer = bsearch(Param[0]->Val->Pointer, Param[1]->Val->Pointer, Param[2]->Val->Integer, Param[3]->Val->Integer, (int (*)())Param[4]->Val->Pointer);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void StdlibAbs(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
ReturnValue->Val->Integer = abs(Param[0]->Val->Integer);
|
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibLabs(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
ReturnValue->Val->Integer = labs(Param[0]->Val->Integer);
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
void StdlibDiv(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
ReturnValue->Val->Integer = div(Param[0]->Val->Integer, Param[1]->Val->Integer);
|
|
|
|
}
|
|
|
|
|
|
|
|
void StdlibLdiv(struct ParseState *Parser, struct Value *ReturnValue, struct Value **Param, int NumArgs)
|
|
|
|
{
|
|
|
|
ReturnValue->Val->Integer = ldiv(Param[0]->Val->Integer, Param[1]->Val->Integer);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
/* handy structure definitions */
|
|
|
|
const char StdlibDefs[] = "\
|
|
|
|
typedef struct { \
|
|
|
|
int quot, rem; \
|
|
|
|
} div_t; \
|
|
|
|
\
|
|
|
|
typedef struct { \
|
|
|
|
int quot, rem; \
|
|
|
|
} ldiv_t; \
|
|
|
|
";
|
|
|
|
#endif
|
|
|
|
|
2010-06-13 08:29:45 -04:00
|
|
|
/* all stdlib.h functions */
|
|
|
|
struct LibraryFunction StdlibFunctions[] =
|
|
|
|
{
|
2015-06-09 03:45:00 -04:00
|
|
|
{StdlibAtof, "float atof(char *);"},
|
|
|
|
{StdlibStrtod, "float strtod(char *,char **);"},
|
|
|
|
{StdlibAtoi, "int atoi(char *);"},
|
|
|
|
{StdlibAtol, "int atol(char *);"},
|
|
|
|
{StdlibStrtol, "int strtol(char *,char **,int);"},
|
|
|
|
{StdlibStrtoul, "int strtoul(char *,char **,int);"},
|
|
|
|
{StdlibMalloc, "void *malloc(int);"},
|
|
|
|
{StdlibCalloc, "void *calloc(int,int);"},
|
|
|
|
{StdlibRealloc, "void *realloc(void *,int);"},
|
|
|
|
{StdlibFree, "void free(void *);"},
|
|
|
|
{StdlibRand, "int rand();"},
|
|
|
|
{StdlibSrand, "void srand(int);"},
|
|
|
|
{StdlibAbort, "void abort();"},
|
|
|
|
{StdlibExit, "void exit(int);"},
|
|
|
|
{StdlibGetenv, "char *getenv(char *);"},
|
|
|
|
{StdlibSystem, "int system(char *);"},
|
|
|
|
/* {StdlibBsearch, "void *bsearch(void *,void *,int,int,int (*)());"}, */
|
|
|
|
/* {StdlibQsort, "void *qsort(void *,int,int,int (*)());"}, */
|
|
|
|
{StdlibAbs, "int abs(int);"},
|
|
|
|
{StdlibLabs, "int labs(int);"},
|
2010-06-13 10:55:18 -04:00
|
|
|
#if 0
|
2015-06-09 03:45:00 -04:00
|
|
|
{StdlibDiv, "div_t div(int);"},
|
|
|
|
{StdlibLdiv, "ldiv_t ldiv(int);"},
|
2010-06-13 10:55:18 -04:00
|
|
|
#endif
|
2015-06-09 03:45:00 -04:00
|
|
|
{NULL, NULL}
|
2010-06-13 08:29:45 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
/* creates various system-dependent definitions */
|
2012-09-22 01:11:44 -04:00
|
|
|
void StdlibSetupFunc(Picoc *pc)
|
2010-06-13 08:29:45 -04:00
|
|
|
{
|
2010-06-13 10:17:29 -04:00
|
|
|
/* define NULL, TRUE and FALSE */
|
2012-09-22 01:11:44 -04:00
|
|
|
if (!VariableDefined(pc, TableStrRegister(pc, "NULL")))
|
2015-06-10 15:24:53 -04:00
|
|
|
VariableDefinePlatformVar(pc, NULL, "NULL", &pc->IntType, (union AnyValue *)&Stdlib_ZeroValue, false);
|
2010-06-13 08:29:45 -04:00
|
|
|
}
|
|
|
|
|