/[inetutils]/inetutils/ftp/domacro.c
ViewVC logotype

Diff of /inetutils/ftp/domacro.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.5 by alainm, Tue Feb 27 17:07:12 2001 UTC revision 1.6 by gray, Tue Oct 11 11:16:40 2005 UTC
# Line 28  Line 28 
28   */   */
29    
30  #ifndef lint  #ifndef lint
31  static char sccsid[] = "@(#)domacro.c   8.3 (Berkeley) 4/2/94";  static char     sccsid[] = "@(#)domacro.c       8.3 (Berkeley) 4/2/94";
32  #endif /* not lint */  #endif /* not lint */
33    
34  #ifdef HAVE_CONFIG_H  #ifdef HAVE_CONFIG_H
# Line 43  static char sccsid[] = "@(#)domacro.c  8. Line 43  static char sccsid[] = "@(#)domacro.c  8.
43  #include "ftp_var.h"  #include "ftp_var.h"
44    
45  void  void
46  domacro(argc, argv)  domacro (int argc, char *argv[])
         int argc;  
         char *argv[];  
47  {  {
48          int i, j, count = 2, loopflg = 0;    int             i, j, count = 2, loopflg = 0;
49          char *cp1, *cp2, line2[200];    char           *cp1, *cp2, line2[200];
50          struct cmd *c;    struct cmd     *c;
51    
52          if (argc < 2 && !another(&argc, &argv, "macro name")) {    if (argc < 2 && !another (&argc, &argv, "macro name"))
53                  printf("Usage: %s macro_name.\n", argv[0]);      {
54                  code = -1;        printf ("Usage: %s macro_name.\n", argv[0]);
55                  return;        code = -1;
56          return;
57        }
58      for (i = 0; i < macnum; ++i)
59        {
60          if (!strncmp (argv[1], macros[i].mac_name, 9))
61            {
62              break;
63          }          }
64          for (i = 0; i < macnum; ++i) {      }
65                  if (!strncmp(argv[1], macros[i].mac_name, 9)) {    if (i == macnum)
66                          break;      {
67                  }        printf ("'%s' macro not found.\n", argv[1]);
68          }        code = -1;
69          if (i == macnum) {        return;
70                  printf("'%s' macro not found.\n", argv[1]);      }
71                  code = -1;    strcpy (line2, line);
72                  return;  
73          }    do
74          (void) strcpy(line2, line);      {
75  TOP:        cp1 = macros[i].mac_start;
76          cp1 = macros[i].mac_start;        while (cp1 != macros[i].mac_end)
77          while (cp1 != macros[i].mac_end) {          {
78                  while (isspace(*cp1)) {            while (isspace (*cp1))
79                          cp1++;              {
80                  }                cp1++;
81                  cp2 = line;              }
82                  while (*cp1 != '\0') {            cp2 = line;
83                        switch(*cp1) {            while (*cp1 != '\0')
84                              case '\\':              {
85                                   *cp2++ = *++cp1;                switch (*cp1)
86                                   break;                  {
87                              case '$':                  case '\\':
88                                   if (isdigit(*(cp1+1))) {                    *cp2++ = *++cp1;
89                                      j = 0;                    break;
90                                      while (isdigit(*++cp1)) {                  case '$':
91                                            j = 10*j +  *cp1 - '0';                    if (isdigit (*(cp1 + 1)))
92                                      }                      {
93                                      cp1--;                        j = 0;
94                                      if (argc - 2 >= j) {                        while (isdigit (*++cp1))
95                                          (void) strcpy(cp2, argv[j+1]);                          j = 10 * j + *cp1 - '0';
96                                          cp2 += strlen(argv[j+1]);                        cp1--;
97                                      }                        if (argc - 2 >= j)
98                                      break;                          {
99                                   }                            strcpy (cp2, argv[j + 1]);
100                                   if (*(cp1+1) == 'i') {                            cp2 += strlen (argv[j + 1]);
                                         loopflg = 1;  
                                         cp1++;  
                                         if (count < argc) {  
                                            (void) strcpy(cp2, argv[count]);  
                                            cp2 += strlen(argv[count]);  
                                         }  
                                         break;  
                                 }  
                                 /* intentional drop through */  
                             default:  
                                 *cp2++ = *cp1;  
                                 break;  
                       }  
                       if (*cp1 != '\0') {  
                          cp1++;  
                       }  
                 }  
                 *cp2 = '\0';  
                 makeargv();  
                 if (margv[0] == NULL)  
                         return;  
                 c = getcmd(margv[0]);  
                   
                 if (c == (struct cmd *)-1) {  
                         printf("?Ambiguous command\n");  
                         code = -1;  
                 }  
                 else if (c == 0) {  
                         printf("?Invalid command\n");  
                         code = -1;  
                 }  
                 else if (c->c_conn && !connected) {  
                         printf("Not connected.\n");  
                         code = -1;  
                 }  
                 else {  
                         if (verbose) {  
                                 printf("%s\n",line);  
101                          }                          }
102                          (*c->c_handler)(margc, margv);                        break;
103                          if (bell && c->c_bell) {                      }
104                                  (void) putchar('\007');                    if (*(cp1 + 1) == 'i')
105                        {
106                          loopflg = 1;
107                          cp1++;
108                          if (count < argc)
109                            {
110                              strcpy (cp2, argv[count]);
111                              cp2 += strlen (argv[count]);
112                          }                          }
113                          (void) strcpy(line, line2);                        break;
114                          makeargv();                      }
115                          argc = margc;                    /* intentional drop through */
116                          argv = margv;                  default:
117                  }                    *cp2++ = *cp1;
118                  if (cp1 != macros[i].mac_end) {                    break;
119                          cp1++;                  }
120                  }                if (*cp1 != '\0')
121          }                  cp1++;
122          if (loopflg && ++count < argc) {              }
123                  goto TOP;            *cp2 = '\0';
124              makeargv ();
125              if (margv[0] == NULL)
126                return;
127              c = getcmd (margv[0]);
128              
129              if (c == (struct cmd *) -1)
130                {
131                  printf ("?Ambiguous command\n");
132                  code = -1;
133                }
134              else if (c == 0)
135                {
136                  printf ("?Invalid command\n");
137                  code = -1;
138                }
139              else if (c->c_conn && !connected)
140                {
141                  printf ("Not connected.\n");
142                  code = -1;
143                }
144              else
145                {
146                  if (verbose)
147                    printf ("%s\n", line);
148                  (*c->c_handler) (margc, margv);
149                  if (bell && c->c_bell)
150                    putchar ('\007');
151                  strcpy (line, line2);
152                  makeargv ();
153                  argc = margc;
154                  argv = margv;
155                }
156              if (cp1 != macros[i].mac_end)
157                cp1++;
158          }          }
159        }
160      while (loopflg && ++count < argc);
161  }  }

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.6

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26