Annotation of coherent/e/bin/cku179/ckuusr.c, revision 1.1

1.1     ! root        1: char *userv = "User Interface 5A(081), 8 Feb 92";
        !             2: 
        !             3: /*  C K U U S R --  "User Interface" for Unix Kermit (Part 1)  */
        !             4: 
        !             5: /*
        !             6:  Author: Frank da Cruz ([email protected], [email protected]),
        !             7:  Columbia University Center for Computing Activities.
        !             8:  First released January 1985.
        !             9:  Copyright (C) 1985, 1992, Trustees of Columbia University in the City of New 
        !            10:  York.  Permission is granted to any individual or institution to use, copy, or
        !            11:  redistribute this software so long as it is not sold for profit, provided this
        !            12:  copyright notice is retained. 
        !            13: */
        !            14: 
        !            15: /*
        !            16:   NOTE: Because of the massive additions in functionality, and therefore
        !            17:   the increase in the number of commands, much code was moved from here to
        !            18:   the two new modules, ckuus4.c and ckuus5.c.  This module now contains only
        !            19:   the top-level command keyword table, the SET command keyword table, and
        !            20:   the top-level interactive command parser/dispatcher.  ckuus3.c contains the
        !            21:   rest of the SET and REMOTE command parsers; ckuus2.c contains the help
        !            22:   command parser and help text strings, and ckuus4.c and ckuus5.c contain
        !            23:   miscellaneous pieces that logically belong in the ckuusr.c file but had to
        !            24:   be moved because of size problems with some C compilers / linkers.
        !            25:   Later...  as the other modules became too large, a ckuus6.c was created.
        !            26:   Still later...  ckuus7.c.
        !            27:   Also: ckuusy.c contains the UNIX-style command-line interface;
        !            28:   ckuusx.c contains routines needed by both the command-line interface and
        !            29:   the interactive command parser.
        !            30: */
        !            31: 
        !            32: /*
        !            33:  The ckuus*.c modules depend on the existence of C library features like fopen,
        !            34:  fgets, feof, (f)printf, argv/argc, etc.  Other functions that are likely to
        !            35:  vary among Unix implementations -- like setting terminal modes or interrupts
        !            36:  -- are invoked via calls to functions that are defined in the system-
        !            37:  dependent modules, ck?[ft]io.c.  The command line parser processes any
        !            38:  arguments found on the command line, as passed to main() via argv/argc.  The
        !            39:  interactive parser uses the facilities of the cmd package (developed for this
        !            40:  program, but usable by any program).  Any command parser may be substituted
        !            41:  for this one.  The only requirements for the Kermit command parser are these:
        !            42: 
        !            43: 1. Set parameters via global variables like duplex, speed, ttname, etc.  See
        !            44:    ckmain.c for the declarations and descriptions of these variables.
        !            45: 
        !            46: 2. If a command can be executed without the use of Kermit protocol, then
        !            47:    execute the command directly and set the variable sstate to 0. Examples
        !            48:    include 'set' commands, local directory listings, the 'connect' command.
        !            49: 
        !            50: 3. If a command requires the Kermit protocol, set the following variables:
        !            51: 
        !            52:     sstate                             string data
        !            53:       'x' (enter server mode)            (none)
        !            54:       'r' (send a 'get' command)         cmarg, cmarg2
        !            55:       'v' (enter receive mode)           cmarg2
        !            56:       'g' (send a generic command)       cmarg
        !            57:       's' (send files)                   nfils, cmarg & cmarg2 OR cmlist
        !            58:       'c' (send a remote host command)   cmarg
        !            59: 
        !            60:     cmlist is an array of pointers to strings.
        !            61:     cmarg, cmarg2 are pointers to strings.
        !            62:     nfils is an integer.
        !            63: 
        !            64:     cmarg can be a filename string (possibly wild), or
        !            65:        a pointer to a prefabricated generic command string, or
        !            66:        a pointer to a host command string.
        !            67:     cmarg2 is the name to send a single file under, or
        !            68:        the name under which to store an incoming file; must not be wild.
        !            69:        If it's the name for receiving, a null value means to store the
        !            70:        file under the name it arrives with.
        !            71:     cmlist is a list of nonwild filenames, such as passed via argv.
        !            72:     nfils is an integer, interpreted as follows:
        !            73:       -1: filespec (possibly wild) in cmarg, must be expanded internally.
        !            74:        0: send from stdin (standard input).
        !            75:       >0: number of files to send, from cmlist.
        !            76: 
        !            77:  The screen() function is used to update the screen during file transfer.
        !            78:  The tlog() function writes to a transaction log.
        !            79:  The debug() function writes to a debugging log.
        !            80:  The intmsg() and chkint() functions provide the user i/o for interrupting
        !            81:    file transfers.
        !            82: */
        !            83: 
        !            84: #ifndef NOICP
        !            85: /* Includes */
        !            86:  
        !            87: #include "ckcdeb.h"
        !            88: #include "ckcasc.h"
        !            89: #include "ckcker.h"
        !            90: #include "ckuusr.h"
        !            91: #include "ckcxla.h"
        !            92: #include "ckcnet.h"                    /* Network symbols */
        !            93:  
        !            94: #ifdef datageneral
        !            95: #define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd)
        !            96: #endif /* datageneral */
        !            97: 
        !            98: /* External Kermit Variables, see ckmain.c for description. */
        !            99:  
        !           100: extern int size, local, sndsrc, xitsta, server, displa, binary,
        !           101:   escape, duplex, nfils, quiet, tlevel, pflag, zincnt, atcapr, atdiso, verwho;
        !           102:  
        !           103: extern long vernum;
        !           104: extern char *versio;
        !           105: extern char *ckxsys, *cmarg, *cmarg2, **cmlist;
        !           106: extern char *PWDCMD, *WHOCMD, *TYPCMD;
        !           107: extern char ttname[];
        !           108: #ifndef NOFRILLS
        !           109: extern int rmailf;                     /* MAIL command items */
        !           110: extern char optbuf[];
        !           111: #endif /* NOFRILLS */
        !           112: extern CHAR sstate;
        !           113: 
        !           114: #ifndef NOMSEND                                /* Multiple SEND */
        !           115: extern char *msfiles[];
        !           116: #endif /* NOMSEND */
        !           117: extern char fspec[];                   /* Most recent filespec */
        !           118: 
        !           119: #ifndef NOCSETS
        !           120: extern int nfilc;
        !           121: extern struct keytab fcstab[];
        !           122: #endif /* NOCSETS */
        !           123: 
        !           124: int rcflag = 0;                                /* Pointer to home directory string */
        !           125: int repars,                            /* Reparse needed */
        !           126:     techo = 0,                         /* Take echo */
        !           127:     terror = 0;                                /* Take error action, 1 = quit */
        !           128: #ifndef NOSCRIPT
        !           129: int secho = 1;
        !           130: #endif /* NOSCRIPT */
        !           131: 
        !           132: #ifndef NOXMIT
        !           133: /* Variables for TRANSMIT command */
        !           134: 
        !           135: int xmitx = 1;                 /* Whether to echo during TRANSMIT */
        !           136: int xmitf = 0;                 /* Character to fill empty lines */
        !           137: int xmitl = 0;                 /* 1 = Send linefeeds too */
        !           138: int xmitp = LF;                        /* Host line prompt */
        !           139: int xmits = 0;                 /* Use shift-in/shift-out, 0 = no */
        !           140: int xmitw = 0;                 /* Milliseconds to pause during xmit */
        !           141: #endif /* NOXMIT */
        !           142: 
        !           143: /* Declarations from ck?fio.c module */
        !           144:  
        !           145: extern char *SPACMD;                   /* Space command, home directory. */
        !           146:  
        !           147: /* Command-oriented items */
        !           148: 
        !           149: #ifdef DCMDBUF
        !           150: extern char *cmdbuf;                   /* Command buffers */
        !           151: extern char *line;                     /* Character buffer for anything */
        !           152: #else
        !           153: extern char cmdbuf[];                  /* Command buffers */
        !           154: extern char line[];                    /* Character buffer for anything */
        !           155: #endif /* DCMDBUF */
        !           156: 
        !           157: char *lp;                              /* Pointer to line buffer */
        !           158: 
        !           159: #ifndef NOSPL
        !           160: extern char inpbuf[];                  /* Buffer for INPUT and REINPUT */
        !           161: char *inpbp = inpbuf;                  /* And pointer to same */
        !           162: extern char lblbuf[];                  /* Buffer for labels */
        !           163: #endif /* NOSPL */
        !           164: 
        !           165: char psave[80] = { NUL };              /* For saving & restoring prompt */
        !           166: 
        !           167: extern char tmpbuf[];                  /* Temporary buffer */
        !           168:  
        !           169: extern int success;                    /* Command success/failure flag */
        !           170: 
        !           171: #ifndef NOSPL
        !           172: int                                    /* SET INPUT parameters. */
        !           173:   indef = 5,                           /* 5 seconds default timeout */
        !           174:   intime = 0,                          /* 0 = proceed */
        !           175:   incase = 0,                          /* 0 = ignore */
        !           176:   inecho = 1;                          /* 1 = echo on */
        !           177:  
        !           178: int maclvl = -1;                       /* Macro nesting level */
        !           179: int mecho = 0;                         /* Macro echo, 0 = don't */
        !           180: int merror = 0;                                /* Macro error action */
        !           181: char varnam[6];                                /* For variable names */
        !           182: extern int macargc[];                  /* ARGC from macro invocation */
        !           183: 
        !           184: extern char *m_arg[MACLEVEL][NARGS];   /* Stack of macro arguments */
        !           185:  
        !           186: extern char **a_ptr[];                 /* Array pointers */
        !           187: extern int a_dim[];                    /* Array dimensions */
        !           188: 
        !           189: #ifdef DCMDBUF
        !           190: extern struct cmdptr *cmdstk;          /* The command stack itself */
        !           191: #else
        !           192: extern struct cmdptr cmdstk[];         /* The command stack itself */
        !           193: #endif /* DCMDBUF */
        !           194: extern int cmdlvl;                     /* Current position in command stack */
        !           195: #endif /* NOSPL */
        !           196: 
        !           197: static int x, y, z = 0;                        /* Local workers */
        !           198: static char *s;
        !           199: 
        !           200: #define xsystem(s) zsyscmd(s)
        !           201: 
        !           202: /* Top-Level Interactive Command Keyword Table */
        !           203:  
        !           204: struct keytab cmdtab[] = {
        !           205: #ifndef NOPUSH
        !           206:     "!",          XXSHE, CM_INV,       /* shell escape */
        !           207: #endif /* NOPUSH */
        !           208:     "#",          XXCOM, CM_INV,       /* comment */
        !           209: #ifndef NOSPL
        !           210:     ":",           XXLBL, CM_INV,      /* label */
        !           211: #endif /* NOSPL */
        !           212: #ifndef NOPUSH
        !           213:     "@",           XXSHE, CM_INV,      /* DCL escape */
        !           214: #endif /* NOPUSH */
        !           215: #ifndef NOSPL
        !           216:     "asg",         XXASS, CM_INV,       /* invisible synonym for assign */
        !           217:     "ask",         XXASK, 0,           /* ask */
        !           218:     "askq",        XXASKQ,0,            /* ask quietly */
        !           219:     "assign",      XXASS, 0,            /* assign */
        !           220: #endif /* NOSPL */
        !           221: #ifndef NOFRILLS
        !           222:     "bug",         XXBUG, 0,           /* bug report instructions */
        !           223: #endif /* NOFRILLS */
        !           224:     "bye",         XXBYE, 0,           /* bye to remote server */
        !           225:     "c",           XXCON, CM_INV|CM_ABR, /* invisible synonym for connect */
        !           226: #ifndef NOFRILLS
        !           227:     "cat",         XXTYP, CM_INV,      /* display a local file */
        !           228: #endif /* NOFRILLS */
        !           229:     "cd",          XXCWD, 0,           /* change directory */
        !           230: #ifndef NOFRILLS
        !           231:     "clear",       XXCLE, 0,           /* clear input buffer */
        !           232: #endif /* NOFRILLS */
        !           233:     "close",      XXCLO, 0,            /* close a log file */
        !           234: #ifdef NOFRILLS
        !           235:     "comment",     XXCOM, CM_INV,      /* comment */
        !           236: #else
        !           237:     "comment",     XXCOM, 0,           /* comment */
        !           238: #endif /* NOFRILLS */
        !           239:     "connect",     XXCON, 0,           /* connect to remote system */
        !           240:     "cwd",        XXCWD, CM_INV,       /* invisisble synonym for cd */
        !           241: #ifndef NOSPL
        !           242:     "dcl",         XXDCL, CM_INV,      /* declare an array */
        !           243:     "declare",     XXDCL, 0,           /* declare an array */
        !           244:     "decrement",   XXDEC, 0,           /* decrement a numeric variable */
        !           245:     "define",      XXDEF, 0,           /* define a macro */
        !           246: #endif /* NOSPL */
        !           247: #ifndef NOFRILLS
        !           248:     "delete",      XXDEL, 0,           /* delete a file */
        !           249: #endif /* NOFRILLS */
        !           250: #ifndef NODIAL
        !           251:     "dial",       XXDIAL,0,            /* dial a phone number */
        !           252: #endif /* NODIAL */
        !           253: #ifndef MAC
        !           254:     "directory",   XXDIR, 0,           /* directory of files */
        !           255: #endif /* MAC */
        !           256: #ifndef NOFRILLS
        !           257:     "disable",     XXDIS, 0,           /* disable server function */
        !           258: #endif /* NOFRILLS */
        !           259: #ifndef NOSPL
        !           260:     "do",          XXDO,  0,           /* execute a macro */
        !           261: #endif /* NOSPL */
        !           262:     "echo",        XXECH, 0,           /* echo argument */
        !           263: #ifndef NOSPL
        !           264:     "else",        XXELS, CM_INV,      /* ELSE part of IF statement */
        !           265: #endif /* NOSPL */
        !           266: #ifndef NOFRILLS
        !           267:     "enable",      XXENA, 0,           /* enable a server function */
        !           268: #endif /* NOFRILLS */
        !           269: #ifndef NOSPL
        !           270:     "end",         XXEND, 0,           /* END command file or macro */
        !           271: #endif /* NOSPL */
        !           272: #ifndef NOFRILLS
        !           273: #ifdef COMMENT
        !           274: /* The ERROR command is badly broken.  Uncomment it when it's fixed! */
        !           275:     "error",       XXERR, 0,           /* Send an Error packet */
        !           276: #endif /* COMMENT */
        !           277: #endif /* NOFRILLS */
        !           278:     "exit",       XXEXI, 0,            /* exit the program */
        !           279:     "finish",      XXFIN, 0,           /* FINISH */
        !           280: #ifndef NOSPL
        !           281:     "for",         XXFOR, 0,           /* FOR loop */
        !           282: #endif /* NOSPL */
        !           283: #ifndef NOFRILLS
        !           284: #ifndef MAC
        !           285:     "fot",        XXDIR, CM_INV,       /* "fot" = "dir" (for Chris) */
        !           286: #endif /* MAC */
        !           287: #endif /* NOFRILLS */
        !           288: #ifndef NOSPL
        !           289:     "ge",          XXGET, CM_INV,      /* Abbreviation for GET */
        !           290: #endif /* NOSPL */
        !           291:     "get",         XXGET, 0,           /* GET */
        !           292: #ifndef NOSPL
        !           293: #ifndef NOFRILLS
        !           294:     "getok",       XXGOK, 0,           /* GETOK (ask for Yes/No) */
        !           295: #endif /* NOFRILLS */
        !           296: #endif /* NOSPL */
        !           297: #ifndef NOSPL
        !           298:     "goto",        XXGOTO,0,           /* goto label in take file or macro */
        !           299: #endif /* NOSPL */
        !           300:     "hangup",      XXHAN, 0,           /* hangup dialed phone connection */
        !           301:     "help",       XXHLP, 0,            /* display help text */
        !           302: #ifndef NOSPL
        !           303:     "i",           XXINP, CM_INV|CM_ABR, /* invisible synonym for INPUT */
        !           304:     "if",          XXIF,  0,           /* if (condition) command */
        !           305:     "in",          XXINP, CM_INV|CM_ABR, /* invisible synonym for INPUT */
        !           306:     "increment",   XXINC, 0,           /* increment a numeric variable */
        !           307:     "input",       XXINP, 0,           /* input string from comm line */
        !           308: #endif /* NOSPL */
        !           309: #ifndef NOFRILLS
        !           310:     "l",           XXLOG, CM_INV|CM_ABR,/* invisible synonym for log */
        !           311: #endif /* NOFRILLS */
        !           312:     "log",        XXLOG, 0,            /* open a log file */
        !           313: #ifndef NOFRILLS
        !           314: #ifndef MAC
        !           315:     "ls",          XXDIR, CM_INV,      /* invisible synonym for directory */
        !           316: #endif /* MAC */
        !           317:     "mail",        XXMAI, 0,           /* mail file to user */
        !           318:     "man",         XXHLP, CM_INV,       /* Synonym for help */
        !           319: #endif /* NOFRILLS */
        !           320: #ifndef NOMSEND
        !           321:     "mget",        XXGET, CM_INV,      /* MGET = GET */
        !           322:     "msend",       XXMSE, 0,           /* Multiple SEND */
        !           323:     "mput",        XXMSE, CM_INV,      /* MPUT = MSEND */
        !           324: #endif /* NOMSEND */
        !           325: #ifndef NOFRILLS
        !           326:     "mv",          XXREN, CM_INV,      /* rename a local file */
        !           327: #endif /* NOFRILLS */
        !           328: #ifndef NOSPL
        !           329:     "o",           XXOUT, CM_INV|CM_ABR,/* invisible synonym for OUTPUT */
        !           330:     "open",        XXOPE, 0,           /* open file for reading or writing */
        !           331:     "output",      XXOUT, 0,           /* output string to comm line */
        !           332: #endif /* NOSPL */
        !           333: #ifdef SUNX25
        !           334:     "pad",         XXPAD, 0,            /* PAD commands */
        !           335: #endif /* SUNX25 */
        !           336: #ifndef NOSPL
        !           337:     "pause",       XXPAU, 0,           /* sleep for specified interval */
        !           338:     "pop",         XXEND, CM_INV,      /* allow POP as synonym for END */
        !           339: #endif /* NOSPL */
        !           340: #ifndef NOFRILLS
        !           341:     "print",       XXPRI, 0,           /* PRINT */
        !           342: #ifndef NOPUSH
        !           343:     "pu",          XXSHE, CM_INV,      /* PU = PUSH */
        !           344:     "push",        XXSHE, 0,           /* PUSH command (like RUN, !) */
        !           345: #endif /* NOPUSH */
        !           346:     "put",        XXSEN, CM_INV,       /* PUT = SEND */
        !           347: #ifndef MAC
        !           348:     "pwd",         XXPWD, 0,            /* print working directory */
        !           349: #endif /* MAC */
        !           350: #endif /* NOFRILLS */
        !           351:     "quit",       XXQUI, 0,            /* quit from program = exit */
        !           352:     "r",           XXREC, CM_INV,      /* invisible synonym for receive */
        !           353: #ifndef NOSPL
        !           354:     "read",        XXREA, 0,            /* read */
        !           355: #endif /* NOSPL */
        !           356:     "receive",    XXREC, 0,            /* receive files */
        !           357: #ifndef NODIAL
        !           358:     "redial",      XXRED, 0,           /* redial */
        !           359: #endif /* NODIAL */
        !           360: #ifndef NOSPL
        !           361:     "reinput",     XXREI, 0,            /* reinput */
        !           362: #endif /* NOSPL */
        !           363:     "remote",     XXREM, 0,            /* send generic command to server */
        !           364: #ifndef NOFRILLS
        !           365:     "rename",      XXREN, 0,           /* rename a local file */
        !           366:     "replay",      XXTYP, CM_INV,      /* replay (for now, just type) */
        !           367: #endif /* NOFRILLS */
        !           368: #ifndef NOSPL
        !           369:     "return",      XXRET, 0,           /* return from function */
        !           370: #endif /* NOSPL */
        !           371: #ifndef NOFRILLS
        !           372:     "rm",          XXDEL, CM_INV,      /* invisible synonym for delete */
        !           373: #endif /* NOFRILLS */
        !           374: #ifndef NOPUSH
        !           375:     "run",         XXSHE, 0,           /* run a program or command */
        !           376: #endif /* NOPUSH */
        !           377:     "s",           XXSEN, CM_INV|CM_ABR, /* invisible synonym for send */
        !           378: #ifndef NOSCRIPT
        !           379:     "script",     XXLOGI,0,            /* execute a uucp-style script */
        !           380: #endif /* NOSCRIPT */
        !           381:     "send",       XXSEN, 0,            /* send files */
        !           382: #ifndef NOSERVER
        !           383:     "server",     XXSER, 0,            /* be a server */
        !           384: #endif /* NOSERVER */
        !           385:     "set",        XXSET, 0,            /* set parameters */
        !           386: #ifndef NOSHOW
        !           387:     "show",       XXSHO, 0,            /* show parameters */
        !           388: #endif /* NOSHOW */
        !           389: #ifndef NOSPL
        !           390: #ifndef NOFRILLS
        !           391:     "sleep",       XXPAU, CM_INV,      /* sleep for specified interval */
        !           392: #endif /* NOFRILLS */
        !           393: #endif /* NOSPL */
        !           394: #ifndef MAC
        !           395:     "space",       XXSPA, 0,           /* show available disk space */
        !           396: #endif /* MAC */
        !           397: #ifndef NOFRILLS
        !           398: #ifndef NOPUSH
        !           399:     "spawn",       XXSHE, CM_INV,      /* synonym for PUSH, RUN */
        !           400: #endif /* NOPUSH */
        !           401: #endif /* NOFRILLS */
        !           402:     "statistics",  XXSTA, 0,           /* display file transfer stats */
        !           403: #ifndef NOSPL
        !           404:     "stop",        XXSTO, 0,           /* stop all take files */
        !           405: #endif /* NOSPL */
        !           406: #ifndef NOJC
        !           407:     "suspend",     XXSUS, 0,           /* Suspend */
        !           408: #endif /* NOJC */
        !           409:     "take",       XXTAK, 0,            /* take commands from file */
        !           410: #ifndef NOFRILLS
        !           411: #ifdef NETCONN
        !           412:     "telnet",      XXTEL, 0,           /* telnet */
        !           413: #endif /* NETCONN */
        !           414:     "test",        XXTES, CM_INV,      /* (for testing) */
        !           415: #endif /* NOFRILLS */
        !           416: #ifndef NOCSETS
        !           417:     "translate",   XXXLA, 0,           /* translate local file char sets */
        !           418: #endif
        !           419: #ifndef NOXMIT
        !           420:     "transmit",    XXTRA, 0,           /* raw upload file */
        !           421: #endif /* NOXMIT */
        !           422: #ifndef NOFRILLS
        !           423:     "type",        XXTYP, 0,           /* display a local file */
        !           424: #endif /* NOFRILLS */
        !           425:     "version",     XXVER, 0            /* version number display */
        !           426: #ifndef NOSPL
        !           427: ,   "wait",        XXWAI, 0            /* wait (like pause) */
        !           428: ,   "while",       XXWHI, 0            /* while */
        !           429: #endif /* NOSPL */
        !           430: #ifndef MAC
        !           431: #ifndef NOFRILLS
        !           432: ,   "who",         XXWHO, 0            /* who */
        !           433: #endif /* NOFRILLS */
        !           434: #endif /* MAC */
        !           435: #ifndef NOSPL
        !           436: ,   "write",       XXWRI, 0            /* write */
        !           437: ,   "xif",         XXIFX, 0            /* Extended IF */
        !           438: #endif /* NOSPL */
        !           439: #ifndef NOCSETS
        !           440: ,   "xlate",       XXXLA, CM_INV       /* translate local file char sets */
        !           441: #endif
        !           442: #ifndef NOXMIT
        !           443: ,   "xmit",        XXTRA, CM_INV       /* raw upload file */
        !           444: #endif /* NOXMIT */
        !           445: #ifndef NOJC
        !           446: ,   "z",           XXSUS, CM_INV       /* Suspend */
        !           447: #endif /* NOJC */
        !           448: #ifndef NOSPL
        !           449: ,   "_getargs",    XXGTA, CM_INV        /* used internally by FOR, etc */
        !           450: ,   "_putargs",    XXPTA, CM_INV        /* used internally by FOR, etc */
        !           451: #endif /* NOSPL */
        !           452: };
        !           453: int ncmd = (sizeof(cmdtab) / sizeof(struct keytab));
        !           454: 
        !           455: char toktab[] = {
        !           456: #ifndef NOPUSH
        !           457:     '!',                               /* Shell escape */
        !           458: #endif /* NOPUSH */
        !           459:     '#',                               /* Comment */
        !           460:     ';',                               /* Comment */
        !           461: #ifndef NOSPL
        !           462:     ':',                               /* Label */
        !           463: #endif /* NOSPL */
        !           464: #ifndef NOPUSH
        !           465:     '@',                               /* DCL escape */
        !           466: #endif /* NOPUSH */
        !           467:     '\0'                               /* End of this string */
        !           468: };
        !           469: 
        !           470: #ifndef NOSPL
        !           471: #ifndef NOFRILLS
        !           472: struct keytab yesno[] = {
        !           473:     "no",    0, 0,
        !           474:     "ok",    1, 0,
        !           475:     "yes",   1, 0
        !           476: };
        !           477: int nyesno = (sizeof(yesno) / sizeof(struct keytab));
        !           478: #endif /* NOFRILLS */
        !           479: #endif /* NOSPL */
        !           480: 
        !           481: /* Parameter keyword table */
        !           482:  
        !           483: struct keytab prmtab[] = {
        !           484:     "attributes",       XYATTR,  0,
        !           485:     "background",       XYBACK,  0,
        !           486:     "baud",            XYSPEE,  CM_INV,
        !           487:     "block-check",     XYCHKT,  0,
        !           488: #ifdef DYNAMIC
        !           489:     "buffers",          XYBUF,   0,
        !           490: #endif /* DYNAMIC */
        !           491: #ifndef MAC
        !           492:     "carrier",          XYCARR,  0,
        !           493: #endif /* MAC */
        !           494: #ifndef NOSPL
        !           495:     "case",             XYCASE,  0,
        !           496: #endif /* NOSPL */
        !           497:     "command",          XYCMD,   0,
        !           498: #ifndef NOSPL
        !           499:     "count",            XYCOUN,  0,
        !           500: #endif /* NOSPL */
        !           501: #ifdef DEBUG
        !           502:     "debug",            XYDEBU,  CM_INV,
        !           503: #endif /* DEBUG */
        !           504: #ifdef VMS
        !           505:     "default",          XYDFLT,  0,
        !           506: #else
        !           507: #ifndef MAC
        !           508:     "default",          XYDFLT,  CM_INV,
        !           509: #endif /* MAC */
        !           510: #endif /* VMS */
        !           511:     "delay",           XYDELA,  0,
        !           512: #ifndef NODIAL
        !           513:     "dial",             XYDIAL,  0,
        !           514: #endif /* NODIAL */
        !           515:     "duplex",          XYDUPL,  0,
        !           516:     "escape-character", XYESC,   0,
        !           517:     "file",            XYFILE,  0,
        !           518:     "flow-control",    XYFLOW,  0,
        !           519:     "handshake",       XYHAND,  0,
        !           520: #ifdef NETCONN
        !           521:     "host",             XYHOST,  0,
        !           522: #endif /* NETCONN */
        !           523:     "incomplete",      XYIFD,   0,
        !           524: #ifndef NOSPL
        !           525:     "input",            XYINPU,  0,
        !           526: #ifndef MAC
        !           527: #ifndef NOSETKEY
        !           528:     "key",             XYKEY,   0,
        !           529: #endif /* NOSETKEY */
        !           530: #endif /* MAC */
        !           531: #endif /* NOSPL */
        !           532:     "l",                XYLINE,  CM_INV|CM_ABR,
        !           533: #ifndef NOCSETS
        !           534:     "language",         XYLANG,  0,
        !           535: #endif /* NOCSETS */
        !           536:     "line",             XYLINE,  0,
        !           537:     "local-echo",      XYLCLE,  CM_INV,
        !           538: #ifndef NOSPL
        !           539:     "macro",            XYMACR,  0,
        !           540: #endif /* NOSPL */
        !           541: #ifndef NODIAL
        !           542:     "modem-dialer",    XYMODM,  0,
        !           543: #endif
        !           544: #ifdef NETCONN
        !           545:     "network",          XYNET,   CM_INV,
        !           546: #endif /* NETCONN */
        !           547: #ifdef COMMENT
        !           548:     "packet-length",    XYLEN,   CM_INV, /* moved to send/receive */
        !           549: #endif
        !           550: #ifdef SUNX25
        !           551:     "pad",              XYPAD,   0,
        !           552: #endif /* SUNX25 */
        !           553:     "parity",          XYPARI,  0,
        !           554:     "port",             XYLINE,  CM_INV,
        !           555: #ifndef NOFRILLS
        !           556:     "prompt",          XYPROM,  0,
        !           557: #endif /* NOFRILLS */
        !           558:     "quiet",           XYQUIE,  0,
        !           559:     "receive",          XYRECV,  0,
        !           560:     "retry-limit",      XYRETR,  0,
        !           561: #ifndef NOSCRIPT
        !           562:     "script",          XYSCRI,  0,
        !           563: #endif /* NOSCRIPT */
        !           564:     "send",             XYSEND,  0,
        !           565: #ifndef NOSERVER
        !           566:     "server",           XYSERV,  0,
        !           567: #endif /* NOSERVER */
        !           568: #ifdef UNIX
        !           569:     "session-log",      XYSESS,  0,
        !           570: #endif /* UNIX */
        !           571:     "speed",           XYSPEE,  0,
        !           572: #ifndef NOJC
        !           573:     "suspend",          XYSUSP,  0,
        !           574: #endif /* NOJC */
        !           575:     "take",             XYTAKE,  0,
        !           576:     "terminal",         XYTERM,  0,
        !           577: #ifndef NOCSETS
        !           578:     "transfer",         XYXFER,  0,
        !           579: #endif /* NOCSETS */
        !           580: #ifndef NOXMIT
        !           581:     "transmit",         XYXMIT,  0,
        !           582: #endif /* NOXMIT */
        !           583: #ifndef NOCSETS
        !           584:     "unknown-char-set", XYUNCS,  0,
        !           585: #endif /* NOCSETS */
        !           586:     "window-size",      XYWIND,  0
        !           587: #ifdef UNIX
        !           588: ,   "wildcard-expansion", XYWILD, 0
        !           589: #endif /* UNIX */
        !           590: #ifdef SUNX25
        !           591: ,   "x.25",             XYX25,   0
        !           592: #endif /* SUNX25 */
        !           593: #ifndef NOCSETS
        !           594: ,   "xfer",             XYXFER,  CM_INV
        !           595: #endif /* NOCSETS */
        !           596: #ifndef NOXMIT
        !           597: ,   "xmit",             XYXMIT,  CM_INV
        !           598: #endif /* NOXMIT */
        !           599: };
        !           600: int nprm = (sizeof(prmtab) / sizeof(struct keytab)); /* How many parameters */
        !           601:  
        !           602: /* Table of networks */
        !           603: #ifdef NETCONN
        !           604: struct keytab netcmd[] = {
        !           605: /*  "decnet",        NET_DEC,  0, */
        !           606:     "tcp/ip",        NET_TCPB, 0
        !           607: /*  "stream-tcp-ip", NET_TCPA, 0  */
        !           608: #ifdef SUNX25
        !           609:     ,"x.25",         NET_SX25, 0
        !           610: #endif /* SUNX25 */
        !           611: };
        !           612: int nnets = (sizeof(netcmd) / sizeof(struct keytab)); /* How many networks */
        !           613: #endif /* NETCONN */
        !           614: 
        !           615: /* Remote Command Table */
        !           616:  
        !           617: struct keytab remcmd[] = {
        !           618:     "cd",        XZCWD, 0,
        !           619:     "cwd",       XZCWD, CM_INV,
        !           620:     "delete",    XZDEL, 0,
        !           621:     "directory", XZDIR, 0,
        !           622:     "help",      XZHLP, 0,
        !           623: #ifndef NOPUSH
        !           624:     "host",      XZHOS, 0,
        !           625: #endif /* NOPUSH */
        !           626: #ifndef NOFRILLS
        !           627:     "kermit",    XZKER, 0,
        !           628:     "login",     XZLGI, 0,
        !           629:     "logout",    XZLGO, 0,
        !           630:     "print",     XZPRI, 0,
        !           631: #endif /* NOFRILLS */
        !           632:     "set",       XZSET, 0,
        !           633:     "space",    XZSPA, 0
        !           634: #ifndef NOFRILLS
        !           635: ,   "type",     XZTYP, 0,
        !           636:     "who",      XZWHO, 0
        !           637: #endif /* NOFRILLS */
        !           638: };
        !           639: int nrmt = (sizeof(remcmd) / sizeof(struct keytab));
        !           640:  
        !           641: struct keytab logtab[] = {
        !           642: #ifdef DEBUG
        !           643:     "debugging",    LOGD, 0,
        !           644: #endif /* DEBUG */
        !           645:     "packets",     LOGP, 0,
        !           646:     "session",      LOGS, 0
        !           647: #ifdef TLOG
        !           648: ,   "transactions", LOGT, 0
        !           649: #endif /* TLOG */
        !           650: };
        !           651: int nlog = (sizeof(logtab) / sizeof(struct keytab));
        !           652:  
        !           653: struct keytab writab[] = {
        !           654: #ifndef NOSPL
        !           655:     "append-file",     LOGW, CM_INV,
        !           656: #endif /* NOSPL */
        !           657:     "debug-log",       LOGD, 0,
        !           658: #ifndef NOSPL
        !           659:     "file",            LOGW, 0,
        !           660: #endif /* NOSPL */
        !           661:     "packet-log",      LOGP, 0,
        !           662:     "screen",          LOGX, 0,
        !           663:     "session-log",     LOGS, 0,
        !           664:     "sys$output",      LOGX, CM_INV,
        !           665:     "transaction-log", LOGT, 0
        !           666: };
        !           667: int nwri = (sizeof(writab) / sizeof(struct keytab));
        !           668: 
        !           669: struct keytab clstab[] = {
        !           670: #ifndef NOSPL
        !           671:     "append-file",     LOGW, CM_INV,
        !           672: #endif /* NOSPL */
        !           673: #ifdef DEBUG
        !           674:     "debug-log",       LOGD, 0,
        !           675: #endif /* DEBUG */
        !           676:     "packet-log",      LOGP, 0,
        !           677: #ifndef NOSPL
        !           678:     "read-file",       LOGR, 0,
        !           679: #endif /* NOSPL */
        !           680:     "session-log",     LOGS, 0
        !           681: #ifdef TLOG
        !           682: ,   "transaction-log", LOGT, 0
        !           683: #endif /* TLOG */
        !           684: #ifndef NOSPL
        !           685: ,   "write-file",      LOGW, 0
        !           686: #endif /* NOSPL */
        !           687: };
        !           688: int ncls = (sizeof(clstab) / sizeof(struct keytab));
        !           689: 
        !           690: /* SHOW command arguments */
        !           691:  
        !           692: struct keytab shotab[] = {
        !           693: #ifndef NOSPL
        !           694:     "arguments", SHARG, 0,
        !           695:     "arrays", SHARR, 0,
        !           696: #endif /* NOSPL */
        !           697:     "attributes", SHATT, 0,
        !           698:     "communications", SHCOM, 0,
        !           699: #ifndef NOSPL
        !           700:     "count", SHCOU, 0,
        !           701: #endif /* NOSPL */
        !           702: #ifdef VMS
        !           703:     "default", SHDFLT, 0,
        !           704: #else
        !           705:     "default", SHDFLT, CM_INV,
        !           706: #endif /* VMS */
        !           707: #ifndef NODIAL
        !           708:     "dial", SHDIA, 0,
        !           709: #endif /* NODIAL */
        !           710:     "escape", SHESC, 0,
        !           711:     "file", SHFIL, 0,
        !           712: #ifndef NOSPL
        !           713:     "functions", SHFUN, 0,
        !           714:     "globals", SHVAR, 0,
        !           715: #endif /* NOSPL */
        !           716: #ifndef NOSETKEY
        !           717:     "key", SHKEY, 0,
        !           718: #endif /* NOSETKEY */
        !           719: #ifdef VMS
        !           720:     "labeled-file-info", SHLBL, 0,
        !           721: #endif /* VMS */
        !           722: #ifndef NOCSETS
        !           723:     "languages", SHLNG, 0,
        !           724: #endif /* NOCSETS */
        !           725: #ifndef NOSPL
        !           726:     "macros", SHMAC, 0,
        !           727: #endif /* NOSPL */
        !           728:     "modem", SHMOD, 0,
        !           729: #ifdef NETCONN
        !           730:     "network", SHNET, 0,
        !           731: #ifdef SUNX25
        !           732:     "pad", SHPAD, 0,
        !           733: #endif /* SUNX25 */
        !           734: #endif /* NETCONN */
        !           735:     "parameters", SHPAR, CM_INV,
        !           736:     "protocol", SHPRO, 0,
        !           737: #ifndef NOSPL
        !           738:     "scripts", SHSCR, 0,
        !           739: #endif /* NOSPL */
        !           740: #ifndef NOSERVER
        !           741:     "server", SHSER, 0,
        !           742: #endif /* NOSERVER */
        !           743:     "status", SHSTA, 0,
        !           744: #ifdef MAC
        !           745:     "stack", SHSTK, 0,                 /* debugging */
        !           746: #endif /* MAC */
        !           747:     "terminal", SHTER, 0
        !           748: #ifndef NOXMIT
        !           749: ,   "transmit", SHXMI, 0
        !           750: #endif /* NOXMIT */
        !           751: #ifndef NOSPL
        !           752: ,   "variables", SHBUI, 0
        !           753: #endif /* NOSPL */
        !           754: #ifndef NOFRILLS
        !           755: ,   "versions", SHVER, 0
        !           756: #endif /* NOFRILLS */
        !           757: #ifndef NOXMIT
        !           758: ,   "xmit", SHXMI, CM_INV
        !           759: #endif /* NOXMIT */
        !           760: };
        !           761: int nsho = (sizeof(shotab) / sizeof(struct keytab));
        !           762: 
        !           763: #ifdef SUNX25
        !           764: struct keytab padtab[] = {              /* PAD commands */
        !           765:     "clear",      XYPADL, 0,
        !           766:     "interrupt",  XYPADI, 0,
        !           767:     "reset",      XYPADR, 0,
        !           768:     "status",     XYPADS, 0
        !           769: };
        !           770: int npadc = (sizeof(padtab) / sizeof(struct keytab));
        !           771: #endif /* SUNX25 */
        !           772: 
        !           773: struct keytab enatab[] = {             /* ENABLE commands */
        !           774:     "all",        EN_ALL,  0,
        !           775:     "bye",        EN_BYE,  0,
        !           776:     "cd",         EN_CWD,  0,
        !           777:     "cwd",        EN_CWD,  CM_INV,
        !           778:     "delete",     EN_DEL,  0,
        !           779:     "directory",  EN_DIR,  0,
        !           780:     "finish",     EN_FIN,  0,
        !           781:     "get",        EN_GET,  0,
        !           782:     "host",       EN_HOS,  0,
        !           783:     "send",       EN_SEN,  0,
        !           784:     "set",        EN_SET,  0,
        !           785:     "space",      EN_SPA,  0,
        !           786:     "type",       EN_TYP,  0,
        !           787:     "who",        EN_WHO,  0
        !           788: };
        !           789: int nena = (sizeof(enatab) / sizeof(struct keytab));
        !           790: 
        !           791: #ifndef NOSPL
        !           792: #ifdef COMMENT
        !           793: struct mtab mactab[MAC_MAX] = {                /* Preinitialized macro table */
        !           794:     NULL, NULL, 0
        !           795: };
        !           796: #else
        !           797: struct mtab *mactab;                   /* Dynamically allocated macro table */
        !           798: #endif /* COMMENT */
        !           799: int nmac = 0;
        !           800: 
        !           801: struct keytab mackey[MAC_MAX];         /* Macro names as command keywords */
        !           802: #endif /* NOSPL */
        !           803: 
        !           804: /* Forward declarations of functions */
        !           805: 
        !           806: _PROTOTYP (int doask,   ( int  ) );
        !           807: _PROTOTYP (int dodef,   ( int  ) );
        !           808: _PROTOTYP (int dodel,   ( void ) );
        !           809: _PROTOTYP (int dodial,  ( int  ) );
        !           810: _PROTOTYP (int dodir,   ( void ) );
        !           811: _PROTOTYP (int doelse,  ( void ) );
        !           812: _PROTOTYP (int dofor,   ( void ) );
        !           813: _PROTOTYP (int dogta,   ( int  ) );
        !           814: _PROTOTYP (int doincr,  ( int  ) );
        !           815: _PROTOTYP (int dopaus,  ( int  ) );
        !           816: _PROTOTYP (int dorenam, ( void ) );
        !           817: 
        !           818: /*  D O C M D  --  Do a command  */
        !           819:  
        !           820: /*
        !           821:  Returns:
        !           822:    -2: user typed an illegal command
        !           823:    -1: reparse needed
        !           824:     0: parse was successful (even tho command may have failed).
        !           825: */ 
        !           826: int
        !           827: docmd(cx) int cx; {
        !           828: 
        !           829:     debug(F101,"docmd entry, cx","",cx);
        !           830: 
        !           831: /*
        !           832:   Massive switch() broken up into many smaller ones, for the benefit of
        !           833:   compilers that run out of space when trying to handle large switch
        !           834:   statements.
        !           835: */
        !           836:     switch (cx) {
        !           837:       case -4:                 /* EOF */
        !           838: #ifdef OSK
        !           839:        if (!quiet && pflag)  printf("\n");
        !           840: #else
        !           841:        if (!quiet && pflag)  printf("\r\n");
        !           842: #endif /* OSK */
        !           843:          doexit(GOOD_EXIT,xitsta);
        !           844:       case -3:                         /* Null command */
        !           845:        return(0);
        !           846:       case -9:                         /* Like -2, but errmsg already done */
        !           847:       case -6:                         /* Special */
        !           848:       case -2:                         /* Error, maybe */
        !           849:       case -1:                         /* Reparse needed */
        !           850:        return(cx);
        !           851:       default:
        !           852:        break;
        !           853:     }
        !           854:  
        !           855: /* And later, even the smaller ones were removed, so now we just have ifs. */
        !           856: /* (And even later, many of these were moved to separate modules...) */
        !           857: 
        !           858: #ifndef NOSPL
        !           859: /* Copy macro args from/to two levels up, used internally by _floop et al. */
        !           860:     if (cx == XXGTA || cx == XXPTA) {  /* _GETARGS, _PUTARGS */
        !           861:        int x;
        !           862:        debug(F101,"docmd XXGTA","",XXGTA);
        !           863:        debug(F101,"docmd cx","",cx);
        !           864:        debug(F101,"docmd XXGTA maclvl","",maclvl);
        !           865:        x = dogta(cx);
        !           866:        debug(F101,"docmd dogta returns","",x);
        !           867:        debug(F101,"docmd dogta maclvl","",maclvl);
        !           868:        return(x);
        !           869:     }
        !           870: #endif /* NOSPL */
        !           871: 
        !           872: #ifndef NOSPL
        !           873: /* ASK, ASKQ, READ */
        !           874:     if (cx == XXASK || cx == XXASKQ || cx == XXREA) {
        !           875:        return(doask(cx));
        !           876:     }
        !           877: #endif /* NOSPL */
        !           878: 
        !           879: #ifndef NOFRILLS
        !           880:     if (cx == XXBUG) {                 /* BUG */
        !           881:        if ((x = cmcfm()) < 0) return(x);
        !           882:        return(dobug());
        !           883:     }
        !           884: #endif /* NOFRILLS */
        !           885: 
        !           886:     if (cx == XXBYE) {                 /* BYE */
        !           887:        if ((x = cmcfm()) < 0) return(x);
        !           888:        sstate = setgen('L',"","","");
        !           889:        if (local) ttflui();            /* If local, flush tty input buffer */
        !           890:        return(0);
        !           891:     } 
        !           892: 
        !           893: #ifndef NOFRILLS
        !           894:     if (cx == XXCLE) {                 /* CLEAR */
        !           895:        if ((x = cmcfm()) < 0) return(x);
        !           896:        y = ttflui();                   /* Flush input buffer */
        !           897: #ifndef NOSPL
        !           898:        for (x = 0; x < INPBUFSIZ; x++) /* and our local copy too */
        !           899:          inpbuf[x] = 0;
        !           900:        inpbp = inpbuf;
        !           901: #endif /* NOSPL */
        !           902:        success = (y == 0);             /* Set SUCCESS/FAILURE */
        !           903:        return(success);
        !           904:     }
        !           905: #endif /* NOFRILLS */
        !           906: 
        !           907:     if (cx == XXCOM) {                 /* COMMENT */
        !           908:        if ((x = cmtxt("Text of comment line","",&s,NULL)) < 0)
        !           909:          return(x);
        !           910:        /* Don't change SUCCESS flag for this one */
        !           911:        return(0);
        !           912:     } 
        !           913: 
        !           914:     if (cx == XXCON) {                 /* CONNECT */
        !           915:        if ((x = cmcfm()) < 0)
        !           916:          return(x);
        !           917:        return(success = doconect());
        !           918:     }
        !           919: 
        !           920:     if (cx == XXCWD)                   /* CWD */
        !           921:       return(success = docd());
        !           922: 
        !           923:     if (cx == XXCLO) {                 /* CLOSE */
        !           924:        x = cmkey(clstab,ncls,"Which log or file to close","",xxstring);
        !           925:        if (x == -3) {
        !           926:            printf("?You must tell which file or log\n");
        !           927:            return(-9);
        !           928:        }
        !           929:        if (x < 0) return(x);
        !           930:        if ((y = cmcfm()) < 0) return(y);
        !           931:        y = doclslog(x);
        !           932:        success = (y == 1);
        !           933:        return(success);
        !           934:     }
        !           935: 
        !           936: #ifndef NOSPL
        !           937:     if (cx == XXDEC || cx == XXINC)    /* DECREMENT, INCREMENT */
        !           938:       return(doincr(cx));
        !           939: #endif /* NOSPL */
        !           940: 
        !           941: #ifndef NOSPL
        !           942:     if (cx == XXDEF || cx == XXASS)    /* DEFINE, ASSIGN */
        !           943:       return(dodef(cx));
        !           944: #endif /* NOSPL */
        !           945: 
        !           946: #ifndef NOSPL    
        !           947:     if (cx == XXDCL) {                 /* DECLARE an array */
        !           948:        if ((y = cmfld("Array name","",&s,NULL)) < 0) {
        !           949:            if (y == -3) {
        !           950:                printf("?Array name required\n");
        !           951:                return(-9);
        !           952:            } else return(y);
        !           953:        }
        !           954:        if ((y = arraynam(s,&x,&z)) < 0) return(y);
        !           955:        if ((y = cmcfm()) < 0) return(y);
        !           956:        if (dclarray((char)x,z) < 0) {
        !           957:            printf("?Declare failed\n");
        !           958:            return(success = 0);
        !           959:        }
        !           960:        return(success = 1);
        !           961:     }
        !           962: #endif /* NOSPL */
        !           963: 
        !           964: 
        !           965: #ifndef NODIAL
        !           966:     if (cx == XXRED || cx == XXDIAL)   /* DIAL or REDIAL */
        !           967:       return(dodial(cx));
        !           968: #endif /* NODIAL */
        !           969:  
        !           970: #ifndef NOFRILLS
        !           971:     if (cx == XXDEL)                   /* DELETE */
        !           972:       return(dodel());
        !           973: #endif /* NOFRILLS */
        !           974: 
        !           975: #ifndef MAC
        !           976:     if (cx == XXDIR)                   /* DIRECTORY */
        !           977:       return(dodir());
        !           978: #endif /* MAC */
        !           979:  
        !           980: #ifndef NOSPL
        !           981:     if (cx == XXELS)                   /* ELSE */
        !           982:       return(doelse());
        !           983: #endif /* NOSPL */
        !           984: 
        !           985: #ifndef NOFRILLS
        !           986:     if (cx == XXENA || cx == XXDIS) {  /* ENABLE, DISABLE */
        !           987:        s = (cx == XXENA) ?
        !           988:          "Server function to enable" :
        !           989:            "Server function to disable";
        !           990: 
        !           991:        if ((x = cmkey(enatab,nena,s,"",xxstring)) < 0) {
        !           992:            if (x == -3) {
        !           993:                printf("?Name of server function required\n");
        !           994:                return(-9);
        !           995:            } else return(x);
        !           996:        }
        !           997:        if ((y = cmcfm()) < 0) return(y);
        !           998:        return(doenable(cx,x));
        !           999:     }
        !          1000: #endif /* NOFRILLS */
        !          1001: 
        !          1002: #ifndef NOSPL
        !          1003:     if (cx == XXEND) {                 /* END, POP (same thing) */
        !          1004:        if ((y = cmnum("exit status code","0",10,&x,xxstring)) < 0)
        !          1005:          return(y);
        !          1006:        if (cmdlvl == 0) {              /* At top level, nothing happens... */
        !          1007:            if ((y = cmcfm()) < 0)
        !          1008:              return(y);
        !          1009:            return(success = (x == 0));
        !          1010:        }
        !          1011:        popclvl();
        !          1012:        return(success = (x == 0));
        !          1013:     }
        !          1014: #endif /* NOSPL */
        !          1015: 
        !          1016: #ifndef NOSPL
        !          1017:     if (cx == XXRET) {                 /* RETURN */
        !          1018:        if (cmdlvl == 0) {              /* At top level, nothing happens... */
        !          1019:            if ((x = cmcfm()) < 0)
        !          1020:              return(x);
        !          1021:            return(success = 1);
        !          1022:        } else if (cmdstk[cmdlvl].src == CMD_TF) { /* In TAKE file, like POP */
        !          1023:            if ((x = cmtxt("optional return value","",&s,NULL)) < 0)
        !          1024:              return(x);                /* Allow trailing text, but ignore. */
        !          1025:            if ((x = cmcfm()) < 0)
        !          1026:              return(x);
        !          1027:            popclvl();                  /* pop command level */
        !          1028:            return(success = 1);        /* always succeeds */
        !          1029:        } else if (cmdstk[cmdlvl].src == CMD_MD) { /* Within macro */  
        !          1030:            if ((x = cmtxt("optional return value","",&s,NULL)) < 0)
        !          1031:              return(x);
        !          1032:            return(doreturn(s));        /* Trailing text is return value. */
        !          1033:        } else return(-2);
        !          1034:     }
        !          1035: #endif /* NOSPL */
        !          1036: 
        !          1037: #ifndef NOSPL
        !          1038:     if (cx == XXDO) {                  /* DO (a macro) */
        !          1039:        if (nmac == 0) {
        !          1040:            printf("\n?No macros defined\n");
        !          1041:            return(-2);
        !          1042:        }
        !          1043:        for (y = 0; y < nmac; y++) {    /* copy the macro table */
        !          1044:            mackey[y].kwd = mactab[y].kwd; /* into a regular keyword table */
        !          1045:            mackey[y].kwval = y;        /* with value = pointer to macro tbl */
        !          1046:            mackey[y].flgs = mactab[y].flgs;
        !          1047:        }
        !          1048:        /* parse name as keyword */
        !          1049:        if ((x = cmkey(mackey,nmac,"macro","",xxstring)) < 0) {
        !          1050:            if (x == -3) {
        !          1051:                printf("?Macro name required\n");
        !          1052:                return(-9);
        !          1053:            } else return(x);
        !          1054:        }
        !          1055:        if ((y = cmtxt("optional arguments","",&s,xxstring)) < 0)
        !          1056:          return(y);                    /* get args */
        !          1057:        return(success = dodo(x,s));
        !          1058:     }
        !          1059: #endif /* NOSPL */
        !          1060: 
        !          1061:     if (cx == XXECH) {                 /* ECHO */
        !          1062:        if ((x = cmtxt("Material to be echoed","",&s,xxstring)) < 0)
        !          1063:          return(x);
        !          1064:        printf("%s\n",s);
        !          1065:        return(1);                      /* Always succeeds */
        !          1066:     }
        !          1067: 
        !          1068: #ifndef NOSPL
        !          1069:     if (cx == XXOPE)                   /* OPEN */
        !          1070:       return(doopen());
        !          1071: #endif /* NOSPL */
        !          1072: 
        !          1073: #ifndef NOSPL
        !          1074:     if (cx == XXOUT) {                 /* OUTPUT */
        !          1075:        if ((x = cmtxt("Text to be output","",&s,xxstring)) < 0)
        !          1076:          return(x);
        !          1077:        if (*s == '{') {
        !          1078:            x = (int)strlen(s);
        !          1079:            if (s[x-1] == '}') {
        !          1080:                s[x-1] = NUL;
        !          1081:                s++;
        !          1082:            }
        !          1083:        }
        !          1084:        return(success = dooutput(s));
        !          1085:     }
        !          1086: #endif /* NOSPL */
        !          1087: 
        !          1088: #ifdef SUNX25
        !          1089:     if (cx == XXPAD) {                 /* PAD commands */
        !          1090:        x = cmkey(padtab,npadc,"PAD command","",xxstring);
        !          1091:        if (x == -3) {
        !          1092:            printf("?You must specify a PAD command to execute\n");
        !          1093:            return(-2);
        !          1094:        }
        !          1095:        if (x < 0) return(x);
        !          1096:     
        !          1097:        switch (x) {
        !          1098:          case XYPADL: 
        !          1099:            if (x25stat() < 0)
        !          1100:              printf("Sorry, you must 'set network' & 'set host' first\r\n");
        !          1101:            else {
        !          1102:                x25clear();
        !          1103:                initpad();
        !          1104:            }
        !          1105:            break;
        !          1106:          case XYPADS:
        !          1107:            if (x25stat() < 0)
        !          1108:              printf("Not connected\r\n");
        !          1109:            else {
        !          1110:                extern int linkid, lcn;
        !          1111:                conol("Connected thru ");
        !          1112:                conol(ttname);
        !          1113:                printf(", Link id %d, Logical channel number %d\r\n",
        !          1114:                       linkid,lcn);
        !          1115:            }
        !          1116:            break;
        !          1117:          case XYPADR:
        !          1118:            if (x25stat() < 0)
        !          1119:              printf("Sorry, you must 'set network' & 'set host' first\r\n");
        !          1120:            else
        !          1121:              x25reset(0,0);
        !          1122:            break;
        !          1123:          case XYPADI:
        !          1124:            if (x25stat() < 0)
        !          1125:              printf("Sorry, you must 'set network' & 'set host' first\r\n");
        !          1126:            else 
        !          1127:              x25intr(0);
        !          1128:        }
        !          1129:        return(0);
        !          1130: }
        !          1131: #endif /* SUNX25 */
        !          1132: 
        !          1133: #ifndef NOSPL
        !          1134:     if (cx == XXPAU || cx == XXWAI) {  /* PAUSE, WAIT */
        !          1135:        return(dopaus(cx));
        !          1136:     }
        !          1137: #endif /* NOSPL */
        !          1138: 
        !          1139: #ifndef NOFRILLS
        !          1140:     if (cx == XXPRI) {
        !          1141:        if ((x = cmifi("File to print","",&s,&y,xxstring)) < 0) {
        !          1142:            if (x == -3) {
        !          1143:                printf("?A file specification is required\n");
        !          1144:                return(-9);
        !          1145:            } else return(x);
        !          1146:        }
        !          1147:        if (y != 0) {
        !          1148:            printf("?Wildcards not allowed\n");
        !          1149:            return(-9);
        !          1150:        }
        !          1151:        strcpy(line,s);
        !          1152:        if ((x = cmtxt("Local print command options, or carriage return","",&s,
        !          1153:                       xxstring)) < 0) return(x);
        !          1154:        return(success = (zprint(s,line) == 0) ? 1 : 0);
        !          1155:     }
        !          1156: 
        !          1157: #ifndef MAC
        !          1158:     if (cx == XXPWD) {                 /* PWD */
        !          1159:        if ((x = cmcfm()) < 0) return(x);
        !          1160:        xsystem(PWDCMD);
        !          1161:        return(success = 1);            /* blind faith */
        !          1162:     }
        !          1163: #endif /* MAC */
        !          1164: #endif /* NOFRILLS */
        !          1165: 
        !          1166:     if (cx == XXQUI || cx == XXEXI) {  /* EXIT, QUIT */
        !          1167:        if ((y = cmnum("exit status code","",10,&x,xxstring)) < 0) {
        !          1168:            if (y == -3)
        !          1169:              x = xitsta;
        !          1170:            else return(y);
        !          1171:        }
        !          1172:        if ((y = cmcfm()) < 0) return(y);
        !          1173: #ifdef VMS
        !          1174:        doexit(GOOD_EXIT,x);
        !          1175: #else
        !          1176: #ifdef OSK
        !          1177: /* Returning any codes here makes the OS-9 shell print an error message. */
        !          1178:        doexit(GOOD_EXIT,-1);
        !          1179: #else
        !          1180:        doexit(x,-1);
        !          1181: #endif /* OSK */
        !          1182: #endif /* VMS */
        !          1183:     }
        !          1184: 
        !          1185: #ifdef COMMENT                         /* DOESN'T WORK! */
        !          1186: #ifndef NOFRILLS
        !          1187:     if (cx == XXERR) {                 /* ERROR */
        !          1188:        if ((x = cmcfm()) < 0) return(x);
        !          1189:        ttflui();
        !          1190:        sstate = 'a';
        !          1191:        return(0);
        !          1192:     }
        !          1193: #endif /* NOFRILLS */
        !          1194: #endif /* COMMENT */
        !          1195: 
        !          1196:     if (cx == XXFIN) {                 /* FINISH */
        !          1197:        if ((x = cmcfm()) < 0) return(x);
        !          1198:        sstate = setgen('F',"","","");
        !          1199:        if (local) ttflui();            /* If local, flush tty input buffer */
        !          1200:        return(0);
        !          1201:     }
        !          1202: 
        !          1203: #ifndef NOSPL
        !          1204:     if (cx == XXFOR)                   /* FOR loop */
        !          1205:       return(dofor());
        !          1206: #endif /* NOSPL */
        !          1207: 
        !          1208:     if (cx == XXGET) {                 /* GET */
        !          1209:        x = cmtxt("Name of remote file(s), or carriage return","",&cmarg,
        !          1210:                  xxstring);
        !          1211: #ifndef NOFRILLS
        !          1212:        if ((x == -2) || (x == -1)) return(x);
        !          1213: #else
        !          1214:        if (x < 0) return(x);
        !          1215: #endif /* NOFRILLS */
        !          1216:        x = doget();
        !          1217: #ifdef MAC
        !          1218:        if (sstate == 'r')
        !          1219:            scrcreate();
        !          1220: #endif /* MAC */
        !          1221:        return(x);
        !          1222:     }
        !          1223: 
        !          1224: #ifndef NOSPL
        !          1225: #ifndef NOFRILLS
        !          1226:     if (cx == XXGOK) {                 /* GETOK */
        !          1227:        return(success = doask(cx));
        !          1228:     }
        !          1229: #endif /* NOFRILLS */
        !          1230: #endif /* NOSPL */
        !          1231: 
        !          1232:     if (cx == XXHLP) {                 /* HELP */
        !          1233: #ifdef NOHELP
        !          1234:        return(dohlp(XXHLP));        
        !          1235: #else
        !          1236:        x = cmkey2(cmdtab,ncmd,"C-Kermit command","help",toktab,xxstring);
        !          1237:        if (x == -5) {
        !          1238:            y = chktok(toktab);
        !          1239:            debug(F101,"top-level cmkey token","",y);
        !          1240:            ungword();
        !          1241:            switch (y) {
        !          1242: #ifndef NOPUSH
        !          1243:              case '!': x = XXSHE; break;
        !          1244: #endif /* NOPUSH */
        !          1245:              case '#': x = XXCOM; break;
        !          1246:              case ';': x = XXCOM; break;
        !          1247: #ifndef NOSPL
        !          1248:              case ':': x = XXLBL; break;
        !          1249: #endif /* NOSPL */
        !          1250:              case '&': x = XXECH; break;
        !          1251:              default:
        !          1252:                printf("\n?Invalid - %s\n",cmdbuf);
        !          1253:                x = -2;
        !          1254:            }
        !          1255:        }
        !          1256:        return(dohlp(x));
        !          1257: #endif /* NOHELP */
        !          1258:     }
        !          1259:  
        !          1260:     if (cx == XXHAN) {                 /* HANGUP */
        !          1261:        if ((x = cmcfm()) < 0) return(x);
        !          1262:        success = (tthang() > -1);
        !          1263:        return(success);
        !          1264:     }
        !          1265: 
        !          1266: #ifndef NOSPL
        !          1267:     if (cx == XXGOTO) {                        /* GOTO */
        !          1268: /* Note, here we don't set SUCCESS/FAILURE flag */
        !          1269:        if ((y = cmfld("label","",&s,xxstring)) < 0) {
        !          1270:            if (y == -3) {
        !          1271:                printf("?Label name required\n");
        !          1272:                return(-9);
        !          1273:            } else return(y);
        !          1274:        }
        !          1275:        strcpy(lblbuf,s);
        !          1276:        if ((x = cmcfm()) < 0) return(x);
        !          1277:        s = lblbuf;
        !          1278:        return(dogoto(s));
        !          1279:     }
        !          1280: #endif /* NOSPL */
        !          1281: 
        !          1282: #ifndef NOSPL
        !          1283: /* IF, Extended IF, WHILE */
        !          1284:     if (cx == XXIF || cx == XXIFX || cx == XXWHI) {
        !          1285:        return(doif(cx));
        !          1286:     }
        !          1287: #endif /* NOSPL */
        !          1288: 
        !          1289: #ifndef NOSPL
        !          1290:     if (cx == XXINP || cx == XXREI) {  /* INPUT and REINPUT */
        !          1291:        y = cmnum("seconds to wait for input","1",10,&x,xxstring);
        !          1292:        if (y < 0) {
        !          1293:            return(y);
        !          1294:        }
        !          1295:        if (x <= 0) x = 1;
        !          1296:        if ((y = cmtxt("Material to be input","",&s,xxstring)) < 0)
        !          1297:          return(y);
        !          1298:        if (*s == '\0') {
        !          1299:            printf("?Text required\n");
        !          1300:            return(-9);
        !          1301:        }
        !          1302:        if (*s == '{') {
        !          1303:            y = (int)strlen(s);
        !          1304:            if (s[y-1] == '}') {
        !          1305:                s[y-1] = NUL;
        !          1306:                s++;
        !          1307:            }
        !          1308:        }
        !          1309:        if (cx == XXINP) {              /* INPUT */
        !          1310:            debug(F110,"calling doinput",s,0);
        !          1311:            success = doinput(x,s);     /* Go try to input the search string */
        !          1312:        } else {                        /* REINPUT */
        !          1313:            debug(F110,"xxrei line",s,0);
        !          1314:            success = doreinp(x,s);
        !          1315:        }
        !          1316:        if (intime && !success) {       /* TIMEOUT-ACTION = QUIT? */
        !          1317:            popclvl();                  /* If so, pop command level. */
        !          1318:            if (pflag && cmdlvl == 0) {
        !          1319:                if (cx == XXINP) printf("Input timed out\n");
        !          1320:                if (cx == XXREI) printf("Reinput failed\n");
        !          1321:            }
        !          1322:        }
        !          1323:        return(success);                /* Return do(re)input's return code */
        !          1324:     }
        !          1325: #endif /* NOSPL */
        !          1326: 
        !          1327: #ifndef NOSPL
        !          1328:     if (cx == XXLBL) {                 /* LABEL */
        !          1329:        if ((x = cmfld("label","",&s,xxstring)) < 0) {
        !          1330:            if (x == -3) {
        !          1331:                printf("?Label name required\n");
        !          1332:                return(-9);
        !          1333:            } else return(x);
        !          1334:        }
        !          1335:        if ((x = cmcfm()) < 0) return(x);
        !          1336:        return(0);
        !          1337:     }
        !          1338: #endif /* NOSPL */
        !          1339: 
        !          1340:     if (cx == XXLOG) {                 /* LOG */
        !          1341:        x = cmkey(logtab,nlog,"What to log","",xxstring);
        !          1342:        if (x == -3) {
        !          1343:            printf("?Type of log required\n");
        !          1344:            return(-9);
        !          1345:        }
        !          1346:        if (x < 0) return(x);
        !          1347:        x = dolog(x);
        !          1348:        if (x < 0)
        !          1349:          return(x);
        !          1350:        else
        !          1351:          return(success = x);
        !          1352:     }
        !          1353:  
        !          1354: #ifndef NOSCRIPT
        !          1355:     if (cx == XXLOGI) {                        /* UUCP-style script */
        !          1356:        if ((x = cmtxt("expect-send expect-send ...","",&s,xxstring)) < 0)
        !          1357:          return(x);
        !          1358: #ifdef VMS
        !          1359:        conres();                       /* For Ctrl-C to work... */
        !          1360: #endif /* VMS */
        !          1361:        return(success = dologin(s));   /* Return 1=completed, 0=failed */
        !          1362:     }
        !          1363: #endif /* NOSCRIPT */
        !          1364:  
        !          1365:     if (cx == XXREC) {                 /* RECEIVE */
        !          1366:        cmarg2 = "";
        !          1367:        x = cmofi("Name under which to store the file, or CR","",&cmarg2,
        !          1368:                  xxstring);
        !          1369:        if ((x == -1) || (x == -2)) return(x);
        !          1370:        debug(F111,"cmofi cmarg2",cmarg2,x);
        !          1371:        if ((x = cmcfm()) < 0) return(x);
        !          1372:        sstate = 'v';
        !          1373: #ifdef MAC
        !          1374:        scrcreate();
        !          1375: #endif /* MAC */
        !          1376:        if (local) displa = 1;
        !          1377:        return(0);
        !          1378:     }
        !          1379:  
        !          1380:     if (cx == XXREM) {                 /* REMOTE */
        !          1381:        x = cmkey(remcmd,nrmt,"Remote Kermit server command","",xxstring);
        !          1382:        if (x == -3) {
        !          1383:            printf("?You must specify a command for the remote server\n");
        !          1384:            return(-9);
        !          1385:        }
        !          1386:        return(dormt(x));
        !          1387:     }
        !          1388: 
        !          1389: #ifndef NOFRILLS
        !          1390:     if (cx == XXREN)                   /* RENAME */
        !          1391:       return(dorenam());
        !          1392: #endif /* NOFRILLS */
        !          1393: 
        !          1394:     if (cx == XXSEN || cx == XXMAI) {  /* SEND, MAIL */
        !          1395:        cmarg = cmarg2 = "";
        !          1396:        if ((x = cmifi("File(s) to send","",&s,&y,xxstring)) < 0) {
        !          1397:            if (x == -3) {
        !          1398:                printf("?A file specification is required\n");
        !          1399:                return(-9);
        !          1400:            } else return(x);
        !          1401:        }
        !          1402:        nfils = -1;                     /* Files come from internal list. */
        !          1403:        strcpy(line,s);                 /* Save copy of string just parsed. */
        !          1404:        strncpy(fspec,s,FSPECL);        /* and here for \v(filespec) */
        !          1405:        if (cx == XXSEN) {              /* SEND command */
        !          1406:            debug(F101,"Send: wild","",y);
        !          1407:            if (y == 0) {
        !          1408:                if ((x = cmtxt("Name to send it with","",&cmarg2,
        !          1409:                               xxstring)) < 0)
        !          1410:                  return(x);
        !          1411:            } else {
        !          1412:                if ((x = cmcfm()) < 0) return(x);
        !          1413:            }
        !          1414:            cmarg = line;               /* File to send */
        !          1415:            debug(F110,"Sending:",cmarg,0);
        !          1416:            if (*cmarg2 != '\0') debug(F110," as:",cmarg2,0);
        !          1417:        } else {                        /* MAIL */
        !          1418: #ifndef NOFRILLS
        !          1419:            if (!atdiso || !atcapr) {   /* Disposition attribute off? */
        !          1420:                printf("?Disposition Attribute is Off\n");
        !          1421:                return(-2);
        !          1422:            }
        !          1423:            debug(F101,"Mail: wild","",y);
        !          1424:            *optbuf = NUL;              /* Wipe out any old options */
        !          1425:            if ((x = cmtxt("Address to mail to","",&s,xxstring)) < 0)
        !          1426:              return(x);
        !          1427:            if ((int)strlen(s) == 0) {
        !          1428:                printf("?Address required\n");
        !          1429:                return(-9);
        !          1430:            }
        !          1431:            strcpy(optbuf,s);
        !          1432:            if ((int)strlen(optbuf) > 94) { /* Ensure legal size */
        !          1433:                printf("?Option string too long\n");
        !          1434:                return(-2);
        !          1435:            }
        !          1436:            cmarg = line;               /* File to send */
        !          1437:            debug(F110,"Mailing:",cmarg,0);
        !          1438:            debug(F110,"To:",optbuf,0);
        !          1439:            rmailf = 1;                 /* MAIL modifier flag for SEND */
        !          1440: #else
        !          1441:            printf("?Sorry, MAIL feature not configured.\n");
        !          1442:            return(-2);
        !          1443: #endif /* NOFRILLS */
        !          1444:        }
        !          1445:        sstate = 's';                   /* Set start state to SEND */
        !          1446: #ifdef MAC
        !          1447:        scrcreate();
        !          1448: #endif /* MAC */
        !          1449:        if (local) {                    /* If in local mode, */
        !          1450:            displa = 1;                 /* turn on file transfer display */
        !          1451:            ttflui();                   /* and flush tty input buffer. */
        !          1452:        }
        !          1453:        return(0);
        !          1454:     }
        !          1455:  
        !          1456: #ifndef NOMSEND
        !          1457:     if (cx == XXMSE) {                 /* MSEND command */
        !          1458:        nfils = 0;                      /* Like getting a list of */
        !          1459:        lp = line;                      /* files on the command line */
        !          1460:        while (1) {
        !          1461:            char *p;
        !          1462:            if ((x = cmifi("Names of files to send, separated by spaces","",
        !          1463:                           &s,&y,xxstring)) < 0) {
        !          1464:                if (x == -3) {
        !          1465:                    if (nfils <= 0) {
        !          1466:                        printf("?A file specification is required\n");
        !          1467:                        return(-9);
        !          1468:                    } else break;
        !          1469:                }
        !          1470:                return(x);
        !          1471:            }
        !          1472:            msfiles[nfils++] = lp;      /* Got one, count it, point to it, */
        !          1473:            p = lp;                     /* remember pointer, */
        !          1474:            while (*lp++ = *s++) ;      /* and copy it into buffer */
        !          1475:            if (nfils == 1) *fspec = NUL; /* Take care of \v(filespec) */
        !          1476:            if (((int)strlen(fspec) + (int)strlen(p) + 1) < FSPECL) {
        !          1477:                strcat(fspec,p);
        !          1478:                strcat(fspec," ");
        !          1479:            }
        !          1480:        }
        !          1481:        cmlist = msfiles;               /* Point cmlist to pointer array */
        !          1482:        cmarg2 = "";                    /* No internal expansion list (yet) */
        !          1483:        sndsrc = nfils;                 /* Filenames come from cmlist */
        !          1484:        sstate = 's';                   /* Set start state to SEND */
        !          1485: #ifdef MAC
        !          1486:        scrcreate();
        !          1487: #endif /* MAC */
        !          1488:        if (local) {                    /* If in local mode, */
        !          1489:            displa = 1;                 /* turn on file transfer display */
        !          1490:            ttflui();                   /* and flush tty input buffer. */
        !          1491:        }
        !          1492:        return(0);
        !          1493:     }
        !          1494: #endif /* NOMSEND */
        !          1495: 
        !          1496: #ifndef NOSERVER
        !          1497:     if (cx == XXSER) {                 /* SERVER */
        !          1498:        if ((x = cmcfm()) < 0) return(x);
        !          1499:        sstate = 'x';
        !          1500: #ifdef MAC
        !          1501:        scrcreate();
        !          1502: #endif /* MAC */
        !          1503:        if (local) displa = 1;
        !          1504: #ifdef AMIGA
        !          1505:        reqoff();                       /* No DOS requestors while server */
        !          1506: #endif /* AMIGA */
        !          1507:     return(0);
        !          1508:     }
        !          1509: #endif /* NOSERVER */
        !          1510: 
        !          1511:     if (cx == XXSET) {                 /* SET command */
        !          1512:        x = cmkey(prmtab,nprm,"Parameter","",xxstring);
        !          1513:        if (x == -3) {
        !          1514:            printf("?You must specify a parameter to set\n");
        !          1515:            return(-9);
        !          1516:        }
        !          1517:        if (x < 0) return(x);
        !          1518:        /* have to set success separately for each item in doprm()... */
        !          1519:        /* actually not really, could have just had doprm return 0 or 1 */
        !          1520:        /* and set success here... */
        !          1521:        y = doprm(x,0);
        !          1522:        if (y == -3) {
        !          1523:            printf("?More fields required\n");
        !          1524:            return(-9);
        !          1525:        } else return(y);
        !          1526:     }
        !          1527: 
        !          1528: #ifndef NOPUSH
        !          1529:     if (cx == XXSHE) {                 /* SHELL (system) command */
        !          1530:        if (cmtxt("System command to execute","",&s,xxstring) < 0)
        !          1531:          return(-1);
        !          1532:        conres();                       /* Make console normal  */
        !          1533:        x = zshcmd(s);
        !          1534:        concb((char)escape);
        !          1535:        return(success = x);
        !          1536:     }
        !          1537: #endif /* NOPUSH */
        !          1538: 
        !          1539: #ifndef NOSHOW
        !          1540:     if (cx == XXSHO) {                 /* SHOW */
        !          1541:        x = cmkey(shotab,nsho,"","parameters",xxstring);
        !          1542:        if (x < 0) return(x);
        !          1543:        return(success = doshow(x));
        !          1544:     }
        !          1545: #endif /* NOSHOW */
        !          1546:  
        !          1547: #ifndef MAC
        !          1548:     if (cx == XXSPA) {                 /* SPACE */
        !          1549: #ifdef datageneral
        !          1550:        /* The DG can take an argument after its "space" command. */
        !          1551:        if ((x = cmtxt("Confirm, or local directory name","",&s,xxstring)) < 0)
        !          1552:          return(x);
        !          1553:        if (*s == NUL) xsystem(SPACMD);
        !          1554:        else {
        !          1555:            char *cp;
        !          1556:            cp = alloc((int)strlen(s) + 7); /* For "space *s" */
        !          1557:            strcpy(cp,"space "), strcat(cp,s);
        !          1558:            xsystem(cp);
        !          1559:            if (cp) free(cp);
        !          1560:        }
        !          1561: #else
        !          1562:        if ((x = cmcfm()) < 0) return(x);
        !          1563:        xsystem(SPACMD);
        !          1564: #endif /* datageneral */
        !          1565:        return(success = 1);            /* pretend it worked */
        !          1566:     }
        !          1567: #endif /* MAC */
        !          1568:  
        !          1569:     if (cx == XXSTA) {                 /* STATISTICS */
        !          1570:        if ((x = cmcfm()) < 0) return(x);
        !          1571:        return(success = dostat());
        !          1572:     }
        !          1573: 
        !          1574: #ifndef NOSPL
        !          1575:     if (cx == XXSTO) {                 /* STOP */
        !          1576: 
        !          1577:        if ((y = cmnum("exit status code","0",10,&x,xxstring)) < 0)
        !          1578:          return(y);
        !          1579:        if ((y = cmcfm()) < 0) return(y);
        !          1580:        dostop();       
        !          1581:        return(success = (x == 0));
        !          1582:     }
        !          1583: #endif /* NOSPL */
        !          1584: 
        !          1585:     if (cx == XXSUS) {                 /* SUSPEND */
        !          1586:        if ((y = cmcfm()) < 0) return(y);
        !          1587:        stptrap(0);
        !          1588:        return(0);
        !          1589:     }
        !          1590: 
        !          1591:     if (cx == XXTAK) {                 /* TAKE */
        !          1592:        if (tlevel > MAXTAKE-1) {
        !          1593:            printf("?Take files nested too deeply\n");
        !          1594:            return(-2);
        !          1595:        }
        !          1596:        if ((y = cmifi("C-Kermit command file","",&s,&x,xxstring)) < 0) { 
        !          1597:            if (y == -3) {
        !          1598:                printf("?A file name is required\n");
        !          1599:                return(-9);
        !          1600:            } else return(y);
        !          1601:        }
        !          1602:        if (x != 0) {
        !          1603:            printf("?Wildcards not allowed in command file name\n");
        !          1604:            return(-9);
        !          1605:        }
        !          1606:        strcpy(line,s);
        !          1607:        if ((y = cmcfm()) < 0) return(y);
        !          1608:        return(success = dotake(line));
        !          1609:     }
        !          1610:  
        !          1611: #ifdef NETCONN
        !          1612:     if (cx == XXTEL) {                 /* TELNET */
        !          1613:        if ((y = setlin(XYHOST,0)) < 0) return(y);
        !          1614:        return (success = (y == 0) ? 0 : doconect());
        !          1615:     }
        !          1616: #endif /* NETCONN */
        !          1617: 
        !          1618: #ifndef NOXMIT
        !          1619:     if (cx == XXTRA) {                 /* TRANSMIT */
        !          1620:        if ((x = cmifi("File to transmit","",&s,&y,xxstring)) < 0) {
        !          1621:            if (x == -3) {
        !          1622:                printf("?Name of an existing file\n");
        !          1623:                return(-9);
        !          1624:            } else return(x);
        !          1625:        }
        !          1626:        if (y != 0) {
        !          1627:            printf("?Only a single file may be transmitted\n");
        !          1628:            return(-2);
        !          1629:        }
        !          1630:        strcpy(line,s);                 /* Save copy of string just parsed. */
        !          1631:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1632:        debug(F111,"calling transmit",line,xmitp);
        !          1633:        return(success = transmit(line,(char)xmitp)); /* Do the command */
        !          1634:     }
        !          1635: #endif /* NOXMIT */
        !          1636: 
        !          1637: #ifndef NOFRILLS
        !          1638:     if (cx == XXTYP) {                 /* TYPE */
        !          1639: #ifndef MAC
        !          1640:        char *tc;
        !          1641: #endif /* MAC */
        !          1642:        if ((x = cmifi("File to type","",&s,&y,xxstring)) < 0) {
        !          1643:            if (x == -3) {
        !          1644:                printf("?Name of an existing file\n");
        !          1645:                return(-9);
        !          1646:            } else return(x);
        !          1647:        }
        !          1648:        if (y != 0) {
        !          1649:            printf("?A single file please\n");
        !          1650:            return(-2);
        !          1651:        }
        !          1652: #ifndef MAC
        !          1653:        if (!(tc = getenv("CK_TYPE"))) tc = TYPCMD;
        !          1654:        sprintf(line,"%s %s",tc,s);
        !          1655:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1656:        xsystem(line);
        !          1657:        return(success = 1);
        !          1658: #else
        !          1659:        strcpy(line,s);
        !          1660:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1661:        return(success = dotype(line));
        !          1662: #endif /* MAC */
        !          1663:     }
        !          1664: #endif /* NOFRILLS */
        !          1665: 
        !          1666: #ifndef NOFRILLS
        !          1667:     if (cx == XXTES) {                 /* TEST */
        !          1668:        /* Fill this in with whatever is being tested... */
        !          1669:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1670: 
        !          1671: #ifndef NOSPL
        !          1672: #ifdef COMMENT
        !          1673:        { int d, i, j;                  /* Dump all arrays */
        !          1674:          char c, **p;
        !          1675:          for (i = 0; i < 27; i++) {
        !          1676:              p = a_ptr[i];
        !          1677:              d = a_dim[i];
        !          1678:              c = (i == 0) ? 64 : i + 96;
        !          1679:              if (d && p) {
        !          1680:                  fprintf(stderr,"&%c[%d]\n",c,d);
        !          1681:                  for (j = 0; j <= d; j++) {
        !          1682:                      if (p[j]) {
        !          1683:                          fprintf(stderr,"  &%c[%2d] = [%s]\n",c,j,p[j]);
        !          1684:                      }
        !          1685:                  }       
        !          1686:              }
        !          1687:          }
        !          1688:       }
        !          1689: #else /* Not COMMENT */
        !          1690:        printf("cmdlvl = %d, tlevel = %d, maclvl = %d\n",cmdlvl,tlevel,maclvl);
        !          1691:        if (maclvl < 0) {
        !          1692:            printf("%s\n",
        !          1693:             "Call me from inside a macro and I'll dump the argument stack");
        !          1694:            return(0);
        !          1695:        }
        !          1696:        printf("Macro level: %d, ARGC = %d\n     ",maclvl,macargc[maclvl]);
        !          1697:        for (y = 0; y < 10; y++) printf("%7d",y);
        !          1698:        for (x = 0; x <= maclvl; x++) {
        !          1699:            printf("\n%2d:  ",x);
        !          1700:            for (y = 0; y < 10; y++) {
        !          1701:                s = m_arg[x][y];
        !          1702:                printf("%7s",s ? s : "(none)");
        !          1703:            }
        !          1704:        }
        !          1705:        printf("\n");
        !          1706: #endif /* COMMENT */
        !          1707: #endif /* NOSPL */
        !          1708:        return(0);
        !          1709:     }
        !          1710: #endif /* NOFRILLS */
        !          1711: 
        !          1712: #ifndef NOCSETS
        !          1713:     if (cx == XXXLA) {    /* TRANSLATE <ifn> from-cs to-cs <ofn> */
        !          1714:        int incs, outcs;
        !          1715:        if ((x = cmifi("File to translate","",&s,&y,xxstring)) < 0) {
        !          1716:            if (x == -3) {
        !          1717:                printf("?Name of an existing file\n");
        !          1718:                return(-9);
        !          1719:            } else return(x);
        !          1720:        }
        !          1721:        if (y != 0) {
        !          1722:            printf("?A single file please\n");
        !          1723:            return(-2);
        !          1724:        }
        !          1725:        strcpy(line,s);                 /* Save copy of string just parsed. */
        !          1726: 
        !          1727:        if ((incs = cmkey(fcstab,nfilc,"from character-set","",xxstring)) < 0)
        !          1728:          return(incs);
        !          1729:        if ((outcs = cmkey(fcstab,nfilc,"to character-set","",xxstring)) < 0)
        !          1730:          return(outcs);
        !          1731:        if ((x = cmofi("output file",CTTNAM,&s,xxstring)) < 0) return(x);
        !          1732:        strncpy(tmpbuf,s,50);
        !          1733:        if ((y = cmcfm()) < 0) return(y); /* Confirm the command */
        !          1734:        return(success = xlate(line,tmpbuf,incs,outcs)); /* Execute it */
        !          1735:     }
        !          1736: #endif /* NOCSETS */
        !          1737: 
        !          1738:     if (cx == XXVER) {                 /* VERSION */
        !          1739:        if ((y = cmcfm()) < 0) return(y);
        !          1740:        printf("%s,%s\n Numeric: %ld",versio,ckxsys,vernum);
        !          1741:        if (verwho) printf("-%d\n",verwho); else printf("\n");
        !          1742:        return(success = 1);
        !          1743:     }
        !          1744: 
        !          1745: #ifndef MAC
        !          1746: #ifndef NOFRILLS
        !          1747:     if (cx == XXWHO) {                 /* WHO */
        !          1748:        char *wc;
        !          1749:        if ((y = cmtxt("user name","",&s,xxstring)) < 0) return(y);
        !          1750:        if (!(wc = getenv("CK_WHO"))) wc = WHOCMD;
        !          1751:        sprintf(line,"%s %s",wc,s);
        !          1752:        xsystem(line);
        !          1753:        return(success = 1);
        !          1754:     }
        !          1755: #endif /* NOFRILLS */
        !          1756: #endif /* MAC */
        !          1757: 
        !          1758: #ifndef NOFRILLS
        !          1759:     if (cx == XXWRI) {                 /* WRITE */
        !          1760:        if ((x = cmkey(writab,nwri,"to file or log","",xxstring)) < 0) {
        !          1761:            if (x == -3) printf("?Write to what?\n");
        !          1762:            return(x);
        !          1763:        }
        !          1764:        if ((y = cmtxt("text","",&s,xxstring)) < 0) return(y);
        !          1765:        switch (x) {
        !          1766:          case LOGD: y = ZDFILE; break;
        !          1767:          case LOGP: y = ZPFILE; break;
        !          1768:          case LOGS: y = ZSFILE; break;
        !          1769:          case LOGT: y = ZTFILE; break;
        !          1770: #ifndef NOSPL
        !          1771:          case LOGW: y = ZWFILE; break;
        !          1772: #endif /* NOSPL */
        !          1773:          case LOGX:
        !          1774:            printf("%s",s);
        !          1775: #ifndef NOSPL
        !          1776:            if (cmdlvl == 0) printf("\n");
        !          1777: #else
        !          1778:            if (tlevel == 0) printf("\n");
        !          1779: #endif /* NOSPL */
        !          1780:            return(success = 1);
        !          1781:          default: return(-2);
        !          1782:        }
        !          1783:        if ((x = zsout(y,s)) < 0)
        !          1784:          printf("?File or log not open\n");
        !          1785:        return(success = (x == 0) ? 1 : 0);
        !          1786:     }
        !          1787: #endif /* NOFRILLS */
        !          1788: 
        !          1789:     debug(F101,"docmd unk arg","",cx);
        !          1790:     return(-2);                                /* None of the above. */
        !          1791: } /* end of docmnd() */
        !          1792: 
        !          1793: #endif /* NOICP */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.