亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? batch.c

?? 一個類似windows
?? C
字號:
/*
 *  BATCH.C - batch file processor for CMD.EXE.
 *
 *
 *  History:
 *
 *    ??/??/?? (Evan Jeffrey)
 *        started.
 *
 *    15 Jul 1995 (Tim Norman)
 *        modes and bugfixes.
 *
 *    08 Aug 1995 (Matt Rains)
 *        i have cleaned up the source code. changes now bring this
 *        source into guidelines for recommended programming practice.
 *
 *        i have added some constants to help making changes easier.
 *
 *    29 Jan 1996 (Steffan Kaiser)
 *        made a few cosmetic changes
 *
 *    05 Feb 1996 (Tim Norman)
 *        changed to comply with new first/rest calling scheme
 *
 *    14 Jun 1997 (Steffen Kaiser)
 *        bug fixes.  added error level expansion %?.  ctrl-break handling
 *
 *    16 Jul 1998 (Hans B Pufal)
 *        Totally reorganised in conjunction with COMMAND.C (cf) to
 *        implement proper BATCH file nesting and other improvements.
 *
 *    16 Jul 1998 (John P Price <linux-guru@gcfl.net>)
 *        Seperated commands into individual files.
 *
 *    19 Jul 1998 (Hans B Pufal) [HBP_001]
 *        Preserve state of echo flag across batch calls.
 *
 *    19 Jul 1998 (Hans B Pufal) [HBP_002]
 *        Implementation of FOR command
 *
 *    20-Jul-1998 (John P Price <linux-guru@gcfl.net>)
 *        added error checking after malloc calls
 *
 *    27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
 *        added config.h include
 *
 *    02-Aug-1998 (Hans B Pufal) [HBP_003]
 *        Fixed bug in ECHO flag restoration at exit from batch file
 *
 *    26-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
 *        Replaced CRT io functions by Win32 io functions.
 *        Unicode safe!
 *
 *    23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.es>)
 *        Fixes made to get "for" working.
 *
 *    02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
 *        Remove all hardcode string to En.rc
 */

#include <precomp.h>
#include "resource.h"


/* The stack of current batch contexts.
 * NULL when no batch is active
 */
LPBATCH_CONTEXT bc = NULL;

BOOL bEcho = TRUE;          /* The echo flag */



/* Buffer for reading Batch file lines */
TCHAR textline[BATCH_BUFFSIZE];


/*
 * Returns a pointer to the n'th parameter of the current batch file.
 * If no such parameter exists returns pointer to empty string.
 * If no batch file is current, returns NULL
 *
 */

LPTSTR FindArg (INT n)
{
	LPTSTR pp;

#ifdef _DEBUG
	DebugPrintf (_T("FindArg: (%d)\n"), n);
#endif

	if (bc == NULL)
		return NULL;

	n += bc->shiftlevel;
	pp = bc->params;

	/* Step up the strings till we reach the end */
	/* or the one we want */
	while (*pp && n--)
		pp += _tcslen (pp) + 1;

	return pp;
}


/*
 * Batch_params builds a parameter list in newlay allocated memory.
 * The parameters consist of null terminated strings with a final
 * NULL character signalling the end of the parameters.
 *
*/

LPTSTR BatchParams (LPTSTR s1, LPTSTR s2)
{
	LPTSTR dp = (LPTSTR)malloc ((_tcslen(s1) + _tcslen(s2) + 3) * sizeof (TCHAR));

	/* JPP 20-Jul-1998 added error checking */
	if (dp == NULL)
	{
		error_out_of_memory();
		return NULL;
	}

	if (s1 && *s1)
	{
		s1 = _stpcpy (dp, s1);
		*s1++ = _T('\0');
	}
	else
		s1 = dp;

	while (*s2)
	{
		if (_istspace (*s2) || _tcschr (_T(",;"), *s2))
		{
			*s1++ = _T('\0');
			s2++;
			while (*s2 && _tcschr (_T(" ,;"), *s2))
				s2++;
			continue;
		}

		if ((*s2 == _T('"')) || (*s2 == _T('\'')))
		{
			TCHAR st = *s2;

			do
				*s1++ = *s2++;
			while (*s2 && (*s2 != st));
		}

		*s1++ = *s2++;
	}

	*s1++ = _T('\0');
	*s1 = _T('\0');

	return dp;
}


/*
 * If a batch file is current, exits it, freeing the context block and
 * chaining back to the previous one.
 *
 * If no new batch context is found, sets ECHO back ON.
 *
 * If the parameter is non-null or not empty, it is printed as an exit
 * message
 */

