📄 infocmp.c
字号:
/* Copyright (c) 1984 AT&T *//* All Rights Reserved *//* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T *//* The copyright notice above does not evidence any *//* actual or intended publication of such source code. */#ifndef lintstatic char sccsid[] = "@(#)infocmp.c 1.1 92/07/30 SMI"; /* from S5R3 1.11.1.1 */#endif/* NAME infocmp - compare terminfo descriptions, or dump a terminfo description AUTHOR Tony Hansen, February 23, 1984.*/#include "curses.h"#include "term.h"#include "print.h"#include <fcntl.h>/* externs from libcurses */extern char *boolnames[];extern char *boolcodes[];extern char *boolfnames[];extern char *numnames[];extern char *numcodes[];extern char *numfnames[];extern char *strnames[];extern char *strcodes[];extern char *strfnames[];extern char ttytype[];extern int tgetflag ();extern int tgetnum ();extern char *tgetstr ();/* externs from libc */extern char *malloc ();extern void exit ();extern void qsort ();extern char *getenv ();extern int getopt ();extern int optind;extern char *optarg;extern char *strncpy(), *strcpy();extern int strcmp(), strlen();/* data structures for this program */struct boolstruct { char *infoname; /* the terminfo capability name */ char *capname; /* the termcap capability name */ char *fullname; /* the long C variable name */ char *secondname; /* the use= terminal w/ this value */ char val; /* the value */ char secondval; /* the value in the use= terminal */ char changed; /* a use= terminal changed the value */ char seenagain; /* a use= terminal had this entry */ };struct numstruct { char *infoname; /* ditto from above */ char *capname; char *fullname; char *secondname; short val; short secondval; char changed; char seenagain; };struct strstruct { char *infoname; /* ditto from above */ char *capname; char *fullname; char *secondname; char *val; char *secondval; char changed; char seenagain; };/* globals for this file */char *progname; /* argv[0], the name of the program */static struct boolstruct *ibool;/* array of char information */static struct numstruct *num; /* array of number information */static struct strstruct *str; /* array of string information */static char *used; /* usage statistics */static int numbools; /* how many booleans there are */static int numnums; /* how many numbers there are */static int numstrs; /* how many strings there are */#define TTYLEN 255static char *firstterm; /* the name of the first terminal */static char *savettytype; /* the synonyms of the first terminal */static char _savettytype[TTYLEN];/* the place to save those names */static int devnull; /* open("/dev/null") for setupterm */#define trace stderr /* send trace messages to stderr *//* options */static int verbose = 0; /* debugging printing level */static int diff = 0; /* produce diff listing, the default */static int common = 0; /* produce common listing */static int neither = 0; /* list caps in neither entry */static int use = 0; /* produce use= comparison listing */static enum printtypes printing /* doing any of above printing at all */ = pr_none;enum { none, by_database, by_terminfo, by_longnames, by_cap } sortorder = none; /* sort the fields for printing */static char *term1info, *term2info; /* $TERMINFO settings */static int Aflag = 0, Bflag = 0; /* $TERMINFO was set with -A/-B */#define EQUAL(s1,s2) ( ((s1 == NULL) && (s2 == NULL)) || \ ((s1 != NULL) && (s2 != NULL) && \ (strcmp(s1,s2) == 0) ) )void badmalloc(){ (void) fprintf (stderr, "%s: malloc is out of space!\n", progname); exit (-1);}/* Allocate and initialize the global data structures and variables.*/void allocvariables(argc, firstoptind)int argc, firstoptind;{ register int i, nullseen; /* find out how many names we are dealing with */ for (numbools = 0; boolnames[numbools]; numbools++) ; for (numnums = 0; numnames[numnums]; numnums++) ; for (numstrs = 0; strnames[numstrs]; numstrs++) ; if (verbose) { (void) fprintf (trace, "There are %d boolean capabilities.\n", numbools); (void) fprintf (trace, "There are %d numeric capabilities.\n", numnums); (void) fprintf (trace, "There are %d string capabilities.\n", numstrs); } /* Allocate storage for the names and their values */ ibool = (struct boolstruct *) malloc ((unsigned) numbools * sizeof (struct boolstruct)); num = (struct numstruct *) malloc ((unsigned) numnums * sizeof (struct numstruct)); str = (struct strstruct *) malloc ((unsigned) numstrs * sizeof (struct strstruct)); /* Allocate array to keep track of which names have been used. */ if (use) used = (char *) malloc ((unsigned) (argc - firstoptind) * sizeof (char)); if ((ibool == NULL) || (num == NULL) || (str == NULL) || (use && (used == NULL))) badmalloc(); /* Fill in the names and initialize the structures. */ nullseen = FALSE; for (i = 0; i < numbools; i++) { ibool[i].infoname = boolnames[i]; ibool[i].capname = boolcodes[i]; /* This is necessary until fnames.c is */ /* incorporated into standard curses. */ if (nullseen || (boolfnames[i] == NULL)) { ibool[i].fullname = "unknown_boolean"; nullseen = TRUE; } else ibool[i].fullname = boolfnames[i]; ibool[i].changed = FALSE; ibool[i].seenagain = FALSE; } nullseen = 0; for (i = 0; i < numnums; i++) { num[i].infoname = numnames[i]; num[i].capname = numcodes[i]; if (nullseen || (numfnames[i] == NULL)) { ibool[i].fullname = "unknown_number"; nullseen = TRUE; } else num[i].fullname = numfnames[i]; num[i].changed = FALSE; num[i].seenagain = FALSE; } nullseen = 0; for (i = 0; i < numstrs; i++) { str[i].infoname = strnames[i]; str[i].capname = strcodes[i]; if (nullseen || (strfnames[i] == NULL)) { str[i].fullname = "unknown_string"; nullseen = TRUE; } else str[i].fullname = strfnames[i]; str[i].changed = FALSE; str[i].seenagain = FALSE; }}/* Routines to be passed to qsort(3) for comparison of the structures.*/int boolcompare (a, b)struct boolstruct *a, *b;{ switch ( (int) sortorder) { case (int) by_terminfo: return strcmp (a->infoname, b->infoname); case (int) by_cap: return strcmp (a->capname, b->capname); case (int) by_longnames: return strcmp (a->fullname, b->fullname); default: return 0; }}int numcompare (a, b)struct numstruct *a, *b;{ switch ( (int) sortorder) { case (int) by_terminfo: return strcmp (a->infoname, b->infoname); case (int) by_cap: return strcmp (a->capname, b->capname); case (int) by_longnames: return strcmp (a->fullname, b->fullname); default: return 0; }}int strcompare (a, b)struct strstruct *a, *b;{ switch ( (int) sortorder) { case (int) by_terminfo: return strcmp (a->infoname, b->infoname); case (int) by_cap: return strcmp (a->capname, b->capname); case (int) by_longnames: return strcmp (a->fullname, b->fullname); default: return 0; }}/* Sort the entries by their terminfo name.*/sortnames(){ if (sortorder != by_database) { qsort ((char *) ibool, (unsigned) numbools, sizeof (struct boolstruct) , boolcompare); qsort ((char *) num, (unsigned) numnums, sizeof (struct numstruct) , numcompare); qsort ((char *) str, (unsigned) numstrs, sizeof (struct strstruct) , strcompare); }}/* Print out a string, or "NULL" if it's not defined.*/void PR (stream, string)FILE *stream;register char *string;{ if (string == NULL) (void) fprintf (stream, "NULL"); else tpr (stream, string);}/* Output the 'ko' termcap string. This is a list of all of the input keys that input the same thing as the corresponding output strings. */int kncounter;char kobuffer[512];char *addko (output, input, koptr)char *output, *input, *koptr;{ char *inptr, *outptr, padbuffer[512]; inptr = tgetstr (input, (char **)0); if (inptr == NULL) return koptr; outptr = tgetstr (output, (char **)0); if (outptr == NULL) return koptr; outptr = rmpadding (outptr, padbuffer, (int *) 0); if (strcmp (inptr, outptr) == 0) { *koptr++ = *output++; *koptr++ = *output++; *koptr++ = ','; kncounter++; } return koptr;}void setupknko(){ char *koptr; kncounter = 0; koptr = kobuffer; koptr = addko("bs", "kb", koptr); /* key_backspace */ koptr = addko("bt", "kB", koptr); /* key_btab */ koptr = addko("cl", "kC", koptr); /* key_clear */ koptr = addko("le", "kl", koptr); /* key_left */ koptr = addko("do", "kd", koptr); /* key_down */ koptr = addko("nd", "kr", koptr); /* key_right */ koptr = addko("up", "ku", koptr); /* key_up */ koptr = addko("dc", "kD", koptr); /* key_dc */ koptr = addko("dl", "kL", koptr); /* key_dl */ koptr = addko("cd", "kS", koptr); /* key_eos */ koptr = addko("ce", "kE", koptr); /* key_eol */ koptr = addko("ho", "kh", koptr); /* key_home */ koptr = addko("st", "kT", koptr); /* key_stab */ koptr = addko("ic", "kI", koptr); /* key_ic */ koptr = addko("im", "kI", koptr); /* key_ic */ koptr = addko("al", "kA", koptr); /* key_il */ koptr = addko("sf", "kF", koptr); /* key_sf */ koptr = addko("ll", "kH", koptr); /* key_ll */ koptr = addko("sr", "kR", koptr); /* key_sr */ koptr = addko("ei", "kM", koptr); /* key_eic */ koptr = addko("ct", "ka", koptr); /* key_catab */ /* get rid of comma */ if (koptr != kobuffer) *(--koptr) = '\0';}void pr_kn(){ if (kncounter > 0) pr_number ((char *)0, "kn", (char *)0, kncounter);}void pr_ko(){ if (kncounter > 0) pr_string ((char *)0, "ko", (char *)0, kobuffer);}void pr_bcaps(){ char *retptr; char padbuffer[512]; if (verbose) (void) fprintf (trace, "looking at 'bs'\n"); retptr = cconvert (rmpadding (cursor_left, padbuffer, (int *) 0)); if (strcmp ("\\b", retptr) == 0) pr_boolean ((char *)0, "bs", (char *)0, 1); if (verbose) (void) fprintf (trace, "looking at 'pt'\n"); retptr = cconvert (rmpadding (tab, padbuffer, (int *) 0)); if (strcmp ("\\t", retptr) == 0) pr_boolean ((char *)0, "pt", (char *)0, 1); if (verbose) (void) fprintf (trace, "looking at 'nc'\n"); retptr = cconvert (rmpadding (carriage_return, padbuffer, (int *) 0)); if (strcmp ("\\r", retptr) != 0) pr_boolean ((char *)0, "nc", (char *)0, 1); if (verbose) (void) fprintf (trace, "looking at 'ns'\n"); if (scroll_forward == NULL) pr_boolean ((char *)0, "ns", (char *)0, 1); /* Ignore "xr": Return acts like ce \r \n (Delta Data) */}void pr_ncaps(){ char padbuffer[512]; int padding; if (verbose) (void) fprintf (trace, "looking at 'ug'\n"); /* Duplicate sg for ug: Number of blank chars left by us or ue */ if (magic_cookie_glitch > -1) pr_number ((char *)0, "ug", (char *)0, magic_cookie_glitch); if (verbose) (void) fprintf (trace, "looking at 'dB'\n"); /* Number of millisec of bs delay needed */ (void) rmpadding (cursor_left, padbuffer, &padding); if (padding > 0) pr_number ((char *)0, "dB", (char *)0, padding); if (verbose) (void) fprintf (trace, "looking at 'dC'\n"); /* Number of millisec of cr delay needed */ (void) rmpadding (carriage_return, padbuffer, &padding); if (padding > 0) pr_number ((char *)0, "dC", (char *)0, padding); if (verbose) (void) fprintf (trace, "looking at 'dF'\n"); /* Number of millisec of ff delay needed */ (void) rmpadding (form_feed, padbuffer, &padding); if (padding > 0) pr_number ((char *)0, "dF", (char *)0, padding); if (verbose) (void) fprintf (trace, "looking at 'dN'\n"); /* Number of millisec of nl delay needed */ (void) rmpadding (cursor_down, padbuffer, &padding); if (padding > 0) pr_number ((char *)0, "dN", (char *)0, padding); if (verbose) (void) fprintf (trace, "looking at 'dT'\n"); /* Number of millisec of tab delay needed */ (void) rmpadding (tab, padbuffer, &padding); if (padding > 0) pr_number ((char *)0, "dT", (char *)0, padding); /* Handle "kn": Number of "other" keys */ setupknko(); pr_kn();}void pr_scaps(){ char *retptr; char padbuffer[512]; /* Backspace if not "^H" */ if (verbose) (void) fprintf (trace, "looking at 'bc'\n"); retptr = cconvert (rmpadding (cursor_left, padbuffer, (int *) 0)); if (strcmp ("\\b", retptr) != 0) pr_string ((char *)0, "bc", (char *)0, cursor_left); /* Newline character (default "\n") */ if (verbose) (void) fprintf (trace, "looking at 'nl'\n"); retptr = cconvert (rmpadding (cursor_down, padbuffer, (int *) 0)); if (strcmp ("\\n", retptr) != 0) pr_string ((char *)0, "nl", (char *)0, cursor_down); /* Handle "ko" here: Termcap entries for other non-function keys */ pr_ko(); /* Ignore "ma": Arrow key map, used by vi version 2 only */}/* Set up the first terminal and save the values from it.*/void initfirstterm (term)register char *term;{ register int i; if (verbose) (void) fprintf (trace, "setting up terminal type '%s'.\n", term); (void) setupterm (term, devnull, (int *) 0); /* Save the name for later use. */ if (use) { register unsigned int length; savettytype = _savettytype; if ((length = strlen(ttytype)) >= TTYLEN) { savettytype = malloc (length); if (savettytype == NULL) { (void) fprintf (stderr, "%s: malloc is out of space\n", progname); (void) strncpy (_savettytype, ttytype, TTYLEN-1); _savettytype[TTYLEN] = '\0'; savettytype = _savettytype; } } else (void) strcpy (_savettytype, ttytype); } if (printing != pr_none) { pr_heading (term, ttytype); pr_bheading (); } /* Save the values for the first terminal. */ for (i = 0; i < numbools; i++) { if ((ibool[i].val = tgetflag (ibool[i].capname)) && printing != pr_none) pr_boolean (ibool[i].infoname, ibool[i].capname, ibool[i].fullname, 1); if (verbose) (void) fprintf (trace, "%s=%d.\n", ibool[i].infoname, ibool[i].val); } if (printing != pr_none) { if (printing == pr_cap) pr_bcaps();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -