1: 
   2: /*
   3:  * Copyright (c) 1985 Regents of the University of California.
   4:  * All rights reserved.  The Berkeley software License Agreement
   5:  * specifies the terms and conditions for redistribution.
   6:  */
   7: 
   8: #ifndef lint
   9: static char sccsid[] = "@(#)domacro.c	1.2 (Berkeley) 3/7/86";
  10: #endif not lint
  11: 
  12: #include "ftp_var.h"
  13: 
  14: #include <signal.h>
  15: #include <stdio.h>
  16: #include <errno.h>
  17: #include <ctype.h>
  18: #include <sys/ttychars.h>
  19: 
  20: domacro(argc, argv)
  21:     int argc;
  22:     char *argv[];
  23: {
  24:     register int i, j;
  25:     register char *cp1, *cp2;
  26:     int count = 2, loopflg = 0;
  27:     char line2[200];
  28:     extern char **glob(), *globerr;
  29:     struct cmd *getcmd(), *c;
  30:     extern struct cmd cmdtab[];
  31: 
  32:     if (argc < 2) {
  33:         (void) strcat(line, " ");
  34:         printf("(macro name) ");
  35:         (void) gets(&line[strlen(line)]);
  36:         makeargv();
  37:         argc = margc;
  38:         argv = margv;
  39:     }
  40:     if (argc < 2) {
  41:         printf("Usage: %s macro_name.\n", argv[0]);
  42:         code = -1;
  43:         return;
  44:     }
  45:     for (i = 0; i < macnum; ++i) {
  46:         if (!strncmp(argv[1], macros[i].mac_name, 9)) {
  47:             break;
  48:         }
  49:     }
  50:     if (i == macnum) {
  51:         printf("'%s' macro not found.\n", argv[1]);
  52:         code = -1;
  53:         return;
  54:     }
  55:     (void) strcpy(line2, line);
  56: TOP:
  57:     cp1 = macros[i].mac_start;
  58:     while (cp1 != macros[i].mac_end) {
  59:         while (isspace(*cp1)) {
  60:             cp1++;
  61:         }
  62:         cp2 = line;
  63:         while (*cp1 != '\0') {
  64:               switch(*cp1) {
  65:                 case '\\':
  66:                  *cp2++ = *++cp1;
  67:                  break;
  68:                 case '$':
  69:                  if (isdigit(*(cp1+1))) {
  70:                     j = 0;
  71:                     while (isdigit(*++cp1)) {
  72:                       j = 10*j +  *cp1 - '0';
  73:                     }
  74:                     cp1--;
  75:                     if (argc - 2 >= j) {
  76:                     (void) strcpy(cp2, argv[j+1]);
  77:                     cp2 += strlen(argv[j+1]);
  78:                     }
  79:                     break;
  80:                  }
  81:                  if (*(cp1+1) == 'i') {
  82:                     loopflg = 1;
  83:                     cp1++;
  84:                     if (count < argc) {
  85:                        (void) strcpy(cp2, argv[count]);
  86:                        cp2 += strlen(argv[count]);
  87:                     }
  88:                     break;
  89:                 }
  90:                 /* intentional drop through */
  91:                 default:
  92:                 *cp2++ = *cp1;
  93:                 break;
  94:               }
  95:               if (*cp1 != '\0') {
  96:              cp1++;
  97:               }
  98:         }
  99:         *cp2 = '\0';
 100:         makeargv();
 101:         c = getcmd(margv[0]);
 102:         if (c == (struct cmd *)-1) {
 103:             printf("?Ambiguous command\n");
 104:             code = -1;
 105:         }
 106:         else if (c == 0) {
 107:             printf("?Invalid command\n");
 108:             code = -1;
 109:         }
 110:         else if (c->c_conn && !connected) {
 111:             printf("Not connected.\n");
 112:             code = -1;
 113:         }
 114:         else {
 115:             if (verbose) {
 116:                 printf("%s\n",line);
 117:             }
 118:             (*c->c_handler)(margc, margv);
 119:             if (bell && c->c_bell) {
 120:                 (void) putchar(CTRL(g));
 121:             }
 122:             (void) strcpy(line, line2);
 123:             makeargv();
 124:             argc = margc;
 125:             argv = margv;
 126:         }
 127:         if (cp1 != macros[i].mac_end) {
 128:             cp1++;
 129:         }
 130:     }
 131:     if (loopflg && ++count < argc) {
 132:         goto TOP;
 133:     }
 134: }

Defined functions

domacro defined in line 20; used 3 times

Defined variables

sccsid defined in line 9; never used
Last modified: 1986-03-07
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1446
Valid CSS Valid XHTML 1.0 Strict