VOID ExitBatch (LPTSTR msg)
{
#ifdef _DEBUG
	DebugPrintf (_T("ExitBatch: (\'%s\')\n"), msg);
#endif

	if (bc != NULL)
	{
		LPBATCH_CONTEXT t = bc;

		if (bc->hBatchFile)
		{
			CloseHandle (bc->hBatchFile);
			bc->hBatchFile = INVALID_HANDLE_VALUE;
		}

		if (bc->params)
			free(bc->params);

		if (bc->forproto)
			free(bc->forproto);

		if (bc->ffind)
			free(bc->ffind);

		/* Preserve echo state across batch calls */
		bEcho = bc->bEcho;

		bc = bc->prev;
		free(t);
	}

	if (msg && *msg)
		ConOutPrintf (_T("%s\n"), msg);
}


/*
 * Start batch file execution
 *
 * The firstword parameter is the full filename of the batch file.
 *
 */

BOOL Batch (LPTSTR fullname, LPTSTR firstword, LPTSTR param)
{
	HANDLE hFile;
	SetLastError(0);
	hFile = CreateFile (fullname, GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, NULL,
			    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL |
				 FILE_FLAG_SEQUENTIAL_SCAN, NULL);	

#ifdef _DEBUG
	DebugPrintf (_T("Batch: (\'%s\', \'%s\', \'%s\')  hFile = %x\n"),
				 fullname, firstword, param, hFile);
#endif

	if (hFile == INVALID_HANDLE_VALUE)
	{
		ConErrResPuts(STRING_BATCH_ERROR);
		return FALSE;
	}

	/* Kill any and all FOR contexts */
	while (bc && bc->forvar)
		ExitBatch (NULL);

	if (bc == NULL)
	{
		/* No curent batch file, create a new context */
		LPBATCH_CONTEXT n = (LPBATCH_CONTEXT)malloc (sizeof(BATCH_CONTEXT));

		if (n == NULL)
		{
			error_out_of_memory ();
			return FALSE;
		}

		n->prev = bc;
		bc = n;
		bc->In[0] = _T('\0');
		bc->Out[0] = _T('\0');
		bc->Err[0] = _T('\0');
	}
	else if (bc->hBatchFile != INVALID_HANDLE_VALUE)
	{
		/* Then we are transferring to another batch */
		CloseHandle (bc->hBatchFile);
		bc->hBatchFile = INVALID_HANDLE_VALUE;
		free (bc->params);
	}

	bc->hBatchFile = hFile;
	SetFilePointer (bc->hBatchFile, 0, NULL, FILE_BEGIN); 
	bc->bEcho = bEcho; /* Preserve echo across batch calls */
	bc->shiftlevel = 0;

	bc->ffind = NULL;
	bc->forvar = _T('\0');
	bc->forproto = NULL;
	bc->params = BatchParams (firstword, param);

#ifdef _DEBUG
	DebugPrintf (_T("Batch: returns TRUE\n"));
#endif

	return TRUE;
}

VOID AddBatchRedirection(TCHAR * ifn, TCHAR * ofn, TCHAR * efn)
{
	if(!bc)
		return;
	if(_tcslen(ifn))
		_tcscpy(bc->In,ifn);
	if(_tcslen(ofn))
		_tcscpy(bc->Out,ofn);
	if(_tcslen(efn))
		_tcscpy(bc->Err,efn);

}

/*
 * Read and return the next executable line form the current batch file
 *
 * If no batch file is current or no further executable lines are found
 * return NULL.
 *
 * Here we also look out for FOR bcontext structures which trigger the
 * FOR expansion code.
 *
 * Set eflag to 0 if line is not to be echoed else 1
 */

