int a2_libdostring(struct a2_state* state){ int args = a2_top(state); if(args==0 || a2_type(state, 0)!=TSTRING) a2_err(state, "the arg must string type."); const char* str = a2_tostring(state, 0); if(a2_dostring(state, str, strlen(str))){ printf("%s\n", a2_tostring(state, a2_top(state)-1)); } return 0; }
int a2_libsystem(struct a2_state* state) { int args = a2_top(state); if(args==0 || a2_type(state, 0)!=TSTRING) a2_err(state, "the arg must string type."); const char* str = a2_tostring(state, 0); system(str); return 0; }
int a2_libdofile(struct a2_state* state){ int args = a2_top(state); if(args==0 || a2_type(state, 0)!=TSTRING) a2_err(state, "the arg must string type."); const char* filename = a2_tostring(state, 0); int top = a2_top(state); a2_loadfile(state, filename); return a2_top(state) - top; }
int a2_libdostring(struct a2_state* state){ int args = a2_top(state); if(args==0 || a2_type(state, 0)!=TSTRING) a2_err(state, "the arg must string type."); const char* str = a2_tostring(state, 0); int top = a2_top(state); a2_dostring(state, str, strlen(str)); return a2_top(state) - top; }
static void _command(struct a2_state* state){ for(;;){ char* str = NULL; if( NULL != (str = readline(">")) ){ if(str[0]=='='){ size_t sz = strlen(str)+7; char tmp [sz]; sprintf(tmp , "print(%s)", str+1); tmp[sz-1] = '\0'; if(a2_dostring(state, tmp, strlen(tmp))) printf("%s", a2_tostring(state, a2_top(state)-1)); }else{ if(a2_dostring(state, str, strlen(str))) printf("%s", a2_tostring(state, a2_top(state)-1)); } add_history(str); free(str); } } }
// print int a2_libprint(struct a2_state* state){ int args = a2_top(state); int i; for(i=0; i<args; i++){ switch(a2_type(state, i)){ case TNIL: printf("nil "); break; case TNUMBER: printf("%.14g ", a2_tonumber(state, i)); break; case TSTRING: printf("%s ", a2_tostring(state, i)); break; case TBOOL: printf("%s ", (a2_tobool(state, i))?("true"):("false")); break; case TCFUNCTION: printf("cfunc:%p ", a2_tocfunction(state, i)); break; case TCLOSURE: printf("closure:%p ", a2_topoint(state, i)); break; case TARRAY: printf("array:%p ", a2_topoint(state, i)); break; case TMAP: printf("map:%p ", a2_topoint(state, i)); break; default: assert(0); } } printf("\n"); return 0; }
static inline void _load(struct a2_state* state, const char* filename){ if(a2_loadfile(state, filename)){ printf("%s\n", a2_tostring(state, a2_top(state)-1)); } }