コード例 #1
0
ファイル: unibi-put.c プロジェクト: fwalch/neovim-deps
int main(int argc, char **argv) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s CAPNAME [PARAM...]\n", argv[0]);
        return 2;
    }

    unibi_term *t = unibi_from_env();
    if (!t) {
        fprintf(stderr, "%s: %s: %s\n", argv[0], getenv("TERM"), strerror(errno));
        return 3;
    }

    if (strcmp(argv[1], "longname") == 0) {
        printf("%s\n", unibi_get_name(t));
        return 0;
    }

    for (enum unibi_boolean i = unibi_boolean_begin_ + 1; i < unibi_boolean_end_; ++i) {
        if (
            strcmp(argv[1], unibi_name_bool(i)) == 0 ||
            strcmp(argv[1], unibi_short_name_bool(i)) == 0
        ) {
            if (unibi_get_bool(t, i)) {
                return 0;
            } else {
                return 1;
            }
        }
    }

    for (enum unibi_numeric i = unibi_numeric_begin_ + 1; i < unibi_numeric_end_; ++i) {
        if (
            strcmp(argv[1], unibi_name_num(i)) == 0 ||
            strcmp(argv[1], unibi_short_name_num(i)) == 0
        ) {
            printf("%hd\n", unibi_get_num(t, i));
            return 0;
        }
    }

    for (enum unibi_string i = unibi_string_begin_ + 1; i < unibi_string_end_; ++i) {
        if (
            strcmp(argv[1], unibi_name_str(i)) == 0 ||
            strcmp(argv[1], unibi_short_name_str(i)) == 0
        ) {
            const char *fmt = unibi_get_str(t, i);
            if (!fmt) {
                return 1;
            }
            if (argc < 3) {
                fputs(fmt, stdout);
                return 0;
            }
            unibi_var_t vars[9] = {{0}};
            switch (i) {
#define REQ(N) do { if (argc - 2 < (N)) { fprintf(stderr, "%s: %s: missing argument\n", argv[0], argv[1]); return 4; } } while (0)

                case unibi_dial_phone:
                case unibi_quick_dial:
                    REQ(1);
                    vars[0].p = argv[2];
                    break;

                case unibi_pkey_key:
                case unibi_pkey_local:
                case unibi_pkey_xmit:
                case unibi_plab_norm:
                    REQ(2);
                    vars[0].i = atoi(argv[2]);
                    vars[1].p = argv[3];
                    break;

                case unibi_pkey_plab:
                    REQ(3);
                    vars[0].i = atoi(argv[2]);
                    vars[1].p = argv[3];
                    vars[2].p = argv[4];
                    break;

                default: {
                    for (int k = 0; k + 2 < argc; ++k) {
                        vars[k].i = atoi(argv[k + 2]);
                    }
                    break;

#undef REQ
                }
            }
            char buf[1024];
            size_t r = unibi_run(fmt, vars, buf, sizeof buf);
            fwrite(buf, 1, r, stdout);
            return 0;
        }
    }

    fprintf(stderr, "%s: %s: unknown terminfo capability\n", argv[0], argv[1]);
    return 5;
}
コード例 #2
0
ファイル: terminfo.c プロジェクト: qvacua/neovim
/// Dumps termcap info to the messages area.
/// Serves a similar purpose as Vim `:set termcap` (removed in Nvim).
///
/// @note adapted from unibilium unibi-dump.c
void terminfo_info_msg(const unibi_term *const ut)
{
  if (exiting) {
    return;
  }
  msg_puts_title("\n\n--- Terminal info --- {{{\n");

  char *term;
  get_tty_option("term", &term);
  msg_printf_attr(0, "&term: %s\n", term);
  msg_printf_attr(0, "Description: %s\n", unibi_get_name(ut));
  const char **a = unibi_get_aliases(ut);
  if (*a) {
    msg_puts("Aliases: ");
    do {
      msg_printf_attr(0, "%s%s\n", *a, a[1] ? " | " : "");
      a++;
    } while (*a);
  }

  msg_puts("Boolean capabilities:\n");
  for (enum unibi_boolean i = unibi_boolean_begin_ + 1;
       i < unibi_boolean_end_; i++) {
    msg_printf_attr(0, "  %-25s %-10s = %s\n", unibi_name_bool(i),
                    unibi_short_name_bool(i),
                    unibi_get_bool(ut, i) ? "true" : "false");
  }

  msg_puts("Numeric capabilities:\n");
  for (enum unibi_numeric i = unibi_numeric_begin_ + 1;
       i < unibi_numeric_end_; i++) {
    int n = unibi_get_num(ut, i);  // -1 means "empty"
    msg_printf_attr(0, "  %-25s %-10s = %d\n", unibi_name_num(i),
                    unibi_short_name_num(i), n);
  }

  msg_puts("String capabilities:\n");
  for (enum unibi_string i = unibi_string_begin_ + 1;
       i < unibi_string_end_; i++) {
    const char *s = unibi_get_str(ut, i);
    if (s) {
      msg_printf_attr(0, "  %-25s %-10s = ", unibi_name_str(i),
                      unibi_short_name_str(i));
      // Most of these strings will contain escape sequences.
      msg_outtrans_special((char_u *)s, false);
      msg_putchar('\n');
    }
  }

  if (unibi_count_ext_bool(ut)) {
    msg_puts("Extended boolean capabilities:\n");
    for (size_t i = 0; i < unibi_count_ext_bool(ut); i++) {
      msg_printf_attr(0, "  %-25s = %s\n",
                      unibi_get_ext_bool_name(ut, i),
                      unibi_get_ext_bool(ut, i) ? "true" : "false");
    }
  }

  if (unibi_count_ext_num(ut)) {
    msg_puts("Extended numeric capabilities:\n");
    for (size_t i = 0; i < unibi_count_ext_num(ut); i++) {
      msg_printf_attr(0, "  %-25s = %d\n",
                      unibi_get_ext_num_name(ut, i),
                      unibi_get_ext_num(ut, i));
    }
  }

  if (unibi_count_ext_str(ut)) {
    msg_puts("Extended string capabilities:\n");
    for (size_t i = 0; i < unibi_count_ext_str(ut); i++) {
      msg_printf_attr(0, "  %-25s = ", unibi_get_ext_str_name(ut, i));
      msg_outtrans_special((char_u *)unibi_get_ext_str(ut, i), false);
      msg_putchar('\n');
    }
  }

  msg_puts("}}}\n");
  xfree(term);
}