~ubuntu-branches/debian/sid/ncurses/sid-200908151543

« back to all changes in this revision

Viewing changes to progs/tset.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-12-14 21:06:00 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20081214210600-2rdjwvpplgvh3zeb
Tags: 5.7+20081213-1
MergingĀ upstreamĀ versionĀ 5.7+20081213.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/****************************************************************************
2
 
 * Copyright (c) 1998-2004,2005 Free Software Foundation, Inc.              *
 
2
 * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
3
3
 *                                                                          *
4
4
 * Permission is hereby granted, free of charge, to any person obtaining a  *
5
5
 * copy of this software and associated documentation files (the            *
73
73
 * SUCH DAMAGE.
74
74
 */
75
75
 
 
76
#define USE_LIBTINFO
76
77
#define __INTERNAL_CAPS_VISIBLE /* we need to see has_hardware_tabs */
77
78
#include <progs.priv.h>
78
79
 
88
89
char *ttyname(int fd);
89
90
#endif
90
91
 
91
 
/* this is just to stifle a missing-prototype warning */
92
 
#ifdef linux
93
 
# include <sys/ioctl.h>
 
92
#if HAVE_SIZECHANGE
 
93
# if !defined(sun) || !TERMIOS
 
94
#  if HAVE_SYS_IOCTL_H
 
95
#   include <sys/ioctl.h>
 
96
#  endif
 
97
# endif
94
98
#endif
95
99
 
96
100
#if NEED_PTEM_H
103
107
#include <dump_entry.h>
104
108
#include <transform.h>
105
109
 
106
 
MODULE_ID("$Id: tset.c,v 1.60 2005/09/25 00:43:52 tom Exp $")
 
110
MODULE_ID("$Id: tset.c,v 1.76 2008/10/11 19:26:19 tom Exp $")
 
111
 
 
112
/*
 
113
 * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
 
114
 * Solaris, IRIX) define TIOCGWINSZ and struct winsize.
 
115
 */
 
116
#ifdef TIOCGSIZE
 
117
# define IOCTL_GET_WINSIZE TIOCGSIZE
 
118
# define IOCTL_SET_WINSIZE TIOCSSIZE
 
119
# define STRUCT_WINSIZE struct ttysize
 
120
# define WINSIZE_ROWS(n) n.ts_lines
 
121
# define WINSIZE_COLS(n) n.ts_cols
 
122
#else
 
123
# ifdef TIOCGWINSZ
 
124
#  define IOCTL_GET_WINSIZE TIOCGWINSZ
 
125
#  define IOCTL_SET_WINSIZE TIOCSWINSZ
 
126
#  define STRUCT_WINSIZE struct winsize
 
127
#  define WINSIZE_ROWS(n) n.ws_row
 
128
#  define WINSIZE_COLS(n) n.ws_col
 
129
# endif
 
130
#endif
107
131
 
108
132
extern char **environ;
109
133
 
167
191
    char temp[BUFSIZ];
168
192
    unsigned len = strlen(_nc_progname) + 2;
169
193
 
