int select_str2(char* msg, char* str[], int len, int cancel) { gSelectStrMsg = msg; gSelectStrStr = str; gSelectStrLen = len; gSelectStrCursor = 0; while(1) { xclear(); view(); select_str_view(); refresh(); /// input /// int meta; int key = xgetch(&meta); if(key == 10 || key == 13) { break; } else if(key == 6 || key == KEY_RIGHT) { gSelectStrCursor++; if(gSelectStrCursor >= len) gSelectStrCursor = len-1; } else if(key == 2 || key == KEY_LEFT) { gSelectStrCursor--; if(gSelectStrCursor < 0) gSelectStrCursor= 0; } else if(key == 12) { // CTRL-L xclear_immediately(); } else if(key == 3 || key == 7 || key == 27) { // CTRL-C -G Escape gSelectStrCursor = cancel; break; } else { int i; for(i=0; i< len; i++) { if(toupper(key) == toupper(str[i][0])) { gSelectStrCursor = i; goto finished; } } } } finished: gView = NULL; #if defined(__CYGWIN__) xclear_immediately(); // 画面の再描写 view(); refresh(); #endif return gSelectStrCursor; }
/////////////////////////////////////////////////// // choice /////////////////////////////////////////////////// char* choice(char* msg, char* str[], int len, int cancel) { const int maxy = mgetmaxy(); const int maxx = mgetmaxx(); int cursor = 0; while(1) { /// view /// clear(); view(); mclear_online(maxy-2); mclear_lastline(); move(maxy-2, 0); printw("%s", msg); printw(" "); int i; for(i=0; i< len; i++) { if(cursor == i) { attron(A_REVERSE); printw("%s", str[i]); attroff(A_REVERSE); printw(" "); } else { printw("%s ", str[i]); } } refresh(); /// input /// int meta; int key = xgetch(&meta); if(key == 10 || key == 13) { break; } else if(key == 6 || key == KEY_RIGHT) { cursor++; if(cursor >= len) cursor = len-1; } else if(key == 2 || key == KEY_LEFT) { cursor--; if(cursor < 0) cursor= 0; } else if(key == 12) { // CTRL-L xclear_immediately(); } else if(key == 3 || key == 7 || key == 27) { // CTRL-C -G Escape return NULL; } else { int i; for(i=0; i< len; i++) { if(toupper(key) == toupper(str[i][0])) { cursor = i; goto finished; } } } } finished: #if defined(__CYGWIN__) xclear_immediately(); // 画面の再描写 view(); refresh(); #endif return str[cursor]; }
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; }
static int interpret(const t_node *const start, size_t len) { const t_node *p = start; const t_node *const end = start + len; size_t i = 0; for (; p < end; ++p) { switch (p->action) { case INS_NOP: fprintf(stderr, "%s: internal error\n", prog); abort(); case INS_GO_LEFT: if (i < p->attr.count) { fprintf(stderr, "%s: pointer out of range (-%lu)\n", prog, (unsigned long)(p->attr.count - i)); return EXIT_FAILURE; } i -= p->attr.count; break; case INS_GO_RIGHT: if (COUNTOF(cells) - i - 1 < p->attr.count) { fprintf(stderr, "%s: pointer out of range (%lu)\n", prog, (unsigned long)(p->attr.count + i)); return EXIT_FAILURE; } i += p->attr.count; break; case INS_DECR: poke(i, peek(i) - p->attr.count); break; case INS_INCR: poke(i, peek(i) + p->attr.count); break; case INS_PUTC: { size_t n; for (n = 0; n < p->attr.count; ++n) { putchar(peek(i)); } break; } case INS_GETC: { size_t n; for (n = 0; n < p->attr.count; ++n) { poke(i, xgetch()); } break; } case INS_WHILE: if (!peek(i)) { p = p->attr.bro; } break; case INS_WEND: if (peek(i)) { p = p->attr.bro; } break; case INS_SET: poke(i, p->attr.count); break; } } return 0; }