#include #include #include #include enum type { INT, FLOAT, CHAR, }; union v_value { int _int; float _float; char _char; unsigned int bits; }; struct variable { unsigned char type; union v_value value; }; void draw_box(int y, int x, int width, int height); void print_variable(struct variable var, int y, int x); void set_bit(struct variable *var, int pos, bool value); bool get_bit(struct variable var, int pos); int get_bit_len(struct variable); char *get_str_type(struct variable); void print_bits_menuplater(struct variable, int); int main() { int num, bitlen, hover_bit=0, c, key; struct variable var; srand(time(NULL)); c = rand() % 3 + 1; switch (c) { case 1: var.type = INT; var.value._int = (int)rand(); break; case 2: var.type = FLOAT; var.value._float = (float)rand(); break; case 3: var.type = CHAR; var.value._char = (char)rand(); break; } var.value.bits %= get_bit_len(var); bitlen = get_bit_len(var); initscr(); keypad(stdscr, true); curs_set(0); while (true) { clear(); print_variable(var, LINES / 2 - 2, COLS / 2 - 5); print_bits_menuplater(var, hover_bit); refresh(); key = getch(); switch (key) { case 259: // Up Key case 258: // Down Key case '\n': case ' ': set_bit(&var, hover_bit, !get_bit(var, hover_bit)); break; case 260: // Left Key if (hover_bit < bitlen-1) hover_bit++; break; case 261: // Right Key if (hover_bit > 0) hover_bit--; break; case 'r': endwin(); main(); exit(0); case 27: case 'q': endwin(); exit(0); break; } } endwin(); return 0; } void draw_box(int y, int x, int width, int height) { int c_x = getcurx(stdscr), c_y = getcury(stdscr); int i; // draw top and bottm line for (i=0; ivalue.bits |= (1 << pos); } else { var->value.bits &= ~(1 << pos); } } bool get_bit(struct variable var, int pos) { return var.value.bits & (1 << pos); } int get_bit_len(struct variable var) { switch (var.type) { case INT: return sizeof(int) * 8; case FLOAT: return sizeof(float) * 8; case CHAR: return sizeof(char) * 8; } return 0; } char* s_type[3] = {"INT", "FLOAT", "CHAR"}; char *get_str_type(struct variable var) { switch (var.type) { case INT: return s_type[0]; case FLOAT: return s_type[1]; case CHAR: return s_type[2]; } return ""; } void print_bits_menuplater(struct variable var, int hover_bit) { int bitlen = get_bit_len(var), y = LINES*0.80, x = COLS/2+bitlen; for (int i=0; i