void err_msg(char* msg, char* sname, int line) { char* tmp = MALLOC(strlen(sname) + 128 + strlen(msg)); snprintf(tmp, strlen(sname) + 128 + strlen(msg), "%s %d: %s\n", sname, line, msg); string_put(gErrMsg, tmp); FREE(tmp); }
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; }
int input_box(char* msg, char* result, int result_size, char* def_input, int def_cursor) { gInputBoxMsg = msg; int result2 = 0; gInputBoxCursor = def_cursor; string_put(gInputBoxInput, def_input); gView = input_box_view; while(1) { xclear(); view(); //input_box_view(); refresh(); /// input /// int meta; int key = xgetch(&meta); if(key == 10 || key == 13) { result2 = 0; break; } else if(key == 6 || key == KEY_RIGHT) { input_box_cursor_move(gInputBoxInput, &gInputBoxCursor, 1); } else if(key == 2 || key == KEY_LEFT) { input_box_cursor_move(gInputBoxInput, &gInputBoxCursor, -1); } else if(key == 8 || key == KEY_BACKSPACE) { // CTRL-H if(gInputBoxCursor > 0) { char* str2 = string_c_str(gInputBoxInput); int utfpos = str_pointer2kanjipos(gKanjiCode, str2, str2 + gInputBoxCursor); char* before_point = str_kanjipos2pointer(gKanjiCode, str2, utfpos-1); int new_cursor = before_point-str2; string_erase(gInputBoxInput, before_point - str2, (str2 + gInputBoxCursor) - before_point); gInputBoxCursor = new_cursor; } } else if(key == 4 || key == KEY_DC) { // CTRL-D DELETE char* str2 = string_c_str(gInputBoxInput); if(string_length(gInputBoxInput) > 0) { if(gInputBoxCursor < string_length(gInputBoxInput)) { int utfpos = str_pointer2kanjipos(gKanjiCode, str2, str2 + gInputBoxCursor); char* next_point = str_kanjipos2pointer(gKanjiCode, str2, utfpos+1); string_erase(gInputBoxInput, gInputBoxCursor, next_point - (str2 + gInputBoxCursor)); } } } else if(key == 1 || key == KEY_HOME) { // CTRL-A input_box_cursor_move(gInputBoxInput, &gInputBoxCursor, -999); } else if(key == 5 || key == KEY_END) { // CTRL-E input_box_cursor_move(gInputBoxInput, &gInputBoxCursor, 999); } else if(key == 11) { // CTRL-K string_erase(gInputBoxInput, gInputBoxCursor, string_length(gInputBoxInput)-gInputBoxCursor); } else if(key == 21) { // CTRL-U string_put(gInputBoxInput, ""); gInputBoxCursor = 0; } else if(key == 23) { // CTRL-W if(gInputBoxCursor > 0) { const char* s = string_c_str(gInputBoxInput); int pos = gInputBoxCursor-1; if(s[pos]==' ' || s[pos]=='/' || s[pos]=='\'' || s[pos]=='"') { while(pos>=0 && (s[pos]==' ' || s[pos]=='/' || s[pos]=='\'' || s[pos]=='"')) { pos--; } } while(pos>=0 && s[pos]!=' ' && s[pos]!='/' && s[pos]!='\'' && s[pos]!='"') { pos--; } string_erase(gInputBoxInput, pos+1, gInputBoxCursor-pos-1); gInputBoxCursor = pos+1; } } else if(meta==1 && key == 'd') { // Meta-d const char* s = string_c_str(gInputBoxInput); if(s[gInputBoxCursor] != 0) { int pos = gInputBoxCursor; pos++; while(s[pos]!=0 && (s[pos] == ' ' || s[pos] == '/' || s[pos] == '\'' || s[pos] == '"')) { pos++; } while(s[pos]!=0 && s[pos] != ' ' && s[pos] != '/' && s[pos] != '\'' && s[pos] != '"') { pos++; } string_erase(gInputBoxInput, gInputBoxCursor, pos-gInputBoxCursor); } } else if(meta==1 && key == 'b') { // META-b if(gInputBoxCursor > 0) { const char* s = string_c_str(gInputBoxInput); int pos = gInputBoxCursor; pos--; while(pos>=0 && (s[pos] == ' ' || s[pos] == '/' || s[pos] == '\'' || s[pos] == '"')) { pos--; } while(pos>=0 && s[pos] != ' ' && s[pos] != '/' && s[pos] != '\'' && s[pos] != '"') { pos--; } gInputBoxCursor = pos+1; } } else if(meta==1 && key == 'f') { // META-f const char* s = string_c_str(gInputBoxInput); if(s[gInputBoxCursor] != 0) { int pos = gInputBoxCursor; pos++; while(s[pos]!=0 && (s[pos] == ' ' || s[pos] == '/' || s[pos] == '\'' || s[pos] == '"')) { pos++; } while(s[pos]!=0 && s[pos] != ' ' && s[pos] != '/' && s[pos] != '\'' && s[pos] != '"') { pos++; } gInputBoxCursor = pos; } } else if(key == 3 || key == 7 || key == 27) { // CTRL-C -G Escape result2 = 1; break; } else if(key == 12) { // CTRL-L xclear_immediately(); } else { if(meta == 0 && !(key >= 0 && key <= 27)) { char tmp[128]; snprintf(tmp, 128, "%c", key); string_insert(gInputBoxInput, gInputBoxCursor, tmp); gInputBoxCursor++; } } } gView = NULL; int maxx = mgetmaxx(); int maxy = mgetmaxy(); xstrncpy(result, string_c_str(gInputBoxInput), result_size); mmove_immediately(maxy -2, 0); #if defined(__CYGWIN__) xclear_immediately(); // 画面の再描写 view(); refresh(); #endif return result2; }