pc-hack

PC HACK 3.61 source code (archival)
git clone http://frotz.net/git/pc-hack.git
Log | Files | Refs

testtcp.c (6971B)


      1 /************************************************************************
      2  *									*
      3  *			Copyright (c) 1982, Fred Fish			*
      4  *			    All Rights Reserved				*
      5  *									*
      6  *	This software and/or documentation is released for public	*
      7  *	distribution for personal, non-commercial use only.		*
      8  *	Limited rights to use, modify, and redistribute are hereby	*
      9  *	granted for non-commercial purposes, provided that all		*
     10  *	copyright notices remain intact and all changes are clearly	*
     11  *	documented.  The author makes no warranty of any kind with	*
     12  *	respect to this product and explicitly disclaims any implied	*
     13  *	warranties of merchantability or fitness for any particular	*
     14  *	purpose.							*
     15  *									*
     16  ************************************************************************
     17  */
     18 
     19 
     20 /*
     21  *  TEST PROGRAM
     22  *
     23  *	testtcp   test termcap functions
     24  *
     25  *  KEY WORDS
     26  *
     27  *	test routines
     28  *	termcap test
     29  *
     30  *  SYNOPSIS
     31  *
     32  *	termcap [-efns] terminal [capability [capability ...]]
     33  *
     34  *		-e  =>   expand string capability given by -s
     35  *		-f  =>   determine boolean capabilities for terminal
     36  *		-n  =>   determine numeric capabilities for terminal
     37  *		-s  =>   determine string capabilities for terminal
     38  *
     39  *		terminal =>  terminal name as given in termcap file
     40  *		capability => a boolean, numeric, or string capability
     41  *
     42  *		NOTE:  All capabilities must be of same type, as
     43  *		       given by [-fns].
     44  *
     45  *		If terminal is only argument then entire entry is
     46  *		printed.
     47  *
     48  *  DESCRIPTION
     49  *
     50  *	Provides way to test termcap functions.  Can find
     51  *	and print an entire termcap terminal entry, or various
     52  *	capabilities from the entry.
     53  *
     54  *  AUTHOR
     55  *
     56  *	Fred Fish
     57  *
     58  */
     59 
     60 #include <stdio.h>
     61 
     62 #define TRUE 1
     63 #define FALSE 0
     64 #define NO_FILE	 -1			/* Returned if can't open file */
     65 #define NO_ENTRY  0			/* Returned if can't find entry */
     66 #define SUCCESS   1			/* Returned if entry found ok */
     67 #define TRUNCATED 2			/* Returned if entry found but trunc */
     68 #define BUFFER_SIZE 1024
     69 
     70 int eflag = FALSE;
     71 int fflag = FALSE;
     72 int nflag = FALSE;
     73 int sflag = FALSE;
     74 
     75 int got_terminal = FALSE;
     76 int got_capability = FALSE;
     77 
     78 
     79 /*
     80  *  FUNCTION
     81  *
     82  *	main   termcap test entry point
     83  *
     84  *  KEY WORDS
     85  *
     86  *	main
     87  *
     88  *  SYNOPSIS
     89  *
     90  *	main(argc,argv)
     91  *	int argc;
     92  *	char *argv[];
     93  *
     94  *  DESCRIPTION
     95  *
     96  *	This is where the termcap test starts executing.  All argument list
     97  *	switches are processed first, then all the specified
     98  *	capability identification strings are processed.
     99  *
    100  */
    101 
    102 /*
    103  *  PSEUDO CODE
    104  *
    105  *	Begin main
    106  *	    Process command line options.
    107  *	    For each argument list field
    108  *		If field was not erased during option processing
    109  *		    If terminal name field not yet processed then
    110  *			Process an assumed terminal name field.
    111  *			Set terminal name processed flag.
    112  *		    Else
    113  *			Process a capability field.
    114  *			Set capability field processed flag.
    115  *		    End if
    116  *		End if
    117  *	    End for
    118  *	    If no capabilities processed then
    119  *		Simply dump buffer.
    120  *	    End if
    121  *	End main
    122  *
    123  */
    124 
    125 main(argc, argv)
    126 int argc;
    127 char *argv[];
    128 {
    129     char *argp;
    130     int argnum;
    131     char buffer[BUFFER_SIZE];
    132 
    133     options(argc,argv);
    134     for (argnum = 1; argnum < argc; argnum++) {
    135         if ((argp = argv[argnum]) != NULL) {
    136 	    if (!got_terminal) {
    137 		terminal(buffer,argp);
    138 		got_terminal = TRUE;
    139 	    } else {
    140 		capability(argp);
    141 		got_capability = TRUE;
    142 	    }
    143         }
    144     }
    145     if (got_terminal && !got_capability) {
    146 	printf("%s",buffer);
    147     }
    148 }
    149 
    150 /*
    151  *  FUNCTION
    152  *
    153  *	options   process command line options
    154  *
    155  *  SYNOPSIS
    156  *
    157  *	options(argc,argv)
    158  *	int argc;
    159  *	char *argv[];
    160  *
    161  *  DESCRIPTION
    162  *
    163  *	Scans argument list, processing each switch as it is
    164  *	found.  The pointer to each switch string is then
    165  *	replaced with a NULL to effectively erase the switch
    166  *	argument.
    167  *
    168  */
    169 
    170 /*
    171  *  PSEUDO CODE
    172  *
    173  *	Begin options
    174  *	    For each argument in the argument list
    175  *		Get pointer to first char of argument.
    176  *		If the argument is a switch then
    177  *		    Replace argument pointer with NULL.
    178  *		    Look at next argument character.
    179  *		    While there is another argument character
    180  *			Switch on the argument character
    181  *			Case "EXPAND":
    182  *			    Set expand (e) flag.
    183  *			    Break out of switch.
    184  *			Case "BOOLEAN":
    185  *			    Set boolean (f) flag.
    186  *			    Break out of switch.
    187  *			Case "NUMERIC":
    188  *			    Set numeric flag.
    189  *			    Break out of switch.
    190  *			Case "STRING":
    191  *			    Set string flag.
    192  *			    Break out of switch.
    193  *			Default:
    194  *			    Abort with usage message.
    195  *			End switch
    196  *		    End while
    197  *		End if
    198  *	    End for
    199  *	End options
    200  *
    201  */
    202 
    203 options(argc, argv)
    204 int argc;
    205 char *argv[];
    206 {
    207     int i;
    208     char c;		/* 1st char of current command-line argument */
    209     char *cp;		/* current argument pointer */
    210 
    211     for (i=1; i<argc; i++) {
    212         cp = argv[i];
    213         if (*cp == '-') {
    214             argv[i] = NULL;
    215 	    cp++;
    216 	    while (c = *cp++) {
    217 	        switch (c) {
    218 		case 'e':
    219 		    eflag = TRUE;
    220 		    break;
    221 		case 'f':
    222 		    fflag = TRUE;
    223 	            break;
    224 	        case 'n':
    225 		    nflag = TRUE;
    226 	            break;
    227 	        case 's':
    228 		    sflag = TRUE;
    229 	            break;
    230 	        default:
    231 	            usage();
    232 	        }
    233             }
    234         }
    235     }
    236 }
    237 
    238 /*
    239  *  FUNCTION
    240  *
    241  *	usage   give usage message and abort
    242  *
    243  *  KEY WORDS
    244  *
    245  *	usage
    246  *	help processing
    247  *	abort locations
    248  *
    249  *  SYNOPSIS
    250  *
    251  *	usage()
    252  *
    253  *  DESCRIPTION
    254  *
    255  *	Usage is typically called when a problem has been
    256  *	detected in the argument list.
    257  *	It prints a usage message and exits.
    258  *
    259  */
    260 
    261 /*
    262  *  PSEUDO CODE
    263  *
    264  *	Begin usage
    265  *	    Print usage message.
    266  *	    Exit.
    267  *	End usage
    268  *
    269  */
    270 
    271 usage()
    272 {
    273     printf("Usage: termcap [-fns] terminal [capability [capability ... ]]\n");
    274     exit();
    275 }
    276 
    277 
    278 terminal(buffer,name)
    279 char *buffer;
    280 char *name;
    281 {
    282     int status;
    283 
    284     status = tgetent(buffer,name);
    285     switch (status) {
    286     case NO_FILE:
    287 	fprintf(stderr,"Can't find a termcap data base file.\n");
    288 	exit();
    289     case NO_ENTRY:
    290 	fprintf(stderr,"Can't find entry \"%s\"\n",name);
    291 	exit();
    292     case TRUNCATED:
    293 	fprintf(stderr,"Warning --- entry \"%s\" too long\n",name);
    294 	break;
    295     case SUCCESS:
    296         break;
    297     default:
    298         fprintf(stderr,"? tgetent returned illegal status %d\n",status);
    299 	exit();
    300     }
    301 }
    302 
    303 capability(id)
    304 char *id;
    305 {
    306     int value;
    307     char buffer[256];
    308     char *area;
    309     char *ep, *tgoto();
    310 
    311     if (fflag) {
    312 	value = tgetflag(id);
    313 	if (value) {
    314 	    printf("%s TRUE\n",id);
    315 	} else {
    316 	    printf("%s FALSE\n",id);
    317 	}
    318     } else if (nflag) {
    319 	value = tgetnum(id);
    320 	printf("%s = %o octal %d decimal\n",id,value,value);
    321     } else if (sflag) {
    322 	area = buffer;
    323 	tgetstr(id,&area);
    324 	if (eflag) {
    325 	    ep = tgoto(buffer,75,23);
    326 	}
    327 	doprint(id,buffer);
    328 	if (eflag) {
    329 	    doprint(id,ep);
    330 	}
    331     }
    332 }
    333 
    334 doprint(id,cp)
    335 char *id;
    336 char *cp;
    337 {
    338     printf("%s = ",id);
    339     for ( ; *cp != NULL; cp++) {
    340 	if (*cp < 040) {
    341 	    printf("^%c ",*cp |= 0100);
    342 	} else {
    343 	    printf("%c ",*cp);
    344 	}
    345     }
    346     printf("\n");
    347 }
    348