BOOL xyzsh_eval(int* rcode, char* cmd, char* source_name, fXyzshJobDone xyzsh_job_done_, sObject* nextin, sObject* nextout, int argc, char** argv, sObject* current_object) { string_put(gErrMsg, ""); xyzsh_job_done = xyzsh_job_done_; stack_start_stack(); sObject* block = BLOCK_NEW_STACK(); int sline = 1; if(parse(cmd, source_name, &sline, block, NULL)) { xyzsh_set_signal(); sObject* fun = FUN_NEW_STACK(NULL); sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); vector_add(gStackFrames, stackframe); //uobject_init(stackframe); SFUN(fun).mLocalObjects = stackframe; sObject* argv2 = VECTOR_NEW_GC(16, FALSE); int i; for(i=0; i<argc; i++) { vector_add(argv2, STRING_NEW_GC(argv[i], FALSE)); } uobject_put(SFUN(fun).mLocalObjects, "ARGV", argv2); if(!run(block, nextin, nextout, rcode, current_object, fun)) { xyzsh_restore_signal_default(); (void)vector_pop_back(gStackFrames); stack_end_stack(); /// wait background job xyzsh_wait_background_job(); return FALSE; } xyzsh_restore_signal_default(); (void)vector_pop_back(gStackFrames); stack_end_stack(); } else { stack_end_stack(); /// wait background job xyzsh_wait_background_job(); return FALSE; } /// wait background job xyzsh_wait_background_job(); return TRUE; }
BOOL xyzsh_load_file(char* fname, char** argv, int argc, sObject* current_object) { xyzsh_set_signal_optc(); sRunInfo runinfo; memset(&runinfo, 0, sizeof(sRunInfo)); runinfo.mSName = "xyzsh"; runinfo.mCurrentObject = current_object; if(!load_file(fname, gStdin, gStdout, &runinfo, argv, argc)) { if(runinfo.mRCode == RCODE_BREAK) { fprintf(stderr, "invalid break. Not in a loop\n"); xyzsh_restore_signal_default(); return FALSE; } else if(runinfo.mRCode & RCODE_RETURN) { fprintf(stderr, "invalid return. Not in a function\n"); xyzsh_restore_signal_default(); return FALSE; } else if(runinfo.mRCode == RCODE_EXIT) { } else { fprintf(stderr, "run time error\n"); fprintf(stderr, "%s", string_c_str(gErrMsg)); xyzsh_restore_signal_default(); return FALSE; } } if(runinfo.mRCode != 0) { fprintf(stderr, "return code is %d\n", runinfo.mRCode); } xyzsh_restore_signal_default(); return TRUE; }
void xyzsh_opt_c(char* cmd, char** argv, int argc) { stack_start_stack(); int rcode = 0; sObject* block = BLOCK_NEW_STACK(); int sline = 1; if(parse(cmd, "xyzsh", &sline, block, NULL)) { xyzsh_set_signal_optc(); sObject* fun = FUN_NEW_STACK(NULL); sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); vector_add(gStackFrames, stackframe); //uobject_init(stackframe); SFUN(fun).mLocalObjects = stackframe; sObject* argv2 = VECTOR_NEW_GC(16, FALSE); int i; for(i=0; i<argc; i++) { vector_add(argv2, STRING_NEW_GC(argv[i], FALSE)); } uobject_put(SFUN(fun).mLocalObjects, "ARGV", argv2); if(!run(block, gStdin, gStdout, &rcode, gRootObject, fun)) { if(rcode == RCODE_BREAK) { fprintf(stderr, "invalid break. Not in a loop\n"); } else if(rcode & RCODE_RETURN) { fprintf(stderr, "invalid return. Not in a function\n"); } else if(rcode == RCODE_EXIT) { } else { fprintf(stderr, "run time error\n"); fprintf(stderr, "%s", string_c_str(gErrMsg)); } } (void)vector_pop_back(gStackFrames); xyzsh_restore_signal_default(); } else { fprintf(stderr, "parser error\n"); fprintf(stderr, "%s", string_c_str(gErrMsg)); } if(rcode != 0) { fprintf(stderr, "return code is %d\n", rcode); } stack_end_stack(); }
void xyzsh_read_rc_core(char* path) { xyzsh_set_signal_optc(); sRunInfo runinfo; char** argv = NULL; int argc = 0; if(path && access(path, R_OK) == 0) { memset(&runinfo, 0, sizeof(sRunInfo)); runinfo.mSName = path; runinfo.mCurrentObject = gRootObject; if(!load_file(path, gStdin, gStdout, &runinfo, argv, argc)) { if(runinfo.mRCode == RCODE_BREAK) { fprintf(stderr, "invalid break. Not in a loop\n"); exit(1); } else if(runinfo.mRCode & RCODE_RETURN) { fprintf(stderr, "invalid return. Not in a function\n"); exit(1); } else if(runinfo.mRCode == RCODE_EXIT) { } else { fprintf(stderr, "run time error\n"); fprintf(stderr, "%s", string_c_str(gErrMsg)); exit(1); } } if(runinfo.mRCode != 0) { fprintf(stderr, "return code is %d\n", runinfo.mRCode); exit(1); } } xyzsh_restore_signal_default(); }
// EOF --> rcode == -2 // errors --> rcode == -1 BOOL xyzsh_readline_interface_onetime(int* rcode, char* cmdline, int cursor_pos, char* source_name, char** argv, int argc, fXyzshJobDone xyzsh_job_done_) { /// start interactive shell /// xyzsh_job_done = xyzsh_job_done_; /// edit line /// char* buf = ALLOC run_editline(cmdline, cursor_pos); /// run /// if(buf == NULL) { *rcode = -2; /// wait background job xyzsh_wait_background_job(); } else if(*buf) { stack_start_stack(); sObject* block = BLOCK_NEW_STACK(); int sline = 1; if(parse(buf, "xyzsh", &sline, block, NULL)) { xyzsh_set_signal(); sObject* fun = FUN_NEW_STACK(NULL); sObject* stackframe = UOBJECT_NEW_GC(8, gXyzshObject, "_stackframe", FALSE); vector_add(gStackFrames, stackframe); //uobject_init(stackframe); SFUN(fun).mLocalObjects = stackframe; sObject* argv2 = VECTOR_NEW_GC(16, FALSE); int i; for(i=0; i<argc; i++) { vector_add(argv2, STRING_NEW_GC(argv[i], FALSE)); } uobject_put(SFUN(fun).mLocalObjects, "ARGV", argv2); if(!run(block, gStdin, gStdout, rcode, gCurrentObject, fun)) { xyzsh_restore_signal_default(); if(*rcode == RCODE_BREAK) { fprintf(stderr, "invalid break. Not in a loop\n"); } else if(*rcode & RCODE_RETURN) { fprintf(stderr, "invalid return. Not in a function\n"); } else if(*rcode == RCODE_EXIT) { } else { fprintf(stderr, "run time error\n"); fprintf(stderr, "%s", string_c_str(gErrMsg)); } if(*rcode != 0) { fprintf(stderr, "return code is %d\n", *rcode); } (void)vector_pop_back(gStackFrames); stack_end_stack(); /// wait background job xyzsh_wait_background_job(); FREE(buf); return FALSE; } (void)vector_pop_back(gStackFrames); } else { xyzsh_restore_signal_default(); fprintf(stderr, "parser error\n"); fprintf(stderr, "%s", string_c_str(gErrMsg)); if(*rcode != 0) { fprintf(stderr, "return code is %d\n", *rcode); } stack_end_stack(); /// wait background job xyzsh_wait_background_job(); FREE(buf); return FALSE; } if(*rcode != 0) { fprintf(stderr, "return code is %d\n", *rcode); } stack_end_stack(); /// wait background job xyzsh_wait_background_job(); FREE(buf); } return TRUE; }