void print_userlist_list(userlist_t * p) { unsigned int j = 0; char line[100], *q; q = (char *) xmalloc(100 * 100); strcpy(q, ""); sprintf(q, "\n\1g\1f"); while (p) { sprintf(line, " \1g%-20s", p->name); p = p->next; if ((j++ % 3) == 2) strcat(line, "\n"); strcat(q, line); } strcat(q, "\n"); if (j % 3 != 0) strcat(q, "\n"); more_string(q); xfree(q); return; }
void whoknows() { char *invited = NULL; char *kicked = NULL; int i = 0, k = 0; room_t bing; bing = readquad(curr_rm); i = mono_sql_uf_whoknows(curr_rm, &invited); k = mono_sql_uf_kicked(curr_rm, &kicked); switch (i) { case -1: cprintf("\n\1f\1rAn error occurred in the SQL query.\n"); break; case 0: cprintf("\n\1f\1rNo users currently know this %s.\n", config.forum); break; default: cprintf("\n\1f\1g%d user%s can currently read \1y'%s'\1w:\n", i, (i == 1) ? "" : "s", bing.name); more_string(invited); switch (k) { case -1: cprintf("\n\1f\1rAn error occurred in the SQL query.\n"); break; case 0: cprintf("\n\1f\1rNo users have been kicked from this %s.\n", config.forum); break; default: cprintf("\n\1f\1g%d user%s %s been kicked from \1y'%s'\1w:\n", k, (k == 1) ? "" : "s", (k == 1) ? "has" : "have", bing.name); more_string(kicked); break; } } xfree(invited); xfree(kicked); return; }
void print_forumlist_list(forumlist_t * p) { char line[100], *q; q = (char *) xmalloc(100 * 100); strcpy(q, ""); sprintf(q, "\1g\1f"); while (p) { sprintf(line, "\1w%3u.\1g%s\n", p->forum_id, p->name); p = p->next; strcat(q, line); } more_string(q); xfree(q); return; }
void show_known_rooms(int param) { char *p; switch (param) { case 1: p = known_rooms_list(usersupp, 0); break; case 2: p = unread_rooms_list(usersupp); break; default: p = known_rooms_list(usersupp, 1); break; } nox = 1; more_string(p); xfree(p); return; }
void menu_friend(int param) { register char cmd = '\0'; char *str = NULL; nox = 1; while (1) { IFNEXPERT { if (param == FRIEND) more(MENUDIR "/menu_friend", 1); else more(MENUDIR "/menu_enemy", 1); } if (!(usersupp->flags & US_NOCMDHELP)) cprintf("%s\n", (param == FRIEND) ? FRIEND_CMDS : ENEMY_CMDS); cprintf("\1f\1g%s \1w-> \1c", (param == FRIEND) ? "Edit X-Friends" : "Edit X-Enemies"); cmd = get_single_quiet("Aacrtdqls\n\r ?"); switch (cmd) { case '?': cprintf("Help!\n"); if (param == FRIEND) online_help('f'); /* more(MENUDIR "/menu_friend", 1); */ else online_help('e'); /* more(MENUDIR "/menu_enemy", 1); */ break; case '\n': case '\r': case ' ': case 'q': cprintf("\1f\1gQuit.\n"); /* update_friends_cache(); */ start_user_cache(usersupp->usernum); return; break; case 'A': if (param == FRIEND) { cprintf("\1f\1gAdd Quick-X Friend.\n"); menu_friend_quick_add(); break; } break; case 'a': cprintf("\1f\1gAdd user to %slist.\n", (param == FRIEND) ? "friends" : "enemy"); menu_friend_add(param); break; case 'c': cprintf("\1f\1gAre you sure you want to clear your %slist (y/N)? ", (param == FRIEND) ? "friends" : "enemy"); if (yesno_default(NO) == NO) break; cprintf("\1f\1g%s \1w-> \1c", (param == FRIEND) ? "Edit X-Friends" : "Edit X-Enemies"); cprintf("\1f\1gClearing %slist.\n", (param == FRIEND) ? "friends" : "enemy"); if (param == FRIEND) { mono_sql_uu_clear_list_by_type(usersupp->usernum, L_FRIEND); } else { mono_sql_uu_clear_list_by_type(usersupp->usernum, L_ENEMY); } break; case 'd': case 'r': cprintf("\1f\1gRemove user from %slist.\n", (param == FRIEND) ? "friends" : "enemy"); menu_friend_remove(param); break; case 'l': case 's': cprintf("\1f\1gList %s.\n", (param == FRIEND) ? "friends" : "enemies"); str = menu_friend_list(param); more_string(str); xfree(str); break; case 't': if (param == ENEMY) break; usersupp->flags ^= US_NOTIFY_FR; cprintf("\1f\1gToggle logon notifications %s.\n", (usersupp->flags & US_NOTIFY_FR) ? "on" : "\1roff\1g"); break; default: cprintf("\1f\1rEEK, HAMSTERS\n"); break; } /* switch */ } /* while */ return; }
size_t vterm_input_write(VTerm *vt, const char *bytes, size_t len) { size_t pos = 0; const char *string_start; switch(vt->parser.state) { case NORMAL: case CSI_LEADER: case CSI_ARGS: case CSI_INTERMED: case ESC: string_start = NULL; break; case STRING: case ESC_IN_STRING: string_start = bytes; break; } #define ENTER_STRING_STATE(st) do { vt->parser.state = STRING; string_start = bytes + pos + 1; } while(0) #define ENTER_STATE(st) do { vt->parser.state = st; string_start = NULL; } while(0) #define ENTER_NORMAL_STATE() ENTER_STATE(NORMAL) for( ; pos < len; pos++) { unsigned char c = bytes[pos]; if(c == 0x00 || c == 0x7f) { // NUL, DEL if(vt->parser.state >= STRING) { more_string(vt, string_start, bytes + pos - string_start); string_start = bytes + pos + 1; } continue; } if(c == 0x18 || c == 0x1a) { // CAN, SUB ENTER_NORMAL_STATE(); continue; } else if(c == 0x1b) { // ESC vt->parser.intermedlen = 0; if(vt->parser.state == STRING) vt->parser.state = ESC_IN_STRING; else ENTER_STATE(ESC); continue; } else if(c == 0x07 && // BEL, can stand for ST in OSC or DCS state vt->parser.state == STRING) { // fallthrough } else if(c < 0x20) { // other C0 if(vt->parser.state >= STRING) more_string(vt, string_start, bytes + pos - string_start); do_control(vt, c); if(vt->parser.state >= STRING) string_start = bytes + pos + 1; continue; } // else fallthrough switch(vt->parser.state) { case ESC_IN_STRING: if(c == 0x5c) { // ST vt->parser.state = STRING; done_string(vt, string_start, bytes + pos - string_start - 1); ENTER_NORMAL_STATE(); break; } vt->parser.state = ESC; // else fallthrough case ESC: switch(c) { case 0x50: // DCS start_string(vt, VTERM_PARSER_DCS); ENTER_STRING_STATE(); break; case 0x5b: // CSI vt->parser.csi_leaderlen = 0; ENTER_STATE(CSI_LEADER); break; case 0x5d: // OSC start_string(vt, VTERM_PARSER_OSC); ENTER_STRING_STATE(); break; default: if(is_intermed(c)) { if(vt->parser.intermedlen < INTERMED_MAX-1) vt->parser.intermed[vt->parser.intermedlen++] = c; } else if(!vt->parser.intermedlen && c >= 0x40 && c < 0x60) { do_control(vt, c + 0x40); ENTER_NORMAL_STATE(); } else if(c >= 0x30 && c < 0x7f) { do_escape(vt, c); ENTER_NORMAL_STATE(); } else { DEBUG_LOG("TODO: Unhandled byte %02x in Escape\n", c); } } break; case CSI_LEADER: /* Extract leader bytes 0x3c to 0x3f */ if(c >= 0x3c && c <= 0x3f) { if(vt->parser.csi_leaderlen < CSI_LEADER_MAX-1) vt->parser.csi_leader[vt->parser.csi_leaderlen++] = c; break; } /* else fallthrough */ vt->parser.csi_leader[vt->parser.csi_leaderlen] = 0; vt->parser.csi_argi = 0; vt->parser.csi_args[0] = CSI_ARG_MISSING; vt->parser.state = CSI_ARGS; /* fallthrough */ case CSI_ARGS: /* Numerical value of argument */ if(c >= '0' && c <= '9') { if(vt->parser.csi_args[vt->parser.csi_argi] == CSI_ARG_MISSING) vt->parser.csi_args[vt->parser.csi_argi] = 0; vt->parser.csi_args[vt->parser.csi_argi] *= 10; vt->parser.csi_args[vt->parser.csi_argi] += c - '0'; break; } if(c == ':') { vt->parser.csi_args[vt->parser.csi_argi] |= CSI_ARG_FLAG_MORE; c = ';'; } if(c == ';') { vt->parser.csi_argi++; vt->parser.csi_args[vt->parser.csi_argi] = CSI_ARG_MISSING; break; } /* else fallthrough */ vt->parser.csi_argi++; vt->parser.intermedlen = 0; vt->parser.state = CSI_INTERMED; case CSI_INTERMED: if(is_intermed(c)) { if(vt->parser.intermedlen < INTERMED_MAX-1) vt->parser.intermed[vt->parser.intermedlen++] = c; break; } else if(c == 0x1b) { /* ESC in CSI cancels */ } else if(c >= 0x40 && c <= 0x7e) { vt->parser.intermed[vt->parser.intermedlen] = 0; do_csi(vt, c); } /* else was invalid CSI */ ENTER_NORMAL_STATE(); break; case STRING: if(c == 0x07 || (c == 0x9c && !vt->mode.utf8)) { done_string(vt, string_start, bytes + pos - string_start); ENTER_NORMAL_STATE(); } break; case NORMAL: if(c >= 0x80 && c < 0xa0 && !vt->mode.utf8) { switch(c) { case 0x90: // DCS start_string(vt, VTERM_PARSER_DCS); ENTER_STRING_STATE(); break; case 0x9b: // CSI ENTER_STATE(CSI_LEADER); break; case 0x9d: // OSC start_string(vt, VTERM_PARSER_OSC); ENTER_STRING_STATE(); break; default: do_control(vt, c); break; } } else { size_t eaten = 0; if(vt->parser.callbacks && vt->parser.callbacks->text) eaten = (*vt->parser.callbacks->text)(bytes + pos, len - pos, vt->parser.cbdata); if(!eaten) { DEBUG_LOG("libvterm: Text callback did not consume any input\n"); /* force it to make progress */ eaten = 1; } pos += (eaten - 1); // we'll ++ it again in a moment } break; } } return len; }