LPTSTR ReadBatchLine (LPBOOL bLocalEcho)
{
	LPTSTR first;
	LPTSTR ip;

	/* No batch */
	if (bc == NULL)
		return NULL;

#ifdef _DEBUG
	DebugPrintf (_T("ReadBatchLine ()\n"));
#endif

	while (1)
	{
		/* User halt */
		if (CheckCtrlBreak (BREAK_BATCHFILE))
		{
			while (bc)
				ExitBatch (NULL);
			return NULL;
		}

		/* No batch */
		if (bc == NULL)
			return NULL;

		/* If its a FOR context... */
		if (bc->forvar)
		{
			LPTSTR sp = bc->forproto; /* pointer to prototype command */
			LPTSTR dp = textline;     /* Place to expand protoype */
			LPTSTR fv = FindArg (0);  /* Next list element */

			/* End of list so... */
			if ((fv == NULL) || (*fv == _T('\0')))
			{
				/* just exit this context */
				ExitBatch (NULL);
				continue;
			}

			if (_tcscspn (fv, _T("?*")) == _tcslen (fv))
			{
				/* element is wild file */
				bc->shiftlevel++;       /* No use it and shift list */
			}
			else
			{
				/* Wild file spec, find first (or next) file name */
				if (bc->ffind)
				{
					/* First already done so do next */

					fv = FindNextFile (bc->hFind, bc->ffind) ? bc->ffind->cFileName : NULL;
				}
				else
				{
					/*  For first find, allocate a find first block */
					if ((bc->ffind = (LPWIN32_FIND_DATA)malloc (sizeof (WIN32_FIND_DATA))) == NULL)
					{
						error_out_of_memory();
						return NULL;
					}

					bc->hFind = FindFirstFile (fv, bc->ffind);

					fv = !(bc->hFind==INVALID_HANDLE_VALUE) ? bc->ffind->cFileName : NULL;
				}

				if (fv == NULL)
				{
					/* Null indicates no more files.. */
					free (bc->ffind);      /* free the buffer */
					bc->ffind = NULL;
					bc->shiftlevel++;     /* On to next list element */
					continue;
				}
			}

			/* At this point, fv points to parameter string */
			while (*sp)
			{
				if ((*sp == _T('%')) && (*(sp + 1) == bc->forvar))
				{
					/* replace % var */
					dp = _stpcpy (dp, fv);
					sp += 2;
				}
				else
				{
					/* Else just copy */
					*dp++ = *sp++;
				}
			}

			*dp = _T('\0');

			*bLocalEcho = bEcho;

			return textline;
		}

		if (!FileGetString (bc->hBatchFile, textline, sizeof (textline) / sizeof (textline[0])))
		{
#ifdef _DEBUG
			DebugPrintf (_T("ReadBatchLine(): Reached EOF!\n"));
#endif
			/* End of file.... */
			ExitBatch (NULL);

			if (bc == NULL)
				return NULL;

			continue;
		}
#ifdef _DEBUG
		DebugPrintf (_T("ReadBatchLine(): textline: \'%s\'\n"), textline);
#endif

		/* Strip leading spaces and trailing space/control chars */
		for (first = textline; _istspace (*first); first++)
			;

		for (ip = first + _tcslen (first) - 1; _istspace (*ip) || _istcntrl (*ip); ip--)
			;

		*++ip = _T('\0');

		/* ignore labels and empty lines */
		if (*first == _T(':') || *first == 0)
			continue;

		if (*first == _T('@'))
		{
			/* don't echo this line */
			do
				first++;
			while (_istspace (*first));

			*bLocalEcho = 0;
		}
		else
			*bLocalEcho = bEcho;

		break;
	}

	return first;
}

