Example #1
0
int
main (void)
{
  pthread_t t_snake;

  screen_init (2);
  create_task (&t_snake, snake, NULL, 500, 2, 1024);

  interp_run ();

  exit (0);
}
Example #2
0
int
ScriptEngine::Execute(void)
{
    int       ex_argc;
    object_t *ex_args;
    object_t  value = OBJECT_NULL;
        
    int r;
    while (1)
    {
        r = interp_run(&mInterp, value, &ex_argc, &ex_args);

        if (r <= 0)
            break;

        value = OBJECT_NULL;
        switch (r)
        {
        case VM_EXTERNAL_CALL:
        {
            if (OBJECT_TYPE(ex_args[0]) != OBJECT_TYPE_STRING) break;
            std::map<std::string, std::pair<external_function_t, void *> >::iterator
                it = mExCallMap.find(xstring_cstr(ex_args[0]->string));
            if (it != mExCallMap.end())
                value = it->second.first(it->second.second, ex_argc, ex_args);

            int i;
            for (i = 0; i != ex_argc; ++ i)
                interp_unprotect(&mInterp, ex_args[i]);
            
            break;
        }
        case VM_EXTERNAL_LOAD:
        {
            std::map<std::string, std::pair<external_var_op_t, void *> >::iterator
                it = mExVarMap.find(xstring_cstr(mInterp.ex->exp->load.name));
            if (it != mExVarMap.end())
                value = it->second.first(it->second.second, mInterp.ex->exp->load.name, NULL);
            break;
        }
        case VM_EXTERNAL_STORE:
        {
            std::map<std::string, std::pair<external_var_op_t, void *> >::iterator
                it = mExVarMap.find(xstring_cstr(mInterp.ex->exp->store.name));
            if (it != mExVarMap.end())
                value = it->second.first(it->second.second, mInterp.ex->exp->store.name, mInterp.ex->value);
            break;
        }
        case VM_EXTERNAL_CONSTANT:
        {
            std::map<std::string, object_t >::iterator
                it = mExConstMap.find(xstring_cstr(mInterp.ex->exp->constant.name));
            if (it != mExConstMap.end())
                value = it->second;
            break;
        }
        }
    }
        
    return r;
}
Example #3
0
int main(int argc, const char *args[])
{
    if (argc != 3)
    {
        printf("USAGE: %s [i|s|r] file\n", args[0]);
        return -1;
    }

    char mode = args[1][0];
    simple_stream_s s;
    ast_node_t n;
    interp_s __interp;
    interp_t interp = &__interp;
    object_t prog;
    
    switch (mode)
    {
    case 'i':
    case 's':

        simple_stream_open(&s, fopen(args[2], "r"));

        n = ast_simple_parse_char_stream((stream_in_f)simple_stream_in, &s);

        simple_stream_close(&s);

        if (n != NULL)
        {            

            if (mode == 'i')
            {
                ast_dump(n, stdout);
                ast_free(n);
                
                break;
            }
            
            ast_syntax_parse(n, 0);
            sematic_symref_analyse(n);
            
            ast_dump(n, stdout);
            ast_free(n);
        }

        break;

    case 'r':

        interp_initialize(interp, 16);
        
        simple_stream_open(&s, fopen(args[2], "r"));

        prog = interp_eval(interp, (stream_in_f)simple_stream_in, &s, NULL);

        simple_stream_close(&s);

        if (prog != NULL) interp_apply(interp, prog, 0, NULL);
        
        int       ex_argc = 0;
        object_t *ex_args;
        object_t  ex_ret = NULL;
        int i;

        object_t __me = interp_object_new(interp);
        __me->string = xstring_from_cstr("SEE interpreter", -1);
        OBJECT_TYPE_INIT(__me, OBJECT_TYPE_STRING);
        interp_protect(interp, __me);
        
        while (1)
        {
            int r = interp_run(interp, ex_ret, &ex_argc, &ex_args);
            if (r <= 0) break;
            
            switch (r)
            {
            case VM_EXTERNAL_CALL:
                ex_ret = OBJECT_NULL;
                /* An example for handling external calls: display */
                if (OBJECT_TYPE(ex_args[0]) == OBJECT_TYPE_STRING)
                {
                    if (xstring_equal_cstr(ex_args[0]->string, "display", -1))
                    {
                        for (i = 1; i != ex_argc; ++ i)
                        {
                            object_dump(ex_args[i], stdout);
                        }
                        printf("\n");
                    }
                }

                /* The caller should unprotect the ex arguments by themself */
                for (i = 0; i != ex_argc; ++ i)
                    interp_unprotect(interp, ex_args[i]);

                break;

            case VM_EXTERNAL_CONSTANT:
                /* An example for handling external constant. */
                /* remember that we should never create objects from
                 * heap for the external constant */
                if (xstring_equal_cstr(interp->ex->exp->constant.name, "#answer-to-the-universe", -1))
                    ex_ret = INT_BOX(42);
                else ex_ret = OBJECT_NULL;
                
                break;

            case VM_EXTERNAL_LOAD:
                /* Handling external load */
                ex_ret = OBJECT_NULL;
                if (xstring_equal_cstr(interp->ex->exp->load.name, "me", -1))
                {
                    ex_ret = __me;
                }
                break;

            case VM_EXTERNAL_STORE:
                /* Handler external store */
                ex_ret = OBJECT_NULL;
                if (xstring_equal_cstr(interp->ex->exp->store.name, "me", -1))
                {
                    fprintf(stderr, "Setting ``me'' is impossible\n");
                    fprintf(stderr, "VALUE: \n");
                    object_dump(interp->ex->value, stderr);
                    fprintf(stderr, "\n");
                }
                break;
                
            default:
                ex_ret = OBJECT_NULL;
                break;
            }
        }
        interp_uninitialize(interp);

        break;
        
    default:

        printf("ERROR OPTION\n");
        return -1;
    }

    return 0;
}