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 00:51:07 +00:00
|
|
|
struct returnobject *fopenWrapper(struct scopeobject *scope)
|
|
|
|
{
|
2013-02-24 07:40:58 +00:00
|
|
|
IdentifierNode *id1 = createIdentifierNode(IT_DIRECT, (void *)copyString("filename"), NULL, NULL, 0);
|
|
|
|
ValueObject *val1 = getScopeValueLocal(scope, scope, id1);
|
|
|
|
IdentifierNode *id2 = createIdentifierNode(IT_DIRECT, (void *)copyString("mode"), NULL, NULL, 0);
|
|
|
|
ValueObject *val2 = getScopeValueLocal(scope, scope, id2);
|
|
|
|
char *filename = getString(val1);
|
|
|
|
char *mode = getString(val2);
|
|
|
|
|
|
|
|
FILE *f = fopen(filename, mode);
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
IdentifierNode *id1 = createIdentifierNode(IT_DIRECT, (void *)copyString("file"), NULL, NULL, 0);
|
|
|
|
ValueObject *val1 = getScopeValueLocal(scope, scope, id1);
|
|
|
|
IdentifierNode *id2 = createIdentifierNode(IT_DIRECT, (void *)copyString("length"), NULL, NULL, 0);
|
|
|
|
ValueObject *val2 = getScopeValueLocal(scope, scope, id2);
|
|
|
|
FILE *file = (FILE *)getBlob(val1);
|
|
|
|
int length = getInteger(val2);
|
|
|
|
|
|
|
|
char *buf = malloc((sizeof(char) * length) + 1);
|
|
|
|
fread(buf, 1, length, file);
|
|
|
|
buf[length] = '\0';
|
|
|
|
|
|
|
|
ValueObject *ret = createStringValueObject(buf);
|
|
|
|
return createReturnObject(RT_RETURN, ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct returnobject *fcloseWrapper(struct scopeobject *scope)
|
2013-02-24 00:51:07 +00:00
|
|
|
{
|
2013-02-24 07:40:58 +00:00
|
|
|
IdentifierNode *id1 = createIdentifierNode(IT_DIRECT, (void *)copyString("file"), NULL, NULL, 0);
|
|
|
|
ValueObject *val1 = getScopeValueLocal(scope, scope, id1);
|
|
|
|
FILE *file = (FILE *)getBlob(val1);
|
|
|
|
|
|
|
|
fclose(file);
|
|
|
|
return createReturnObject(RT_DEFAULT, NULL);
|
|
|
|
}
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
void loadBinding(ScopeObject *scope)
|
|
|
|
{
|
|
|
|
/* TODO: add error checking and handling */
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
/* stdio */
|
|
|
|
ScopeObject *stdio = createScopeObject(scope);
|
|
|
|
IdentifierNode* name_stdio = createIdentifierNode(IT_DIRECT, (void *)copyString("STDIO"), NULL, NULL, 0);
|
|
|
|
createScopeValue(scope, scope, name_stdio);
|
|
|
|
ValueObject *val_stdio = createArrayValueObject(stdio);
|
|
|
|
updateScopeValue(scope, scope, name_stdio, val_stdio);
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
/* fopen */
|
|
|
|
{
|
|
|
|
IdentifierNode* name = createIdentifierNode(IT_DIRECT, (void *)copyString("FOPENIN"), NULL, NULL, 0);
|
|
|
|
IdentifierNodeList *args = createIdentifierNodeList();
|
|
|
|
IdentifierNode *filename = createIdentifierNode(IT_DIRECT, (void *)copyString("filename"), NULL, NULL, 0);
|
|
|
|
IdentifierNode *mode = createIdentifierNode(IT_DIRECT, (void *)copyString("mode"), NULL, NULL, 0);
|
|
|
|
addIdentifierNode(args, filename);
|
|
|
|
addIdentifierNode(args, mode);
|
|
|
|
StmtNodeList *stmts = createStmtNodeList();
|
|
|
|
BindingStmtNode *binding = createBindingStmtNode(&fopenWrapper);
|
|
|
|
StmtNode *wrapper = createStmtNode(ST_BINDING, binding);
|
|
|
|
addStmtNode(stmts, wrapper);
|
|
|
|
BlockNode *body = createBlockNode(stmts);
|
|
|
|
/* TODO: should this first parameter be NULL? */
|
|
|
|
FuncDefStmtNode *interface = createFuncDefStmtNode(NULL, name, args, body);
|
|
|
|
ValueObject *val = createFunctionValueObject(interface);
|
|
|
|
createScopeValue(stdio, stdio, name);
|
|
|
|
updateScopeValue(stdio, stdio, name, val);
|
|
|
|
}
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
/* fread */
|
|
|
|
{
|
|
|
|
IdentifierNode* name = createIdentifierNode(IT_DIRECT, (void *)copyString("FREADIN"), NULL, NULL, 0);
|
|
|
|
IdentifierNodeList *args = createIdentifierNodeList();
|
|
|
|
IdentifierNode *filename = createIdentifierNode(IT_DIRECT, (void *)copyString("file"), NULL, NULL, 0);
|
|
|
|
IdentifierNode *mode = createIdentifierNode(IT_DIRECT, (void *)copyString("length"), NULL, NULL, 0);
|
|
|
|
addIdentifierNode(args, filename);
|
|
|
|
addIdentifierNode(args, mode);
|
|
|
|
StmtNodeList *stmts = createStmtNodeList();
|
|
|
|
BindingStmtNode *binding = createBindingStmtNode(&freadWrapper);
|
|
|
|
StmtNode *wrapper = createStmtNode(ST_BINDING, binding);
|
|
|
|
addStmtNode(stmts, wrapper);
|
|
|
|
BlockNode *body = createBlockNode(stmts);
|
|
|
|
/* TODO: should this first parameter be NULL? */
|
|
|
|
FuncDefStmtNode *interface = createFuncDefStmtNode(NULL, name, args, body);
|
|
|
|
ValueObject *val = createFunctionValueObject(interface);
|
|
|
|
createScopeValue(stdio, stdio, name);
|
|
|
|
updateScopeValue(stdio, stdio, name, val);
|
|
|
|
}
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
/* fclose */
|
|
|
|
{
|
|
|
|
IdentifierNode* name = createIdentifierNode(IT_DIRECT, (void *)copyString("FCLOSIN"), NULL, NULL, 0);
|
|
|
|
IdentifierNodeList *args = createIdentifierNodeList();
|
|
|
|
IdentifierNode *filename = createIdentifierNode(IT_DIRECT, (void *)copyString("file"), NULL, NULL, 0);
|
|
|
|
addIdentifierNode(args, filename);
|
|
|
|
StmtNodeList *stmts = createStmtNodeList();
|
|
|
|
BindingStmtNode *binding = createBindingStmtNode(&fcloseWrapper);
|
|
|
|
StmtNode *wrapper = createStmtNode(ST_BINDING, binding);
|
|
|
|
addStmtNode(stmts, wrapper);
|
|
|
|
BlockNode *body = createBlockNode(stmts);
|
|
|
|
FuncDefStmtNode *interface = createFuncDefStmtNode(NULL, name, args, body);
|
|
|
|
ValueObject *val = createFunctionValueObject(interface);
|
|
|
|
createScopeValue(stdio, stdio, name);
|
|
|
|
updateScopeValue(stdio, stdio, name, val);
|
|
|
|
}
|
2013-02-24 00:51:07 +00:00
|
|
|
|
2013-02-24 07:40:58 +00:00
|
|
|
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
|
|
|
}
|