1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* Copyright (c) 1988 AT&T */ 23*7c478bd9Sstevel@tonic-gate /* All Rights Reserved */ 24*7c478bd9Sstevel@tonic-gate 25*7c478bd9Sstevel@tonic-gate 26*7c478bd9Sstevel@tonic-gate /* 27*7c478bd9Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 28*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 29*7c478bd9Sstevel@tonic-gate */ 30*7c478bd9Sstevel@tonic-gate 31*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.13 */ 32*7c478bd9Sstevel@tonic-gate 33*7c478bd9Sstevel@tonic-gate /* 34*7c478bd9Sstevel@tonic-gate NAME 35*7c478bd9Sstevel@tonic-gate infocmp - compare terminfo descriptions, or dump a terminfo 36*7c478bd9Sstevel@tonic-gate description 37*7c478bd9Sstevel@tonic-gate 38*7c478bd9Sstevel@tonic-gate AUTHOR 39*7c478bd9Sstevel@tonic-gate Tony Hansen, February 23, 1984. 40*7c478bd9Sstevel@tonic-gate */ 41*7c478bd9Sstevel@tonic-gate 42*7c478bd9Sstevel@tonic-gate #include "curses.h" 43*7c478bd9Sstevel@tonic-gate #include "term.h" 44*7c478bd9Sstevel@tonic-gate #include "print.h" 45*7c478bd9Sstevel@tonic-gate #include <fcntl.h> 46*7c478bd9Sstevel@tonic-gate #include <stdlib.h> 47*7c478bd9Sstevel@tonic-gate 48*7c478bd9Sstevel@tonic-gate /* externs from libcurses */ 49*7c478bd9Sstevel@tonic-gate extern char *boolnames[]; 50*7c478bd9Sstevel@tonic-gate extern char *boolcodes[]; 51*7c478bd9Sstevel@tonic-gate extern char *boolfnames[]; 52*7c478bd9Sstevel@tonic-gate extern char *numnames[]; 53*7c478bd9Sstevel@tonic-gate extern char *numcodes[]; 54*7c478bd9Sstevel@tonic-gate extern char *numfnames[]; 55*7c478bd9Sstevel@tonic-gate extern char *strnames[]; 56*7c478bd9Sstevel@tonic-gate extern char *strcodes[]; 57*7c478bd9Sstevel@tonic-gate extern char *strfnames[]; 58*7c478bd9Sstevel@tonic-gate extern char ttytype[]; 59*7c478bd9Sstevel@tonic-gate extern int tgetflag(); 60*7c478bd9Sstevel@tonic-gate extern int tgetnum(); 61*7c478bd9Sstevel@tonic-gate extern char *tgetstr(); 62*7c478bd9Sstevel@tonic-gate 63*7c478bd9Sstevel@tonic-gate /* externs from libc */ 64*7c478bd9Sstevel@tonic-gate extern void exit(); 65*7c478bd9Sstevel@tonic-gate extern void qsort(); 66*7c478bd9Sstevel@tonic-gate extern char *getenv(); 67*7c478bd9Sstevel@tonic-gate extern int getopt(); 68*7c478bd9Sstevel@tonic-gate extern int optind; 69*7c478bd9Sstevel@tonic-gate extern char *optarg; 70*7c478bd9Sstevel@tonic-gate extern char *strncpy(), *strcpy(); 71*7c478bd9Sstevel@tonic-gate extern int strcmp(), strlen(); 72*7c478bd9Sstevel@tonic-gate 73*7c478bd9Sstevel@tonic-gate /* data structures for this program */ 74*7c478bd9Sstevel@tonic-gate 75*7c478bd9Sstevel@tonic-gate struct boolstruct { 76*7c478bd9Sstevel@tonic-gate char *infoname; /* the terminfo capability name */ 77*7c478bd9Sstevel@tonic-gate char *capname; /* the termcap capability name */ 78*7c478bd9Sstevel@tonic-gate char *fullname; /* the long C variable name */ 79*7c478bd9Sstevel@tonic-gate char *secondname; /* the use= terminal w/ this value */ 80*7c478bd9Sstevel@tonic-gate char val; /* the value */ 81*7c478bd9Sstevel@tonic-gate char secondval; /* the value in the use= terminal */ 82*7c478bd9Sstevel@tonic-gate char changed; /* a use= terminal changed the value */ 83*7c478bd9Sstevel@tonic-gate char seenagain; /* a use= terminal had this entry */ 84*7c478bd9Sstevel@tonic-gate }; 85*7c478bd9Sstevel@tonic-gate 86*7c478bd9Sstevel@tonic-gate struct numstruct { 87*7c478bd9Sstevel@tonic-gate char *infoname; /* ditto from above */ 88*7c478bd9Sstevel@tonic-gate char *capname; 89*7c478bd9Sstevel@tonic-gate char *fullname; 90*7c478bd9Sstevel@tonic-gate char *secondname; 91*7c478bd9Sstevel@tonic-gate short val; 92*7c478bd9Sstevel@tonic-gate short secondval; 93*7c478bd9Sstevel@tonic-gate char changed; 94*7c478bd9Sstevel@tonic-gate char seenagain; 95*7c478bd9Sstevel@tonic-gate }; 96*7c478bd9Sstevel@tonic-gate 97*7c478bd9Sstevel@tonic-gate struct strstruct { 98*7c478bd9Sstevel@tonic-gate char *infoname; /* ditto from above */ 99*7c478bd9Sstevel@tonic-gate char *capname; 100*7c478bd9Sstevel@tonic-gate char *fullname; 101*7c478bd9Sstevel@tonic-gate char *secondname; 102*7c478bd9Sstevel@tonic-gate char *val; 103*7c478bd9Sstevel@tonic-gate char *secondval; 104*7c478bd9Sstevel@tonic-gate char changed; 105*7c478bd9Sstevel@tonic-gate char seenagain; 106*7c478bd9Sstevel@tonic-gate }; 107*7c478bd9Sstevel@tonic-gate 108*7c478bd9Sstevel@tonic-gate /* globals for this file */ 109*7c478bd9Sstevel@tonic-gate char *progname; /* argv[0], the name of the program */ 110*7c478bd9Sstevel@tonic-gate static struct boolstruct *ibool; /* array of char information */ 111*7c478bd9Sstevel@tonic-gate static struct numstruct *num; /* array of number information */ 112*7c478bd9Sstevel@tonic-gate static struct strstruct *str; /* array of string information */ 113*7c478bd9Sstevel@tonic-gate static char *used; /* usage statistics */ 114*7c478bd9Sstevel@tonic-gate static int numbools; /* how many booleans there are */ 115*7c478bd9Sstevel@tonic-gate static int numnums; /* how many numbers there are */ 116*7c478bd9Sstevel@tonic-gate static int numstrs; /* how many strings there are */ 117*7c478bd9Sstevel@tonic-gate #define TTYLEN 255 118*7c478bd9Sstevel@tonic-gate static char *firstterm; /* the name of the first terminal */ 119*7c478bd9Sstevel@tonic-gate static char *savettytype; /* the synonyms of the first terminal */ 120*7c478bd9Sstevel@tonic-gate static char _savettytype[TTYLEN+1]; /* the place to save those names */ 121*7c478bd9Sstevel@tonic-gate static int devnull; /* open("/dev/null") for setupterm */ 122*7c478bd9Sstevel@tonic-gate #define trace stderr /* send trace messages to stderr */ 123*7c478bd9Sstevel@tonic-gate 124*7c478bd9Sstevel@tonic-gate /* options */ 125*7c478bd9Sstevel@tonic-gate static int verbose = 0; /* debugging printing level */ 126*7c478bd9Sstevel@tonic-gate static int diff = 0; /* produce diff listing, the default */ 127*7c478bd9Sstevel@tonic-gate static int common = 0; /* produce common listing */ 128*7c478bd9Sstevel@tonic-gate static int neither = 0; /* list caps in neither entry */ 129*7c478bd9Sstevel@tonic-gate static int use = 0; /* produce use= comparison listing */ 130*7c478bd9Sstevel@tonic-gate static enum printtypes printing /* doing any of above printing at all */ 131*7c478bd9Sstevel@tonic-gate = pr_none; 132*7c478bd9Sstevel@tonic-gate enum { none, by_database, by_terminfo, by_longnames, by_cap } 133*7c478bd9Sstevel@tonic-gate sortorder = none; /* sort the fields for printing */ 134*7c478bd9Sstevel@tonic-gate static char *term1info, *term2info; /* $TERMINFO settings */ 135*7c478bd9Sstevel@tonic-gate static int Aflag = 0, Bflag = 0; /* $TERMINFO was set with -A/-B */ 136*7c478bd9Sstevel@tonic-gate 137*7c478bd9Sstevel@tonic-gate #define EQUAL(s1, s2) (((s1 == NULL) && (s2 == NULL)) || \ 138*7c478bd9Sstevel@tonic-gate ((s1 != NULL) && (s2 != NULL) && \ 139*7c478bd9Sstevel@tonic-gate (strcmp(s1, s2) == 0))) 140*7c478bd9Sstevel@tonic-gate 141*7c478bd9Sstevel@tonic-gate static void sortnames(); 142*7c478bd9Sstevel@tonic-gate int numcompare(const void *, const void *); 143*7c478bd9Sstevel@tonic-gate int boolcompare(const void *, const void *); 144*7c478bd9Sstevel@tonic-gate int strcompare(const void *, const void *); 145*7c478bd9Sstevel@tonic-gate static void check_nth_terminal(char *, int); 146*7c478bd9Sstevel@tonic-gate 147*7c478bd9Sstevel@tonic-gate void 148*7c478bd9Sstevel@tonic-gate badmalloc() 149*7c478bd9Sstevel@tonic-gate { 150*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "%s: malloc is out of space!\n", progname); 151*7c478bd9Sstevel@tonic-gate exit(-1); 152*7c478bd9Sstevel@tonic-gate } 153*7c478bd9Sstevel@tonic-gate 154*7c478bd9Sstevel@tonic-gate /* 155*7c478bd9Sstevel@tonic-gate Allocate and initialize the global data structures and variables. 156*7c478bd9Sstevel@tonic-gate */ 157*7c478bd9Sstevel@tonic-gate void 158*7c478bd9Sstevel@tonic-gate allocvariables(int argc, int firstoptind) 159*7c478bd9Sstevel@tonic-gate { 160*7c478bd9Sstevel@tonic-gate register int i, nullseen; 161*7c478bd9Sstevel@tonic-gate 162*7c478bd9Sstevel@tonic-gate /* find out how many names we are dealing with */ 163*7c478bd9Sstevel@tonic-gate for (numbools = 0; boolnames[numbools]; numbools++) 164*7c478bd9Sstevel@tonic-gate ; 165*7c478bd9Sstevel@tonic-gate for (numnums = 0; numnames[numnums]; numnums++) 166*7c478bd9Sstevel@tonic-gate ; 167*7c478bd9Sstevel@tonic-gate for (numstrs = 0; strnames[numstrs]; numstrs++) 168*7c478bd9Sstevel@tonic-gate ; 169*7c478bd9Sstevel@tonic-gate 170*7c478bd9Sstevel@tonic-gate if (verbose) { 171*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "There are %d boolean capabilities.\n", 172*7c478bd9Sstevel@tonic-gate numbools); 173*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "There are %d numeric capabilities.\n", 174*7c478bd9Sstevel@tonic-gate numnums); 175*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "There are %d string capabilities.\n", 176*7c478bd9Sstevel@tonic-gate numstrs); 177*7c478bd9Sstevel@tonic-gate } 178*7c478bd9Sstevel@tonic-gate 179*7c478bd9Sstevel@tonic-gate /* Allocate storage for the names and their values */ 180*7c478bd9Sstevel@tonic-gate ibool = (struct boolstruct *) malloc((unsigned) numbools * 181*7c478bd9Sstevel@tonic-gate sizeof (struct boolstruct)); 182*7c478bd9Sstevel@tonic-gate num = (struct numstruct *) malloc((unsigned) numnums * 183*7c478bd9Sstevel@tonic-gate sizeof (struct numstruct)); 184*7c478bd9Sstevel@tonic-gate str = (struct strstruct *) malloc((unsigned) numstrs * 185*7c478bd9Sstevel@tonic-gate sizeof (struct strstruct)); 186*7c478bd9Sstevel@tonic-gate 187*7c478bd9Sstevel@tonic-gate /* Allocate array to keep track of which names have been used. */ 188*7c478bd9Sstevel@tonic-gate if (use) 189*7c478bd9Sstevel@tonic-gate used = (char *) malloc((unsigned) (argc - firstoptind) * 190*7c478bd9Sstevel@tonic-gate sizeof (char)); 191*7c478bd9Sstevel@tonic-gate 192*7c478bd9Sstevel@tonic-gate if ((ibool == NULL) || (num == NULL) || (str == NULL) || 193*7c478bd9Sstevel@tonic-gate (use && (used == NULL))) 194*7c478bd9Sstevel@tonic-gate badmalloc(); 195*7c478bd9Sstevel@tonic-gate 196*7c478bd9Sstevel@tonic-gate /* Fill in the names and initialize the structures. */ 197*7c478bd9Sstevel@tonic-gate nullseen = FALSE; 198*7c478bd9Sstevel@tonic-gate for (i = 0; i < numbools; i++) { 199*7c478bd9Sstevel@tonic-gate ibool[i].infoname = boolnames[i]; 200*7c478bd9Sstevel@tonic-gate ibool[i].capname = boolcodes[i]; 201*7c478bd9Sstevel@tonic-gate /* This is necessary until fnames.c is */ 202*7c478bd9Sstevel@tonic-gate /* incorporated into standard curses. */ 203*7c478bd9Sstevel@tonic-gate if (nullseen || (boolfnames[i] == NULL)) { 204*7c478bd9Sstevel@tonic-gate ibool[i].fullname = "unknown_boolean"; 205*7c478bd9Sstevel@tonic-gate nullseen = TRUE; 206*7c478bd9Sstevel@tonic-gate } else 207*7c478bd9Sstevel@tonic-gate ibool[i].fullname = boolfnames[i]; 208*7c478bd9Sstevel@tonic-gate ibool[i].changed = FALSE; 209*7c478bd9Sstevel@tonic-gate ibool[i].seenagain = FALSE; 210*7c478bd9Sstevel@tonic-gate } 211*7c478bd9Sstevel@tonic-gate nullseen = 0; 212*7c478bd9Sstevel@tonic-gate for (i = 0; i < numnums; i++) { 213*7c478bd9Sstevel@tonic-gate num[i].infoname = numnames[i]; 214*7c478bd9Sstevel@tonic-gate num[i].capname = numcodes[i]; 215*7c478bd9Sstevel@tonic-gate if (nullseen || (numfnames[i] == NULL)) { 216*7c478bd9Sstevel@tonic-gate ibool[i].fullname = "unknown_number"; 217*7c478bd9Sstevel@tonic-gate nullseen = TRUE; 218*7c478bd9Sstevel@tonic-gate } else 219*7c478bd9Sstevel@tonic-gate num[i].fullname = numfnames[i]; 220*7c478bd9Sstevel@tonic-gate num[i].changed = FALSE; 221*7c478bd9Sstevel@tonic-gate num[i].seenagain = FALSE; 222*7c478bd9Sstevel@tonic-gate } 223*7c478bd9Sstevel@tonic-gate nullseen = 0; 224*7c478bd9Sstevel@tonic-gate for (i = 0; i < numstrs; i++) { 225*7c478bd9Sstevel@tonic-gate str[i].infoname = strnames[i]; 226*7c478bd9Sstevel@tonic-gate str[i].capname = strcodes[i]; 227*7c478bd9Sstevel@tonic-gate if (nullseen || (strfnames[i] == NULL)) { 228*7c478bd9Sstevel@tonic-gate str[i].fullname = "unknown_string"; 229*7c478bd9Sstevel@tonic-gate nullseen = TRUE; 230*7c478bd9Sstevel@tonic-gate } else 231*7c478bd9Sstevel@tonic-gate str[i].fullname = strfnames[i]; 232*7c478bd9Sstevel@tonic-gate str[i].changed = FALSE; 233*7c478bd9Sstevel@tonic-gate str[i].seenagain = FALSE; 234*7c478bd9Sstevel@tonic-gate } 235*7c478bd9Sstevel@tonic-gate } 236*7c478bd9Sstevel@tonic-gate 237*7c478bd9Sstevel@tonic-gate /* 238*7c478bd9Sstevel@tonic-gate Routines to be passed to qsort(3) for comparison of the structures. 239*7c478bd9Sstevel@tonic-gate */ 240*7c478bd9Sstevel@tonic-gate int 241*7c478bd9Sstevel@tonic-gate boolcompare(const void *x, const void *y) 242*7c478bd9Sstevel@tonic-gate { 243*7c478bd9Sstevel@tonic-gate struct boolstruct *a; 244*7c478bd9Sstevel@tonic-gate struct boolstruct *b; 245*7c478bd9Sstevel@tonic-gate 246*7c478bd9Sstevel@tonic-gate a = (struct boolstruct *)x; 247*7c478bd9Sstevel@tonic-gate b = (struct boolstruct *)y; 248*7c478bd9Sstevel@tonic-gate 249*7c478bd9Sstevel@tonic-gate switch ((int) sortorder) { 250*7c478bd9Sstevel@tonic-gate case (int) by_terminfo: 251*7c478bd9Sstevel@tonic-gate return (strcmp(a->infoname, b->infoname)); 252*7c478bd9Sstevel@tonic-gate case (int) by_cap: 253*7c478bd9Sstevel@tonic-gate return (strcmp(a->capname, b->capname)); 254*7c478bd9Sstevel@tonic-gate case (int) by_longnames: 255*7c478bd9Sstevel@tonic-gate return (strcmp(a->fullname, b->fullname)); 256*7c478bd9Sstevel@tonic-gate default: 257*7c478bd9Sstevel@tonic-gate return (0); 258*7c478bd9Sstevel@tonic-gate } 259*7c478bd9Sstevel@tonic-gate } 260*7c478bd9Sstevel@tonic-gate 261*7c478bd9Sstevel@tonic-gate int 262*7c478bd9Sstevel@tonic-gate numcompare(const void *x, const void *y) 263*7c478bd9Sstevel@tonic-gate { 264*7c478bd9Sstevel@tonic-gate struct numstruct *a; 265*7c478bd9Sstevel@tonic-gate struct numstruct *b; 266*7c478bd9Sstevel@tonic-gate 267*7c478bd9Sstevel@tonic-gate a = (struct numstruct *)x; 268*7c478bd9Sstevel@tonic-gate b = (struct numstruct *)y; 269*7c478bd9Sstevel@tonic-gate switch ((int) sortorder) { 270*7c478bd9Sstevel@tonic-gate case (int) by_terminfo: 271*7c478bd9Sstevel@tonic-gate return (strcmp(a->infoname, b->infoname)); 272*7c478bd9Sstevel@tonic-gate case (int) by_cap: 273*7c478bd9Sstevel@tonic-gate return (strcmp(a->capname, b->capname)); 274*7c478bd9Sstevel@tonic-gate case (int) by_longnames: 275*7c478bd9Sstevel@tonic-gate return (strcmp(a->fullname, b->fullname)); 276*7c478bd9Sstevel@tonic-gate default: 277*7c478bd9Sstevel@tonic-gate return (0); 278*7c478bd9Sstevel@tonic-gate } 279*7c478bd9Sstevel@tonic-gate } 280*7c478bd9Sstevel@tonic-gate 281*7c478bd9Sstevel@tonic-gate int 282*7c478bd9Sstevel@tonic-gate strcompare(const void *x, const void *y) 283*7c478bd9Sstevel@tonic-gate { 284*7c478bd9Sstevel@tonic-gate struct strstruct *a; 285*7c478bd9Sstevel@tonic-gate struct strstruct *b; 286*7c478bd9Sstevel@tonic-gate 287*7c478bd9Sstevel@tonic-gate a = (struct strstruct *)x; 288*7c478bd9Sstevel@tonic-gate b = (struct strstruct *)y; 289*7c478bd9Sstevel@tonic-gate 290*7c478bd9Sstevel@tonic-gate switch ((int) sortorder) { 291*7c478bd9Sstevel@tonic-gate case (int) by_terminfo: 292*7c478bd9Sstevel@tonic-gate return (strcmp(a->infoname, b->infoname)); 293*7c478bd9Sstevel@tonic-gate case (int) by_cap: 294*7c478bd9Sstevel@tonic-gate return (strcmp(a->capname, b->capname)); 295*7c478bd9Sstevel@tonic-gate case (int) by_longnames: 296*7c478bd9Sstevel@tonic-gate return (strcmp(a->fullname, b->fullname)); 297*7c478bd9Sstevel@tonic-gate default: 298*7c478bd9Sstevel@tonic-gate return (0); 299*7c478bd9Sstevel@tonic-gate } 300*7c478bd9Sstevel@tonic-gate } 301*7c478bd9Sstevel@tonic-gate 302*7c478bd9Sstevel@tonic-gate /* 303*7c478bd9Sstevel@tonic-gate Sort the entries by their terminfo name. 304*7c478bd9Sstevel@tonic-gate */ 305*7c478bd9Sstevel@tonic-gate static void 306*7c478bd9Sstevel@tonic-gate sortnames() 307*7c478bd9Sstevel@tonic-gate { 308*7c478bd9Sstevel@tonic-gate if (sortorder != by_database) { 309*7c478bd9Sstevel@tonic-gate qsort((char *) ibool, (unsigned) numbools, 310*7c478bd9Sstevel@tonic-gate sizeof (struct boolstruct), boolcompare); 311*7c478bd9Sstevel@tonic-gate qsort((char *) num, (unsigned) numnums, 312*7c478bd9Sstevel@tonic-gate sizeof (struct numstruct), numcompare); 313*7c478bd9Sstevel@tonic-gate qsort((char *) str, (unsigned) numstrs, 314*7c478bd9Sstevel@tonic-gate sizeof (struct strstruct), strcompare); 315*7c478bd9Sstevel@tonic-gate } 316*7c478bd9Sstevel@tonic-gate return; 317*7c478bd9Sstevel@tonic-gate } 318*7c478bd9Sstevel@tonic-gate 319*7c478bd9Sstevel@tonic-gate /* 320*7c478bd9Sstevel@tonic-gate Print out a string, or "NULL" if it's not defined. 321*7c478bd9Sstevel@tonic-gate */ 322*7c478bd9Sstevel@tonic-gate void 323*7c478bd9Sstevel@tonic-gate PR(FILE *stream, char *string) 324*7c478bd9Sstevel@tonic-gate { 325*7c478bd9Sstevel@tonic-gate if (string == NULL) 326*7c478bd9Sstevel@tonic-gate (void) fprintf(stream, "NULL"); 327*7c478bd9Sstevel@tonic-gate else 328*7c478bd9Sstevel@tonic-gate tpr(stream, string); 329*7c478bd9Sstevel@tonic-gate } 330*7c478bd9Sstevel@tonic-gate 331*7c478bd9Sstevel@tonic-gate /* 332*7c478bd9Sstevel@tonic-gate Output the 'ko' termcap string. This is a list of all of the input 333*7c478bd9Sstevel@tonic-gate keys that input the same thing as the corresponding output strings. 334*7c478bd9Sstevel@tonic-gate */ 335*7c478bd9Sstevel@tonic-gate int kncounter; 336*7c478bd9Sstevel@tonic-gate char kobuffer[512]; 337*7c478bd9Sstevel@tonic-gate 338*7c478bd9Sstevel@tonic-gate char 339*7c478bd9Sstevel@tonic-gate *addko(char *output, char *input, char *koptr) 340*7c478bd9Sstevel@tonic-gate { 341*7c478bd9Sstevel@tonic-gate char *inptr, *outptr, padbuffer[512]; 342*7c478bd9Sstevel@tonic-gate inptr = tgetstr(input, (char **)0); 343*7c478bd9Sstevel@tonic-gate if (inptr == NULL) 344*7c478bd9Sstevel@tonic-gate return (koptr); 345*7c478bd9Sstevel@tonic-gate outptr = tgetstr(output, (char **)0); 346*7c478bd9Sstevel@tonic-gate if (outptr == NULL) 347*7c478bd9Sstevel@tonic-gate return (koptr); 348*7c478bd9Sstevel@tonic-gate outptr = rmpadding(outptr, padbuffer, (int *) 0); 349*7c478bd9Sstevel@tonic-gate if (strcmp(inptr, outptr) == 0) { 350*7c478bd9Sstevel@tonic-gate *koptr++ = *output++; 351*7c478bd9Sstevel@tonic-gate *koptr++ = *output++; 352*7c478bd9Sstevel@tonic-gate *koptr++ = ','; 353*7c478bd9Sstevel@tonic-gate kncounter++; 354*7c478bd9Sstevel@tonic-gate } 355*7c478bd9Sstevel@tonic-gate return (koptr); 356*7c478bd9Sstevel@tonic-gate } 357*7c478bd9Sstevel@tonic-gate 358*7c478bd9Sstevel@tonic-gate void 359*7c478bd9Sstevel@tonic-gate setupknko() 360*7c478bd9Sstevel@tonic-gate { 361*7c478bd9Sstevel@tonic-gate char *koptr; 362*7c478bd9Sstevel@tonic-gate 363*7c478bd9Sstevel@tonic-gate kncounter = 0; 364*7c478bd9Sstevel@tonic-gate koptr = kobuffer; 365*7c478bd9Sstevel@tonic-gate 366*7c478bd9Sstevel@tonic-gate koptr = addko("bs", "kb", koptr); /* key_backspace */ 367*7c478bd9Sstevel@tonic-gate koptr = addko("bt", "kB", koptr); /* key_btab */ 368*7c478bd9Sstevel@tonic-gate koptr = addko("cl", "kC", koptr); /* key_clear */ 369*7c478bd9Sstevel@tonic-gate koptr = addko("le", "kl", koptr); /* key_left */ 370*7c478bd9Sstevel@tonic-gate koptr = addko("do", "kd", koptr); /* key_down */ 371*7c478bd9Sstevel@tonic-gate koptr = addko("nd", "kr", koptr); /* key_right */ 372*7c478bd9Sstevel@tonic-gate koptr = addko("up", "ku", koptr); /* key_up */ 373*7c478bd9Sstevel@tonic-gate koptr = addko("dc", "kD", koptr); /* key_dc */ 374*7c478bd9Sstevel@tonic-gate koptr = addko("dl", "kL", koptr); /* key_dl */ 375*7c478bd9Sstevel@tonic-gate koptr = addko("cd", "kS", koptr); /* key_eos */ 376*7c478bd9Sstevel@tonic-gate koptr = addko("ce", "kE", koptr); /* key_eol */ 377*7c478bd9Sstevel@tonic-gate koptr = addko("ho", "kh", koptr); /* key_home */ 378*7c478bd9Sstevel@tonic-gate koptr = addko("st", "kT", koptr); /* key_stab */ 379*7c478bd9Sstevel@tonic-gate koptr = addko("ic", "kI", koptr); /* key_ic */ 380*7c478bd9Sstevel@tonic-gate koptr = addko("im", "kI", koptr); /* key_ic */ 381*7c478bd9Sstevel@tonic-gate koptr = addko("al", "kA", koptr); /* key_il */ 382*7c478bd9Sstevel@tonic-gate koptr = addko("sf", "kF", koptr); /* key_sf */ 383*7c478bd9Sstevel@tonic-gate koptr = addko("ll", "kH", koptr); /* key_ll */ 384*7c478bd9Sstevel@tonic-gate koptr = addko("sr", "kR", koptr); /* key_sr */ 385*7c478bd9Sstevel@tonic-gate koptr = addko("ei", "kM", koptr); /* key_eic */ 386*7c478bd9Sstevel@tonic-gate koptr = addko("ct", "ka", koptr); /* key_catab */ 387*7c478bd9Sstevel@tonic-gate 388*7c478bd9Sstevel@tonic-gate /* get rid of comma */ 389*7c478bd9Sstevel@tonic-gate if (koptr != kobuffer) 390*7c478bd9Sstevel@tonic-gate *(--koptr) = '\0'; 391*7c478bd9Sstevel@tonic-gate } 392*7c478bd9Sstevel@tonic-gate 393*7c478bd9Sstevel@tonic-gate void 394*7c478bd9Sstevel@tonic-gate pr_kn() 395*7c478bd9Sstevel@tonic-gate { 396*7c478bd9Sstevel@tonic-gate if (kncounter > 0) 397*7c478bd9Sstevel@tonic-gate pr_number((char *)0, "kn", (char *)0, kncounter); 398*7c478bd9Sstevel@tonic-gate } 399*7c478bd9Sstevel@tonic-gate 400*7c478bd9Sstevel@tonic-gate void 401*7c478bd9Sstevel@tonic-gate pr_ko() 402*7c478bd9Sstevel@tonic-gate { 403*7c478bd9Sstevel@tonic-gate if (kncounter > 0) 404*7c478bd9Sstevel@tonic-gate pr_string((char *)0, "ko", (char *)0, kobuffer); 405*7c478bd9Sstevel@tonic-gate } 406*7c478bd9Sstevel@tonic-gate 407*7c478bd9Sstevel@tonic-gate void 408*7c478bd9Sstevel@tonic-gate pr_bcaps() 409*7c478bd9Sstevel@tonic-gate { 410*7c478bd9Sstevel@tonic-gate char *retptr; 411*7c478bd9Sstevel@tonic-gate char padbuffer[512]; 412*7c478bd9Sstevel@tonic-gate 413*7c478bd9Sstevel@tonic-gate if (verbose) 414*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'bs'\n"); 415*7c478bd9Sstevel@tonic-gate retptr = cconvert(rmpadding(cursor_left, padbuffer, (int *) 0)); 416*7c478bd9Sstevel@tonic-gate if (strcmp("\\b", retptr) == 0) 417*7c478bd9Sstevel@tonic-gate pr_boolean((char *)0, "bs", (char *)0, 1); 418*7c478bd9Sstevel@tonic-gate 419*7c478bd9Sstevel@tonic-gate if (verbose) 420*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'pt'\n"); 421*7c478bd9Sstevel@tonic-gate retptr = cconvert(rmpadding(tab, padbuffer, (int *) 0)); 422*7c478bd9Sstevel@tonic-gate if (strcmp("\\t", retptr) == 0) 423*7c478bd9Sstevel@tonic-gate pr_boolean((char *)0, "pt", (char *)0, 1); 424*7c478bd9Sstevel@tonic-gate 425*7c478bd9Sstevel@tonic-gate if (verbose) 426*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'nc'\n"); 427*7c478bd9Sstevel@tonic-gate retptr = cconvert(rmpadding(carriage_return, padbuffer, (int *) 0)); 428*7c478bd9Sstevel@tonic-gate if (strcmp("\\r", retptr) != 0) 429*7c478bd9Sstevel@tonic-gate pr_boolean((char *)0, "nc", (char *)0, 1); 430*7c478bd9Sstevel@tonic-gate 431*7c478bd9Sstevel@tonic-gate if (verbose) 432*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'ns'\n"); 433*7c478bd9Sstevel@tonic-gate if (scroll_forward == NULL) 434*7c478bd9Sstevel@tonic-gate pr_boolean((char *)0, "ns", (char *)0, 1); 435*7c478bd9Sstevel@tonic-gate 436*7c478bd9Sstevel@tonic-gate /* Ignore "xr": Return acts like ce \r \n (Delta Data) */ 437*7c478bd9Sstevel@tonic-gate } 438*7c478bd9Sstevel@tonic-gate 439*7c478bd9Sstevel@tonic-gate void 440*7c478bd9Sstevel@tonic-gate pr_ncaps() 441*7c478bd9Sstevel@tonic-gate { 442*7c478bd9Sstevel@tonic-gate char padbuffer[512]; 443*7c478bd9Sstevel@tonic-gate int padding; 444*7c478bd9Sstevel@tonic-gate 445*7c478bd9Sstevel@tonic-gate if (verbose) 446*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'ug'\n"); 447*7c478bd9Sstevel@tonic-gate /* Duplicate sg for ug: Number of blank chars left by us or ue */ 448*7c478bd9Sstevel@tonic-gate if (magic_cookie_glitch > -1) 449*7c478bd9Sstevel@tonic-gate pr_number((char *)0, "ug", (char *)0, magic_cookie_glitch); 450*7c478bd9Sstevel@tonic-gate 451*7c478bd9Sstevel@tonic-gate if (verbose) 452*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'dB'\n"); 453*7c478bd9Sstevel@tonic-gate /* Number of millisec of bs delay needed */ 454*7c478bd9Sstevel@tonic-gate (void) rmpadding(cursor_left, padbuffer, &padding); 455*7c478bd9Sstevel@tonic-gate if (padding > 0) 456*7c478bd9Sstevel@tonic-gate pr_number((char *)0, "dB", (char *)0, padding); 457*7c478bd9Sstevel@tonic-gate 458*7c478bd9Sstevel@tonic-gate if (verbose) 459*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'dC'\n"); 460*7c478bd9Sstevel@tonic-gate /* Number of millisec of cr delay needed */ 461*7c478bd9Sstevel@tonic-gate (void) rmpadding(carriage_return, padbuffer, &padding); 462*7c478bd9Sstevel@tonic-gate if (padding > 0) 463*7c478bd9Sstevel@tonic-gate pr_number((char *)0, "dC", (char *)0, padding); 464*7c478bd9Sstevel@tonic-gate 465*7c478bd9Sstevel@tonic-gate if (verbose) 466*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'dF'\n"); 467*7c478bd9Sstevel@tonic-gate /* Number of millisec of ff delay needed */ 468*7c478bd9Sstevel@tonic-gate (void) rmpadding(form_feed, padbuffer, &padding); 469*7c478bd9Sstevel@tonic-gate if (padding > 0) 470*7c478bd9Sstevel@tonic-gate pr_number((char *)0, "dF", (char *)0, padding); 471*7c478bd9Sstevel@tonic-gate 472*7c478bd9Sstevel@tonic-gate if (verbose) 473*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'dN'\n"); 474*7c478bd9Sstevel@tonic-gate /* Number of millisec of nl delay needed */ 475*7c478bd9Sstevel@tonic-gate (void) rmpadding(cursor_down, padbuffer, &padding); 476*7c478bd9Sstevel@tonic-gate if (padding > 0) 477*7c478bd9Sstevel@tonic-gate pr_number((char *)0, "dN", (char *)0, padding); 478*7c478bd9Sstevel@tonic-gate 479*7c478bd9Sstevel@tonic-gate if (verbose) 480*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'dT'\n"); 481*7c478bd9Sstevel@tonic-gate /* Number of millisec of tab delay needed */ 482*7c478bd9Sstevel@tonic-gate (void) rmpadding(tab, padbuffer, &padding); 483*7c478bd9Sstevel@tonic-gate if (padding > 0) 484*7c478bd9Sstevel@tonic-gate pr_number((char *)0, "dT", (char *)0, padding); 485*7c478bd9Sstevel@tonic-gate 486*7c478bd9Sstevel@tonic-gate /* Handle "kn": Number of "other" keys */ 487*7c478bd9Sstevel@tonic-gate setupknko(); 488*7c478bd9Sstevel@tonic-gate pr_kn(); 489*7c478bd9Sstevel@tonic-gate } 490*7c478bd9Sstevel@tonic-gate 491*7c478bd9Sstevel@tonic-gate void 492*7c478bd9Sstevel@tonic-gate pr_scaps() 493*7c478bd9Sstevel@tonic-gate { 494*7c478bd9Sstevel@tonic-gate char *retptr; 495*7c478bd9Sstevel@tonic-gate char padbuffer[512]; 496*7c478bd9Sstevel@tonic-gate 497*7c478bd9Sstevel@tonic-gate /* Backspace if not "^H" */ 498*7c478bd9Sstevel@tonic-gate if (verbose) 499*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'bc'\n"); 500*7c478bd9Sstevel@tonic-gate retptr = cconvert(rmpadding(cursor_left, padbuffer, (int *) 0)); 501*7c478bd9Sstevel@tonic-gate if (strcmp("\\b", retptr) != 0) 502*7c478bd9Sstevel@tonic-gate pr_string((char *)0, "bc", (char *)0, cursor_left); 503*7c478bd9Sstevel@tonic-gate 504*7c478bd9Sstevel@tonic-gate /* Newline character (default "\n") */ 505*7c478bd9Sstevel@tonic-gate if (verbose) 506*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "looking at 'nl'\n"); 507*7c478bd9Sstevel@tonic-gate retptr = cconvert(rmpadding(cursor_down, padbuffer, (int *) 0)); 508*7c478bd9Sstevel@tonic-gate if (strcmp("\\n", retptr) != 0) 509*7c478bd9Sstevel@tonic-gate pr_string((char *)0, "nl", (char *)0, cursor_down); 510*7c478bd9Sstevel@tonic-gate 511*7c478bd9Sstevel@tonic-gate /* Handle "ko" here: Termcap entries for other non-function keys */ 512*7c478bd9Sstevel@tonic-gate pr_ko(); 513*7c478bd9Sstevel@tonic-gate 514*7c478bd9Sstevel@tonic-gate /* Ignore "ma": Arrow key map, used by vi version 2 only */ 515*7c478bd9Sstevel@tonic-gate } 516*7c478bd9Sstevel@tonic-gate 517*7c478bd9Sstevel@tonic-gate /* 518*7c478bd9Sstevel@tonic-gate Set up the first terminal and save the values from it. 519*7c478bd9Sstevel@tonic-gate */ 520*7c478bd9Sstevel@tonic-gate void 521*7c478bd9Sstevel@tonic-gate initfirstterm(char *term) 522*7c478bd9Sstevel@tonic-gate { 523*7c478bd9Sstevel@tonic-gate register int i; 524*7c478bd9Sstevel@tonic-gate 525*7c478bd9Sstevel@tonic-gate if (verbose) 526*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "setting up terminal type '%s'.\n", 527*7c478bd9Sstevel@tonic-gate term); 528*7c478bd9Sstevel@tonic-gate 529*7c478bd9Sstevel@tonic-gate (void) setupterm(term, devnull, (int *) 0); 530*7c478bd9Sstevel@tonic-gate 531*7c478bd9Sstevel@tonic-gate /* Save the name for later use. */ 532*7c478bd9Sstevel@tonic-gate if (use) { 533*7c478bd9Sstevel@tonic-gate register unsigned int length; 534*7c478bd9Sstevel@tonic-gate savettytype = _savettytype; 535*7c478bd9Sstevel@tonic-gate if ((length = strlen(ttytype)) >= TTYLEN) { 536*7c478bd9Sstevel@tonic-gate savettytype = malloc(length); 537*7c478bd9Sstevel@tonic-gate if (savettytype == NULL) { 538*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "%s: malloc is out " 539*7c478bd9Sstevel@tonic-gate "of space\n", progname); 540*7c478bd9Sstevel@tonic-gate (void) strncpy(_savettytype, ttytype, 541*7c478bd9Sstevel@tonic-gate TTYLEN-1); 542*7c478bd9Sstevel@tonic-gate _savettytype[TTYLEN] = '\0'; 543*7c478bd9Sstevel@tonic-gate savettytype = _savettytype; 544*7c478bd9Sstevel@tonic-gate } 545*7c478bd9Sstevel@tonic-gate } else 546*7c478bd9Sstevel@tonic-gate (void) strcpy(_savettytype, ttytype); 547*7c478bd9Sstevel@tonic-gate } 548*7c478bd9Sstevel@tonic-gate 549*7c478bd9Sstevel@tonic-gate if (printing != pr_none) { 550*7c478bd9Sstevel@tonic-gate pr_heading(term, ttytype); 551*7c478bd9Sstevel@tonic-gate pr_bheading(); 552*7c478bd9Sstevel@tonic-gate } 553*7c478bd9Sstevel@tonic-gate 554*7c478bd9Sstevel@tonic-gate /* Save the values for the first terminal. */ 555*7c478bd9Sstevel@tonic-gate for (i = 0; i < numbools; i++) { 556*7c478bd9Sstevel@tonic-gate if ((ibool[i].val = tgetflag(ibool[i].capname)) && 557*7c478bd9Sstevel@tonic-gate printing != pr_none) 558*7c478bd9Sstevel@tonic-gate pr_boolean(ibool[i].infoname, ibool[i].capname, 559*7c478bd9Sstevel@tonic-gate ibool[i].fullname, 1); 560*7c478bd9Sstevel@tonic-gate if (verbose) 561*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "%s=%d.\n", ibool[i].infoname, 562*7c478bd9Sstevel@tonic-gate ibool[i].val); 563*7c478bd9Sstevel@tonic-gate } 564*7c478bd9Sstevel@tonic-gate 565*7c478bd9Sstevel@tonic-gate if (printing != pr_none) { 566*7c478bd9Sstevel@tonic-gate if (printing == pr_cap) 567*7c478bd9Sstevel@tonic-gate pr_bcaps(); 568*7c478bd9Sstevel@tonic-gate pr_bfooting(); 569*7c478bd9Sstevel@tonic-gate pr_nheading(); 570*7c478bd9Sstevel@tonic-gate } 571*7c478bd9Sstevel@tonic-gate 572*7c478bd9Sstevel@tonic-gate for (i = 0; i < numnums; i++) { 573*7c478bd9Sstevel@tonic-gate if (((num[i].val = tgetnum(num[i].capname)) > -1) && 574*7c478bd9Sstevel@tonic-gate printing != pr_none) 575*7c478bd9Sstevel@tonic-gate pr_number(num[i].infoname, num[i].capname, 576*7c478bd9Sstevel@tonic-gate num[i].fullname, num[i].val); 577*7c478bd9Sstevel@tonic-gate if (verbose) 578*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "%s=%d.\n", num[i].infoname, 579*7c478bd9Sstevel@tonic-gate num[i].val); 580*7c478bd9Sstevel@tonic-gate } 581*7c478bd9Sstevel@tonic-gate 582*7c478bd9Sstevel@tonic-gate if (printing != pr_none) { 583*7c478bd9Sstevel@tonic-gate if (printing == pr_cap) 584*7c478bd9Sstevel@tonic-gate pr_ncaps(); 585*7c478bd9Sstevel@tonic-gate pr_nfooting(); 586*7c478bd9Sstevel@tonic-gate pr_sheading(); 587*7c478bd9Sstevel@tonic-gate } 588*7c478bd9Sstevel@tonic-gate 589*7c478bd9Sstevel@tonic-gate for (i = 0; i < numstrs; i++) { 590*7c478bd9Sstevel@tonic-gate str[i].val = tgetstr(str[i].capname, (char **)0); 591*7c478bd9Sstevel@tonic-gate if ((str[i].val != NULL) && printing != pr_none) 592*7c478bd9Sstevel@tonic-gate pr_string(str[i].infoname, str[i].capname, 593*7c478bd9Sstevel@tonic-gate str[i].fullname, str[i].val); 594*7c478bd9Sstevel@tonic-gate if (verbose) { 595*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "%s='", str[i].infoname); 596*7c478bd9Sstevel@tonic-gate PR(trace, str[i].val); 597*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "'.\n"); 598*7c478bd9Sstevel@tonic-gate } 599*7c478bd9Sstevel@tonic-gate } 600*7c478bd9Sstevel@tonic-gate 601*7c478bd9Sstevel@tonic-gate if (printing == pr_cap) 602*7c478bd9Sstevel@tonic-gate pr_scaps(); 603*7c478bd9Sstevel@tonic-gate 604*7c478bd9Sstevel@tonic-gate if (printing != pr_none) 605*7c478bd9Sstevel@tonic-gate pr_sfooting(); 606*7c478bd9Sstevel@tonic-gate } 607*7c478bd9Sstevel@tonic-gate 608*7c478bd9Sstevel@tonic-gate /* 609*7c478bd9Sstevel@tonic-gate Set up the n'th terminal. 610*7c478bd9Sstevel@tonic-gate */ 611*7c478bd9Sstevel@tonic-gate static void 612*7c478bd9Sstevel@tonic-gate check_nth_terminal(char *nterm, int n) 613*7c478bd9Sstevel@tonic-gate { 614*7c478bd9Sstevel@tonic-gate register char boolval; 615*7c478bd9Sstevel@tonic-gate register short numval; 616*7c478bd9Sstevel@tonic-gate register char *strval; 617*7c478bd9Sstevel@tonic-gate register int i; 618*7c478bd9Sstevel@tonic-gate 619*7c478bd9Sstevel@tonic-gate if (use) 620*7c478bd9Sstevel@tonic-gate used[n] = FALSE; 621*7c478bd9Sstevel@tonic-gate 622*7c478bd9Sstevel@tonic-gate if (verbose) 623*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "adding in terminal type '%s'.\n", 624*7c478bd9Sstevel@tonic-gate nterm); 625*7c478bd9Sstevel@tonic-gate 626*7c478bd9Sstevel@tonic-gate (void) setupterm(nterm, devnull, (int *) 0); 627*7c478bd9Sstevel@tonic-gate 628*7c478bd9Sstevel@tonic-gate if (printing != pr_none) { 629*7c478bd9Sstevel@tonic-gate pr_heading(nterm, ttytype); 630*7c478bd9Sstevel@tonic-gate pr_bheading(); 631*7c478bd9Sstevel@tonic-gate } 632*7c478bd9Sstevel@tonic-gate 633*7c478bd9Sstevel@tonic-gate if (diff || common || neither) { 634*7c478bd9Sstevel@tonic-gate if (Aflag && Bflag) 635*7c478bd9Sstevel@tonic-gate (void) printf("comparing %s (TERMINFO=%s) to %s " 636*7c478bd9Sstevel@tonic-gate "(TERMINFO=%s).\n", 637*7c478bd9Sstevel@tonic-gate firstterm, term1info, nterm, term2info); 638*7c478bd9Sstevel@tonic-gate else if (Aflag) 639*7c478bd9Sstevel@tonic-gate (void) printf("comparing %s (TERMINFO=%s) to %s.\n", 640*7c478bd9Sstevel@tonic-gate firstterm, term1info, nterm); 641*7c478bd9Sstevel@tonic-gate else if (Bflag) 642*7c478bd9Sstevel@tonic-gate (void) printf("comparing %s to %s (TERMINFO=%s).\n", 643*7c478bd9Sstevel@tonic-gate firstterm, nterm, term2info); 644*7c478bd9Sstevel@tonic-gate else 645*7c478bd9Sstevel@tonic-gate (void) printf("comparing %s to %s.\n", 646*7c478bd9Sstevel@tonic-gate firstterm, nterm); 647*7c478bd9Sstevel@tonic-gate (void) printf(" comparing booleans.\n"); 648*7c478bd9Sstevel@tonic-gate } 649*7c478bd9Sstevel@tonic-gate 650*7c478bd9Sstevel@tonic-gate /* save away the values for the nth terminal */ 651*7c478bd9Sstevel@tonic-gate for (i = 0; i < numbools; i++) { 652*7c478bd9Sstevel@tonic-gate boolval = tgetflag(ibool[i].capname); 653*7c478bd9Sstevel@tonic-gate if (use) { 654*7c478bd9Sstevel@tonic-gate if (ibool[i].seenagain) { 655*7c478bd9Sstevel@tonic-gate /* 656*7c478bd9Sstevel@tonic-gate ** We do not have to worry about this impossible case 657*7c478bd9Sstevel@tonic-gate ** since booleans can have only two values: true and 658*7c478bd9Sstevel@tonic-gate ** false. 659*7c478bd9Sstevel@tonic-gate ** if (boolval && (boolval != ibool[i].secondval)) 660*7c478bd9Sstevel@tonic-gate ** { 661*7c478bd9Sstevel@tonic-gate ** (void) fprintf(trace, "use= order dependency" 662*7c478bd9Sstevel@tonic-gate ** "found:\n"); 663*7c478bd9Sstevel@tonic-gate ** (void) fprintf(trace, " %s: %s has %d, %s has" 664*7c478bd9Sstevel@tonic-gate ** " %d.\n", 665*7c478bd9Sstevel@tonic-gate ** ibool[i].capname, ibool[i].secondname, 666*7c478bd9Sstevel@tonic-gate ** ibool[i].secondval, nterm, boolval); 667*7c478bd9Sstevel@tonic-gate ** } 668*7c478bd9Sstevel@tonic-gate */ 669*7c478bd9Sstevel@tonic-gate } else { 670*7c478bd9Sstevel@tonic-gate if (boolval == TRUE) { 671*7c478bd9Sstevel@tonic-gate ibool[i].seenagain = TRUE; 672*7c478bd9Sstevel@tonic-gate ibool[i].secondval = boolval; 673*7c478bd9Sstevel@tonic-gate ibool[i].secondname = nterm; 674*7c478bd9Sstevel@tonic-gate if (ibool[i].val != boolval) 675*7c478bd9Sstevel@tonic-gate ibool[i].changed = TRUE; 676*7c478bd9Sstevel@tonic-gate else 677*7c478bd9Sstevel@tonic-gate used[n] = TRUE; 678*7c478bd9Sstevel@tonic-gate } 679*7c478bd9Sstevel@tonic-gate } 680*7c478bd9Sstevel@tonic-gate } 681*7c478bd9Sstevel@tonic-gate if (boolval) { 682*7c478bd9Sstevel@tonic-gate if (printing != pr_none) 683*7c478bd9Sstevel@tonic-gate pr_boolean(ibool[i].infoname, ibool[i].capname, 684*7c478bd9Sstevel@tonic-gate ibool[i].fullname, 1); 685*7c478bd9Sstevel@tonic-gate if (common && (ibool[i].val == boolval)) 686*7c478bd9Sstevel@tonic-gate (void) printf("\t%s= T.\n", ibool[i].infoname); 687*7c478bd9Sstevel@tonic-gate } else if (neither && !ibool[i].val) 688*7c478bd9Sstevel@tonic-gate (void) printf("\t!%s.\n", ibool[i].infoname); 689*7c478bd9Sstevel@tonic-gate if (diff && (ibool[i].val != boolval)) 690*7c478bd9Sstevel@tonic-gate (void) printf("\t%s: %c:%c.\n", ibool[i].infoname, 691*7c478bd9Sstevel@tonic-gate ibool[i].val?'T':'F', boolval?'T':'F'); 692*7c478bd9Sstevel@tonic-gate if (verbose) 693*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "%s: %d:%d, changed=%d, " 694*7c478bd9Sstevel@tonic-gate "seen=%d.\n", ibool[i].infoname, ibool[i].val, 695*7c478bd9Sstevel@tonic-gate boolval, ibool[i].changed, ibool[i].seenagain); 696*7c478bd9Sstevel@tonic-gate } 697*7c478bd9Sstevel@tonic-gate 698*7c478bd9Sstevel@tonic-gate if (printing != pr_none) { 699*7c478bd9Sstevel@tonic-gate if (printing == pr_cap) 700*7c478bd9Sstevel@tonic-gate pr_bcaps(); 701*7c478bd9Sstevel@tonic-gate pr_bfooting(); 702*7c478bd9Sstevel@tonic-gate pr_nheading(); 703*7c478bd9Sstevel@tonic-gate } 704*7c478bd9Sstevel@tonic-gate 705*7c478bd9Sstevel@tonic-gate if (diff || common || neither) 706*7c478bd9Sstevel@tonic-gate (void) printf(" comparing numbers.\n"); 707*7c478bd9Sstevel@tonic-gate 708*7c478bd9Sstevel@tonic-gate for (i = 0; i < numnums; i++) { 709*7c478bd9Sstevel@tonic-gate numval = tgetnum(num[i].capname); 710*7c478bd9Sstevel@tonic-gate if (use) { 711*7c478bd9Sstevel@tonic-gate if (num[i].seenagain) { 712*7c478bd9Sstevel@tonic-gate if ((numval > -1) && 713*7c478bd9Sstevel@tonic-gate (numval != num[i].secondval)) { 714*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 715*7c478bd9Sstevel@tonic-gate "%s: use = order dependency " 716*7c478bd9Sstevel@tonic-gate "found:\n", progname); 717*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, " %s: %s " 718*7c478bd9Sstevel@tonic-gate "has %d, %s has %d.\n", 719*7c478bd9Sstevel@tonic-gate num[i].capname, num[i].secondname, 720*7c478bd9Sstevel@tonic-gate num[i].secondval, nterm, numval); 721*7c478bd9Sstevel@tonic-gate } 722*7c478bd9Sstevel@tonic-gate } else { 723*7c478bd9Sstevel@tonic-gate if (numval > -1) { 724*7c478bd9Sstevel@tonic-gate num[i].seenagain = TRUE; 725*7c478bd9Sstevel@tonic-gate num[i].secondval = numval; 726*7c478bd9Sstevel@tonic-gate num[i].secondname = nterm; 727*7c478bd9Sstevel@tonic-gate if ((numval > -1) && 728*7c478bd9Sstevel@tonic-gate (num[i].val != numval)) 729*7c478bd9Sstevel@tonic-gate num[i].changed = TRUE; 730*7c478bd9Sstevel@tonic-gate else 731*7c478bd9Sstevel@tonic-gate used[n] = TRUE; 732*7c478bd9Sstevel@tonic-gate } 733*7c478bd9Sstevel@tonic-gate } 734*7c478bd9Sstevel@tonic-gate } 735*7c478bd9Sstevel@tonic-gate if (numval > -1) { 736*7c478bd9Sstevel@tonic-gate if (printing != pr_none) 737*7c478bd9Sstevel@tonic-gate pr_number(num[i].infoname, num[i].capname, 738*7c478bd9Sstevel@tonic-gate num[i].fullname, numval); 739*7c478bd9Sstevel@tonic-gate if (common && (num[i].val == numval)) 740*7c478bd9Sstevel@tonic-gate (void) printf("\t%s= %d.\n", num[i].infoname, 741*7c478bd9Sstevel@tonic-gate numval); 742*7c478bd9Sstevel@tonic-gate } else if (neither && (num[i].val == -1)) 743*7c478bd9Sstevel@tonic-gate (void) printf("\t!%s.\n", num[i].infoname); 744*7c478bd9Sstevel@tonic-gate if (diff && (num[i].val != numval)) 745*7c478bd9Sstevel@tonic-gate (void) printf("\t%s: %d:%d.\n", 746*7c478bd9Sstevel@tonic-gate num[i].infoname, num[i].val, numval); 747*7c478bd9Sstevel@tonic-gate if (verbose) 748*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "%s: %d:%d, " 749*7c478bd9Sstevel@tonic-gate "changed = %d, seen = %d.\n", 750*7c478bd9Sstevel@tonic-gate num[i].infoname, num[i].val, numval, 751*7c478bd9Sstevel@tonic-gate num[i].changed, num[i].seenagain); 752*7c478bd9Sstevel@tonic-gate } 753*7c478bd9Sstevel@tonic-gate 754*7c478bd9Sstevel@tonic-gate if (printing != pr_none) { 755*7c478bd9Sstevel@tonic-gate if (printing == pr_cap) 756*7c478bd9Sstevel@tonic-gate pr_ncaps(); 757*7c478bd9Sstevel@tonic-gate pr_nfooting(); 758*7c478bd9Sstevel@tonic-gate pr_sheading(); 759*7c478bd9Sstevel@tonic-gate } 760*7c478bd9Sstevel@tonic-gate 761*7c478bd9Sstevel@tonic-gate if (diff || common || neither) 762*7c478bd9Sstevel@tonic-gate (void) printf(" comparing strings.\n"); 763*7c478bd9Sstevel@tonic-gate 764*7c478bd9Sstevel@tonic-gate for (i = 0; i < numstrs; i++) { 765*7c478bd9Sstevel@tonic-gate strval = tgetstr(str[i].capname, (char **)0); 766*7c478bd9Sstevel@tonic-gate if (use) { 767*7c478bd9Sstevel@tonic-gate if (str[i].seenagain && (strval != NULL)) { 768*7c478bd9Sstevel@tonic-gate if (!EQUAL(strval, str[i].secondval)) { 769*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 770*7c478bd9Sstevel@tonic-gate "use= order dependency" 771*7c478bd9Sstevel@tonic-gate " found:\n"); 772*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 773*7c478bd9Sstevel@tonic-gate " %s: %s has '", 774*7c478bd9Sstevel@tonic-gate str[i].capname, str[i].secondname); 775*7c478bd9Sstevel@tonic-gate PR(stderr, str[i].secondval); 776*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 777*7c478bd9Sstevel@tonic-gate "', %s has '", nterm); 778*7c478bd9Sstevel@tonic-gate PR(stderr, strval); 779*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "'.\n"); 780*7c478bd9Sstevel@tonic-gate } 781*7c478bd9Sstevel@tonic-gate } else { 782*7c478bd9Sstevel@tonic-gate if (strval != NULL) { 783*7c478bd9Sstevel@tonic-gate str[i].seenagain = TRUE; 784*7c478bd9Sstevel@tonic-gate str[i].secondval = strval; 785*7c478bd9Sstevel@tonic-gate str[i].secondname = nterm; 786*7c478bd9Sstevel@tonic-gate if (!EQUAL(str[i].val, strval)) 787*7c478bd9Sstevel@tonic-gate str[i].changed = TRUE; 788*7c478bd9Sstevel@tonic-gate else 789*7c478bd9Sstevel@tonic-gate used[n] = TRUE; 790*7c478bd9Sstevel@tonic-gate } 791*7c478bd9Sstevel@tonic-gate } 792*7c478bd9Sstevel@tonic-gate } 793*7c478bd9Sstevel@tonic-gate if (strval != NULL) { 794*7c478bd9Sstevel@tonic-gate if (printing != pr_none) 795*7c478bd9Sstevel@tonic-gate pr_string(str[i].infoname, str[i].capname, 796*7c478bd9Sstevel@tonic-gate str[i].fullname, strval); 797*7c478bd9Sstevel@tonic-gate if (common && EQUAL(str[i].val, strval)) { 798*7c478bd9Sstevel@tonic-gate (void) printf("\t%s= '", str[i].infoname); 799*7c478bd9Sstevel@tonic-gate PR(stdout, strval); 800*7c478bd9Sstevel@tonic-gate (void) printf("'.\n"); 801*7c478bd9Sstevel@tonic-gate } 802*7c478bd9Sstevel@tonic-gate } else if (neither && (str[i].val == NULL)) 803*7c478bd9Sstevel@tonic-gate (void) printf("\t!%s.\n", str[i].infoname); 804*7c478bd9Sstevel@tonic-gate if (diff && !EQUAL(str[i].val, strval)) { 805*7c478bd9Sstevel@tonic-gate (void) printf("\t%s: '", str[i].infoname); 806*7c478bd9Sstevel@tonic-gate PR(stdout, str[i].val); 807*7c478bd9Sstevel@tonic-gate (void) printf("','"); 808*7c478bd9Sstevel@tonic-gate PR(stdout, strval); 809*7c478bd9Sstevel@tonic-gate (void) printf("'.\n"); 810*7c478bd9Sstevel@tonic-gate } 811*7c478bd9Sstevel@tonic-gate if (verbose) { 812*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "%s: '", str[i].infoname); 813*7c478bd9Sstevel@tonic-gate PR(trace, str[i].val); 814*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "':'"); 815*7c478bd9Sstevel@tonic-gate PR(trace, strval); 816*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "',changed=%d,seen=%d.\n", 817*7c478bd9Sstevel@tonic-gate str[i].changed, str[i].seenagain); 818*7c478bd9Sstevel@tonic-gate } 819*7c478bd9Sstevel@tonic-gate } 820*7c478bd9Sstevel@tonic-gate 821*7c478bd9Sstevel@tonic-gate if (printing == pr_cap) 822*7c478bd9Sstevel@tonic-gate pr_scaps(); 823*7c478bd9Sstevel@tonic-gate 824*7c478bd9Sstevel@tonic-gate if (printing != pr_none) 825*7c478bd9Sstevel@tonic-gate pr_sfooting(); 826*7c478bd9Sstevel@tonic-gate 827*7c478bd9Sstevel@tonic-gate return; 828*7c478bd9Sstevel@tonic-gate } 829*7c478bd9Sstevel@tonic-gate 830*7c478bd9Sstevel@tonic-gate /* 831*7c478bd9Sstevel@tonic-gate A capability gets an at-sign if it no longer exists, but 832*7c478bd9Sstevel@tonic-gate one of the relative entries contains a value for it. 833*7c478bd9Sstevel@tonic-gate It gets printed if the original value is not seen in ANY 834*7c478bd9Sstevel@tonic-gate of the relative entries, or if the FIRST relative entry that has 835*7c478bd9Sstevel@tonic-gate the capability gives a DIFFERENT value for the capability. 836*7c478bd9Sstevel@tonic-gate */ 837*7c478bd9Sstevel@tonic-gate void 838*7c478bd9Sstevel@tonic-gate dorelative(int firstoptind, int argc, char **argv) 839*7c478bd9Sstevel@tonic-gate { 840*7c478bd9Sstevel@tonic-gate register int i; 841*7c478bd9Sstevel@tonic-gate 842*7c478bd9Sstevel@tonic-gate /* turn off printing of termcap and long names */ 843*7c478bd9Sstevel@tonic-gate pr_init(pr_terminfo); 844*7c478bd9Sstevel@tonic-gate 845*7c478bd9Sstevel@tonic-gate /* print out the entry name */ 846*7c478bd9Sstevel@tonic-gate pr_heading((char *)0, savettytype); 847*7c478bd9Sstevel@tonic-gate 848*7c478bd9Sstevel@tonic-gate pr_bheading(); 849*7c478bd9Sstevel@tonic-gate 850*7c478bd9Sstevel@tonic-gate /* Print out all bools that are different. */ 851*7c478bd9Sstevel@tonic-gate for (i = 0; i < numbools; i++) 852*7c478bd9Sstevel@tonic-gate if (!ibool[i].val && ibool[i].changed) 853*7c478bd9Sstevel@tonic-gate pr_boolean(ibool[i].infoname, (char *)0, 854*7c478bd9Sstevel@tonic-gate (char *)0, -1); 855*7c478bd9Sstevel@tonic-gate else if (ibool[i].val && (ibool[i].changed || 856*7c478bd9Sstevel@tonic-gate !ibool[i].seenagain)) 857*7c478bd9Sstevel@tonic-gate pr_boolean(ibool[i].infoname, (char *)0, (char *)0, 1); 858*7c478bd9Sstevel@tonic-gate 859*7c478bd9Sstevel@tonic-gate pr_bfooting(); 860*7c478bd9Sstevel@tonic-gate pr_nheading(); 861*7c478bd9Sstevel@tonic-gate 862*7c478bd9Sstevel@tonic-gate /* Print out all nums that are different. */ 863*7c478bd9Sstevel@tonic-gate for (i = 0; i < numnums; i++) 864*7c478bd9Sstevel@tonic-gate if (num[i].val < 0 && num[i].changed) 865*7c478bd9Sstevel@tonic-gate pr_number(num[i].infoname, (char *)0, (char *)0, -1); 866*7c478bd9Sstevel@tonic-gate else if (num[i].val >= 0 && (num[i].changed || 867*7c478bd9Sstevel@tonic-gate !num[i].seenagain)) 868*7c478bd9Sstevel@tonic-gate pr_number(num[i].infoname, (char *)0, 869*7c478bd9Sstevel@tonic-gate (char *)0, num[i].val); 870*7c478bd9Sstevel@tonic-gate 871*7c478bd9Sstevel@tonic-gate pr_nfooting(); 872*7c478bd9Sstevel@tonic-gate pr_sheading(); 873*7c478bd9Sstevel@tonic-gate 874*7c478bd9Sstevel@tonic-gate /* Print out all strs that are different. */ 875*7c478bd9Sstevel@tonic-gate for (i = 0; i < numstrs; i++) 876*7c478bd9Sstevel@tonic-gate if (str[i].val == NULL && str[i].changed) 877*7c478bd9Sstevel@tonic-gate pr_string(str[i].infoname, (char *)0, (char *)0, 878*7c478bd9Sstevel@tonic-gate (char *)0); 879*7c478bd9Sstevel@tonic-gate else if ((str[i].val != NULL) && 880*7c478bd9Sstevel@tonic-gate (str[i].changed || !str[i].seenagain)) 881*7c478bd9Sstevel@tonic-gate pr_string(str[i].infoname, (char *)0, (char *)0, str[i].val); 882*7c478bd9Sstevel@tonic-gate 883*7c478bd9Sstevel@tonic-gate pr_sfooting(); 884*7c478bd9Sstevel@tonic-gate 885*7c478bd9Sstevel@tonic-gate /* Finish it up. */ 886*7c478bd9Sstevel@tonic-gate for (i = firstoptind; i < argc; i++) 887*7c478bd9Sstevel@tonic-gate if (used[i - firstoptind]) 888*7c478bd9Sstevel@tonic-gate (void) printf("\tuse=%s,\n", argv[i]); 889*7c478bd9Sstevel@tonic-gate else 890*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 891*7c478bd9Sstevel@tonic-gate "%s: 'use=%s' did not add anything to the " 892*7c478bd9Sstevel@tonic-gate "description.\n", progname, argv[i]); 893*7c478bd9Sstevel@tonic-gate } 894*7c478bd9Sstevel@tonic-gate 895*7c478bd9Sstevel@tonic-gate void 896*7c478bd9Sstevel@tonic-gate local_setenv(char *termNinfo) 897*7c478bd9Sstevel@tonic-gate { 898*7c478bd9Sstevel@tonic-gate extern char **environ; 899*7c478bd9Sstevel@tonic-gate static char *newenviron[2] = { 0, 0 }; 900*7c478bd9Sstevel@tonic-gate static unsigned int termsize = BUFSIZ; 901*7c478bd9Sstevel@tonic-gate static char _terminfo[BUFSIZ]; 902*7c478bd9Sstevel@tonic-gate static char *terminfo = &_terminfo[0]; 903*7c478bd9Sstevel@tonic-gate register int termlen; 904*7c478bd9Sstevel@tonic-gate 905*7c478bd9Sstevel@tonic-gate if (termNinfo && *termNinfo) { 906*7c478bd9Sstevel@tonic-gate if (verbose) 907*7c478bd9Sstevel@tonic-gate (void) fprintf(trace, "setting TERMINFO=%s.\n", 908*7c478bd9Sstevel@tonic-gate termNinfo); 909*7c478bd9Sstevel@tonic-gate termlen = strlen(termNinfo); 910*7c478bd9Sstevel@tonic-gate if (termlen + 10 > termsize) { 911*7c478bd9Sstevel@tonic-gate termsize = termlen + 20; 912*7c478bd9Sstevel@tonic-gate terminfo = (char *) malloc(termsize * sizeof (char)); 913*7c478bd9Sstevel@tonic-gate } 914*7c478bd9Sstevel@tonic-gate if (terminfo == (char *) NULL) 915*7c478bd9Sstevel@tonic-gate badmalloc(); 916*7c478bd9Sstevel@tonic-gate (void) sprintf(terminfo, "TERMINFO=%s", termNinfo); 917*7c478bd9Sstevel@tonic-gate newenviron[0] = terminfo; 918*7c478bd9Sstevel@tonic-gate } else 919*7c478bd9Sstevel@tonic-gate newenviron[0] = (char *) 0; 920*7c478bd9Sstevel@tonic-gate environ = newenviron; 921*7c478bd9Sstevel@tonic-gate } 922*7c478bd9Sstevel@tonic-gate 923*7c478bd9Sstevel@tonic-gate int 924*7c478bd9Sstevel@tonic-gate main(int argc, char **argv) 925*7c478bd9Sstevel@tonic-gate { 926*7c478bd9Sstevel@tonic-gate int i, c, firstoptind; 927*7c478bd9Sstevel@tonic-gate char *tempargv[2]; 928*7c478bd9Sstevel@tonic-gate char *term = getenv("TERM"); 929*7c478bd9Sstevel@tonic-gate 930*7c478bd9Sstevel@tonic-gate term1info = term2info = getenv("TERMINFO"); 931*7c478bd9Sstevel@tonic-gate progname = argv[0]; 932*7c478bd9Sstevel@tonic-gate 933*7c478bd9Sstevel@tonic-gate /* parse options */ 934*7c478bd9Sstevel@tonic-gate while ((c = getopt(argc, argv, "ducnILCvV1rw:s:A:B:")) != EOF) 935*7c478bd9Sstevel@tonic-gate switch (c) { 936*7c478bd9Sstevel@tonic-gate case 'v': verbose++; 937*7c478bd9Sstevel@tonic-gate break; 938*7c478bd9Sstevel@tonic-gate case '1': pr_onecolumn(1); 939*7c478bd9Sstevel@tonic-gate break; 940*7c478bd9Sstevel@tonic-gate case 'w': pr_width(atoi(optarg)); 941*7c478bd9Sstevel@tonic-gate break; 942*7c478bd9Sstevel@tonic-gate case 'd': diff++; 943*7c478bd9Sstevel@tonic-gate break; 944*7c478bd9Sstevel@tonic-gate case 'c': common++; 945*7c478bd9Sstevel@tonic-gate break; 946*7c478bd9Sstevel@tonic-gate case 'n': neither++; 947*7c478bd9Sstevel@tonic-gate break; 948*7c478bd9Sstevel@tonic-gate case 'u': use++; 949*7c478bd9Sstevel@tonic-gate break; 950*7c478bd9Sstevel@tonic-gate case 'L': pr_init(printing = pr_longnames); 951*7c478bd9Sstevel@tonic-gate break; 952*7c478bd9Sstevel@tonic-gate case 'I': pr_init(printing = pr_terminfo); 953*7c478bd9Sstevel@tonic-gate break; 954*7c478bd9Sstevel@tonic-gate case 'C': pr_init(printing = pr_cap); 955*7c478bd9Sstevel@tonic-gate break; 956*7c478bd9Sstevel@tonic-gate case 'A': term1info = optarg; Aflag++; 957*7c478bd9Sstevel@tonic-gate break; 958*7c478bd9Sstevel@tonic-gate case 'B': term2info = optarg; Bflag++; 959*7c478bd9Sstevel@tonic-gate break; 960*7c478bd9Sstevel@tonic-gate case 'r': pr_caprestrict(0); 961*7c478bd9Sstevel@tonic-gate break; 962*7c478bd9Sstevel@tonic-gate case 's': 963*7c478bd9Sstevel@tonic-gate if (strcmp(optarg, "d") == 0) 964*7c478bd9Sstevel@tonic-gate sortorder = by_database; 965*7c478bd9Sstevel@tonic-gate else if (strcmp(optarg, "i") == 0) 966*7c478bd9Sstevel@tonic-gate sortorder = by_terminfo; 967*7c478bd9Sstevel@tonic-gate else if (strcmp(optarg, "l") == 0) 968*7c478bd9Sstevel@tonic-gate sortorder = by_longnames; 969*7c478bd9Sstevel@tonic-gate else if (strcmp(optarg, "c") == 0) 970*7c478bd9Sstevel@tonic-gate sortorder = by_cap; 971*7c478bd9Sstevel@tonic-gate else 972*7c478bd9Sstevel@tonic-gate goto usage; 973*7c478bd9Sstevel@tonic-gate break; 974*7c478bd9Sstevel@tonic-gate case 'V': 975*7c478bd9Sstevel@tonic-gate (void) printf("%s: version %s\n", progname, 976*7c478bd9Sstevel@tonic-gate "@(#)curses:screen/infocmp.c 1.13"); 977*7c478bd9Sstevel@tonic-gate exit(0); 978*7c478bd9Sstevel@tonic-gate case '?': 979*7c478bd9Sstevel@tonic-gate usage: 980*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 981*7c478bd9Sstevel@tonic-gate "usage: %s [-ducn] [-ILC] [-1Vv] " 982*7c478bd9Sstevel@tonic-gate "[-s d|i|l|c] [-A directory] " 983*7c478bd9Sstevel@tonic-gate "[-B directory] term-names ...\n", 984*7c478bd9Sstevel@tonic-gate progname); 985*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-d\tprint " 986*7c478bd9Sstevel@tonic-gate "differences (the default for >1 " 987*7c478bd9Sstevel@tonic-gate "term-name)\n"); 988*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-u\tproduce " 989*7c478bd9Sstevel@tonic-gate "relative description\n"); 990*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-c\tprint common " 991*7c478bd9Sstevel@tonic-gate "entries\n"); 992*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-n\tprint entries " 993*7c478bd9Sstevel@tonic-gate "in neither\n"); 994*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-I\tprint terminfo " 995*7c478bd9Sstevel@tonic-gate "entries (the default for 1 term-name)\n"); 996*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-C\tprint termcap " 997*7c478bd9Sstevel@tonic-gate "entries\n"); 998*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-L\tprint long C " 999*7c478bd9Sstevel@tonic-gate "variable names\n"); 1000*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-1\tsingle column " 1001*7c478bd9Sstevel@tonic-gate "output\n"); 1002*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-V\tprint program " 1003*7c478bd9Sstevel@tonic-gate "version\n"); 1004*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-v\tverbose " 1005*7c478bd9Sstevel@tonic-gate "debugging output\n"); 1006*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-s\tchange sort " 1007*7c478bd9Sstevel@tonic-gate "order\n"); 1008*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-A\tset $TERMINFO " 1009*7c478bd9Sstevel@tonic-gate "for first term-name\n"); 1010*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "\t-B\tset $TERMINFO " 1011*7c478bd9Sstevel@tonic-gate "for other term-names\n"); 1012*7c478bd9Sstevel@tonic-gate exit(-1); 1013*7c478bd9Sstevel@tonic-gate } 1014*7c478bd9Sstevel@tonic-gate 1015*7c478bd9Sstevel@tonic-gate argc -= optind; 1016*7c478bd9Sstevel@tonic-gate argv += optind; 1017*7c478bd9Sstevel@tonic-gate optind = 0; 1018*7c478bd9Sstevel@tonic-gate 1019*7c478bd9Sstevel@tonic-gate /* Default to $TERM for -n, -I, -C and -L options. */ 1020*7c478bd9Sstevel@tonic-gate /* This is done by faking argv[][], argc and optind. */ 1021*7c478bd9Sstevel@tonic-gate if (neither && (argc == 0 || argc == 1)) { 1022*7c478bd9Sstevel@tonic-gate if (argc == 0) 1023*7c478bd9Sstevel@tonic-gate tempargv[0] = term; 1024*7c478bd9Sstevel@tonic-gate else 1025*7c478bd9Sstevel@tonic-gate tempargv[0] = argv[optind]; 1026*7c478bd9Sstevel@tonic-gate tempargv[1] = term; 1027*7c478bd9Sstevel@tonic-gate argc = 2; 1028*7c478bd9Sstevel@tonic-gate argv = tempargv; 1029*7c478bd9Sstevel@tonic-gate optind = 0; 1030*7c478bd9Sstevel@tonic-gate } else if ((printing != pr_none) && (argc == 0)) { 1031*7c478bd9Sstevel@tonic-gate tempargv[0] = term; 1032*7c478bd9Sstevel@tonic-gate argc = 1; 1033*7c478bd9Sstevel@tonic-gate argv = tempargv; 1034*7c478bd9Sstevel@tonic-gate optind = 0; 1035*7c478bd9Sstevel@tonic-gate } 1036*7c478bd9Sstevel@tonic-gate 1037*7c478bd9Sstevel@tonic-gate /* Check for enough names. */ 1038*7c478bd9Sstevel@tonic-gate if ((use || diff || common) && (argc <= 1)) { 1039*7c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1040*7c478bd9Sstevel@tonic-gate "%s: must have at least two terminal names for a " 1041*7c478bd9Sstevel@tonic-gate "comparison to be done.\n", progname); 1042*7c478bd9Sstevel@tonic-gate goto usage; 1043*7c478bd9Sstevel@tonic-gate } 1044*7c478bd9Sstevel@tonic-gate 1045*7c478bd9Sstevel@tonic-gate /* Set the default of diff -d or print -I */ 1046*7c478bd9Sstevel@tonic-gate if (!use && (printing == pr_none) && !common && !neither) { 1047*7c478bd9Sstevel@tonic-gate if (argc == 0 || argc == 1) { 1048*7c478bd9Sstevel@tonic-gate if (argc == 0) { 1049*7c478bd9Sstevel@tonic-gate tempargv[0] = term; 1050*7c478bd9Sstevel@tonic-gate argc = 1; 1051*7c478bd9Sstevel@tonic-gate argv = tempargv; 1052*7c478bd9Sstevel@tonic-gate optind = 0; 1053*7c478bd9Sstevel@tonic-gate } 1054*7c478bd9Sstevel@tonic-gate pr_init(printing = pr_terminfo); 1055*7c478bd9Sstevel@tonic-gate } else 1056*7c478bd9Sstevel@tonic-gate diff++; 1057*7c478bd9Sstevel@tonic-gate } 1058*7c478bd9Sstevel@tonic-gate 1059*7c478bd9Sstevel@tonic-gate /* Set the default sorting order. */ 1060*7c478bd9Sstevel@tonic-gate if (sortorder == none) 1061*7c478bd9Sstevel@tonic-gate switch ((int) printing) { 1062*7c478bd9Sstevel@tonic-gate case (int) pr_cap: 1063*7c478bd9Sstevel@tonic-gate sortorder = by_cap; break; 1064*7c478bd9Sstevel@tonic-gate case (int) pr_longnames: 1065*7c478bd9Sstevel@tonic-gate sortorder = by_longnames; break; 1066*7c478bd9Sstevel@tonic-gate case (int) pr_terminfo: 1067*7c478bd9Sstevel@tonic-gate case (int) pr_none: 1068*7c478bd9Sstevel@tonic-gate sortorder = by_terminfo; break; 1069*7c478bd9Sstevel@tonic-gate } 1070*7c478bd9Sstevel@tonic-gate 1071*7c478bd9Sstevel@tonic-gate firstterm = argv[optind++]; 1072*7c478bd9Sstevel@tonic-gate firstoptind = optind; 1073*7c478bd9Sstevel@tonic-gate 1074*7c478bd9Sstevel@tonic-gate allocvariables(argc, firstoptind); 1075*7c478bd9Sstevel@tonic-gate sortnames(); 1076*7c478bd9Sstevel@tonic-gate 1077*7c478bd9Sstevel@tonic-gate devnull = open("/dev/null", O_RDWR); 1078*7c478bd9Sstevel@tonic-gate local_setenv(term1info); 1079*7c478bd9Sstevel@tonic-gate initfirstterm(firstterm); 1080*7c478bd9Sstevel@tonic-gate local_setenv(term2info); 1081*7c478bd9Sstevel@tonic-gate for (i = 0; optind < argc; optind++, i++) 1082*7c478bd9Sstevel@tonic-gate check_nth_terminal(argv[optind], i); 1083*7c478bd9Sstevel@tonic-gate 1084*7c478bd9Sstevel@tonic-gate if (use) 1085*7c478bd9Sstevel@tonic-gate dorelative(firstoptind, argc, argv); 1086*7c478bd9Sstevel@tonic-gate 1087*7c478bd9Sstevel@tonic-gate return (0); 1088*7c478bd9Sstevel@tonic-gate } 1089