10e3d5408SPeter Wemm /**************************************************************************** 2*73f0a83dSXin LI * Copyright (c) 1998-2012,2013 Free Software Foundation, Inc. * 30e3d5408SPeter Wemm * * 40e3d5408SPeter Wemm * Permission is hereby granted, free of charge, to any person obtaining a * 50e3d5408SPeter Wemm * copy of this software and associated documentation files (the * 60e3d5408SPeter Wemm * "Software"), to deal in the Software without restriction, including * 70e3d5408SPeter Wemm * without limitation the rights to use, copy, modify, merge, publish, * 80e3d5408SPeter Wemm * distribute, distribute with modifications, sublicense, and/or sell * 90e3d5408SPeter Wemm * copies of the Software, and to permit persons to whom the Software is * 100e3d5408SPeter Wemm * furnished to do so, subject to the following conditions: * 110e3d5408SPeter Wemm * * 120e3d5408SPeter Wemm * The above copyright notice and this permission notice shall be included * 130e3d5408SPeter Wemm * in all copies or substantial portions of the Software. * 140e3d5408SPeter Wemm * * 150e3d5408SPeter Wemm * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 160e3d5408SPeter Wemm * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 170e3d5408SPeter Wemm * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 180e3d5408SPeter Wemm * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 190e3d5408SPeter Wemm * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 200e3d5408SPeter Wemm * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 210e3d5408SPeter Wemm * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 220e3d5408SPeter Wemm * * 230e3d5408SPeter Wemm * Except as contained in this notice, the name(s) of the above copyright * 240e3d5408SPeter Wemm * holders shall not be used in advertising or otherwise to promote the * 250e3d5408SPeter Wemm * sale, use or other dealings in this Software without prior written * 260e3d5408SPeter Wemm * authorization. * 270e3d5408SPeter Wemm ****************************************************************************/ 280e3d5408SPeter Wemm 290e3d5408SPeter Wemm /**************************************************************************** 300e3d5408SPeter Wemm * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 310e3d5408SPeter Wemm * and: Eric S. Raymond <esr@snark.thyrsus.com> * 320e3d5408SPeter Wemm ****************************************************************************/ 330e3d5408SPeter Wemm 340e3d5408SPeter Wemm /* 350e3d5408SPeter Wemm * tput.c -- shellscript access to terminal capabilities 360e3d5408SPeter Wemm * 370e3d5408SPeter Wemm * by Eric S. Raymond <esr@snark.thyrsus.com>, portions based on code from 380e3d5408SPeter Wemm * Ross Ridge's mytinfo package. 390e3d5408SPeter Wemm */ 400e3d5408SPeter Wemm 415ca44d1cSRong-En Fan #define USE_LIBTINFO 420e3d5408SPeter Wemm #include <progs.priv.h> 4318259542SPeter Wemm 4418259542SPeter Wemm #if !PURE_TERMINFO 455d08fb1fSRong-En Fan #include <dump_entry.h> 460e3d5408SPeter Wemm #include <termsort.c> 470e3d5408SPeter Wemm #endif 4818259542SPeter Wemm #include <transform.h> 490e3d5408SPeter Wemm 50*73f0a83dSXin LI MODULE_ID("$Id: tput.c,v 1.49 2013/09/28 20:57:25 tom Exp $") 510e3d5408SPeter Wemm 520e3d5408SPeter Wemm #define PUTS(s) fputs(s, stdout) 530e3d5408SPeter Wemm #define PUTCHAR(c) putchar(c) 540e3d5408SPeter Wemm #define FLUSH fflush(stdout) 550e3d5408SPeter Wemm 5618259542SPeter Wemm typedef enum { 5718259542SPeter Wemm Numbers = 0 5818259542SPeter Wemm ,Num_Str 5918259542SPeter Wemm ,Num_Str_Str 6018259542SPeter Wemm } TParams; 6118259542SPeter Wemm 620e3d5408SPeter Wemm static char *prg_name; 6318259542SPeter Wemm static bool is_init = FALSE; 6418259542SPeter Wemm static bool is_reset = FALSE; 650e3d5408SPeter Wemm 6615589c42SPeter Wemm static void 6715589c42SPeter Wemm quit(int status, const char *fmt,...) 680e3d5408SPeter Wemm { 690e3d5408SPeter Wemm va_list argp; 700e3d5408SPeter Wemm 710e3d5408SPeter Wemm va_start(argp, fmt); 724a1a9510SRong-En Fan fprintf(stderr, "%s: ", prg_name); 730e3d5408SPeter Wemm vfprintf(stderr, fmt, argp); 740e3d5408SPeter Wemm fprintf(stderr, "\n"); 750e3d5408SPeter Wemm va_end(argp); 764a1a9510SRong-En Fan ExitProgram(status); 770e3d5408SPeter Wemm } 780e3d5408SPeter Wemm 7915589c42SPeter Wemm static void 8015589c42SPeter Wemm usage(void) 810e3d5408SPeter Wemm { 8218259542SPeter Wemm fprintf(stderr, "usage: %s [-V] [-S] [-T term] capname\n", prg_name); 834a1a9510SRong-En Fan ExitProgram(EXIT_FAILURE); 840e3d5408SPeter Wemm } 850e3d5408SPeter Wemm 8618259542SPeter Wemm static void 8718259542SPeter Wemm check_aliases(const char *name) 8818259542SPeter Wemm { 8906bfebdeSXin LI is_init = same_program(name, PROG_INIT); 9006bfebdeSXin LI is_reset = same_program(name, PROG_RESET); 9118259542SPeter Wemm } 9218259542SPeter Wemm 9318259542SPeter Wemm /* 9418259542SPeter Wemm * Lookup the type of call we should make to tparm(). This ignores the actual 9518259542SPeter Wemm * terminfo capability (bad, because it is not extensible), but makes this 9618259542SPeter Wemm * code portable to platforms where sizeof(int) != sizeof(char *). 9718259542SPeter Wemm */ 9818259542SPeter Wemm static TParams 997a69bbfbSPeter Wemm tparm_type(const char *name) 10018259542SPeter Wemm { 10118259542SPeter Wemm #define TD(code, longname, ti, tc) {code,longname},{code,ti},{code,tc} 10218259542SPeter Wemm TParams result = Numbers; 10318259542SPeter Wemm /* *INDENT-OFF* */ 10418259542SPeter Wemm static const struct { 10518259542SPeter Wemm TParams code; 10618259542SPeter Wemm const char *name; 10718259542SPeter Wemm } table[] = { 10818259542SPeter Wemm TD(Num_Str, "pkey_key", "pfkey", "pk"), 10918259542SPeter Wemm TD(Num_Str, "pkey_local", "pfloc", "pl"), 11018259542SPeter Wemm TD(Num_Str, "pkey_xmit", "pfx", "px"), 11118259542SPeter Wemm TD(Num_Str, "plab_norm", "pln", "pn"), 11218259542SPeter Wemm TD(Num_Str_Str, "pkey_plab", "pfxl", "xl"), 11318259542SPeter Wemm }; 11418259542SPeter Wemm /* *INDENT-ON* */ 11518259542SPeter Wemm 11618259542SPeter Wemm unsigned n; 11718259542SPeter Wemm for (n = 0; n < SIZEOF(table); n++) { 11818259542SPeter Wemm if (!strcmp(name, table[n].name)) { 11918259542SPeter Wemm result = table[n].code; 12018259542SPeter Wemm break; 12118259542SPeter Wemm } 12218259542SPeter Wemm } 12318259542SPeter Wemm return result; 12418259542SPeter Wemm } 12518259542SPeter Wemm 12615589c42SPeter Wemm static int 1274a1a9510SRong-En Fan exit_code(int token, int value) 1284a1a9510SRong-En Fan { 1294a1a9510SRong-En Fan int result = 99; 1304a1a9510SRong-En Fan 1314a1a9510SRong-En Fan switch (token) { 1324a1a9510SRong-En Fan case BOOLEAN: 1334a1a9510SRong-En Fan result = !value; /* TRUE=0, FALSE=1 */ 1344a1a9510SRong-En Fan break; 1354a1a9510SRong-En Fan case NUMBER: 1364a1a9510SRong-En Fan result = 0; /* always zero */ 1374a1a9510SRong-En Fan break; 1384a1a9510SRong-En Fan case STRING: 1394a1a9510SRong-En Fan result = value; /* 0=normal, 1=missing */ 1404a1a9510SRong-En Fan break; 1414a1a9510SRong-En Fan } 1424a1a9510SRong-En Fan return result; 1434a1a9510SRong-En Fan } 1444a1a9510SRong-En Fan 1454a1a9510SRong-En Fan static int 14615589c42SPeter Wemm tput(int argc, char *argv[]) 1470e3d5408SPeter Wemm { 14815589c42SPeter Wemm NCURSES_CONST char *name; 1490e3d5408SPeter Wemm char *s; 1500e3d5408SPeter Wemm int i, j, c; 15118259542SPeter Wemm int status; 1520e3d5408SPeter Wemm FILE *f; 15306bfebdeSXin LI #if !PURE_TERMINFO 15406bfebdeSXin LI bool termcap = FALSE; 15506bfebdeSXin LI #endif 1560e3d5408SPeter Wemm 15739f2269fSPeter Wemm if ((name = argv[0]) == 0) 15839f2269fSPeter Wemm name = ""; 15939f2269fSPeter Wemm check_aliases(name); 16018259542SPeter Wemm if (is_reset || is_init) { 16115589c42SPeter Wemm if (init_prog != 0) { 1620e3d5408SPeter Wemm system(init_prog); 1630e3d5408SPeter Wemm } 1640e3d5408SPeter Wemm FLUSH; 1650e3d5408SPeter Wemm 16618259542SPeter Wemm if (is_reset && reset_1string != 0) { 1670e3d5408SPeter Wemm PUTS(reset_1string); 16815589c42SPeter Wemm } else if (init_1string != 0) { 1690e3d5408SPeter Wemm PUTS(init_1string); 1700e3d5408SPeter Wemm } 1710e3d5408SPeter Wemm FLUSH; 1720e3d5408SPeter Wemm 17318259542SPeter Wemm if (is_reset && reset_2string != 0) { 1740e3d5408SPeter Wemm PUTS(reset_2string); 17515589c42SPeter Wemm } else if (init_2string != 0) { 1760e3d5408SPeter Wemm PUTS(init_2string); 1770e3d5408SPeter Wemm } 1780e3d5408SPeter Wemm FLUSH; 1790e3d5408SPeter Wemm 18039f2269fSPeter Wemm #ifdef set_lr_margin 18115589c42SPeter Wemm if (set_lr_margin != 0) { 1824a1a9510SRong-En Fan PUTS(TPARM_2(set_lr_margin, 0, columns - 1)); 18339f2269fSPeter Wemm } else 18439f2269fSPeter Wemm #endif 18539f2269fSPeter Wemm #ifdef set_left_margin_parm 18639f2269fSPeter Wemm if (set_left_margin_parm != 0 18715589c42SPeter Wemm && set_right_margin_parm != 0) { 1884a1a9510SRong-En Fan PUTS(TPARM_1(set_left_margin_parm, 0)); 1894a1a9510SRong-En Fan PUTS(TPARM_1(set_right_margin_parm, columns - 1)); 19039f2269fSPeter Wemm } else 19139f2269fSPeter Wemm #endif 19239f2269fSPeter Wemm if (clear_margins != 0 19315589c42SPeter Wemm && set_left_margin != 0 19415589c42SPeter Wemm && set_right_margin != 0) { 1950e3d5408SPeter Wemm PUTS(clear_margins); 19615589c42SPeter Wemm if (carriage_return != 0) { 1970e3d5408SPeter Wemm PUTS(carriage_return); 1980e3d5408SPeter Wemm } else { 1990e3d5408SPeter Wemm PUTCHAR('\r'); 2000e3d5408SPeter Wemm } 2010e3d5408SPeter Wemm PUTS(set_left_margin); 2020e3d5408SPeter Wemm if (parm_right_cursor) { 2034a1a9510SRong-En Fan PUTS(TPARM_1(parm_right_cursor, columns - 1)); 2040e3d5408SPeter Wemm } else { 2050e3d5408SPeter Wemm for (i = 0; i < columns - 1; i++) { 2060e3d5408SPeter Wemm PUTCHAR(' '); 2070e3d5408SPeter Wemm } 2080e3d5408SPeter Wemm } 2090e3d5408SPeter Wemm PUTS(set_right_margin); 21015589c42SPeter Wemm if (carriage_return != 0) { 2110e3d5408SPeter Wemm PUTS(carriage_return); 2120e3d5408SPeter Wemm } else { 2130e3d5408SPeter Wemm PUTCHAR('\r'); 2140e3d5408SPeter Wemm } 2150e3d5408SPeter Wemm } 2160e3d5408SPeter Wemm FLUSH; 2170e3d5408SPeter Wemm 2180e3d5408SPeter Wemm if (init_tabs != 8) { 21915589c42SPeter Wemm if (clear_all_tabs != 0 && set_tab != 0) { 2200e3d5408SPeter Wemm for (i = 0; i < columns - 1; i += 8) { 2210e3d5408SPeter Wemm if (parm_right_cursor) { 2224a1a9510SRong-En Fan PUTS(TPARM_1(parm_right_cursor, 8)); 2230e3d5408SPeter Wemm } else { 2240e3d5408SPeter Wemm for (j = 0; j < 8; j++) 2250e3d5408SPeter Wemm PUTCHAR(' '); 2260e3d5408SPeter Wemm } 2270e3d5408SPeter Wemm PUTS(set_tab); 2280e3d5408SPeter Wemm } 2290e3d5408SPeter Wemm FLUSH; 2300e3d5408SPeter Wemm } 2310e3d5408SPeter Wemm } 2320e3d5408SPeter Wemm 23318259542SPeter Wemm if (is_reset && reset_file != 0) { 2340e3d5408SPeter Wemm f = fopen(reset_file, "r"); 23515589c42SPeter Wemm if (f == 0) { 2364a1a9510SRong-En Fan quit(4 + errno, "Can't open reset_file: '%s'", reset_file); 2370e3d5408SPeter Wemm } 2380e3d5408SPeter Wemm while ((c = fgetc(f)) != EOF) { 2390e3d5408SPeter Wemm PUTCHAR(c); 2400e3d5408SPeter Wemm } 2410e3d5408SPeter Wemm fclose(f); 24215589c42SPeter Wemm } else if (init_file != 0) { 2430e3d5408SPeter Wemm f = fopen(init_file, "r"); 24415589c42SPeter Wemm if (f == 0) { 2454a1a9510SRong-En Fan quit(4 + errno, "Can't open init_file: '%s'", init_file); 2460e3d5408SPeter Wemm } 2470e3d5408SPeter Wemm while ((c = fgetc(f)) != EOF) { 2480e3d5408SPeter Wemm PUTCHAR(c); 2490e3d5408SPeter Wemm } 2500e3d5408SPeter Wemm fclose(f); 2510e3d5408SPeter Wemm } 2520e3d5408SPeter Wemm FLUSH; 2530e3d5408SPeter Wemm 25418259542SPeter Wemm if (is_reset && reset_3string != 0) { 2550e3d5408SPeter Wemm PUTS(reset_3string); 2564a1a9510SRong-En Fan } else if (init_3string != 0) { 2574a1a9510SRong-En Fan PUTS(init_3string); 2580e3d5408SPeter Wemm } 2590e3d5408SPeter Wemm FLUSH; 2600e3d5408SPeter Wemm return 0; 2610e3d5408SPeter Wemm } 2620e3d5408SPeter Wemm 2630e3d5408SPeter Wemm if (strcmp(name, "longname") == 0) { 2640e3d5408SPeter Wemm PUTS(longname()); 2650e3d5408SPeter Wemm return 0; 2660e3d5408SPeter Wemm } 26718259542SPeter Wemm #if !PURE_TERMINFO 26806bfebdeSXin LI retry: 26906bfebdeSXin LI #endif 27006bfebdeSXin LI if ((status = tigetflag(name)) != -1) { 27106bfebdeSXin LI return exit_code(BOOLEAN, status); 27206bfebdeSXin LI } else if ((status = tigetnum(name)) != CANCELLED_NUMERIC) { 27306bfebdeSXin LI (void) printf("%d\n", status); 27406bfebdeSXin LI return exit_code(NUMBER, 0); 27506bfebdeSXin LI } else if ((s = tigetstr(name)) == CANCELLED_STRING) { 27606bfebdeSXin LI #if !PURE_TERMINFO 27706bfebdeSXin LI if (!termcap) { 2780e3d5408SPeter Wemm const struct name_table_entry *np; 2790e3d5408SPeter Wemm 28006bfebdeSXin LI termcap = TRUE; 28106bfebdeSXin LI if ((np = _nc_find_entry(name, _nc_get_hash_table(termcap))) != 0) { 28215589c42SPeter Wemm switch (np->nte_type) { 2830e3d5408SPeter Wemm case BOOLEAN: 2840e3d5408SPeter Wemm if (bool_from_termcap[np->nte_index]) 2850e3d5408SPeter Wemm name = boolnames[np->nte_index]; 2860e3d5408SPeter Wemm break; 2870e3d5408SPeter Wemm 2880e3d5408SPeter Wemm case NUMBER: 2890e3d5408SPeter Wemm if (num_from_termcap[np->nte_index]) 2900e3d5408SPeter Wemm name = numnames[np->nte_index]; 2910e3d5408SPeter Wemm break; 2920e3d5408SPeter Wemm 2930e3d5408SPeter Wemm case STRING: 2940e3d5408SPeter Wemm if (str_from_termcap[np->nte_index]) 2950e3d5408SPeter Wemm name = strnames[np->nte_index]; 2960e3d5408SPeter Wemm break; 2970e3d5408SPeter Wemm } 29806bfebdeSXin LI goto retry; 29906bfebdeSXin LI } 3000e3d5408SPeter Wemm } 3010e3d5408SPeter Wemm #endif 3024a1a9510SRong-En Fan quit(4, "unknown terminfo capability '%s'", name); 30318259542SPeter Wemm } else if (s != ABSENT_STRING) { 3040e3d5408SPeter Wemm if (argc > 1) { 3050e3d5408SPeter Wemm int k; 306*73f0a83dSXin LI int ignored; 3074a1a9510SRong-En Fan long numbers[1 + NUM_PARM]; 3084a1a9510SRong-En Fan char *strings[1 + NUM_PARM]; 3094a1a9510SRong-En Fan char *p_is_s[NUM_PARM]; 3100e3d5408SPeter Wemm 3110e3d5408SPeter Wemm /* Nasty hack time. The tparm function needs to see numeric 3120e3d5408SPeter Wemm * parameters as numbers, not as pointers to their string 3130e3d5408SPeter Wemm * representations 3140e3d5408SPeter Wemm */ 3150e3d5408SPeter Wemm 31615589c42SPeter Wemm for (k = 1; k < argc; k++) { 31718259542SPeter Wemm char *tmp = 0; 31818259542SPeter Wemm strings[k] = argv[k]; 31918259542SPeter Wemm numbers[k] = strtol(argv[k], &tmp, 0); 32018259542SPeter Wemm if (tmp == 0 || *tmp != 0) 32118259542SPeter Wemm numbers[k] = 0; 3220e3d5408SPeter Wemm } 3234a1a9510SRong-En Fan for (k = argc; k <= NUM_PARM; k++) { 32418259542SPeter Wemm numbers[k] = 0; 32518259542SPeter Wemm strings[k] = 0; 32615589c42SPeter Wemm } 3270e3d5408SPeter Wemm 32818259542SPeter Wemm switch (tparm_type(name)) { 32918259542SPeter Wemm case Num_Str: 3304a1a9510SRong-En Fan s = TPARM_2(s, numbers[1], strings[2]); 33118259542SPeter Wemm break; 33218259542SPeter Wemm case Num_Str_Str: 3334a1a9510SRong-En Fan s = TPARM_3(s, numbers[1], strings[2], strings[3]); 33418259542SPeter Wemm break; 3355ca44d1cSRong-En Fan case Numbers: 33618259542SPeter Wemm default: 337*73f0a83dSXin LI (void) _nc_tparm_analyze(s, p_is_s, &ignored); 338*73f0a83dSXin LI #define myParam(n) (p_is_s[n - 1] != 0 ? ((TPARM_ARG) strings[n]) : numbers[n]) 3394a1a9510SRong-En Fan s = TPARM_9(s, 3404a1a9510SRong-En Fan myParam(1), 3414a1a9510SRong-En Fan myParam(2), 3424a1a9510SRong-En Fan myParam(3), 3434a1a9510SRong-En Fan myParam(4), 3444a1a9510SRong-En Fan myParam(5), 3454a1a9510SRong-En Fan myParam(6), 3464a1a9510SRong-En Fan myParam(7), 3474a1a9510SRong-En Fan myParam(8), 3484a1a9510SRong-En Fan myParam(9)); 34918259542SPeter Wemm break; 35018259542SPeter Wemm } 3510e3d5408SPeter Wemm } 3520e3d5408SPeter Wemm 3530e3d5408SPeter Wemm /* use putp() in order to perform padding */ 3540e3d5408SPeter Wemm putp(s); 3554a1a9510SRong-En Fan return exit_code(STRING, 0); 3560e3d5408SPeter Wemm } 3574a1a9510SRong-En Fan return exit_code(STRING, 1); 3580e3d5408SPeter Wemm } 3590e3d5408SPeter Wemm 36015589c42SPeter Wemm int 36115589c42SPeter Wemm main(int argc, char **argv) 3620e3d5408SPeter Wemm { 36318259542SPeter Wemm char *term; 36418259542SPeter Wemm int errret; 36518259542SPeter Wemm bool cmdline = TRUE; 3660e3d5408SPeter Wemm int c; 3670e3d5408SPeter Wemm char buf[BUFSIZ]; 3684a1a9510SRong-En Fan int result = 0; 3690e3d5408SPeter Wemm 37039f2269fSPeter Wemm check_aliases(prg_name = _nc_rootname(argv[0])); 3710e3d5408SPeter Wemm 3720e3d5408SPeter Wemm term = getenv("TERM"); 3730e3d5408SPeter Wemm 3745ca44d1cSRong-En Fan while ((c = getopt(argc, argv, "ST:V")) != -1) { 37515589c42SPeter Wemm switch (c) { 3760e3d5408SPeter Wemm case 'S': 37718259542SPeter Wemm cmdline = FALSE; 3780e3d5408SPeter Wemm break; 3790e3d5408SPeter Wemm case 'T': 3800e3d5408SPeter Wemm use_env(FALSE); 3810e3d5408SPeter Wemm term = optarg; 3820e3d5408SPeter Wemm break; 38318259542SPeter Wemm case 'V': 38418259542SPeter Wemm puts(curses_version()); 3854a1a9510SRong-En Fan ExitProgram(EXIT_SUCCESS); 3860e3d5408SPeter Wemm default: 3870e3d5408SPeter Wemm usage(); 3880e3d5408SPeter Wemm /* NOTREACHED */ 3890e3d5408SPeter Wemm } 39018259542SPeter Wemm } 39118259542SPeter Wemm 39218259542SPeter Wemm /* 39318259542SPeter Wemm * Modify the argument list to omit the options we processed. 39418259542SPeter Wemm */ 39518259542SPeter Wemm if (is_reset || is_init) { 39618259542SPeter Wemm if (optind-- < argc) { 3970e3d5408SPeter Wemm argc -= optind; 3980e3d5408SPeter Wemm argv += optind; 39918259542SPeter Wemm } 40018259542SPeter Wemm argv[0] = prg_name; 40118259542SPeter Wemm } else { 40218259542SPeter Wemm argc -= optind; 40318259542SPeter Wemm argv += optind; 4040e3d5408SPeter Wemm } 4050e3d5408SPeter Wemm 40615589c42SPeter Wemm if (term == 0 || *term == '\0') 4070e3d5408SPeter Wemm quit(2, "No value for $TERM and no -T specified"); 4080e3d5408SPeter Wemm 4090e3d5408SPeter Wemm if (setupterm(term, STDOUT_FILENO, &errret) != OK && errret <= 0) 4100e3d5408SPeter Wemm quit(3, "unknown terminal \"%s\"", term); 4110e3d5408SPeter Wemm 41218259542SPeter Wemm if (cmdline) { 41318259542SPeter Wemm if ((argc <= 0) && !is_reset && !is_init) 41418259542SPeter Wemm usage(); 4154a1a9510SRong-En Fan ExitProgram(tput(argc, argv)); 41618259542SPeter Wemm } 4170e3d5408SPeter Wemm 41815589c42SPeter Wemm while (fgets(buf, sizeof(buf), stdin) != 0) { 4190e3d5408SPeter Wemm char *argvec[16]; /* command, 9 parms, null, & slop */ 4200e3d5408SPeter Wemm int argnum = 0; 4210e3d5408SPeter Wemm char *cp; 4220e3d5408SPeter Wemm 4230e3d5408SPeter Wemm /* crack the argument list into a dope vector */ 4240e3d5408SPeter Wemm for (cp = buf; *cp; cp++) { 42539f2269fSPeter Wemm if (isspace(UChar(*cp))) { 4260e3d5408SPeter Wemm *cp = '\0'; 42739f2269fSPeter Wemm } else if (cp == buf || cp[-1] == 0) { 4280e3d5408SPeter Wemm argvec[argnum++] = cp; 42939f2269fSPeter Wemm if (argnum >= (int) SIZEOF(argvec) - 1) 43039f2269fSPeter Wemm break; 43139f2269fSPeter Wemm } 4320e3d5408SPeter Wemm } 43315589c42SPeter Wemm argvec[argnum] = 0; 4340e3d5408SPeter Wemm 43539f2269fSPeter Wemm if (argnum != 0 4364a1a9510SRong-En Fan && tput(argnum, argvec) != 0) { 4374a1a9510SRong-En Fan if (result == 0) 4384a1a9510SRong-En Fan result = 4; /* will return value >4 */ 4394a1a9510SRong-En Fan ++result; 4404a1a9510SRong-En Fan } 4410e3d5408SPeter Wemm } 4420e3d5408SPeter Wemm 4434a1a9510SRong-En Fan ExitProgram(result); 4440e3d5408SPeter Wemm } 445