]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/tput.c
ncurses 6.0 - patch 20160806
[ncurses.git] / progs / tput.c
index d29ed0a72e45726c37335b9fa3e3f19e52c21c18..f90e76cdb667b7eeb5b5b3c91fc9fd4269776388 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2010,2012 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2015,2016 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            *
@@ -29,6 +29,7 @@
 /****************************************************************************
  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
+ *     and: Thomas E. Dickey                        1996-on                 *
  ****************************************************************************/
 
 /*
@@ -38,8 +39,8 @@
  * Ross Ridge's mytinfo package.
  */
 
-#define USE_LIBTINFO
-#include <progs.priv.h>
+#include <tparm_type.h>
+#include <reset_cmd.h>
 
 #if !PURE_TERMINFO
 #include <dump_entry.h>
 #endif
 #include <transform.h>
 
-MODULE_ID("$Id: tput.c,v 1.48 2012/02/18 21:51:17 tom Exp $")
+MODULE_ID("$Id: tput.c,v 1.56 2016/08/06 20:59:26 tom Exp $")
 
 #define PUTS(s)                fputs(s, stdout)
-#define PUTCHAR(c)     putchar(c)
-#define FLUSH          fflush(stdout)
 
-typedef enum {
-    Numbers = 0
-    ,Num_Str
-    ,Num_Str_Str
-} TParams;
+const char *_nc_progname = "tput";
 
 static char *prg_name;
 static bool is_init = FALSE;
@@ -84,43 +79,10 @@ usage(void)
 }
 
 static void
-check_aliases(const char *name)
+check_aliases(const char *name, bool program)
 {
-    is_init = same_program(name, PROG_INIT);
-    is_reset = same_program(name, PROG_RESET);
-}
-
-/*
- * Lookup the type of call we should make to tparm().  This ignores the actual
- * terminfo capability (bad, because it is not extensible), but makes this
- * code portable to platforms where sizeof(int) != sizeof(char *).
- */
-static TParams
-tparm_type(const char *name)
-{
-#define TD(code, longname, ti, tc) {code,longname},{code,ti},{code,tc}
-    TParams result = Numbers;
-    /* *INDENT-OFF* */
-    static const struct {
-       TParams code;
-       const char *name;
-    } table[] = {
-       TD(Num_Str,     "pkey_key",     "pfkey",        "pk"),
-       TD(Num_Str,     "pkey_local",   "pfloc",        "pl"),
-       TD(Num_Str,     "pkey_xmit",    "pfx",          "px"),
-       TD(Num_Str,     "plab_norm",    "pln",          "pn"),
-       TD(Num_Str_Str, "pkey_plab",    "pfxl",         "xl"),
-    };
-    /* *INDENT-ON* */
-
-    unsigned n;
-    for (n = 0; n < SIZEOF(table); n++) {
-       if (!strcmp(name, table[n].name)) {
-           result = table[n].code;
-           break;
-       }
-    }
-    return result;
+    is_init = same_program(name, program ? PROG_INIT : "init");
+    is_reset = same_program(name, program ? PROG_RESET : "reset");
 }
 
 static int
@@ -143,120 +105,23 @@ exit_code(int token, int value)
 }
 
 static int
