2013-02-24 00:51:07 +00:00
|
|
|
#include "binding.h"
|
|
|
|
|
|
|
|
struct returnobject;
|
|
|
|
struct scopeobject;
|
2013-02-24 07:40:58 +00:00
|
|
|
|
2013-02-24 20:44:33 +00:00
|
|
|
ValueObject *getArg(struct scopeobject *scope, char *name)
|
|
|
|
{
|
|
|
|
IdentifierNode *id = createIdentifierNode(IT_DIRECT, (void *)copyString(name), NULL, NULL, 0);
|
|
|
|
ValueObject *val = getScopeValueLocal(scope, scope, id);
|
|
|
|
deleteIdentifierNode(id);
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
2013-02-24 00:51:07 +00:00
|
|
|
struct returnobject *fopenWrapper(struct scopeobject *scope)
|
|
|
|
{
|
2013-02-24 20:44:33 +00:00
|
|
|
ValueObject *arg1 = getArg(scope, "filename");
|
|
|
|
ValueObject *arg2 = getArg(scope, "mode");
|
|
|
|
char *filename = getString(arg1);
|
|
|
|
char *mode = getString(arg2);
|
2013-02-24 07:40:58 +00:00
|
|
|
|
|
|
|
FILE *f = fopen(filename, mode);
|
2013-02-24 20:44:33 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
ValueObject *ret = createBlobValueObject(f);
|
|
|
|
return createReturnObject(RT_RETURN, ret);
|
2013-02-24 00:51:07 +00:00
|
|
|
}
|
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
struct returnobject *freadWrapper(struct scopeobject *scope)
|
|
|
|
{
|
2013-02-24 20:44:33 +00:00
|
|
|
ValueObject *arg1 = getArg(scope, "file");
|
|
|
|
ValueObject *arg2 = getArg(scope, "length");
|
|
|
|
FILE *file = (FILE *)getBlob(arg1);
|
|
|
|
int length = getInteger(arg2);
|
2013-02-24 07:40:58 +00:00
|
|
|
|
|
|
|
char *buf = malloc((sizeof(char) * length) + 1);
|
|
|
|
fread(buf, 1, length, file);
|
|
|
|
buf[length] = '\0';
|
|
|
|
|
|
|
|
ValueObject *ret = createStringValueObject(buf);
|
|
|
|
return createReturnObject(RT_RETURN, ret);
|
|
|
|
}
|
|
|
|
|
2013-02-25 05:00:07 +00:00
|
|
|
struct returnobject *fwriteWrapper(struct scopeobject *scope)
|
|
|
|
{
|
|
|
|
ValueObject *arg1 = getArg(scope, "file");
|
|
|
|
ValueObject *arg2 = getArg(scope, "data");
|
|
|
|
FILE *file = (FILE *)getBlob(arg1);
|
|
|
|
char *data = getString(arg2);
|
|
|
|
|
|
|
|
fwrite(data, 1, strlen(data), file);
|
|
|
|
|
|
|
|
return createReturnObject(RT_DEFAULT, NULL);
|
|
|
|
}
|
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
struct returnobject *fcloseWrapper(struct scopeobject *scope)
|
2013-02-24 00:51:07 +00:00
|
|
|
{
|
2013-02-24 20:44:33 +00:00
|
|
|
ValueObject *arg1 = getArg(scope, "file");
|
|
|
|
FILE *file = (FILE *)getBlob(arg1);
|
2013-02-24 07:40:58 +00:00
|
|
|
|
|
|
|
fclose(file);
|
2013-02-24 20:44:33 +00:00
|
|
|
deleteValueObject(arg1);
|
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
return createReturnObject(RT_DEFAULT, NULL);
|
|
|
|
}
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 20:44:33 +00:00
|
|
|
void loadLibrary(ScopeObject *scope, IdentifierNode *name)
|
2013-02-24 07:40:58 +00:00
|
|
|
{
|
2013-02-24 20:44:33 +00:00
|
|
|
/* TODO: make this select which library to load */
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
/* stdio */
|
2013-02-24 20:44:33 +00:00
|
|
|
ScopeObject *lib = createScopeObject(scope);
|
|
|
|
IdentifierNode* id = createIdentifierNode(IT_DIRECT, (void *)copyString("STDIO"), NULL, NULL, 0);
|
|
|
|
createScopeValue(scope, scope, id);
|
|
|
|
ValueObject *val = createArrayValueObject(lib);
|
|
|
|
updateScopeValue(scope, scope, id, val);
|
|
|
|
loadBinding(lib, "FOPENIN", "filename mode", &fopenWrapper);
|
|
|
|
loadBinding(lib, "FREADIN", "file length", &freadWrapper);
|
2013-02-25 05:00:07 +00:00
|
|
|
loadBinding(lib, "FWRITIN", "file data", &fwriteWrapper);
|
2013-02-24 20:44:33 +00:00
|
|
|
loadBinding(lib, "FCLOSIN", "file", &fcloseWrapper);
|
|
|
|
}
|
|
|
|
|
|
|
|
void loadBinding(ScopeObject *scope, char *name, const char *args, struct returnobject *(*binding)(struct scopeobject *))
|
|
|
|
{
|
|
|
|
/* TODO: add error checking and handling */
|
|
|
|
|
|
|
|
IdentifierNode* id = createIdentifierNode(IT_DIRECT, (void *)copyString(name), NULL, NULL, 0);
|
|
|
|
StmtNodeList *stmts = createStmtNodeList();
|
|
|
|
BindingStmtNode *stmt = createBindingStmtNode(binding);
|
|
|
|
StmtNode *wrapper = createStmtNode(ST_BINDING, stmt);
|
|
|
|
addStmtNode(stmts, wrapper);
|
|
|
|
BlockNode *body = createBlockNode(stmts);
|
|
|
|
|
|
|
|
IdentifierNodeList *ids = createIdentifierNodeList();
|
|
|
|
const char *start = args;
|
|
|
|
while (start != NULL) {
|
|
|
|
char *end = strchr(start, ' ');
|
|
|
|
char *temp = NULL;
|
|
|
|
unsigned int len = 0;
|
|
|
|
if (end != NULL) len = (end - start);
|
|
|
|
else len = strlen(start);
|
|
|
|
temp = malloc(sizeof(char) * (len + 1));
|
|
|
|
strncpy(temp, start, len);
|
|
|
|
temp[len] = '\0';
|
|
|
|
if (end != NULL) start = (end + 1);
|
|
|
|
else start = NULL;
|
|
|
|
IdentifierNode *arg = createIdentifierNode(IT_DIRECT, (void *)temp, NULL, NULL, 0);
|
|
|
|
addIdentifierNode(ids, arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
FuncDefStmtNode *interface = createFuncDefStmtNode(NULL, id, ids, body);
|
|
|
|
ValueObject *val = createFunctionValueObject(interface);
|
|
|
|
createScopeValue(scope, scope, id);
|
|
|
|
updateScopeValue(scope, scope, id, val);
|
|
|
|
return;
|
2013-02-24 00:51:07 +00:00
|
|
|
|
|
|
|
loadBindingAbort: /* Exception handling */
|
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
return;
|
2013-02-24 00:51:07 +00:00
|
|
|
}
|