]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/tput.c
ncurses 6.2 - patch 20210821
[ncurses.git] / progs / tput.c
index da90dcf07be2b5a564b5e5468583f053d96cedfd..fe82d47235f5b3c0d103d4648f8f480ac487d772 100644 (file)
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 1998-2018,2019 Free Software Foundation, Inc.              *
+ * Copyright 2018-2020,2021 Thomas E. Dickey                                *
+ * Copyright 1998-2016,2017 Free Software Foundation, Inc.                  *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
 #include <clear_cmd.h>
 #include <reset_cmd.h>
 
-#if !PURE_TERMINFO
-#include <dump_entry.h>
-#include <termsort.c>
-#endif
 #include <transform.h>
 #include <tty_settings.h>
 
-MODULE_ID("$Id: tput.c,v 1.80 2019/07/28 18:18:41 tom Exp $")
+MODULE_ID("$Id: tput.c,v 1.91 2021/08/21 00:24:45 tom Exp $")
 
 #define PUTS(s)                fputs(s, stdout)
 
@@ -61,8 +58,8 @@ static bool is_init = FALSE;
 static bool is_reset = FALSE;
 static bool is_clear = FALSE;
 
-static void
-quit(int status, const char *fmt,...)
+static GCC_NORETURN void
+quit(int status, const char *fmt, ...)
 {
     va_list argp;
 
@@ -74,7 +71,7 @@ quit(int status, const char *fmt,...)
     ExitProgram(status);
 }
 
-static void
+static GCC_NORETURN void
 usage(void)
 {
 #define KEEP(s) s "\n"
@@ -224,13 +221,14 @@ tput_cmd(int fd, TTY * saved_settings, bool opt_x, int argc, char *argv[])
            long numbers[1 + NUM_PARM];
            char *strings[1 + NUM_PARM];
            char *p_is_s[NUM_PARM];
+           TParams paramType;
 
            /* Nasty hack time. The tparm function needs to see numeric
             * parameters as numbers, not as pointers to their string
             * representations
             */
 
-           for (k = 1; (k < argc) && (k < NUM_PARM); k++) {
+           for (k = 1; (k < argc) && (k <= NUM_PARM); k++) {
                char *tmp = 0;
                strings[k] = argv[k];
                numbers[k] = strtol(argv[k], &tmp, 0);
@@ -242,7 +240,21 @@ tput_cmd(int fd, TTY * saved_settings, bool opt_x, int argc, char *argv[])
                strings[k] = 0;
            }
 
-           switch (tparm_type(name)) {
+           paramType = tparm_type(name);
+#if NCURSES_XNAMES
+           /*
+            * If the capability is an extended one, analyze the string.
+            */
+           if (paramType == Numbers) {
+               struct name_table_entry const *entry_ptr;
+               entry_ptr = _nc_find_type_entry(name, STRING, FALSE);
+               if (entry_ptr == NULL) {
+                   paramType = Other;
+               }
+           }
+#endif
+
+           switch (paramType) {
            case Num_Str:
                s = TPARM_2(s, numbers[1], strings[2]);
                break;
@@ -250,8 +262,23 @@ tput_cmd(int fd, TTY * saved_settings, bool opt_x, int argc, char *argv[])
                s = TPARM_3(s, numbers[1], strings[2], strings[3]);
                break;
            case Numbers:
+#define myParam(n) numbers[n]
+               s = TIPARM_9(s,
+                            myParam(1),
+                            myParam(2),
+                            myParam(3),
+                            myParam(4),
+                            myParam(5),
+                            myParam(6),
+                            myParam(7),
+                            myParam(8),
+                            myParam(9));
+#undef myParam
+               break;
+           case Other:
+               /* FALLTHRU */
            default:
-               (void) _nc_tparm_analyze(s, p_is_s, &ignored);
+               (void) _nc_tparm_analyze(NULL, s, p_is_s, &ignored);
 #define myParam(n) (p_is_s[n - 1] != 0 ? ((TPARM_ARG) strings[n]) : numbers[n])
                s = TPARM_9(s,
                            myParam(1),
@@ -263,6 +290,7 @@ tput_cmd(int fd, TTY * saved_settings, bool opt_x, int argc, char *argv[])
                            myParam(7),
                            myParam(8),
                            myParam(9));
+#undef myParam
                break;
            }
        }