KNF, ANSI C
[unix-history] / usr / src / usr.bin / ftp / domacro.c
CommitLineData
8ebd1ebf 1/*
acd4f2e1
KB
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
11c5f0a3 4 *
1343342a 5 * %sccs.include.redist.c%
8ebd1ebf
GM
6 */
7
8#ifndef lint
acd4f2e1 9static char sccsid[] = "@(#)domacro.c 8.1 (Berkeley) %G%";
11c5f0a3 10#endif /* not lint */
8ebd1ebf
GM
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
8ebd1ebf
GM
20domacro(argc, argv)
21 int argc;
22 char *argv[];
23{
24 register int i, j;
25 register char *cp1, *cp2;
04480325
GM
26 int count = 2, loopflg = 0;
27 char line2[200];
8ebd1ebf
GM
28 extern char **glob(), *globerr;
29 struct cmd *getcmd(), *c;
30 extern struct cmd cmdtab[];
31
67ff27c7 32 if (argc < 2 && !another(&argc, &argv, "macro name")) {
8ebd1ebf
GM
33 printf("Usage: %s macro_name.\n", argv[0]);
34 code = -1;
35 return;
36 }
37 for (i = 0; i < macnum; ++i) {
38 if (!strncmp(argv[1], macros[i].mac_name, 9)) {
39 break;
40 }
41 }
42 if (i == macnum) {
43 printf("'%s' macro not found.\n", argv[1]);
44 code = -1;
45 return;
46 }
04480325 47 (void) strcpy(line2, line);
8ebd1ebf
GM
48TOP:
49 cp1 = macros[i].mac_start;
50 while (cp1 != macros[i].mac_end) {
51 while (isspace(*cp1)) {
52 cp1++;
53 }
54 cp2 = line;
55 while (*cp1 != '\0') {
56 switch(*cp1) {
57 case '\\':
58 *cp2++ = *++cp1;
59 break;
60 case '$':
61 if (isdigit(*(cp1+1))) {
62 j = 0;
63 while (isdigit(*++cp1)) {
64 j = 10*j + *cp1 - '0';
65 }
66 cp1--;
67 if (argc - 2 >= j) {
04480325 68 (void) strcpy(cp2, argv[j+1]);
8ebd1ebf
GM
69 cp2 += strlen(argv[j+1]);
70 }
71 break;
72 }
73 if (*(cp1+1) == 'i') {
74 loopflg = 1;
75 cp1++;
76 if (count < argc) {
04480325 77 (void) strcpy(cp2, argv[count]);
8ebd1ebf
GM
78 cp2 += strlen(argv[count]);
79 }
80 break;
81 }
82 /* intentional drop through */
83 default:
84 *cp2++ = *cp1;
85 break;
86 }
87 if (*cp1 != '\0') {
88 cp1++;
89 }
90 }
91 *cp2 = '\0';
92 makeargv();
93 c = getcmd(margv[0]);
94 if (c == (struct cmd *)-1) {
95 printf("?Ambiguous command\n");
96 code = -1;
97 }
98 else if (c == 0) {
99 printf("?Invalid command\n");
100 code = -1;
101 }
102 else if (c->c_conn && !connected) {
103 printf("Not connected.\n");
104 code = -1;
105 }
106 else {
107 if (verbose) {
108 printf("%s\n",line);
109 }
110 (*c->c_handler)(margc, margv);
111 if (bell && c->c_bell) {
ff00793c 112 (void) putchar('\007');
8ebd1ebf 113 }
04480325 114 (void) strcpy(line, line2);
8ebd1ebf
GM
115 makeargv();
116 argc = margc;
117 argv = margv;
118 }
119 if (cp1 != macros[i].mac_end) {
120 cp1++;
121 }
122 }
123 if (loopflg && ++count < argc) {
124 goto TOP;
125 }
126}