www.pudn.com > socks5.zip > domacro.c


/* 
 * Copyright (c) 1985 Regents of the University of California. 
 * All rights reserved. 
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met: 
 * 1. Redistributions of source code must retain the above copyright 
 *    notice, this list of conditions and the following disclaimer. 
 * 2. Redistributions in binary form must reproduce the above copyright 
 *    notice, this list of conditions and the following disclaimer in the 
 *    documentation and/or other materials provided with the distribution. 
 * 3. All advertising materials mentioning features or use of this software 
 *    must display the following acknowledgement: 
 *	This product includes software developed by the University of 
 *	California, Berkeley and its contributors. 
 * 4. Neither the name of the University nor the names of its contributors 
 *    may be used to endorse or promote products derived from this software 
 *    without specific prior written permission. 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
 * SUCH DAMAGE. 
 */ 
 
#ifdef SHOW_SCCSIDS 
static char sccsid[] = "@(#)domacro.c	1.8 (Berkeley) 9/28/90"; 
#endif /* not lint */ 
 
#include "ftp_var.h" 
 
#include  
#include  
#include  
#include  
 
#if !defined(SCO) && !defined(_SEQUENT_) && !defined(linux) 
#include  
#endif 
 
void domacro(int argc, char *argv[]) { 
	register int i, j; 
	register char *cp1, *cp2; 
	int count = 2, loopflg = 0; 
	char line2[200]; 
	struct cmd *getcmd(), *c; 
	extern char **glob(); 
 
	if (argc < 2 && !another(&argc, &argv, "macro name")) { 
		printf("Usage: %s macro_name.\n", argv[0]); 
		code = -1; 
		return; 
	} 
	for (i = 0; i < macnum; ++i) { 
		if (!strncmp(argv[1], macros[i].mac_name, 9))  
			break; 
	} 
 
	if (i == macnum) { 
		printf("'%s' macro not found.\n", argv[1]); 
		code = -1; 
		return; 
	} 
 
	(void) strcpy(line2, line); 
TOP: 
	cp1 = macros[i].mac_start; 
	while (cp1 != macros[i].mac_end) { 
		while (isspace(*cp1)) { 
			cp1++; 
		} 
		cp2 = line; 
		while (*cp1 != '\0') { 
		      switch(*cp1) { 
		   	    case '\\': 
				 *cp2++ = *++cp1; 
				 break; 
			    case '$': 
				 if (isdigit(*(cp1+1))) { 
				    j = 0; 
				    while (isdigit(*++cp1)) { 
					  j = 10*j +  *cp1 - '0'; 
				    } 
				    cp1--; 
				    if (argc - 2 >= j) { 
					(void) strcpy(cp2, argv[j+1]); 
					cp2 += strlen(argv[j+1]); 
				    } 
				    break; 
				 } 
				 if (*(cp1+1) == 'i') { 
					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(); 
		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); 
			} 
			(*c->c_handler)(margc, margv); 
			if (bell && c->c_bell) { 
				(void) putchar('\007'); 
			} 
			(void) strcpy(line, line2); 
			makeargv(); 
			argc = margc; 
			argv = margv; 
		} 
		if (cp1 != macros[i].mac_end) { 
			cp1++; 
		} 
	} 
	if (loopflg && ++count < argc) { 
		goto TOP; 
	} 
}