170
 
    if (len < sizeof(temp) - 12) {
 
194
    if ((int) len < (int) sizeof(temp) - 12) {
171
195
        strcpy(temp, _nc_progname);
172
196
        strcat(temp, ": ");
173
197
    } else {
439
463
        mapp->conditional = ~mapp->conditional & (EQ | GT | LT);
440
464
 
441
465
    /* If user specified a port with an option flag, set it. */
442
 
  done:if (port) {
443
 
        if (mapp->porttype)
444
 
          badmopt:err("illegal -m option format: %s", copy);
 
466
  done:
 
467
    if (port) {
 
468
        if (mapp->porttype) {
 
469
          badmopt:
 
470
            err("illegal -m option format: %s", copy);
 
471
        }
445
472
        mapp->porttype = port;
446
473
    }
 
474
    free(copy);
447
475
#ifdef MAPDEBUG
448
476
    (void) printf("port: %s\n", mapp->porttype ? mapp->porttype : "ANY");
449
477
    (void) printf("type: %s\n", mapp->type);
585
613
     * real entry from /etc/termcap.  This prevents us from being fooled
586
614
     * by out of date stuff in the environment.
587
615
     */
588
 
  found:if ((p = getenv("TERMCAP")) != 0 && *p != '/') {
 
616
  found:if ((p = getenv("TERMCAP")) != 0 && !_nc_is_abs_path(p)) {
589
617
        /* 'unsetenv("TERMCAP")' is not portable.
590
618
         * The 'environ' array is better.
591
619
         */
686
714
#define CSUSP   CTRL('Z')
687
715
#endif
688
716
 
689
 
#define CHK(val, dft)   ((int)val <= 0 ? dft : val)
 
717
#if defined(_POSIX_VDISABLE)
 
718
#define DISABLED(val)   (((_POSIX_VDISABLE != -1) \
 
719
                       && ((val) == _POSIX_VDISABLE)) \
 
720
                      || ((val) <= 0))
 
721
#else
 
722
#define DISABLED(val)   ((int)(val) <= 0)
 
723
#endif
 
724
 
 
725
#define CHK(val, dft)   (DISABLED(val) ? dft : val)
690
726
 
691
727
static bool set_tabs(void);
692
728
 
769
805
                      | OFDEL
770
806
#endif
771
807
#ifdef NLDLY
772
 
                      | NLDLY | CRDLY | TABDLY | BSDLY | VTDLY | FFDLY
 
808
                      | NLDLY
 
809
#endif
 
810
#ifdef CRDLY
 
811
                      | CRDLY
 
812
#endif
 
813
#ifdef TABDLY
 
814
                      | TABDLY
 
815
#endif
 
816
#ifdef BSDLY
 
817
                      | BSDLY
 
818
#endif
 
819
#ifdef VTDLY
 
820
                      | VTDLY
 
821
#endif
 
822
#ifdef FFDLY
 
823
                      | FFDLY
773
824
#endif
774
825
        );
775
826
 
838
889
set_control_chars(void)
839
890
{
840
891
#ifdef TERMIOS
841
 
    if (mode.c_cc[VERASE] == 0 || terasechar >= 0)
842
 
        mode.c_cc[VERASE] = terasechar >= 0 ? terasechar : default_erase();
843
 
 
844
 
    if (mode.c_cc[VINTR] == 0 || intrchar >= 0)
845
 
        mode.c_cc[VINTR] = intrchar >= 0 ? intrchar : CINTR;
846
 
 
847
 
    if (mode.c_cc[VKILL] == 0 || tkillchar >= 0)
848
 
        mode.c_cc[VKILL] = tkillchar >= 0 ? tkillchar : CKILL;
 
892
    if (DISABLED(mode.c_cc[VERASE]) || terasechar >= 0)
 
893
        mode.c_cc[VERASE] = (terasechar >= 0) ? terasechar : default_erase();
 
894
 
 
895
    if (DISABLED(mode.c_cc[VINTR]) || intrchar >= 0)
 
896
        mode.c_cc[VINTR] = (intrchar >= 0) ? intrchar : CINTR;
 
897
 
 
898
    if (DISABLED(mode.c_cc[VKILL]) || tkillchar >= 0)
 
899
        mode.c_cc[VKILL] = (tkillchar >= 0) ? tkillchar : CKILL;
849
900
#endif
850
901
}
851
902
 
970
1021
 * Return TRUE if we set any tab stops, FALSE if not.
971
1022
 */
972
1023
static bool
973
 
set_tabs()
 
1024
set_tabs(void)
974
1025
{
975
1026
    if (set_tab && clear_all_tabs) {
976
1027
        int c;
1020
1071
 
1021
1072
    (void) fprintf(stderr, "%s %s ", name, older == newer ? "is" : "set to");
1022
1073
 
 
1074
    if (DISABLED(newer))
 
1075
        (void) fprintf(stderr, "undef.\n");
1023
1076
    /*
1024
1077
     * Check 'delete' before 'backspace', since the key_backspace value
1025
1078
     * is ambiguous.
1026
1079
     */
1027
 
    if (newer == 0177)
 
1080
    else if (newer == 0177)
1028
1081
        (void) fprintf(stderr, "delete.\n");
1029
1082
    else if ((p = key_backspace) != 0
1030
1083
             && newer == (unsigned char) p[0]
1102
1155
static char
1103
1156
arg_to_char(void)
1104
1157
{
1105
 
    return (optarg[0] == '^' && optarg[1] != '\0')
1106
 
        ? ((optarg[1] == '?') ? '\177' : CTRL(optarg[1]))
1107
 
        : optarg[0];
 
1158
    return (char) ((optarg[0] == '^' && optarg[1] != '\0')
 
1159
                   ? ((optarg[1] == '?') ? '\177' : CTRL(optarg[1]))
 
1160
                   : optarg[0]);
1108
1161
}
1109
1162
 
1110
1163
int
1111
1164
main(int argc, char **argv)
1112
1165
{
1113
 
#if defined(TIOCGWINSZ) && defined(TIOCSWINSZ)
1114
 
    struct winsize win;
1115
 
#endif
1116
1166
    int ch, noinit, noset, quiet, Sflag, sflag, showterm;
1117
1167
    const char *p;
1118
1168
    const char *ttype;
1119
1169
 
1120
1170
    obsolete(argv);
1121
1171
    noinit = noset = quiet = Sflag = sflag = showterm = 0;
1122
 
    while ((ch = getopt(argc, argv, "a:cd:e:Ii:k:m:np:qQSrsVw")) != EOF) {
 
1172
    while ((ch = getopt(argc, argv, "a:cd:e:Ii:k:m:np:qQSrsVw")) != -1) {
1123
1173
        switch (ch) {
1124
1174
        case 'c':               /* set control-chars */
1125
1175
            opt_c = TRUE;
1167
1217
            break;
1168
1218
        case 'V':               /* print curses-version */
1169
1219
            puts(curses_version());
1170
 
            return EXIT_SUCCESS;
 
1220
            ExitProgram(EXIT_SUCCESS);
1171
1221
        case 'w':               /* set window-size */
1172
1222
            opt_w = TRUE;
1173
1223
            break;
1192
1242
    can_restore = TRUE;
1193
1243
    original = oldmode = mode;
1194
1244
#ifdef TERMIOS
1195
 
    ospeed = cfgetospeed(&mode);
 
1245
    ospeed = (NCURSES_OSPEED) cfgetospeed(&mode);
1196
1246
#else
1197
 
    ospeed = mode.sg_ospeed;
 
1247
    ospeed = (NCURSES_OSPEED) mode.sg_ospeed;
1198
1248
#endif
1199
1249
 
1200
1250
    if (!strcmp(_nc_progname, PROG_RESET)) {
1208
1258
        tcolumns = columns;
1209
1259
        tlines = lines;
1210
1260
 
1211
 
#if defined(TIOCGWINSZ) && defined(TIOCSWINSZ)
 
1261
#if HAVE_SIZECHANGE
1212
1262
        if (opt_w) {
1213
 
            /* Set window size */
1214
 
            (void) ioctl(STDERR_FILENO, TIOCGWINSZ, &win);
1215
 
            if (win.ws_row == 0 && win.ws_col == 0 &&
 
1263
            STRUCT_WINSIZE win;
 
1264
            /* Set window size if not set already */
 
1265
            (void) ioctl(STDERR_FILENO, IOCTL_GET_WINSIZE, &win);
 
1266
            if (WINSIZE_ROWS(win) == 0 &&
 
1267
                WINSIZE_COLS(win) == 0 &&
1216
1268
                tlines > 0 && tcolumns > 0) {
1217
 
                win.ws_row = tlines;
1218
 
                win.ws_col = tcolumns;
1219
 
                (void) ioctl(STDERR_FILENO, TIOCSWINSZ, &win);
 
1269
                WINSIZE_ROWS(win) = tlines;
 
1270
                WINSIZE_COLS(win) = tcolumns;
 
1271
                (void) ioctl(STDERR_FILENO, IOCTL_SET_WINSIZE, &win);
1220
1272
            }
1221
1273
        }
1222
1274
#endif
1260
1312
 
1261
1313
    if (sflag) {
1262
1314
        int len;
 
1315
        char *var;
 
1316
        char *leaf;
1263
1317
        /*
1264
1318
         * Figure out what shell we're using.  A hack, we look for an
1265
1319
         * environmental variable SHELL ending in "csh".
1266
1320
         */
1267
 
        if ((p = getenv("SHELL")) != 0
1268
 
            && (len = strlen(p)) >= 3
1269
 
            && !strcmp(p + len - 3, "csh"))
 
1321
        if ((var = getenv("SHELL")) != 0
 
1322
            && ((len = (int) strlen(leaf = _nc_basename(var))) >= 3)
 
1323
            && !strcmp(leaf + len - 3, "csh"))
1270
1324
            p = "set noglob;\nsetenv TERM %s;\nunset noglob;\n";
1271
1325
        else
1272
1326
            p = "TERM=%s;\n";
1273
1327
        (void) printf(p, ttype);
1274
1328
    }
1275
1329
 
1276
 
    return EXIT_SUCCESS;
 
1330
    ExitProgram(EXIT_SUCCESS);
1277
1331
}