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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? batch.c

?? winNT技術操作系統,國外開放的原代碼和LIUX一樣
?? 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);
    //
    // Allocate enough memory to hold the params and copy them over without modifications
    //
    bc->raw_params = (TCHAR*) malloc((_tcslen(param)+1) * sizeof(TCHAR));
    if (bc->raw_params != NULL)
    {
        memset (bc->raw_params, 0, _tcslen(bc->raw_params) * sizeof(TCHAR));
        _tcscpy(bc->raw_params,param);
    }
    else
    {
        error_out_of_memory();
        return FALSE;
    }

#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 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品蜜臀在线一区尤物| 欧美羞羞免费网站| 亚洲免费大片在线观看| 99综合影院在线| 精品国产乱码久久久久久老虎| 丝袜美腿高跟呻吟高潮一区| 欧美精品久久一区| 亚洲午夜免费电影| 欧美日韩国产一级| 日韩高清一区二区| 久久精品亚洲一区二区三区浴池| 国内精品自线一区二区三区视频| 国产精品欧美精品| 91国在线观看| 日韩精品一二区| 欧美精品一区二区三| 91色在线porny| 青娱乐精品视频| 日本一区二区三区免费乱视频| 色悠久久久久综合欧美99| 午夜精品一区在线观看| 欧美精品一区二区不卡| 91福利资源站| 国产精品18久久久久久久久| 亚洲三级免费观看| 久久精品日产第一区二区三区高清版 | 欧美日韩国产a| 成人午夜电影网站| 乱中年女人伦av一区二区| 最新国产成人在线观看| www精品美女久久久tv| 欧美日韩国产综合一区二区 | 国产精品免费久久久久| 欧美一区二区三区人| 91亚洲精品久久久蜜桃网站| 韩国女主播一区二区三区| 亚洲综合色噜噜狠狠| 国产精品青草综合久久久久99| 在线不卡中文字幕| 91女厕偷拍女厕偷拍高清| 国产成人在线看| 久久成人免费网| 日韩高清欧美激情| 亚洲电影第三页| 国产精品乱码人人做人人爱| 日韩欧美在线1卡| 欧美色中文字幕| 欧洲一区二区av| 色婷婷亚洲婷婷| 99久久婷婷国产综合精品| 国产精选一区二区三区| 久久国产人妖系列| 秋霞电影网一区二区| 婷婷综合在线观看| 五月婷婷综合激情| 亚洲chinese男男1069| 国产精品视频九色porn| 精品粉嫩超白一线天av| 欧美久久久久久久久| 色哟哟在线观看一区二区三区| 亚洲影视在线播放| 国产精品久久一级| 国产91精品精华液一区二区三区| 国产制服丝袜一区| 日本午夜精品一区二区三区电影| 亚洲h在线观看| 亚洲精品国产无套在线观 | 欧美伦理视频网站| 91色视频在线| 波多野结衣精品在线| 精品亚洲欧美一区| 蜜桃av一区二区在线观看| 美国十次综合导航| 日本午夜精品一区二区三区电影| 午夜激情一区二区三区| 亚洲中国最大av网站| 国产精品人人做人人爽人人添 | 色哟哟欧美精品| av亚洲精华国产精华| 色激情天天射综合网| 欧美亚洲动漫精品| 欧洲色大大久久| 555www色欧美视频| 精品粉嫩超白一线天av| 中文字幕av一区二区三区高| 亚洲综合视频在线观看| 日本网站在线观看一区二区三区| 久久99精品久久只有精品| 国产成人av一区二区三区在线| av网站免费线看精品| 97成人超碰视| 欧美片在线播放| 久久一日本道色综合| 欧美国产成人在线| 亚洲成人777| 国产麻豆精品久久一二三| 99视频精品在线| 欧美一级久久久| 国产精品少妇自拍| 亚洲成av人影院在线观看网| 麻豆国产91在线播放| 91麻豆国产在线观看| 制服丝袜亚洲精品中文字幕| 国产日韩精品一区二区三区| 亚洲韩国一区二区三区| 国产一区二区在线影院| 看国产成人h片视频| 国产精品原创巨作av| 色老汉一区二区三区| 日韩免费视频一区| 国产精品传媒入口麻豆| 亚洲一区二区3| 欧美视频在线观看一区二区| 国产精品18久久久久久vr| 在线观看免费视频综合| 欧美自拍偷拍午夜视频| 国产成人免费在线观看不卡| 国产精品一区二区三区99| 欧美亚洲综合色| 色94色欧美sute亚洲13| 奇米在线7777在线精品| 日本精品一区二区三区四区的功能| 高清不卡一区二区在线| 国内精品免费在线观看| 欧美无砖专区一中文字| 国产精品私人自拍| 五月婷婷激情综合网| 国产精品亚洲а∨天堂免在线| 欧美一区二区三区在线| 亚洲欧美色图小说| 成人污视频在线观看| 日韩一区二区三区视频在线| 亚洲第一成年网| 91电影在线观看| **性色生活片久久毛片| 蜜臀91精品一区二区三区| 韩国av一区二区三区在线观看| 成人sese在线| 亚洲精品一区二区三区四区高清| 日产国产高清一区二区三区| 色吊一区二区三区| 亚洲日本免费电影| 成人动漫视频在线| 欧美精品乱码久久久久久按摩| 亚洲一二三区在线观看| 99精品视频在线播放观看| 国产亚洲精品7777| 国模冰冰炮一区二区| 91麻豆免费看片| 日韩一区在线免费观看| 成人黄页毛片网站| 中文字幕av一区 二区| 国产精品资源网站| 国产亚洲成年网址在线观看| 久久www免费人成看片高清| 91精品国产91综合久久蜜臀| 午夜精品福利一区二区蜜股av| 欧美日韩一区二区电影| 无吗不卡中文字幕| 91国偷自产一区二区三区成为亚洲经典 | 91啪九色porn原创视频在线观看| 国产精品久久午夜| eeuss鲁片一区二区三区在线观看| 中文字幕精品一区| 91免费精品国自产拍在线不卡| 亚洲午夜久久久久久久久电影院 | 国产一区二区影院| 国产午夜亚洲精品不卡| 国产成人高清视频| 中文字幕在线一区二区三区| 色综合久久中文综合久久97 | 尤物视频一区二区| 欧洲一区二区三区在线| 日本亚洲三级在线| 精品少妇一区二区三区在线视频| 国产精品亚洲午夜一区二区三区 | 欧美激情中文不卡| 91在线一区二区三区| 暴力调教一区二区三区| 99精品久久免费看蜜臀剧情介绍| 国产成人综合亚洲91猫咪| 精品亚洲免费视频| 韩国一区二区在线观看| 国产一区在线不卡| 日韩精品色哟哟| 波多野结衣欧美| 日本韩国精品在线| 久久亚洲一区二区三区明星换脸| 国产精品九色蝌蚪自拍| 亚洲精品视频在线观看免费| 中文字幕一区不卡| 91精品在线一区二区| 欧美一级黄色片| 久久成人av少妇免费| 国产女人aaa级久久久级 | 99久久精品免费精品国产| 亚洲美女在线国产| 欧美久久久久久蜜桃| 免费成人在线观看视频| 日韩一区二区三区高清免费看看|