# 2.11BSD#431 - /usr/src/ucb/ftp/domacro.c

##### Functions

    domacro           X

       1: /*
       2:  * Copyright (c) 1985 Regents of the University of California.
       3:  * All rights reserved.
       4:  *
       5:  * Redistribution and use in source and binary forms are permitted
       6:  * provided that the above copyright notice and this paragraph are
       7:  * duplicated in all such forms and that any documentation,
       8:  * advertising materials, and other materials related to such
       9:  * distribution and use acknowledge that the software was developed
      10:  * by the University of California, Berkeley.  The name of the
      11:  * University may not be used to endorse or promote products derived
      12:  * from this software without specific prior written permission.
      13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
      14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
      15:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
      16:  */
      17:
      18: #if !defined(lint) && !defined(pdp11)
      19: static char sccsid[] = "@(#)domacro.c	1.6 (Berkeley) 2/28/89";
      20: #endif /* not lint */
      21:
      22: #include "ftp_var.h"
      23:
      24: #include <signal.h>
      25: #include <stdio.h>
      26: #include <errno.h>
      27: #include <ctype.h>
      28: #include <sys/ttychars.h>
      29:
      30: domacro(argc, argv)
      31:     int argc;
      32:     char *argv[];
      33: {
      34:     register int i, j;
      35:     register char *cp1, *cp2;
      36:     int count = 2, loopflg = 0;
      37:     char line2[200];
      38:     extern char **glob(), *globerr;
      39:     struct cmd *getcmd(), *c;
      40:     extern struct cmd cmdtab[];
      41:
      42:     if (argc < 2) {
      43:         (void) strcat(line, " ");
      44:         printf("(macro name) ");
      45:         (void) gets(&line[strlen(line)]);
      46:         makeargv();
      47:         argc = margc;
      48:         argv = margv;
      49:     }
      50:     if (argc < 2) {
      51:         printf("Usage: %s macro_name.\n", argv[0]);
      52:         code = -1;
      53:         return;
      54:     }
      55:     for (i = 0; i < macnum; ++i) {
      56:         if (!strncmp(argv[1], macros[i].mac_name, 9)) {
      57:             break;
      58:         }
      59:     }
      60:     if (i == macnum) {
      61:         printf("'%s' macro not found.\n", argv[1]);
      62:         code = -1;
      63:         return;
      64:     }
      65:     (void) strcpy(line2, line);
      66: TOP:
      67:     cp1 = macros[i].mac_start;
      68:     while (cp1 != macros[i].mac_end) {
      69:         while (isspace(*cp1)) {
      70:             cp1++;
      71:         }
      72:         cp2 = line;
      73:         while (*cp1 != '\0') {
      74:               switch(*cp1) {
      75:                 case '\\':
      76:                  *cp2++ = *++cp1;
      77:                  break;
      78:                 case '$':
      79:                  if (isdigit(*(cp1+1))) {
      80:                     j = 0;
      81:                     while (isdigit(*++cp1)) {
      82:                       j = 10*j +  *cp1 - '0';
      83:                     }
      84:                     cp1--;
      85:                     if (argc - 2 >= j) {
      86:                     (void) strcpy(cp2, argv[j+1]);
      87:                     cp2 += strlen(argv[j+1]);
      88:                     }
      89:                     break;
      90:                  }
      91:                  if (*(cp1+1) == 'i') {
      92:                     loopflg = 1;
      93:                     cp1++;
      94:                     if (count < argc) {
      95:                        (void) strcpy(cp2, argv[count]);
      96:                        cp2 += strlen(argv[count]);
      97:                     }
      98:                     break;
      99:                 }
     100:                 /* intentional drop through */
     101:                 default:
     102:                 *cp2++ = *cp1;
     103:                 break;
     104:               }
     105:               if (*cp1 != '\0') {
     106:              cp1++;
     107:               }
     108:         }
     109:         *cp2 = '\0';
     110:         makeargv();
     111:         c = getcmd(margv[0]);
     112:         if (c == (struct cmd *)-1) {
     113:             printf("?Ambiguous command\n");
     114:             code = -1;
     115:         }
     116:         else if (c == 0) {
     117:             printf("?Invalid command\n");
     118:             code = -1;
     119:         }
     120:         else if (c->c_conn && !connected) {
     121:             printf("Not connected.\n");
     122:             code = -1;
     123:         }
     124:         else {
     125:             if (verbose) {
     126:                 printf("%s\n",line);
     127:             }
     128:             (*c->c_handler)(margc, margv);
     129:             if (bell && c->c_bell) {
     130:                 (void) putchar('\007');
     131:             }
     132:             (void) strcpy(line, line2);
     133:             makeargv();
     134:             argc = margc;
     135:             argv = margv;
     136:         }
     137:         if (cp1 != macros[i].mac_end) {
     138:             cp1++;
     139:         }
     140:     }
     141:     if (loopflg && ++count < argc) {
     142:         goto TOP;
     143:     }
     144: }

#### Defined functions

domacro defined in line 30; used 3 times

- in /usr/src/ucb/ftp/cmdtab.c line 38, 110
- in /usr/src/ucb/ftp/ftp.c line 253

#### Defined variables

sccsid defined in line 19; never used

Last modified: 1989-06-26 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1183 |