Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}