10e3d5408SPeter Wemm /**************************************************************************** 25ca44d1cSRong-En Fan * Copyright (c) 1998-2006,2007 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 450e3d5408SPeter Wemm #include <termsort.c> 460e3d5408SPeter Wemm #endif 4718259542SPeter Wemm #include <transform.h> 480e3d5408SPeter Wemm 495ca44d1cSRong-En Fan MODULE_ID("$Id: tput.c,v 1.41 2007/10/13 20:34:16 tom Exp $") 500e3d5408SPeter Wemm 510e3d5408SPeter Wemm #define PUTS(s) fputs(s, stdout) 520e3d5408SPeter Wemm #define PUTCHAR(c) putchar(c) 530e3d5408SPeter Wemm #define FLUSH fflush(stdout) 540e3d5408SPeter Wemm 5518259542SPeter Wemm typedef enum { 5618259542SPeter Wemm Numbers = 0 5718259542SPeter Wemm ,Num_Str 5818259542SPeter Wemm ,Num_Str_Str 5918259542SPeter Wemm } TParams; 6018259542SPeter Wemm 610e3d5408SPeter Wemm static char *prg_name; 6218259542SPeter Wemm static bool is_init = FALSE; 6318259542SPeter Wemm static bool is_reset = FALSE; 640e3d5408SPeter Wemm 6515589c42SPeter Wemm static void 6615589c42SPeter Wemm quit(int status, const char *fmt,...) 670e3d5408SPeter Wemm { 680e3d5408SPeter Wemm va_list argp; 690e3d5408SPeter Wemm 700e3d5408SPeter Wemm va_start(argp, fmt); 714a1a9510SRong-En Fan fprintf(stderr, "%s: ", prg_name); 720e3d5408SPeter Wemm vfprintf(stderr, fmt, argp); 730e3d5408SPeter Wemm fprintf(stderr, "\n"); 740e3d5408SPeter Wemm va_end(argp); 754a1a9510SRong-En Fan ExitProgram(status); 760e3d5408SPeter Wemm } 770e3d5408SPeter Wemm 7815589c42SPeter Wemm static void 7915589c42SPeter Wemm usage(void) 800e3d5408SPeter Wemm { 8118259542SPeter Wemm fprintf(stderr, "usage: %s [-V] [-S] [-T term] capname\n", prg_name); 824a1a9510SRong-En Fan ExitProgram(EXIT_FAILURE); 830e3d5408SPeter Wemm } 840e3d5408SPeter Wemm 8518259542SPeter Wemm static void 8618259542SPeter Wemm check_aliases(const char *name) 8718259542SPeter Wemm { 8818259542SPeter Wemm is_init = (strcmp(name, PROG_INIT) == 0); 8918259542SPeter Wemm is_reset = (strcmp(name, PROG_RESET) == 0); 9018259542SPeter Wemm } 9118259542SPeter Wemm 9218259542SPeter Wemm /* 9318259542SPeter Wemm * Lookup the type of call we should make to tparm(). This ignores the actual 9418259542SPeter Wemm * terminfo capability (bad, because it is not extensible), but makes this 9518259542SPeter Wemm * code portable to platforms where sizeof(int) != sizeof(char *). 9618259542SPeter Wemm * 9718259542SPeter Wemm * FIXME: If we want extensibility, analyze the capability string as we do 9818259542SPeter Wemm * in tparm() to decide how to parse the varargs list. 9918259542SPeter Wemm */ 10018259542SPeter Wemm static TParams 1017a69bbfbSPeter Wemm tparm_type(const char *name) 10218259542SPeter Wemm { 10318259542SPeter Wemm #define TD(code, longname, ti, tc) {code,longname},{code,ti},{code,tc} 10418259542SPeter Wemm TParams result = Numbers; 10518259542SPeter Wemm /* *INDENT-OFF* */ 10618259542SPeter Wemm static const struct { 10718259542SPeter Wemm TParams code; 10818259542SPeter Wemm const char *name; 10918259542SPeter Wemm } table[] = { 11018259542SPeter Wemm TD(Num_Str, "pkey_key", "pfkey", "pk"), 11118259542SPeter Wemm TD(Num_Str, "pkey_local", "pfloc", "pl"), 11218259542SPeter Wemm TD(Num_Str, "pkey_xmit", "pfx", "px"), 11318259542SPeter Wemm TD(Num_Str, "plab_norm", "pln", "pn"), 11418259542SPeter Wemm TD(Num_Str_Str, "pkey_plab", "pfxl", "xl"), 11518259542SPeter Wemm }; 11618259542SPeter Wemm /* *INDENT-ON* */ 11718259542SPeter Wemm 11818259542SPeter Wemm unsigned n; 11918259542SPeter Wemm for (n = 0; n < SIZEOF(table); n++) { 12018259542SPeter Wemm if (!strcmp(name, table[n].name)) { 12118259542SPeter Wemm result = table[n].code; 12218259542SPeter Wemm break; 12318259542SPeter Wemm } 12418259542SPeter Wemm } 12518259542SPeter Wemm return result; 12618259542SPeter Wemm } 12718259542SPeter Wemm 12815589c42SPeter Wemm static int 1294a1a9510SRong-En Fan exit_code(int token, int value) 1304a1a9510SRong-En Fan { 1314a1a9510SRong-En Fan int result = 99; 1324a1a9510SRong-En Fan 1334a1a9510SRong-En Fan switch (token) { 1344a1a9510SRong-En Fan case BOOLEAN: 1354a1a9510SRong-En Fan result = !value; /* TRUE=0, FALSE=1 */ 1364a1a9510SRong-En Fan break; 1374a1a9510SRong-En Fan case NUMBER: 1384a1a9510SRong-En Fan result = 0; /* always zero */ 1394a1a9510SRong-En Fan break; 1404a1a9510SRong-En Fan case STRING: 1414a1a9510SRong-En Fan result = value; /* 0=normal, 1=missing */ 1424a1a9510SRong-En Fan break; 1434a1a9510SRong-En Fan } 1444a1a9510SRong-En Fan return result; 1454a1a9510SRong-En Fan } 1464a1a9510SRong-En Fan 1474a1a9510SRong-En Fan static int 14815589c42SPeter Wemm tput(int argc, char *argv[]) 1490e3d5408SPeter Wemm { 15015589c42SPeter Wemm NCURSES_CONST char *name; 1510e3d5408SPeter Wemm char *s; 1520e3d5408SPeter Wemm int i, j, c; 15318259542SPeter Wemm int status; 1540e3d5408SPeter Wemm FILE *f; 1550e3d5408SPeter Wemm 15639f2269fSPeter Wemm if ((name = argv[0]) == 0) 15739f2269fSPeter Wemm name = ""; 15839f2269fSPeter Wemm check_aliases(name); 15918259542SPeter Wemm if (is_reset || is_init) { 16015589c42SPeter Wemm if (init_prog != 0) { 1610e3d5408SPeter Wemm system(init_prog); 1620e3d5408SPeter Wemm } 1630e3d5408SPeter Wemm FLUSH; 1640e3d5408SPeter Wemm 16518259542SPeter Wemm if (is_reset && reset_1string != 0) { 1660e3d5408SPeter Wemm PUTS(reset_1string); 16715589c42SPeter Wemm } else if (init_1string != 0) { 1680e3d5408SPeter Wemm PUTS(init_1string); 1690e3d5408SPeter Wemm } 1700e3d5408SPeter Wemm FLUSH; 1710e3d5408SPeter Wemm 17218259542SPeter Wemm if (is_reset && reset_2string != 0) { 1730e3d5408SPeter Wemm PUTS(reset_2string); 17415589c42SPeter Wemm } else if (init_2string != 0) { 1750e3d5408SPeter Wemm PUTS(init_2string); 1760e3d5408SPeter Wemm } 1770e3d5408SPeter Wemm FLUSH; 1780e3d5408SPeter Wemm 17939f2269fSPeter Wemm #ifdef set_lr_margin 18015589c42SPeter Wemm if (set_lr_margin != 0) { 1814a1a9510SRong-En Fan PUTS(TPARM_2(set_lr_margin, 0, columns - 1)); 18239f2269fSPeter Wemm } else 18339f2269fSPeter Wemm #endif 18439f2269fSPeter Wemm #ifdef set_left_margin_parm 18539f2269fSPeter Wemm if (set_left_margin_parm != 0 18615589c42SPeter Wemm && set_right_margin_parm != 0) { 1874a1a9510SRong-En Fan PUTS(TPARM_1(set_left_margin_parm, 0)); 1884a1a9510SRong-En Fan PUTS(TPARM_1(set_right_margin_parm, columns - 1)); 18939f2269fSPeter Wemm } else 19039f2269fSPeter Wemm #endif 19139f2269fSPeter Wemm if (clear_margins != 0 19215589c42SPeter Wemm && set_left_margin != 0 19315589c42SPeter Wemm && set_right_margin != 0) { 1940e3d5408SPeter Wemm PUTS(clear_margins); 19515589c42SPeter Wemm if (carriage_return != 0) { 1960e3d5408SPeter Wemm PUTS(carriage_return); 1970e3d5408SPeter Wemm } else { 1980e3d5408SPeter Wemm PUTCHAR('\r'); 1990e3d5408SPeter Wemm } 2000e3d5408SPeter Wemm PUTS(set_left_margin); 2010e3d5408SPeter Wemm if (parm_right_cursor) { 2024a1a9510SRong-En Fan PUTS(TPARM_1(parm_right_cursor, columns - 1)); 2030e3d5408SPeter Wemm } else { 2040e3d5408SPeter Wemm for (i = 0; i < columns - 1; i++) { 2050e3d5408SPeter Wemm PUTCHAR(' '); 2060e3d5408SPeter Wemm } 2070e3d5408SPeter Wemm } 2080e3d5408SPeter Wemm PUTS(set_right_margin); 20915589c42SPeter Wemm if (carriage_return != 0) { 2100e3d5408SPeter Wemm PUTS(carriage_return); 2110e3d5408SPeter Wemm } else { 2120e3d5408SPeter Wemm PUTCHAR('\r'); 2130e3d5408SPeter Wemm } 2140e3d5408SPeter Wemm } 2150e3d5408SPeter Wemm FLUSH; 2160e3d5408SPeter Wemm 2170e3d5408SPeter Wemm if (init_tabs != 8) { 21815589c42SPeter Wemm if (clear_all_tabs != 0 && set_tab != 0) { 2190e3d5408SPeter Wemm for (i = 0; i < columns - 1; i += 8) { 2200e3d5408SPeter Wemm if (parm_right_cursor) { 2214a1a9510SRong-En Fan PUTS(TPARM_1(parm_right_cursor, 8)); 2220e3d5408SPeter Wemm } else { 2230e3d5408SPeter Wemm for (j = 0; j < 8; j++) 2240e3d5408SPeter Wemm PUTCHAR(' '); 2250e3d5408SPeter Wemm } 2260e3d5408SPeter Wemm PUTS(set_tab); 2270e3d5408SPeter Wemm } 2280e3d5408SPeter Wemm FLUSH; 2290e3d5408SPeter Wemm } 2300e3d5408SPeter Wemm } 2310e3d5408SPeter Wemm 23218259542SPeter Wemm if (is_reset && reset_file != 0) { 2330e3d5408SPeter Wemm f = fopen(reset_file, "r"); 23415589c42SPeter Wemm if (f == 0) { 2354a1a9510SRong-En Fan quit(4 + errno, "Can't open reset_file: '%s'", reset_file); 2360e3d5408SPeter Wemm } 2370e3d5408SPeter Wemm while ((c = fgetc(f)) != EOF) { 2380e3d5408SPeter Wemm PUTCHAR(c); 2390e3d5408SPeter Wemm } 2400e3d5408SPeter Wemm fclose(f); 24115589c42SPeter Wemm } else if (init_file != 0) { 2420e3d5408SPeter Wemm f = fopen(init_file, "r"); 24315589c42SPeter Wemm if (f == 0) { 2444a1a9510SRong-En Fan quit(4 + errno, "Can't open init_file: '%s'", init_file); 2450e3d5408SPeter Wemm } 2460e3d5408SPeter Wemm while ((c = fgetc(f)) != EOF) { 2470e3d5408SPeter Wemm PUTCHAR(c); 2480e3d5408SPeter Wemm } 2490e3d5408SPeter Wemm fclose(f); 2500e3d5408SPeter Wemm } 2510e3d5408SPeter Wemm FLUSH; 2520e3d5408SPeter Wemm 25318259542SPeter Wemm if (is_reset && reset_3string != 0) { 2540e3d5408SPeter Wemm PUTS(reset_3string); 2554a1a9510SRong-En Fan } else if (init_3string != 0) { 2564a1a9510SRong-En Fan PUTS(init_3string); 2570e3d5408SPeter Wemm } 2580e3d5408SPeter Wemm FLUSH; 2590e3d5408SPeter Wemm return 0; 2600e3d5408SPeter Wemm } 2610e3d5408SPeter Wemm 2620e3d5408SPeter Wemm if (strcmp(name, "longname") == 0) { 2630e3d5408SPeter Wemm PUTS(longname()); 2640e3d5408SPeter Wemm return 0; 2650e3d5408SPeter Wemm } 26618259542SPeter Wemm #if !PURE_TERMINFO 2670e3d5408SPeter Wemm { 2680e3d5408SPeter Wemm const struct name_table_entry *np; 2690e3d5408SPeter Wemm 2700e3d5408SPeter Wemm if ((np = _nc_find_entry(name, _nc_get_hash_table(1))) != 0) 27115589c42SPeter Wemm switch (np->nte_type) { 2720e3d5408SPeter Wemm case BOOLEAN: 2730e3d5408SPeter Wemm if (bool_from_termcap[np->nte_index]) 2740e3d5408SPeter Wemm name = boolnames[np->nte_index]; 2750e3d5408SPeter Wemm break; 2760e3d5408SPeter Wemm 2770e3d5408SPeter Wemm case NUMBER: 2780e3d5408SPeter Wemm if (num_from_termcap[np->nte_index]) 2790e3d5408SPeter Wemm name = numnames[np->nte_index]; 2800e3d5408SPeter Wemm break; 2810e3d5408SPeter Wemm 2820e3d5408SPeter Wemm case STRING: 2830e3d5408SPeter Wemm if (str_from_termcap[np->nte_index]) 2840e3d5408SPeter Wemm name = strnames[np->nte_index]; 2850e3d5408SPeter Wemm break; 2860e3d5408SPeter Wemm } 2870e3d5408SPeter Wemm } 2880e3d5408SPeter Wemm #endif 2890e3d5408SPeter Wemm 29015589c42SPeter Wemm if ((status = tigetflag(name)) != -1) { 2914a1a9510SRong-En Fan return exit_code(BOOLEAN, status); 29215589c42SPeter Wemm } else if ((status = tigetnum(name)) != CANCELLED_NUMERIC) { 2930e3d5408SPeter Wemm (void) printf("%d\n", status); 2944a1a9510SRong-En Fan return exit_code(NUMBER, 0); 29515589c42SPeter Wemm } else if ((s = tigetstr(name)) == CANCELLED_STRING) { 2964a1a9510SRong-En Fan quit(4, "unknown terminfo capability '%s'", name); 29718259542SPeter Wemm } else if (s != ABSENT_STRING) { 2980e3d5408SPeter Wemm if (argc > 1) { 2990e3d5408SPeter Wemm int k; 3004a1a9510SRong-En Fan int popcount; 3014a1a9510SRong-En Fan long numbers[1 + NUM_PARM]; 3024a1a9510SRong-En Fan char *strings[1 + NUM_PARM]; 3034a1a9510SRong-En Fan char *p_is_s[NUM_PARM]; 3040e3d5408SPeter Wemm 3050e3d5408SPeter Wemm /* Nasty hack time. The tparm function needs to see numeric 3060e3d5408SPeter Wemm * parameters as numbers, not as pointers to their string 3070e3d5408SPeter Wemm * representations 3080e3d5408SPeter Wemm */ 3090e3d5408SPeter Wemm 31015589c42SPeter Wemm for (k = 1; k < argc; k++) { 31118259542SPeter Wemm char *tmp = 0; 31218259542SPeter Wemm strings[k] = argv[k]; 31318259542SPeter Wemm numbers[k] = strtol(argv[k], &tmp, 0); 31418259542SPeter Wemm if (tmp == 0 || *tmp != 0) 31518259542SPeter Wemm numbers[k] = 0; 3160e3d5408SPeter Wemm } 3174a1a9510SRong-En Fan for (k = argc; k <= NUM_PARM; k++) { 31818259542SPeter Wemm numbers[k] = 0; 31918259542SPeter Wemm strings[k] = 0; 32015589c42SPeter Wemm } 3210e3d5408SPeter Wemm 32218259542SPeter Wemm switch (tparm_type(name)) { 32318259542SPeter Wemm case Num_Str: 3244a1a9510SRong-En Fan s = TPARM_2(s, numbers[1], strings[2]); 32518259542SPeter Wemm break; 32618259542SPeter Wemm case Num_Str_Str: 3274a1a9510SRong-En Fan s = TPARM_3(s, numbers[1], strings[2], strings[3]); 32818259542SPeter Wemm break; 3295ca44d1cSRong-En Fan case Numbers: 33018259542SPeter Wemm default: 3314a1a9510SRong-En Fan (void) _nc_tparm_analyze(s, p_is_s, &popcount); 3324a1a9510SRong-En Fan #define myParam(n) (p_is_s[n - 1] != 0 ? ((long) strings[n]) : numbers[n]) 3334a1a9510SRong-En Fan s = TPARM_9(s, 3344a1a9510SRong-En Fan myParam(1), 3354a1a9510SRong-En Fan myParam(2), 3364a1a9510SRong-En Fan myParam(3), 3374a1a9510SRong-En Fan myParam(4), 3384a1a9510SRong-En Fan myParam(5), 3394a1a9510SRong-En Fan myParam(6), 3404a1a9510SRong-En Fan myParam(7), 3414a1a9510SRong-En Fan myParam(8), 3424a1a9510SRong-En Fan myParam(9)); 34318259542SPeter Wemm break; 34418259542SPeter Wemm } 3450e3d5408SPeter Wemm } 3460e3d5408SPeter Wemm 3470e3d5408SPeter Wemm /* use putp() in order to perform padding */ 3480e3d5408SPeter Wemm putp(s); 3494a1a9510SRong-En Fan return exit_code(STRING, 0); 3500e3d5408SPeter Wemm } 3514a1a9510SRong-En Fan return exit_code(STRING, 1); 3520e3d5408SPeter Wemm } 3530e3d5408SPeter Wemm 35415589c42SPeter Wemm int 35515589c42SPeter Wemm main(int argc, char **argv) 3560e3d5408SPeter Wemm { 35718259542SPeter Wemm char *term; 35818259542SPeter Wemm int errret; 35918259542SPeter Wemm bool cmdline = TRUE; 3600e3d5408SPeter Wemm int c; 3610e3d5408SPeter Wemm char buf[BUFSIZ]; 3624a1a9510SRong-En Fan int result = 0; 3630e3d5408SPeter Wemm 36439f2269fSPeter Wemm check_aliases(prg_name = _nc_rootname(argv[0])); 3650e3d5408SPeter Wemm 3660e3d5408SPeter Wemm term = getenv("TERM"); 3670e3d5408SPeter Wemm 3685ca44d1cSRong-En Fan while ((c = getopt(argc, argv, "ST:V")) != -1) { 36915589c42SPeter Wemm switch (c) { 3700e3d5408SPeter Wemm case 'S': 37118259542SPeter Wemm cmdline = FALSE; 3720e3d5408SPeter Wemm break; 3730e3d5408SPeter Wemm case 'T': 3740e3d5408SPeter Wemm use_env(FALSE); 3750e3d5408SPeter Wemm term = optarg; 3760e3d5408SPeter Wemm break; 37718259542SPeter Wemm case 'V': 37818259542SPeter Wemm puts(curses_version()); 3794a1a9510SRong-En Fan ExitProgram(EXIT_SUCCESS); 3800e3d5408SPeter Wemm default: 3810e3d5408SPeter Wemm usage(); 3820e3d5408SPeter Wemm /* NOTREACHED */ 3830e3d5408SPeter Wemm } 38418259542SPeter Wemm } 38518259542SPeter Wemm 38618259542SPeter Wemm /* 38718259542SPeter Wemm * Modify the argument list to omit the options we processed. 38818259542SPeter Wemm */ 38918259542SPeter Wemm if (is_reset || is_init) { 39018259542SPeter Wemm if (optind-- < argc) { 3910e3d5408SPeter Wemm argc -= optind; 3920e3d5408SPeter Wemm argv += optind; 39318259542SPeter Wemm } 39418259542SPeter Wemm argv[0] = prg_name; 39518259542SPeter Wemm } else { 39618259542SPeter Wemm argc -= optind; 39718259542SPeter Wemm argv += optind; 3980e3d5408SPeter Wemm } 3990e3d5408SPeter Wemm 40015589c42SPeter Wemm if (term == 0 || *term == '\0') 4010e3d5408SPeter Wemm quit(2, "No value for $TERM and no -T specified"); 4020e3d5408SPeter Wemm 4030e3d5408SPeter Wemm if (setupterm(term, STDOUT_FILENO, &errret) != OK && errret <= 0) 4040e3d5408SPeter Wemm quit(3, "unknown terminal \"%s\"", term); 4050e3d5408SPeter Wemm 40618259542SPeter Wemm if (cmdline) { 40718259542SPeter Wemm if ((argc <= 0) && !is_reset && !is_init) 40818259542SPeter Wemm usage(); 4094a1a9510SRong-En Fan ExitProgram(tput(argc, argv)); 41018259542SPeter Wemm } 4110e3d5408SPeter Wemm 41215589c42SPeter Wemm while (fgets(buf, sizeof(buf), stdin) != 0) { 4130e3d5408SPeter Wemm char *argvec[16]; /* command, 9 parms, null, & slop */ 4140e3d5408SPeter Wemm int argnum = 0; 4150e3d5408SPeter Wemm char *cp; 4160e3d5408SPeter Wemm 4170e3d5408SPeter Wemm /* crack the argument list into a dope vector */ 4180e3d5408SPeter Wemm for (cp = buf; *cp; cp++) { 41939f2269fSPeter Wemm if (isspace(UChar(*cp))) { 4200e3d5408SPeter Wemm *cp = '\0'; 42139f2269fSPeter Wemm } else if (cp == buf || cp[-1] == 0) { 4220e3d5408SPeter Wemm argvec[argnum++] = cp; 42339f2269fSPeter Wemm if (argnum >= (int) SIZEOF(argvec) - 1) 42439f2269fSPeter Wemm break; 42539f2269fSPeter Wemm } 4260e3d5408SPeter Wemm } 42715589c42SPeter Wemm argvec[argnum] = 0; 4280e3d5408SPeter Wemm 42939f2269fSPeter Wemm if (argnum != 0 4304a1a9510SRong-En Fan && tput(argnum, argvec) != 0) { 4314a1a9510SRong-En Fan if (result == 0) 4324a1a9510SRong-En Fan result = 4; /* will return value >4 */ 4334a1a9510SRong-En Fan ++result; 4344a1a9510SRong-En Fan } 4350e3d5408SPeter Wemm } 4360e3d5408SPeter Wemm 4374a1a9510SRong-En Fan ExitProgram(result); 4380e3d5408SPeter Wemm } 439