/* EOF */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女脱光内衣内裤视频久久影院| 国产精品女同一区二区三区| 日韩精品免费视频人成| 色综合 综合色| 日韩和欧美一区二区三区| 日韩欧美在线影院| 粉嫩13p一区二区三区| 亚洲色图制服诱惑| 欧美大度的电影原声| 图片区小说区国产精品视频| 日韩一区二区三区视频| 成人国产视频在线观看| 亚洲午夜视频在线观看| 精品91自产拍在线观看一区| 国产91在线看| 久久成人av少妇免费| 亚洲三级免费电影| 欧美丝袜第三区| 国产一区二区三区免费看| 亚洲黄色免费电影| 久久精品一区二区三区四区| 成人一区二区三区视频在线观看| 亚洲第一电影网| www国产精品av| 色网综合在线观看| 国产一区二区三区免费观看| 亚洲精品一二三四区| 久久久久九九视频| 日本二三区不卡| 成人不卡免费av| 国产精品一区二区三区四区| 日日夜夜免费精品视频| 亚洲欧洲日韩av| 国产欧美综合在线| 久久中文字幕电影| 欧美日本一区二区在线观看| 欧美色视频在线观看| 成人激情黄色小说| www.66久久| 色婷婷精品大视频在线蜜桃视频| 懂色av一区二区三区免费观看| 亚洲人快播电影网| 亚洲美女免费在线| 婷婷国产在线综合| 日本欧美在线观看| 免费观看成人av| 国产成人在线影院| 色综合久久综合网97色综合| 成人激情动漫在线观看| 成人一级黄色片| 色综合久久六月婷婷中文字幕| 成人精品国产免费网站| 91女人视频在线观看| 91在线观看地址| 日韩免费看网站| 精品国产乱码久久久久久久| 欧美精品一区二区三| 精品国产乱码久久久久久蜜臀| 久久精品一区二区三区不卡| 中文字幕一区av| 日韩和欧美的一区| 国产精品综合二区| 99re成人精品视频| 欧美一区二区成人6969| 国产精品久久久久久久久搜平片 | 亚洲成年人影院| 日韩精品欧美精品| 不卡在线视频中文字幕| 欧美一三区三区四区免费在线看| 欧美猛男超大videosgay| 久久精品视频在线看| 亚洲高清在线精品| 麻豆极品一区二区三区| 色猫猫国产区一区二在线视频| 欧美videossexotv100| 国产日产欧美一区| 喷水一区二区三区| 欧美熟乱第一页| 欧美激情一区在线| 久久66热re国产| 日韩欧美综合在线| 天天综合天天综合色| 成人av一区二区三区| 国产丝袜欧美中文另类| 玖玖九九国产精品| 欧美一区二区久久久| 亚洲精品视频在线看| 成人性生交大片免费看中文| 国产午夜一区二区三区| 国产精品自拍毛片| 精品国产伦一区二区三区免费| 亚洲一区二区三区四区的| 91猫先生在线| 一个色在线综合| 欧美色图激情小说| 三级一区在线视频先锋| 欧美电影免费观看完整版| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产91露脸合集magnet| 欧洲视频一区二区| 亚洲h在线观看| 欧美四级电影在线观看| 亚洲伦在线观看| 欧美日韩精品二区第二页| 舔着乳尖日韩一区| 久久综合给合久久狠狠狠97色69| 国产一区二区三区精品视频| 国产精品久久久久一区二区三区| 成人av资源在线| 中文字幕一区二区三区在线观看| 91福利资源站| 国产一区二区三区在线观看免费视频| 中文字幕欧美日本乱码一线二线| 国产69精品久久777的优势| 亚洲免费在线观看视频| 久久综合网色—综合色88| 日本成人中文字幕| 7777精品伊人久久久大香线蕉经典版下载 | 欧美在线视频日韩| 岛国一区二区在线观看| 亚洲在线视频免费观看| 精品久久久影院| 欧美日韩一区二区三区视频| 91色乱码一区二区三区| 久久久亚洲欧洲日产国码αv| www.欧美色图| 国产精品1区2区| 国产精品一区二区免费不卡| 麻豆成人av在线| 午夜电影一区二区三区| 欧美极品少妇xxxxⅹ高跟鞋 | 精品久久久网站| 欧美日韩一区二区三区在线看| 91啪亚洲精品| 成人国产精品视频| 91亚洲永久精品| 欧美亚洲丝袜传媒另类| 欧美人xxxx| 欧美精三区欧美精三区| 欧美亚洲一区二区三区四区| 制服丝袜日韩国产| 国产亚洲va综合人人澡精品| 欧美mv和日韩mv国产网站| 欧美色爱综合网| 欧美一二三区精品| 久久欧美一区二区| 国产精品污污网站在线观看| 中文字幕在线免费不卡| 亚洲激情一二三区| 麻豆国产一区二区| 99re热这里只有精品视频| 在线观看日韩高清av| 欧美日韩亚洲综合在线 | 蜜臀国产一区二区三区在线播放| 美女精品自拍一二三四| 91久久精品网| 久久久久国产精品麻豆| 一区二区三区免费网站| 五月婷婷综合网| 国产成人啪免费观看软件| 色婷婷狠狠综合| 国产日本欧洲亚洲| 日韩影视精彩在线| 欧美性高清videossexo| 国产三级精品三级在线专区| 亚洲不卡在线观看| 国产电影一区在线| 精品理论电影在线| 一区二区三区不卡视频在线观看| 久久国产精品第一页| 91麻豆精品国产91久久久久久| 一区二区三区中文字幕| 风间由美一区二区av101| 精品成a人在线观看| 亚洲一二三四区| 91农村精品一区二区在线| 精品少妇一区二区三区免费观看| 亚洲影院理伦片| 在线观看av一区二区| 亚洲欧美韩国综合色| 色先锋资源久久综合| 樱花影视一区二区| 色综合久久精品| 亚洲另类在线视频| 91精品国产91久久综合桃花| 亚洲欧美日韩电影| 一本大道久久a久久综合| 亚洲综合一二三区| 日韩欧美国产综合在线一区二区三区| 亚洲精品福利视频网站| 欧美丰满一区二区免费视频| 亚洲444eee在线观看| 日韩一区二区免费高清| 久久99精品久久久久婷婷| 日韩精品一区二区三区swag| 国产一区在线精品| 国产精品麻豆久久久| 欧美日本不卡视频| 国产精品资源站在线| 亚洲成人免费看|