Metropoli BBS
VIEWER: scan.c MODE: TEXT (ASCII)
/****************************************************************/
/*								*/
/*			     scan.c				*/
/*								*/
/*		     command.com lexical support		*/
/*								*/
/*			Copyright (c) 1995			*/
/*			Pasquale J. Villani			*/
/*			All Rights Reserved			*/
/*								*/
/* This file is part of DOS-C.					*/
/*								*/
/* DOS-C is free software; you can redistribute it and/or	*/
/* modify it under the terms of the GNU General Public License	*/
/* as published by the Free Software Foundation; either version	*/
/* 2, or (at your option) any later version.			*/
/*								*/
/* DOS-C is distributed in the hope that it will be useful, but	*/
/* WITHOUT ANY WARRANTY; without even the implied warranty of	*/
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See	*/
/* the GNU General Public License for more details.		*/
/*								*/
/* You should have received a copy of the GNU General Public	*/
/* License along with DOS-C; see the file COPYING.  If not,	*/
/* write to the Free Software Foundation, 675 Mass Ave,		*/
/* Cambridge, MA 02139, USA.					*/
/****************************************************************/

/* $Logfile:   C:/dos-c/src/command/scan.c_v  $ */

/*
 * $Log:   C:/dos-c/src/command/scan.c_v  $ 
 * 
 *    Rev 1.1   01 Sep 1995 18:04:42   patv
 * First GPL release.
 * 
 *    Rev 1.0   02 Jul 1995 10:02:18   patv
 * Initial revision.
 */

static char *RcsId = "$Header:   C:/dos-c/src/command/scan.c_v   1.1   01 Sep 1995 18:04:42   patv  $";

#include "../../hdr/portab.h"
#include "globals.h"
#include "proto.h"

VOID scopy(s, d)
REG BYTE *s, *d;
{
	while(*s)
		*d++ = *s++;
	*d = '\0';
}


VOID expand(d, s)
REG BYTE *d, *s;
{
	COUNT idx, bufidx;
	BYTE buffer[MAX_CMDLINE];

	*d = '\0';
	while(*s)
	{
		if(*s == '%' && isnum(s[1]))
		{
			idx = tonum(*++s);
			idx = (idx == 0 ? 0 : idx + shift_offset);
			strcpy(d, posparam[idx]);
			d += strlen(posparam[idx]);
			while(*s && !(*s == 0x0d || *s == 0x0a || *s == ' ' || *s == '\t' || *s == '%'))
				++s;
		}
		else if(*s == '%' && *(s + 1) == '%')
		{
			/* swallow one % save the other			*/
			*d++ = *s++;
			s++;
		}
		else if(*s == '%')
		{
			/* get passed the % 				 */
			++s;
			/* buffer until next %, see if string between the */
			/* is an environment variable			  */
			/* if lp iswhite its not an env var, if its %     */
			/* then look in env and substitute if found	  */
			bufidx = 0;
			while(*s && !(*s == 0x0d || *s == 0x0a || *s == ' ' || *s == '\t' || *s == '%'))
			{
				buffer[bufidx++] = *s++;
				buffer[bufidx] = '\0';
			}
			if(*s != '%')
			{
			/* can't be env variable so add to cmd line	  */
				*d++ = '%';
				strcpy(d, buffer);
				d += strlen(buffer);
			}
			else
			{
			/* lookup and substitiue			  */
			/* get passed ending %				  */
				strcpy(d, EnvLookup(buffer));
				d += strlen(EnvLookup(buffer));
				s++;
			}
		}
		else
		{
			*d++ = *s++;
			*d = '\0';
		}
	}
}

VOID expandspl(d, s, var, sub)
REG BYTE *s, *d;
COUNT var;
BYTE *sub;
{
	while(*s)
	{
		if(*s == '%' && s[1] == var)
		{
			strcpy(d, sub);
			d += strlen(sub);
			while(*s == '%')
				++s;
			while(*s && !(*s == 0x0d || *s == 0x0a || *s == ' ' || *s == '\t' || *s == '%'))
				++s;
		}
		if((*s == '%' && s[1] != var)
		|| (*s == '%' && s[1] == '%' && s[2] != var))
		{
			++s;	/* Throw away leading %			*/
			*d++ = *s++;
			*d = '\0';
		}
		else
		{
			*d++ = *s++;
			*d = '\0';
		}
	}
}

BYTE *scan(s, d)
BYTE *s, *d;
{
	s = skipwh(s);

	if(batch_FLAG && *s == '%' && isnum(s[1]))
	{
		strcpy(d, posparam[tonum(&s[1])]);
		s += 2;
		return s;
	}


	while(*s && !(*s == 0x0d || *s == 0x0a || *s == ' ' || *s == '\t'))
		*d++ = *s++;

	*d = '\0';


	return s;
}

BYTE *scanspl(s, d, c)
BYTE *s, *d;
COUNT c;
{
	s = skipwh(s);
	while(*s && !(*s == 0x0d || *s == 0x0a || *s == ' ' || *s == '\t' || *s == '%' || *s == c))
		*d++ = *s++;

	*d = '\0';
	return s;
}

BYTE *skipwh(s)
BYTE *s;
{
	while(*s && (*s == 0x0d || *s == 0x0a || *s == ' ' || *s == '\t'))
		++s;
	return s;
}


BYTE *scan_seperator(s, d)
BYTE *s, *d;
{
	s = skipwh(s);
	if(*s)
		*d++ = *s++;
	*d = '\0';
	return s;
}


[ RETURN TO DIRECTORY ]