-tput(int argc, char *argv[])
+tput_cmd(int argc, char *argv[])
 {
     NCURSES_CONST char *name;
     char *s;
-    int i, j, c;
     int status;
-    FILE *f;
 #if !PURE_TERMINFO
     bool termcap = FALSE;
 #endif
 
     if ((name = argv[0]) == 0)
        name = "";
-    check_aliases(name);
+    check_aliases(name, FALSE);
     if (is_reset || is_init) {
-       if (init_prog != 0) {
-           system(init_prog);
-       }
-       FLUSH;
-
-       if (is_reset && reset_1string != 0) {
-           PUTS(reset_1string);
-       } else if (init_1string != 0) {
-           PUTS(init_1string);
-       }
-       FLUSH;
-
-       if (is_reset && reset_2string != 0) {
-           PUTS(reset_2string);
-       } else if (init_2string != 0) {
-           PUTS(init_2string);
-       }
-       FLUSH;
-
-#ifdef set_lr_margin
-       if (set_lr_margin != 0) {
-           PUTS(TPARM_2(set_lr_margin, 0, columns - 1));
-       } else
-#endif
-#ifdef set_left_margin_parm
-           if (set_left_margin_parm != 0
-               && set_right_margin_parm != 0) {
-           PUTS(TPARM_1(set_left_margin_parm, 0));
-           PUTS(TPARM_1(set_right_margin_parm, columns - 1));
-       } else
-#endif
-           if (clear_margins != 0
-               && set_left_margin != 0
-               && set_right_margin != 0) {
-           PUTS(clear_margins);
-           if (carriage_return != 0) {
-               PUTS(carriage_return);
-           } else {
-               PUTCHAR('\r');
-           }
-           PUTS(set_left_margin);
-           if (parm_right_cursor) {
-               PUTS(TPARM_1(parm_right_cursor, columns - 1));
-           } else {
-               for (i = 0; i < columns - 1; i++) {
-                   PUTCHAR(' ');
-               }
-           }
-           PUTS(set_right_margin);
-           if (carriage_return != 0) {
-               PUTS(carriage_return);
-           } else {
-               PUTCHAR('\r');
-           }
-       }
-       FLUSH;
-
-       if (init_tabs != 8) {
-           if (clear_all_tabs != 0 && set_tab != 0) {
-               for (i = 0; i < columns - 1; i += 8) {
-                   if (parm_right_cursor) {
-                       PUTS(TPARM_1(parm_right_cursor, 8));
-                   } else {
-                       for (j = 0; j < 8; j++)
-                           PUTCHAR(' ');
-                   }
-                   PUTS(set_tab);
-               }
-               FLUSH;
-           }
-       }
-
-       if (is_reset && reset_file != 0) {
-           f = fopen(reset_file, "r");
-           if (f == 0) {
-               quit(4 + errno, "Can't open reset_file: '%s'", reset_file);
-           }
-           while ((c = fgetc(f)) != EOF) {
-               PUTCHAR(c);
-           }
-           fclose(f);
-       } else if (init_file != 0) {
-           f = fopen(init_file, "r");
-           if (f == 0) {
-               quit(4 + errno, "Can't open init_file: '%s'", init_file);
-           }
-           while ((c = fgetc(f)) != EOF) {
-               PUTCHAR(c);
-           }
-           fclose(f);
-       }
-       FLUSH;
-
-       if (is_reset && reset_3string != 0) {
-           PUTS(reset_3string);
-       } else if (init_3string != 0) {
-           PUTS(init_3string);
+       reset_start(stdout, is_reset, is_init);
+       if (send_init_strings((TTY *) 0)) {
+           reset_flush();
        }
-       FLUSH;
        return 0;
     }
 
@@ -303,7 +168,7 @@ tput(int argc, char *argv[])
     } else if (s != ABSENT_STRING) {
        if (argc > 1) {
            int k;
-           int popcount;
+           int ignored;
            long numbers[1 + NUM_PARM];
            char *strings[1 + NUM_PARM];
            char *p_is_s[NUM_PARM];
@@ -334,7 +199,7 @@ tput(int argc, char *argv[])
                break;
            case Numbers:
            default:
-               (void) _nc_tparm_analyze(s, p_is_s, &popcount);
+               (void) _nc_tparm_analyze(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),
@@ -367,7 +232,7 @@ main(int argc, char **argv)
     char buf[BUFSIZ];
     int result = 0;
 
-    check_aliases(prg_name = _nc_rootname(argv[0]));
+    check_aliases(prg_name = _nc_rootname(argv[0]), TRUE);
 
     term = getenv("TERM");
 
@@ -412,7 +277,7 @@ main(int argc, char **argv)
     if (cmdline) {
        if ((argc <= 0) && !is_reset && !is_init)
            usage();
-       ExitProgram(tput(argc, argv));
+       ExitProgram(tput_cmd(argc, argv));
     }
 
     while (fgets(buf, sizeof(buf), stdin) != 0) {
@@ -433,7 +298,7 @@ main(int argc, char **argv)
        argvec[argnum] = 0;
 
        if (argnum != 0
-           && tput(argnum, argvec) != 0) {
+           && tput_cmd(argnum, argvec) != 0) {
            if (result == 0)
                result = 4;     /* will return value >4 */
            ++result;