⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 infocmp.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*	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 + -