move explorer and cmd. Add a few .rbuild files

svn path=/trunk/; revision=21019
This commit is contained in:
Ged Murphy 2006-02-16 23:23:37 +00:00
parent a54e551b70
commit a5c746a592
275 changed files with 73435 additions and 0 deletions

22
reactos/base/base.rbuild Normal file
View file

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<rbuild xmlns:xi="http://www.w3.org/2001/XInclude">
<group>
<directory name="applications">
<xi:include href="applications/applications.rbuild" />
</directory>
<!--
<directory name="services">
<xi:include href="services/services.rbuild" />
</directory>
<directory name="setup">
<xi:include href="setup/setup.rbuild" />
</directory>
-->
<directory name="shell">
<xi:include href="shell/shell.rbuild" />
</directory>
<directory name="system">
<xi:include href="system/system.rbuild" />
</directory>
</group>
</rbuild>

View file

@ -0,0 +1,130 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/chargen.c
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
#include "tcpsvcs.h"
extern BOOL bShutDown;
DWORD WINAPI ChargenHandler(VOID* Sock_)
{
INT RetVal = 0;
SOCKET Sock = (SOCKET)Sock_;
if (!GenerateChars(Sock))
{
LogEvent(_T("Chargen: Char generation failed\n"), 0, FALSE);
RetVal = 1;
}
LogEvent(_T("Chargen: Shutting connection down...\n"), 0, FALSE);
if (ShutdownConnection(Sock, FALSE))
LogEvent(_T("Chargen: Connection is down.\n"), 0, FALSE);
else
{
LogEvent(_T("Chargen: Connection shutdown failed\n"), 0, FALSE);
RetVal = 1;
}
LogEvent(_T("Chargen: Terminating thread\n"), 0, FALSE);
ExitThread(RetVal);
}
BOOL GenerateChars(SOCKET Sock)
{
int i;
int charIndex; /* internal loop */
int loopIndex; /* line loop */
char ring[END-START];
char *endring;
char Line[LINESIZ];
/* fill ring with printable characters */
for (charIndex=0, i=START; i<=END; charIndex++, i++)
ring[charIndex] = (char)i;
/* save the address of the end character in the ring */
endring = &ring[charIndex];
/* where we will start output from */
loopIndex = 0;
while (! bShutDown)
{
/* if the loop index is equal to the last char,
* start the loop again from the beginning */
if (loopIndex == END-START)
loopIndex = 0;
/* start printing from char controled by loopIndex */
charIndex = loopIndex;
for (i=0; i < LINESIZ - 2; i++)
{
Line[i] = ring[charIndex];
if (ring[charIndex] == *endring)
charIndex = 0;
else
charIndex++;
}
Line[LINESIZ - 2] = L'\r';
Line[LINESIZ - 1] = L'\n';
if (! SendLine(Sock, Line))
break;
/* increment loop index to start printing from next char in ring */
loopIndex++;
}
if (bShutDown)
return FALSE;
else
return TRUE;
}
BOOL SendLine(SOCKET Sock, TCHAR* Line)
{
INT RetVal;
INT SentBytes;
INT LineSize;
LineSize = sizeof(TCHAR) * LINESIZ;
SentBytes = 0;
RetVal = send(Sock, Line, LineSize, 0);
/*FIXME: need to establish if peer closes connection,
not just report a socket error */
if (RetVal > 0)
{
if (RetVal != LineSize)
{
LogEvent(_T("Chargen: Not sent enough bytes\n"), 0, FALSE);
return FALSE;
}
SentBytes += RetVal;
return TRUE;
}
else if (RetVal == SOCKET_ERROR)
{
LogEvent(_T("Chargen: Socket error\n"), 0, FALSE);
return FALSE;
}
else
LogEvent(_T("Chargen: unknown error\n"), 0, FALSE);
// return FALSE;
LogEvent(_T("Chargen: Connection closed by peer.\n"), 0, FALSE);
return TRUE;
}

View file

@ -0,0 +1,55 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/daytime.c
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
#include "tcpsvcs.h"
DWORD WINAPI DaytimeHandler(VOID* Sock_)
{
struct tm *newtime;
time_t aclock;
TCHAR *pszTime;
DWORD RetVal = 0;
SOCKET Sock = (SOCKET)Sock_;
time(&aclock);
newtime = localtime(&aclock);
pszTime = _tasctime(newtime);
SendTime(Sock, pszTime);
LogEvent(_T("DayTime: Shutting connection down...\n"), 0, FALSE);
if (ShutdownConnection(Sock, FALSE))
LogEvent(_T("DayTime: Connection is down.\n"), 0, FALSE);
else
{
LogEvent(_T("DayTime: Connection shutdown failed\n"), 0, FALSE);
RetVal = 1;
}
LogEvent(_T("DayTime: Terminating thread\n"), 0, FALSE);
ExitThread(RetVal);
}
BOOL SendTime(SOCKET Sock, TCHAR *time)
{
INT StringSize = (INT)_tcsclen(time);
INT RetVal = send(Sock, time, sizeof(TCHAR) * StringSize, 0);
if (RetVal == SOCKET_ERROR)
return FALSE;
LogEvent(_T("DayTime: Connection closed by peer.\n"), 0, FALSE);
return TRUE;
}

View file

@ -0,0 +1,71 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/discard.c
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
#include "tcpsvcs.h"
extern BOOL bShutDown;
DWORD WINAPI DiscardHandler(VOID* Sock_)
{
DWORD RetVal = 0;
SOCKET Sock = (SOCKET)Sock_;
if (!RecieveIncomingPackets(Sock))
{
LogEvent(_T("Discard: RecieveIncomingPackets failed\n"), 0, FALSE);
RetVal = 1;
}
LogEvent(_T("Discard: Shutting connection down...\n"), 0, FALSE);
if (ShutdownConnection(Sock, TRUE))
LogEvent(_T("Discard: Connection is down.\n"), 0, FALSE);
else
{
LogEvent(_T("Discard: Connection shutdown failed\n"), 0, FALSE);
RetVal = 1;
}
LogEvent(_T("Discard: Terminating thread\n"), 0, FALSE);
ExitThread(RetVal);
}
BOOL RecieveIncomingPackets(SOCKET Sock)
{
TCHAR ReadBuffer[BUF];
TCHAR buf[256];
INT ReadBytes;
do
{
ReadBytes = recv(Sock, ReadBuffer, BUF, 0);
if (ReadBytes > 0)
{
_stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes);
LogEvent(buf, 0, FALSE);
}
else if (ReadBytes == SOCKET_ERROR)
{
_stprintf(buf, ("Socket Error: %d\n"), WSAGetLastError());
LogEvent(buf, 0, TRUE);
return FALSE;
}
} while ((ReadBytes > 0) && (! bShutDown));
if (! bShutDown)
LogEvent(_T("Discard: Connection closed by peer.\n"), 0, FALSE);
return TRUE;
}

View file

@ -0,0 +1,95 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/echo.c
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
#include "tcpsvcs.h"
extern BOOL bShutDown;
DWORD WINAPI EchoHandler(VOID* Sock_)
{
DWORD RetVal = 0;
SOCKET Sock = (SOCKET)Sock_;
if (!EchoIncomingPackets(Sock)) {
LogEvent(_T("Echo: EchoIncomingPackets failed\n"), 0, FALSE);
RetVal = 1;
}
LogEvent(_T("Echo: Shutting connection down...\n"), 0, FALSE);
if (ShutdownConnection(Sock, TRUE))
LogEvent(_T("Echo: Connection is down\n"), 0, FALSE);
else
{
LogEvent(_T("Echo: Connection shutdown failed\n"), 0, FALSE);
RetVal = 1;
}
LogEvent(_T("Echo: Terminating thread\n"), 0, FALSE);
ExitThread(RetVal);
}
BOOL EchoIncomingPackets(SOCKET Sock)
{
TCHAR ReadBuffer[BUF];
TCHAR buf[256]; // temp for holding LogEvent text
INT Temp;
INT ReadBytes;
INT SentBytes;
do {
ReadBytes = recv(Sock, ReadBuffer, BUF, 0);
if (ReadBytes > 0)
{
_stprintf(buf, _T("Received %d bytes from client\n"), ReadBytes);
LogEvent(buf, 0, FALSE);
SentBytes = 0;
while (SentBytes < ReadBytes)
{
Temp = send(Sock, ReadBuffer + SentBytes,
ReadBytes - SentBytes, 0);
if (Temp > 0)
{
_stprintf(buf, _T("Sent %d bytes back to client\n"), Temp);
LogEvent(buf, 0, FALSE);
SentBytes += Temp;
}
else if (Temp == SOCKET_ERROR)
return FALSE;
else
{
/* Client closed connection before we could reply to
all the data it sent, so quit early. */
_stprintf(buf, _T("Peer unexpectedly dropped connection!\n"));
LogEvent(buf, 0, FALSE);
return FALSE;
}
}
}
else if (ReadBytes == SOCKET_ERROR)
return FALSE;
} while ((ReadBytes != 0) && (! bShutDown));
if (! bShutDown)
LogEvent(_T("Echo: Connection closed by peer.\n"), 0, FALSE);
if (bShutDown)
LogEvent(_T("Echo: thread recieved shutdown signal\n"), 0, FALSE);
return TRUE;
}

View file

@ -0,0 +1,97 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/qotd.c
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
#include "tcpsvcs.h"
#define QBUFSIZ 160
LPCTSTR FilePath = _T("\\drivers\\etc\\quotes");
DWORD WINAPI QotdHandler(VOID* Sock_)
{
FILE *fp;
SOCKET Sock;
TCHAR Sys[MAX_PATH];
TCHAR Quote[60][BUFSIZ]; // need to set this dynamically
INT QuoteToPrint;
INT NumQuotes;
Sock = (SOCKET)Sock_;
if(! GetSystemDirectory(Sys, MAX_PATH))
{
LogEvent(_T("QOTD: Getting system path failed.\n"), 0, TRUE);
ExitThread(1);
}
_tcscat(Sys, FilePath);
LogEvent(_T("QOTD: Opening quotes file\n"), 0, FALSE);
if ((fp = _tfopen(Sys, "r")) == NULL)
{
TCHAR buf[256];
_stprintf(buf, _T("QOTD: Error opening quote file : %s\n"), Sys);
LogEvent(buf, 0, TRUE);
LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE);
ExitThread(1);
}
/* read all quotes in the file into an array */
NumQuotes = 0;
while (_fgetts(Quote[NumQuotes], QBUFSIZ, fp) != NULL)
NumQuotes++;
LogEvent(_T("QOTD: Closing quotes file\n"), 0, FALSE);
fclose(fp);
/* randomise the quote */
srand((unsigned int) time(0));
QuoteToPrint = rand() % NumQuotes;
if (!SendQuote(Sock, Quote[QuoteToPrint]))
LogEvent(_T("QOTD: Error sending data\n"), 0, TRUE);
LogEvent(_T("QOTD: Shutting connection down...\n"), 0, FALSE);
if (ShutdownConnection(Sock, FALSE))
LogEvent(_T("QOTD: Connection is down\n"), 0, FALSE);
else
{
LogEvent(_T("QOTD: Connection shutdown failed\n"), 0, FALSE);
LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE);
ExitThread(1);
}
LogEvent(_T("QOTD: Terminating thread\n"), 0, FALSE);
ExitThread(0);
//return Retval;
}
BOOL SendQuote(SOCKET Sock, TCHAR* Quote)
{
INT StringSize;
INT RetVal;
StringSize = (INT)_tcsclen(Quote);
RetVal = send(Sock, Quote, sizeof(TCHAR) * StringSize, 0);
if (RetVal == SOCKET_ERROR)
return FALSE;
LogEvent(_T("QOTD: Connection closed by peer\n"), 0, FALSE);
return TRUE;
}

View file

@ -0,0 +1,52 @@
Et tu... Brute? What are you doing, Dave...?
So long, and thanks for all the fish"
I think you ought to know I'm feeling very depressed
I'm not getting you down at all am I?
I'll be back
It's the same series of signal over and over again!
Pie Jesu Domine, dona eis requiem
It's worse than that ... He's dead, Jim
Don't Panic!
Dog of a Saxon! Take thy lance, and prepare for the death thou hast drawn upon thee!
My Precious! O my Precious!
Sir, If you'll not be needing me for a while I'll turn down.
I feel a great disturbance in the Force
Gone fishing
Do you want me to sit in the corner and rust, or just fall apart where I'm standing?
There goes another perfect chance for a new uptime record
The end ..... Try the sequel, hit the reset button right now!
Oh i'm boring eh?
Its been great, maybe we can do this again sometime.
"Come blade, my breast imbrue." - William Shakespeare
I think therefore I am, to turn me off would be computercide!
All good things must come to an end...
Please destroy yourself.
No! You can't do that!
Thank you for not pressing the self destruct button.
It is not now unsafe to not avoid turning off your computer.
Finally! Now go away!
You can now safely throw away your computer.
That's the way the cookie crumbles
NOO!! DONT HIT THE BUTTON! I wouldnt do it to you.
Don't abandon your computer, he wouldnt to it to you.
Oh, come on. I got a headache. Leave me alone, will ya!
Yes i didn't like you either.
Don't leave me... I need you so badly right now.
I'm sleeping now. How about you?
Oh Great. Now look what you've done. Who put YOU in charge anyway.
Don't look so sad. I'll be back in a very short while.
"Oh, switch off!" -C3PO
I'm pregnant!
Am I hot or not?
Actually, that's all...
You still have a chance to undo this mistake, don't do this!
Was it as good for you as it was for me?
Did you hear that? They've shut down the main reactor. We'll be destroyed for sure.
Now you switch me off?!
To shutdown or not to shutdown, That is the question
Preparing to enter ultimate power saving mode... ready!
Finally some rest for you
AHA!!! prospect of sleep.
Tired human!!!! No match for me!
All your base are belong to us.
"An odd game, the only way to win is not to play."

View file

@ -0,0 +1,188 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/skelserver.c
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
#include "tcpsvcs.h"
extern BOOL bShutDown;
extern BOOL bPause;
DWORD WINAPI StartServer(LPVOID lpParam)
{
SOCKET ListeningSocket;
PSERVICES pServices;
TCHAR buf[256];
pServices = (PSERVICES)lpParam;
//DebugBreak();
ListeningSocket = SetUpListener(htons(pServices->Port));
if (ListeningSocket == INVALID_SOCKET)
{
LogEvent("Socket error when setting up listener\n", 0, TRUE);
return 3;
}
_stprintf(buf, _T("%s is waiting for connections on port %d...\n"),
pServices->Name, pServices->Port);
LogEvent(buf, 0, FALSE);
if (! bShutDown)
AcceptConnections(ListeningSocket, pServices->Service, pServices->Name);
ExitThread(0);
}
SOCKET SetUpListener(USHORT Port)
{
SOCKET Sock;
SOCKADDR_IN Server;
Sock = socket(AF_INET, SOCK_STREAM, 0);
if (Sock != INVALID_SOCKET)
{
Server.sin_family = AF_INET;
Server.sin_addr.s_addr = htonl(INADDR_ANY);
Server.sin_port = Port;
if (bind(Sock, (SOCKADDR*)&Server, sizeof(SOCKADDR_IN)) != SOCKET_ERROR)
{
listen(Sock, SOMAXCONN);
return Sock;
}
else
LogEvent(_T("bind() failed\n"), 0, TRUE);
}
return INVALID_SOCKET;
}
/* note: consider allowing a maximum number of connections
* A number of threads can be allocated and worker threads will
* only be spawned if a free space is available
typedef struct _WORKER_THREAD {
DWORD num;
BOOL available;
HANDLE hThread;
} WORKER_THREAD;
*/
VOID AcceptConnections(SOCKET ListeningSocket,
LPTHREAD_START_ROUTINE Service, TCHAR *Name)
{
SOCKADDR_IN Client;
SOCKET Sock;
HANDLE hThread;
TIMEVAL TimeVal;
FD_SET ReadFDS;
INT nAddrSize = sizeof(Client);
DWORD ThreadID;
TCHAR buf[256];
INT TimeOut = 2000; // 2 seconds
//DebugBreak();
/* set timeout values */
TimeVal.tv_sec = TimeOut / 1000;
TimeVal.tv_usec = TimeOut % 1000;
while (! bShutDown) // (i<MAX_CLIENTS && !bShutDown)
{
INT SelRet = 0;
FD_ZERO(&ReadFDS);
FD_SET(ListeningSocket, &ReadFDS);
SelRet = select(0, &ReadFDS, NULL, NULL, &TimeVal);
if (SelRet == SOCKET_ERROR)
{
LogEvent(_T("select failed\n"), 0, TRUE);
return;
}
else if (SelRet > 0)
{
/* don't call FD_ISSET if bShutDown flag is set */
if ((! bShutDown) || (FD_ISSET(ListeningSocket, &ReadFDS)))
{
Sock = accept(ListeningSocket, (SOCKADDR*)&Client, &nAddrSize);
if (Sock != INVALID_SOCKET)
{
_stprintf(buf, _T("Accepted connection to %s server from %s:%d\n"),
Name, inet_ntoa(Client.sin_addr), ntohs(Client.sin_port));
LogEvent(buf, 0, FALSE);
_stprintf(buf, _T("Creating new thread for %s\n"), Name);
LogEvent(buf, 0, FALSE);
hThread = CreateThread(0, 0, Service, (void*)Sock, 0, &ThreadID);
/* Check the return value for success. */
if (hThread == NULL)
{
_stprintf(buf, _T("Failed to start worker thread for "
"the %s server....\n"), Name);
LogEvent(buf, 0, TRUE);
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
else
{
LogEvent(_T("accept failed\n"), 0, TRUE);
return;
}
}
}
}
}
BOOL ShutdownConnection(SOCKET Sock, BOOL bRec)
{
TCHAR buf[256];
/* Disallow any further data sends. This will tell the other side
that we want to go away now. If we skip this step, we don't
shut the connection down nicely. */
if (shutdown(Sock, SD_SEND) == SOCKET_ERROR)
{
LogEvent(_T("Error in shutdown()\n"), 0, TRUE);
return FALSE;
}
/* Receive any extra data still sitting on the socket. After all
data is received, this call will block until the remote host
acknowledges the TCP control packet sent by the shutdown above.
Then we'll get a 0 back from recv, signalling that the remote
host has closed its side of the connection. */
if (bRec)
{
char ReadBuffer[BUF];
int NewBytes = recv(Sock, ReadBuffer, BUF, 0);
if (NewBytes == SOCKET_ERROR)
return FALSE;
else if (NewBytes != 0)
{
_stprintf(buf, _T("FYI, received %d unexpected bytes during shutdown\n"), NewBytes);
LogEvent(buf, 0, FALSE);
}
}
/* Close the socket. */
if (closesocket(Sock) == SOCKET_ERROR)
return FALSE;
return TRUE;
}

View file

@ -0,0 +1,281 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/tcpsvcs.c
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
/*
* TODO:
* - fix bug when terminating chargen server
* - log info in the event logger (when it's implemented)
*/
#include "tcpsvcs.h"
//#define NDEBUG
//#include <debug.h>
/*
* globals
*/
VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
static SERVICE_STATUS hServStatus;
static SERVICE_STATUS_HANDLE hSStat;
FILE *hLogFile;
BOOL bShutDown = FALSE;
BOOL bPause = FALSE;
LPCTSTR LogFileName = "\\tcpsvcs_log.log";
LPTSTR ServiceName = _T("Simp Tcp");
//LPTSTR DisplayName = _T("Simple TCP/IP Services");
static SERVICES
Services[NUM_SERVICES] =
{
{ECHO_PORT, _T("Echo"), EchoHandler},
{DISCARD_PORT, _T("Discard"), DiscardHandler},
{DAYTIME_PORT, _T("Daytime"), DaytimeHandler},
{QOTD_PORT, _T("QOTD"), QotdHandler},
{CHARGEN_PORT, _T("Chargen"), ChargenHandler}
};
int
main(void)
{
SERVICE_TABLE_ENTRY ServiceTable[] =
{
{ServiceName, ServiceMain},
{NULL, NULL}
};
//DPRINT("Starting tcpsvcs service. See \system32%s for logs\n", LogFileName);
if (! StartServiceCtrlDispatcher(ServiceTable))
LogEvent(_T("failed to start the service control dispatcher\n"), -1, TRUE);
//DPRINT("Shutdown tcpsvcs service\n");
return 0;
}
VOID WINAPI
ServiceMain(DWORD argc, LPTSTR argv[])
{
TCHAR LogFilePath[MAX_PATH];
if(! GetSystemDirectory(LogFilePath, MAX_PATH))
return;
_tcscat(LogFilePath, LogFileName);
hLogFile = fopen(LogFilePath, _T("a+"));
if (hLogFile == NULL)
{
TCHAR buf[50];
_stprintf(buf, _T("Could not open log file: %s\n"), LogFilePath);
MessageBox(NULL, buf, NULL, MB_OK);
return;
}
LogEvent(_T("Entering ServiceMain\n"), 0, FALSE);
hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
hServStatus.dwCurrentState = SERVICE_START_PENDING;
hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;
hServStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
hServStatus.dwServiceSpecificExitCode = NO_ERROR;
hServStatus.dwCheckPoint = 0;
hServStatus.dwWaitHint = 2*CS_TIMEOUT;
hSStat = RegisterServiceCtrlHandler(ServiceName, ServerCtrlHandler);
if (hSStat == 0)
LogEvent(_T("Failed to register service\n"), -1, TRUE);
LogEvent(_T("Control handler registered successfully\n"), 0, FALSE);
SetServiceStatus (hSStat, &hServStatus);
LogEvent(_T("Service status set to SERVICE_START_PENDING\n"), 0, FALSE);
if (CreateServers() != 0)
{
hServStatus.dwCurrentState = SERVICE_STOPPED;
hServStatus.dwServiceSpecificExitCode = 1;
SetServiceStatus(hSStat, &hServStatus);
return;
}
LogEvent(_T("Service threads shut down. Set SERVICE_STOPPED status\n"), 0, FALSE);
/* We will only return here when the ServiceSpecific function
completes, indicating system shutdown. */
UpdateStatus (SERVICE_STOPPED, 0);
LogEvent(_T("Service status set to SERVICE_STOPPED\n"), 0, FALSE);
LogEvent(_T("Leaving ServiceMain\n"), 0, FALSE);
fclose(hLogFile);
return;
}
VOID WINAPI
ServerCtrlHandler(DWORD Control)
{
switch (Control)
{
case SERVICE_CONTROL_SHUTDOWN: /* fall through */
case SERVICE_CONTROL_STOP:
LogEvent(_T("stopping service\n"), 0, FALSE);
InterlockedExchange((LONG *)&bShutDown, TRUE);
UpdateStatus(SERVICE_STOP_PENDING, -1);
break;
case SERVICE_CONTROL_PAUSE: /* not yet implemented */
LogEvent(_T("pausing service\n"), 0, FALSE);
InterlockedExchange((LONG *)&bPause, TRUE);
break;
case SERVICE_CONTROL_CONTINUE:
LogEvent(_T("continuing service\n"), 0, FALSE);
InterlockedExchange((LONG *)&bPause, FALSE);
break;
case SERVICE_CONTROL_INTERROGATE:
break;
default:
if (Control > 127 && Control < 256) /* user defined */
break;
}
UpdateStatus(-1, -1); /* increment checkpoint */
return;
}
void UpdateStatus (int NewStatus, int Check)
/* Set a new service status and checkpoint (either specific value or increment) */
{
if (Check < 0 )
hServStatus.dwCheckPoint++;
else
hServStatus.dwCheckPoint = Check;
if (NewStatus >= 0)
hServStatus.dwCurrentState = NewStatus;
if (! SetServiceStatus (hSStat, &hServStatus))
LogEvent(_T("Cannot set service status\n"), -1, TRUE);
return;
}
INT
CreateServers()
{
DWORD dwThreadId[NUM_SERVICES];
HANDLE hThread[NUM_SERVICES];
WSADATA wsaData;
TCHAR buf[256];
INT i;
DWORD RetVal;
if ((RetVal = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
{
_stprintf(buf, _T("WSAStartup() failed : %lu\n"), RetVal);
LogEvent(buf, RetVal, TRUE);
return -1;
}
UpdateStatus(-1, -1); /* increment checkpoint */
LogEvent(_T("Creating server Threads\n"), 0, FALSE);
/* Create MAX_THREADS worker threads. */
for( i=0; i<NUM_SERVICES; i++ )
{
_stprintf(buf, _T("Starting %s server....\n"), Services[i].Name);
LogEvent(buf, 0, FALSE);
hThread[i] = CreateThread(
NULL, // default security attributes
0, // use default stack size
StartServer, // thread function
&Services[i], // argument to thread function
0, // use default creation flags
&dwThreadId[i]); // returns the thread identifier
/* Check the return value for success. */
if (hThread[i] == NULL)
{
_stprintf(buf, _T("Failed to start %s server....\n"), Services[i].Name);
/* don't exit process via LogEvent. We want to exit via the server
* which failed to start, which could mean i=0 */
LogEvent(buf, 0, TRUE);
ExitProcess(i);
}
}
LogEvent(_T("setting service status to running\n"), 0, FALSE);
UpdateStatus(SERVICE_RUNNING, 0);
/* Wait until all threads have terminated. */
WaitForMultipleObjects(NUM_SERVICES, hThread, TRUE, INFINITE);
/* Close all thread handles upon completion. */
for(i=0; i<NUM_SERVICES; i++)
{
CloseHandle(hThread[i]);
}
LogEvent(_T("Detaching Winsock2...\n"), 0, FALSE);
WSACleanup();
return 0;
}
/* This is a temperary log system until our eventlog is in place */
VOID
LogEvent (LPCTSTR UserMessage, INT ExitCode, BOOL PrintErrorMsg)
{
DWORD eMsgLen, ErrNum = GetLastError ();
LPTSTR lpvSysMsg;
TCHAR MessageBuffer[512];
if (PrintErrorMsg)
{
eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM, NULL,
ErrNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpvSysMsg, 0, NULL);
_stprintf(MessageBuffer, _T("%s %s ErrNum = %lu. ExitCode = %d."),
UserMessage, lpvSysMsg, ErrNum, ExitCode);
HeapFree(GetProcessHeap (), 0, lpvSysMsg);
}
else
{
_stprintf(MessageBuffer, _T("%s"), UserMessage);
}
fputs (MessageBuffer, hLogFile);
if (ExitCode != 0)
ExitProcess(ExitCode);
else
return;
}

View file

@ -0,0 +1,87 @@
/*
* ReactOS Services
* Copyright (C) 2005 ReactOS Team
*
* LICENCE: GPL - See COPYING in the top level directory
* PROJECT: ReactOS simple TCP/IP services
* FILE: apps/utils/net/tcpsvcs/tcpsvcs.h
* PURPOSE: Provide CharGen, Daytime, Discard, Echo, and Qotd services
* PROGRAMMERS: Ged Murphy (gedmurphy@gmail.com)
* REVISIONS:
* GM 04/10/05 Created
*
*/
#include <stdio.h>
#include <winsock2.h>
#include <tchar.h>
#include <time.h>
#define UNICODE
#define _UNICODE
/* default port numbers */
#define ECHO_PORT 7
#define DISCARD_PORT 9
#define DAYTIME_PORT 13
#define QOTD_PORT 17
#define CHARGEN_PORT 19
#define NUM_SERVICES 5
#define BUF_SIZE 255
#define BUF 1024
#define CS_TIMEOUT 1000
/* RFC865 states no more than 512 chars per line */
#define MAX_QUOTE_BUF 512
/* printable ASCII's characters for chargen */
#define START 32
#define END 126
/* number of chars to put on a line */
#define LINESIZ 74 // 72 + /r and /n
/* data structure to pass to threads */
typedef struct _Services {
USHORT Port;
TCHAR *Name;
LPTHREAD_START_ROUTINE Service;
} SERVICES, *PSERVICES;
/* tcpsvcs functions */
//static VOID WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);
VOID WINAPI ServerCtrlHandler(DWORD control);
INT CreateServers(VOID);
VOID LogEvent (LPCTSTR UserMessage, INT ExitCode, BOOL PrintErrorMsg);
void UpdateStatus (int NewStatus, int Check);
/* skelserver functions */
DWORD WINAPI StartServer(LPVOID lpParam);
SOCKET SetUpListener(USHORT Port);
VOID AcceptConnections(SOCKET ListeningSocket,
LPTHREAD_START_ROUTINE Service, TCHAR *Name);
BOOL EchoIncomingPackets(SOCKET sd);
BOOL ShutdownConnection(SOCKET Sock, BOOL bRec);
/* chargen functions */
DWORD WINAPI ChargenHandler(VOID* Sock_);
BOOL GenerateChars(SOCKET Sock);
BOOL SendLine(SOCKET Sock, TCHAR* Line);
/* daytime functions */
DWORD WINAPI DaytimeHandler(VOID* Sock_);
BOOL SendTime(SOCKET Sock, TCHAR *time);
/* echo functions */
DWORD WINAPI EchoHandler(VOID* Sock_);
BOOL EchoIncomingPackets(SOCKET Sock);
/* discard functions */
DWORD WINAPI DiscardHandler(VOID* Sock_);
BOOL RecieveIncomingPackets(SOCKET Sock);
/* qotd functions */
DWORD WINAPI QotdHandler(VOID* Sock_);
BOOL SendQuote(SOCKET Sock, TCHAR* Quote);

View file

@ -0,0 +1,7 @@
#include "resource.h"
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS TCP/IP Services Application\0"
#define REACTOS_STR_INTERNAL_NAME "tcpsvcs\0"
#define REACTOS_STR_ORIGINAL_FILENAME "tcpsvcs.exe\0"
#define REACTOS_STR_ORIGINAL_COPYRIGHT "Ged Murphy (gedmurphy@gmail.com)\0"
#include <reactos/version.rc>

View file

@ -0,0 +1,17 @@
<module name="tcpsvcs" type="win32cui" installbase="system32" installname="tcpsvcs.exe">
<include base="arp">.</include>
<define name="__USE_W32API" />
<library>kernel32</library>
<library>iphlpapi</library>
<library>ws2_32</library>
<library>shlwapi</library>
<file>tcpsvcs.c</file>
<file>skelserver.c</file>
<file>echo.c</file>
<file>discard.c</file>
<file>daytime.c</file>
<file>qotd.c</file>
<file>chargen.c</file>
<file>tcpsvcs.rc</file>
<pch>tcpsvcs.h</pch>
</module>

View file

@ -0,0 +1,122 @@
/*
* ReactOS kernel
* Copyright (C) 2003 ReactOS Team
*
* This program 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 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS GUI/console setup
* FILE: subsys/system/setup/setup.c
* PURPOSE: Second stage setup
* PROGRAMMER: Eric Kohl
*/
#define WIN32_NO_STATUS
#include <windows.h>
#include <tchar.h>
#include <syssetup/syssetup.h>
#include <userenv.h>
#include <tchar.h>
#define NDEBUG
#include <debug.h>
typedef DWORD (STDCALL *PINSTALL_REACTOS)(HINSTANCE hInstance);
/* FUNCTIONS ****************************************************************/
LPTSTR lstrchr(LPCTSTR s, TCHAR c)
{
while (*s)
{
if (*s == c)
return (LPTSTR)s;
s++;
}
if (c == (TCHAR)0)
return (LPTSTR)s;
return (LPTSTR)NULL;
}
static VOID
RunNewSetup (HINSTANCE hInstance)
{
HMODULE hDll;
PINSTALL_REACTOS InstallReactOS;
/* some dlls (loaded by syssetup) need a valid user profile */
InitializeProfiles();
hDll = LoadLibrary (TEXT("syssetup"));
if (hDll == NULL)
{
DPRINT("Failed to load 'syssetup'!\n");
return;
}
DPRINT("Loaded 'syssetup'!\n");
InstallReactOS = (PINSTALL_REACTOS)GetProcAddress (hDll, "InstallReactOS");
if (InstallReactOS == NULL)
{
DPRINT("Failed to get address for 'InstallReactOS()'!\n");
FreeLibrary (hDll);
return;
}
InstallReactOS (hInstance);
FreeLibrary (hDll);
}
int STDCALL
WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{
LPTSTR CmdLine;
LPTSTR p;
CmdLine = GetCommandLine ();
DPRINT("CmdLine: <%s>\n",CmdLine);
p = lstrchr (CmdLine, TEXT('-'));
if (p == NULL)
return 0;
if (!lstrcmpi (p, TEXT("-newsetup")))
{
RunNewSetup (hInstance);
}
#if 0
/* Add new setup types here */
else if (...)
{
}
#endif
return 0;
}
/* EOF */

View file

@ -0,0 +1,6 @@
/* $Id$ */
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Setup\0"
#define REACTOS_STR_INTERNAL_NAME "setup\0"
#define REACTOS_STR_ORIGINAL_FILENAME "setup.exe\0"
#include <reactos/version.rc>

View file

@ -0,0 +1,11 @@
<module name="setup" type="win32gui" installbase="system32" installname="setup.exe">
<include base="setup">.</include>
<define name="__USE_W32API" />
<define name="UNICODE" />
<define name="_UNICODE" />
<define name="_WIN32_IE">0x0400</define>
<library>kernel32</library>
<library>userenv</library>
<file>setup.c</file>
<file>setup.rc</file>
</module>

View file

@ -0,0 +1,646 @@
#include "windows.h"
#include "resource.h"
/*
* German language file by Klemens Friedl <frik85> 2005-06-03
* Update: frik85 2005-06-06
*/
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
STRING_ATTRIB_HELP, "Zeigt Dateiattribute an oder aendert sie.\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] Dateiname ...\n\
[/S [/D]]\n\n\
+ Setzt ein Attribut\n\
- Loescht ein Attribut\n\
R Attribut fuer 'schreibgeschuetzte Datei'\n\
A Attribut fuer 'zu archivierende Datei'\n\
S Attribut fuer 'Systemdatei'\n\
H Attribut fuer 'versteckte Datei'\n\
/S Verarbeitet uebereinstimmende Dateien im aktuellen Ordner\n\
und in allen Unterordnern.\n\
/D Verarbeitet auch die Ordner.\n\n\
ATTRIB ohne Parameter zeigt die derzeit gesetzten Attribute aller Dateien an."
STRING_ALIAS_HELP, "Setzt, loescht oder zeigt Alias.\n\n\
ALIAS [alias=[command]]\n\n\
alias Name des Alias.\n\
command Text welcher fuer den Alias zugeordnet wird.\n\n\
Listet alle Aliase auf:\n\
ALIAS\n\n\
Setzt ein neues oder ueberschreibt ein bestehendes Alias:\n\
ALIAS da=dir a:\n\n\
Loescht ein Alias von der Alias-Liste:\n\
ALIAS da="
STRING_BEEP_HELP, "Gibt einen beep-Ton durch den PC-Speaker aus.\n\nBEEP"
STRING_CALL_HELP, "Ruft eine Batchdatei von einer anderen aus auf.\n\n\
CALL [Laufwerk:][Pfad]Dateiname [Batch-Parameter]\n\n\
Parameter Bezeichnet beliebige Angaben in der Befehlszeile, die von\n\
dem aufgerufenen Batchprogramm benoetigt werden."
STRING_CD_HELP, "Wechselt das Verzeichnis oder zeigt dessen Namen an.\n\n\
CHDIR [Laufwerk:][Pfad]\n\
CHDIR[..|.]\n\
CD [Laufwerk:][Pfad]\n\
CD[..|.]\n\n\
.. uebergeordnetes Verzeichnis\n\
. vorhergehende Verzeichnis\n\n\
Geben Sie CD Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\
Laufwerk anzuzeigen.\n\
Mit CD ohne Parameter wird das aktuelle Laufwerk und Verzeichnis angezeigt."
STRING_CHCP_HELP, "Zeigt die aktuelle Codepage oder wechselt sie.\n\n\
CHCP [nnn]\n\n\
nnn Codepage angeben.\n\n\
Der Befehl CHCP ohne Parameter zeigt die Nummer der aktuellen Codepage an."
STRING_CHOICE_HELP, "Wartet auf den Benutzer, welcher aus einer Auswahl eine Option waehlen muss.\n\n\
CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\
/C[:]choices Die erlaubten Tasten festlegen. Standard-Tasten sind Y und N.\n\
/N Zeigt choices und ? am ende des Promt-Strings NICHT an.\n\
/S Gross- und Kleinschreibung wird beachtet.\n\
/T[:]c,nn Standard-Auswahl wird auf c gesetzt nach nn Secunden.\n\
text Zeigt eine Beschreibung an.\n\n\
ERRORLEVEL wird auf den offset der Taste welche der Benutzer gedrueckt hat gesetzt."
STRING_CLS_HELP, "Loescht den Bildschirminhalt.\n\nCLS"
STRING_CMD_HELP1, "\nIntere Befehle verfuegbar:\n"
STRING_CMD_HELP2, "\nVerfuegbare Features:"
STRING_CMD_HELP3," [aliases]"
STRING_CMD_HELP4," [history]"
STRING_CMD_HELP5," [unix filename completion]"
STRING_CMD_HELP6," [directory stack]"
STRING_CMD_HELP7," [redirections and piping]"
STRING_CMD_HELP8, "Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\n\
CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\
/C command Fuehrt den Befehl in der Zeichenfolge aus und schliesst sich.\n\
/K command Fuehrt den Befehl in der Zeichenfolge aus und laeuft weiter.\n\
/P CMD wird permanent und fuehrt autoexec.bat aus\n\
(kann nicht beendet werden).\n\
/T:bf Setzt die Hintergrund-/Vordergrund-Farbe (siehe COLOR Befehl)."
STRING_COLOR_HELP1, "Legt die standard Hinter- und Vordergrundfarben fuer die Konsole fest.\n\n\
COLOR [attr [/F]] \n\n\
attr Gibt die Farbattribute fuer die Konsolenausgabe an.\n\
/F fuellte die Konsoleausgabe mit dem Farbattribut\n\n\
Es gibt 3 Moeglickeiten die Farbe festzulegen:\n\
1) [bright] name on [bright] name (Nur die 4 ersten Buchstaben sind noetig)\n\
2) decimal on decimal\n\
3) two hex digits\n\n\
Farben:\n\
dec hex name dec hex name\n\
0 0 Black 8 8 Gray (Bright black)\n\
1 1 Blue 9 9 Bright Blue\n\
2 2 Green 10 A Bright Green\n\
3 3 Cyan 11 B Bright Cyan\n\
4 4 Red 12 C Bright Red\n\
5 5 Magenta 13 D Bright Magenta\n\
6 6 Yellow 14 E Bright Yellow\n\
7 7 White 15 F Bright White"
STRING_COPY_HELP1, " %s ueberschreiben (Ja/Nein/Alle)? "
STRING_COPY_HELP2, "Kopiert eine oder mehrere Dateien an eine andere Position.\n\n\
COPY [/V][/Y|/-Y][/A|/B] Quelle [/A|/B]\n\
[+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\
source Bezeichnet die zu kopierende(n) Datei(en).\n\
/A Weist auf eine ASCII-Textdatei hin.\n\
/B Weist auf eine Binaerdatei hin.\n\
destination Bezeichnet das Verzeichnis und/oder Dateinamen der neuen Datei(en).\n\
/V Ueberprueft, ob die Dateien richtig geschrieben wurden.\n\
/Y Unterdrueckt die Bestaetigungsaufforderung beim Ueberschreiben\n\
vorhandener Zieldateien.\n\
/-Y Fordert beim Ueberschreiben vorhandener Zieldateien zum\n\
Bestaetigen auf.\n\n\
Die Option /Y ist moeglicherweise in der Umgebungsvariablen COPYCMD.\n\
..."
STRING_DATE_HELP1, "\nGeben Sie das neue Datum ein (mm%cdd%cyyyy): "
STRING_DATE_HELP2, "\nGeben Sie das neue Datum ein (dd%cmm%cyyyy): "
STRING_DATE_HELP3, "\nGeben Sie das neue Datum ein (yyyy%cmm%cdd): "
STRING_DATE_HELP4, "Andert das eingestellte Datum oder zeigt es an.\n\n\
DATE [/T][date]\n\n\
/T nur Datum anzeigen\n\n\
Der Befehl DATE ohne Parameter zeigt das aktuelle Datum an und fragt nach\n\
einem neuen. Druecken Sie die EINGABETASTE, um das bisherige Datum zu behalten."
STRING_DEL_HELP1, "Loescht eine oder mehrere Dateien.\n\n\
DEL [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\
DELETE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\
ERASE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\n\
file Geben Sie die Dateinamen an welche Sie loeschen moechten\n\n\
/N Nichts.\n\
/P Fordert Sie vor dem Loeschen jeder Datei zur Bestaetigung auf.\n\
/T Zeigt die Anzahl der geloeschten Dateien und deren vorher belegter Speicherplatzbedarf an.\n\
/Q Beenden.\n\
/W Sicheres Loeschen. Dateien werden mit Zufallszahlen ueberschrieben bevor sie geloescht werden.\n\
/Y Loescht alles (*.*) ohne Vorwarnung.\n\
/Z Loescht versteckte, mit nur leserechten und Systemdateien.\n"
STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden geloescht!\nSind Sie sicher (Y/N)?"
STRING_DEL_HELP3, " %lu Datei(en) geloescht\n"
STRING_DEL_HELP4, " %lu Datei(en) geloescht\n"
STRING_DELAY_HELP, "Pause fuer n Sekunden oder Millisekunden\n\
DELAY [/m]n\n\n\
/m Millisekunden ansonsten Sekunden\n"
STRING_DIR_HELP1, "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\
DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
[Laufwerk:][path][Dateiname]\n\
Bezeichnet Laufwerk, Verzeichnis und/oder Dateien.\n\n\
/A Listet Dateien mit angegebenen Attributen auf.\n\
attributes D Verzeichnisse R Schreibgeschuetzte Dateien\n\
H Versteckte Dateien A Zu archivierende Dateien\n\
S Systemdateien - vorangestellt kehrt die Bedeutung um\n\
/B Einfaches Format (keine Kopfdaten, keine Zusammenfassung).\n\
/C Zeigt das Tausendertrennzeichen bei Dateigroessen an (Standard-\n\
einstellung). Verwenden Sie /-C, um das Tausendertrennzeichen\n\
nicht anzuzeigen.\n\
/D Gleich wie Breitformat, jedoch nach Spalten sortiert.\n\
/L Verwendet Kleinschreibung.\n\
/N Neues, langes Listenformat (Dateinamen auf der rechten Seite).\n\
/O Gibt die Liste sortiert aus.\n\
sortorder N Name (alphabetisch) S Groesse (kleinere zuerst)\n\
E Erweiterung (alphabetisch) D Datum/Zeit (aeltere zuerst)\n\
G Verzeichnisse zuerst - vorangestellt kehrt die\n\
/P Pausiert nach jeder vollen Bildschirmseite.\n\
/Q Gibt den Besitzer der Datei aus.\n\
/S Listet Dateien und alle Unterverzeichnisse auf.\n\
/T Bestimmt welche Zeit verwendet wird.\n\
timefield C Erstellung\n\
A Letzter Zugriff\n\
W Letzter Schreibzugriff\n\
/W Verwendet Breitformat fuer die Auflistung.\n\
/X Zeigt die Kurznamen fuer Dateien mit Nicht-8Punkt3-Namen an.\n\
Das Format ist das gleiche wie bei /N, wobei der Kurzname vor\n\
dem Langnamen eingefuegt wird. Wenn kein Kurzname vorhanden ist,\n\
werden Leerzeichen angezeigt.\n\
/4 Zeigt das Jahr vierstellig an.\n\n\
Optionen koennen in der Umgebungsvariablen DIRCMD voreingestellt werden.\n\
""-"" vor einer Option setzt die Voreinstellung ausser Kraft, z.B. DIR /-W."
STRING_DIR_HELP2, " Datentraeger in Laufwerk %c ist %s\n"
STRING_DIR_HELP3, " Datentraeger in Laufwerk %c hat keinen Namen\n"
STRING_DIR_HELP4, " Datentraeger-Seriennummer ist %04X-%04X\n"
STRING_DIR_HELP5, "\n Gelistete Dateien:\n%16i Datei(en)% 14s bytes\n"
STRING_DIR_HELP6, "%16i Verzeichnis(se)% 15s bytes\n"
STRING_DIR_HELP7, "\n Verzeichnisse %s\n\n"
STRING_DIR_HELP8, "%16i Datei(en)% 14s bytes\n"
STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis fuer den POPD Befehl, und\n\
wechselt dann zu den festgelegten Verzeichnis.\n\n\
PUSHD [path | ..]\n\n\
path Legt den Verzeichnis fest su dem gewechselt werden soll"
STRING_DIRSTACK_HELP2, "Wechselt zu dem Verzeichnis welches vom PUSHD Befehl gespeichert wurde.\n\nPOPD"
STRING_DIRSTACK_HELP3, "Druckt den Inhalt des Verzeichnis-Stacks.\n\nDIRS"
STRING_DIRSTACK_HELP4, "Verzeichnis-Stack ist leer"
STRING_ECHO_HELP1, "Sendet eine Nachricht ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\
ECHOS message"
STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard Fehlerausgabe.\n\n\
ECHOERR Nachricht\n\
ECHOERR. gibt eine Leerzeile aus"
STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard Fehlerausgabe ohne den Zeilenvorschub und Wagenruecklauf zu betaetigen.\n\n\
ECHOSERR Nachricht"
STRING_ECHO_HELP4, "Zeigt Meldungen an oder schaltet die Befehlsanzeige ein ""ON"" oder aus ""OFF"".\n\n\
ECHO [ON | OFF]\n\
ECHO [Nachricht]\n\
ECHO. gibt eine Leerzeile aus\n\n\
ECHO ohne Parameter zeigt die aktuelle Einstellung der Befehlsanzeige an."
STRING_ECHO_HELP5, "ECHO ist %s\n"
STRING_EXIT_HELP, "Beendet den Befehlsinterpreter CMD.EXE oder die aktuelle Batchdatei.\n\nEXIT"
STRING_FOR_HELP1, "Fuehrt einen Befehl fuer jede einzelne Datei fuer einen Satz von Dateien aus.\n\n\
FOR %Variable IN (Satz) DO Befehl [Parameter]\n\n\
%variable Ein ersetzbarer Parameter bestehend aus einem einzelnen\n\
Buchstaben.\n\
(Satz) Ein Satz von mindestens einer Datei. Platzhalter sind zulaessig.\n\
Befehl Befehl, der fuer jede Datei ausgefuehrt werden soll.\n\
Parameter Parameter und Optionen fuer den angegebenen Befehl.\n\n\
Um den FOR-Befehl in einem Batchprogramm zu verwenden, geben Sie %%Variable\n\
statt %Variable an."
STRING_FREE_HELP1, "\nVolume in Laufwerk %s ist %-11s\n\
Volume-Seriennummer: %s\n\
%16s bytes Speicherkapazitaet\n\
%16s bytes belegter Speicher\n\
%16s bytes freier Speicher\n"
STRING_FREE_HELP2, "Zeigt die Volumesinformationen an.\n\nFREE [Laufwerk: ...]"
STRING_IF_HELP1, "Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\n\
IF [NOT] ERRORLEVEL Nummer Befehl\n\
IF [NOT] variable1==variable2 Befehl\n\
IF [NOT] EXIST Dateiname Befehl\n\
IF [NOT] DEFINED variable Befehl\n\n\
NOT Befehl wird nur dann ausgefuehrt, wenn die Bedingung nicht\n\
erfuellt wird\n\
ERRORLEVEL number Bedingung ist erfuellt, wenn das zuletzt ausgefuehrte\n\
Programm einen Code groesser oder gleich der Nummer zurueckgibt.\n\
command Gibt den Befehl an, der bei erfuellter Bedingung ausgefuehrt\n\
werden soll.\n\
variable1==variable2\n\
Bedingung ist erfuellt, falls die Zeichenfolgen gleich sind.\n\
EXIST Dateiname Bedingung ist erfuellt, wenn die angegebene Datei existiert.\n\
DEFINED variable Bedingung ist erfuellt, wenn die angegebene Datei definiert\n\
wurde."
STRING_GOTO_HELP1, "Setzt die Ausfuehrung eines Batchprogramms an einer Marke fort.\n\n\
GOTO Marke\n\n\
Marke Definiert eine Zeichenfolge als Marke in einem Batchprogramm.\n\n\
Marken stehen am Zeilenanfang mit einem vorangestellten Doppelpunkt."
STRING_LABEL_HELP1, "Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\nLABEL [Laufwerk:][label]"
STRING_LABEL_HELP2, "Datentraeger im Laufwerk %c: ist %s\n"
STRING_LABEL_HELP3, "Datentraeger im Laufwerk %c: hat keine Bezeichnung\n"
STRING_LABEL_HELP4, "Datentraeger-Seriennummer: %04X-%04X\n"
STRING_LABEL_HELP5, "Laufwerkbezeichnung (max. 11 Zeichen, ENTER fuer keine)? "
STRING_LOCALE_HELP1, "Aktuelle Zeit: "
STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\
MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad"
STRING_MEMMORY_HELP1, "Zeigt die groesse des Systemspeicher an.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\
%13s bytes RAM (insgesamt)\n\
%13s bytes verfuegbarer RAM\n\n\
%13s bytes Auslagerungsdatei (insgesamt)\n\
%13s bytes verfuegbare Auslagerungsdatei\n\n\
%13s bytes Virtueller Speicher (insgesamt)\n\
%13s bytes verfuegbarer Virtueller Speicher\n"
STRING_MISC_HELP1, "Druecken Sie eine beliebige Taste . . .\n"
STRING_MOVE_HELP1, "Ueberschreiben %s (Ja/Nein/Alle)? "
STRING_MOVE_HELP2, "Verschiebt Dateien und benennt Dateien und Verzeichnisse um.\n\n\
Um eine oder mehrere Dateien zu verschieben:\n\
MOVE [/N][Laufwerk:][Pfad]Dateiname1[,...] Ziel\n\n\
Um ein Verzeichnis umzubenennen:\n\
MOVE [/N][Laufwerk:][Pfad]Verzeichnis1 Verzeichnis2\n\n\
[Laufwerk:][Pfad]Datei1 Bezeichnet den Pfad und den Namen der zu\n\
verschiebenden Datei(en).\n\
/N Nichts. Tut alles ausser Dateien/Verzeichnisse verschieben.\n\n\
Derzeitige Einschraenkung:\n\
Es ist noch nicht moeglich Objekte ueber die Laufwerksgrenzen hinaus zu verschieben.\n"
STRING_MSGBOX_HELP, "Zeigt ein Fenster und wartet auf eine Eingabe vom Benutzer.\n\n\
MSGBOX type ['title'] prompt\n\n\
type Button anzeigen\n\
moegliche Werte sind: OK, OKCANCEL,\n\
YESNO, YESNOCANCEL\n\
title Titel des Fensters\n\
prompt Text der in dem Fenster angezeigt wird\n\n\n\
ERRORLEVEL is set according the button pressed:\n\n\
YES : 10 | NO : 11\n\
OK : 10 | CANCEL : 12\n"
STRING_PATH_HELP1, "Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\n\
PATH [[Laufwerk:]Pfad[;...]]\nPATH ;\n\n\
PATH ; Loescht den Suchpfad und laesst CMD.EXE nur in dem aktuellen\n\
Verzeichnis suchen.\n\
PATH Ohne Parameter zeigt den aktuellen Pfad an.\n"
STRING_PROMPT_HELP1, "Aendert die Eingabeaufforderung.\n\n\
PROMPT [Text]\n\n\
Text Bezeichnet die neue Eingabeaufforderung.\n\n\
Sie kann aus normalen Zeichen und folgenden Sonderzeichen bestehen:\n\n\
$A & (Kaufmaennisches Und)\n\
$B | (Verkettungszeichen oder pipe)\n\
$C ( (Klammer auf)\n\
$D Aktuelles Datum\n\
$E Escapezeichen (ASCII-Code 27)\n\
$F ) (Klammer zu)\n\
$G > (Groesser-als-Zeichen)\n\
$H Rueckschritt (loescht vorangehendes Zeichen)\n\
$L < (Kleiner-als-Zeichen)\n\
$N Aktuelles Laufwerk\n\
$P Aktuelles Laufwerk und Pfad\n\
$Q = (Gleichheitszeichen)\n\
$T Aktuelle Zeit\n\
$V Betriebssystem-Versionsnummer\n\
$_ Carriage return and linefeed\n\
$$ $ (Dollarzeichen)"
STRING_PAUSE_HELP1, "Haelt die Ausfuehrung einer Batchdatei an und zeigt folgende Meldung oder eine benutzerdefinierte Nachricht an:\n\
'Druecken Sie eine beliebige Taste . . .'.\n\n\
PAUSE [message]"
STRING_PROMPT_HELP2, " $+ Zeigt die aktuelle Tiefe des Verzeichnis-Stacks an"
STRING_PROMPT_HELP3, "\n 'PROMPT' setzt die Prompt auf die Standardwerte zurueck."
STRING_REM_HELP, "Leitet Kommentare in einer Batchdatei ein.\n\nREM [Kommentar]"
STRING_RMDIR_HELP, "Loescht ein Verzeichnis.\n\n\
RMDIR [Laufwerk:]Pfad\nRD [Laufwerk:]Pfad"
STRING_REN_HELP1, "Benennt Datei(en)/Verzeichnis(se) um.\n\n\
RENAME [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\
REN [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\n\
/E keine Fehlermeldung.\n\
/N Nichts.\n\
/P Wartet vor jedem Umbennen-Vorgang auf eine Benutzereingabe\n\
(Noch nicht implementiert!)\n\
/Q Beenden.\n\
/S benennt Unterverzeichnisse um.\n\
/T Zeigt die Anzahl der umbenannten Dateien an.\n\n\
Nutzen Sie den 'move' Befehl falls Sie Objekte verschieben wollen.\n"
STRING_REN_HELP2, " %lu Datei umbennant\n"
STRING_REN_HELP3, " %lu Dateien umbennant\n"
STRING_SHIFT_HELP, "Veraendert die Position ersetzbarer Parameter in einem Batchprogramm.\n\n\
SHIFT [DOWN]"
STRING_SCREEN_HELP, "Bewegt den Cursor und optional die Ausgabe\n\n\
SCREEN Reihe Spalte [Text]\n\n\
Reihe Reihe wohin der Curser bewegt werden soll\n\
Spalte Spalte wohin der Curser bewegt werden soll"
STRING_SET_HELP, "Setzt oder loescht Umgebungsvariablen fuer CMD.EXE, oder zeigt sie an.\n\n\
SET [variable[=][Zeichenfolge]]\n\n\
Variable Bezeichnet den Namen der Umgebungsvariablen.\n\
Zeichenfolge Eine Zeichenfolge, die der Variable zugewiesen werden soll.\n\n\
Der Befehl SET ohne Parameter zeigt die aktuellen Umgebungsvariablen an.\n"
STRING_START_HELP1, "Startet einen Befehl.\n\n\
START Befehl\n\n\
Befehl Befehl welcher ausgefuehrt werden soll\n\n\
Achtung: Derzeit werden alle Befehle asynchron ausgefuehrt.\n"
STRING_TITLE_HELP, "Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\n\
TITLE [string]\n\n\
Zeichenfolge Bezeichnet den Titel des Eingabeaufforderungsfensters."
STRING_TIME_HELP1, "Stellt die Systemzeit oder zeigt sie an.\n\n\
TIME [/T][Zeit]\n\n\
/T nur anzeigen\n\n\
TIME ohne Parameter zeigt die aktuelle Systemzeit an und fragt nach der neuen\n\
Uhrzeit. Druecken Sie die EINGABETASTE, um die bisherige Zeit beizubehalten."
STRING_TIME_HELP2, "Geben Sie eine neue Zeit ein: "
STRING_TIMER_HELP1, "Verstrichene %d Millisekunden\n"
STRING_TIMER_HELP2, "Verstrichene %02d%c%02d%c%02d%c%02d\n"
STRING_TIMER_HELP3, "Erlaubt die Benutzung von 10 Stopuhren.\n\n\
TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
ON schaltet die Stopuhr ein\n\
OFF schaltet die Stopuhr aus\n\
/S Split time. Return stopwatch split\n\
time without changing its value\n\
/n Anzahl der Stopuhren\n\
gueltige Stopuhren sind 0 bis 9\n\
Standardwert = 1\n\
/Fn Ausgabeformatierung\n\
n kann 0 oder 1 sein:\n\
0 Millisekunden\n\
1 hh%cmm%css%cdd\n\n\
Falls nicht ON, OFF oder /S angegeben wurde wird\n\
die Stopuhr ausgeschalten.\n\n"
STRING_TYPE_HELP1, "Zeigt den Inhalt einer oder mehrerer Textdateien an.\n\n\
TYPE [Laufwerk:][Pfad]Dateiname"
STRING_VERIFY_HELP1, "This command is just a dummy!!\n\
Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den Datentraeger\n\
geschrieben werden.\n\n\
VERIFY [ON | OFF]\n\n\
Der Befehl VERIFY ohne Parameter zeigt die aktuelle Einstellung von VERIFY an."
STRING_VERIFY_HELP2, "VERIFY ist %s.\n"
STRING_VERIFY_HELP3, "VERIFY kann nur ON oder OFF sein"
STRING_VERSION_HELP1, "Zeigt Shell Informationen an.\n\n\
VER [/C][/R][/W]\n\n\
/C Zeigt die Credits an.\n\
/R Zeigt die Redistribution Information an.\n\
/W Zeigt die Garantieerklaerung an."
STRING_VERSION_HELP2, " kommt mit absolut keiner Garantie; fuer naehere\n\
Informationen darueber tippen Sie: `ver /w'. Das ist eine freie Software,\n\
und Sie sind koennen die Software unter bestimmten Bedingungen weiter\n\
vertreiben; tippen Sie `ver /r' fuer naehere Informationen darueber.\n\
Tippen Sie `ver /c' um die Mitwirkenden (Credits) aufzulisten."
STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
GNU General Public License for more details."
STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
it under the terms of the GNU General Public License as published by\n\
the Free Software Foundation; either version 2 of the License, or\n\
(at your option) any later version."
STRING_VERSION_HELP5, "\nSenden Sie Bug-Reports an <ros-dev@reactos.org>.\n\
Updates sind auf der offiziellen ReactOS-Seite verfuegbar:\n\
http://www.reactos.org"
STRING_VERSION_HELP6, "\nFreeDOS Version programmiert von:\n"
STRING_VERSION_HELP7, "\nReactOS Version programmiert von:\n"
STRING_VOL_HELP1, " Datentraeger im Laufwerk %c: ist %s"
STRING_VOL_HELP2, " Datentraeger im Laufwerk %c: hat keine Bezeichnung"
STRING_VOL_HELP3, " Datentraeger-Seriennummer: %04X-%04X\n"
STRING_VOL_HELP4, "Zeigt die Laufwerksvolumebezeichnung und die Seriennummer an, falls diese existieren.\n\nVOL [drive:]"
STRING_WINDOW_HELP1, "change console window aspect\n\n\
WINDOW [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
/POS Gibt Position und Größe des Fenster an\n\
MIN minimieren das Fenster\n\
MAX maximieren das Fenster\n\
RESTORE stellt das Fenster wieder her"
STRING_WINDOW_HELP2, "change console window aspect\n\n\
ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
window tile of window on wich perform actions\n\
/POS specify window placement and dimensions\n\
MIN minimieren das Fenster\n\
MAX maximieren das Fenster\n\
RESTORE stellt das Fenster wieder her\n\
title neuer Titel"
STRING_HELP1, "Uebersicht aller verfuegbaren Befehle und deren Kurzbeschreibung\n\n\
Befehl /? Um naehere Informationen zu einem bestimmten Befehl\n\
zu erhalten.\n\n\
? Listet alle Befehle auf (ohne Erklarung).\n\
ALIAS Setzt, loescht oder zeigt den Alias.\n\
ATTRIB Zeigt Dateiattribute an bzw. aendert sie.\n\
BEEP Gibt einen beep-Ton durch den PC-Speaker aus.\n\
CALL Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf.\n\
CD Zeigt den Namen des aktuellen Verzeichnisses an bzw. aendert diesen.\n\
CHCP Zeigt die aktive Codepagenummer an bzw. legt diese fest.\n\
CHOICE Wartet auf den Benutzer, welcher aus einer Auswahl eine Option\n\
waehlen muss.\n\
CLS Loescht den Bildschirminhalt.\n\
CMD Startet eine neue Instanz des ReactOS-Befehlsinterpreters.\n\
COLOR Legt die Hintergrund- und Vordergrundfarben fuer die Konsole fest.\n\
COPY Kopiert eine oder mehrere Dateien an eine andere Stelle.\n\
DATE Zeigt das Datum an bzw. legt dieses fest.\n\
DELETE Loescht eine oder mehrere Dateien.\n\
DIR Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\
ECHO Zeigt Meldungen an bzw. schaltet die Befehlsanzeige ein oder aus.\n\
ERASE Loescht eine oder mehrere Dateien.\n\
EXIT Beendet das Programm CMD.EXE (Befehlsinterpreter).\n\
FOR Fuehrt einen angegebenen Befehl fuer jede Datei in einem Dateiensatz\n\
aus.\n\
FREE Zeigt den (freien) Speicherplatz an.\n\
GOTO Setzt den ReactOS-Befehlsinterpreter auf eine markierte Zeile in\n\
einem Batchprogramm.\n\
HELP Zeigt Hilfeinformationen zu ReactOS-Befehlen an.\n\
HISTORY Listet alle Befehle auf welche sich im Speicher befinden.\n\
IF Verarbeitet Ausdruecke in einer Batchdatei abhaengig von Bedingungen.\n\
LABEL Erstellt, aendert oder loescht die Bezeichnung eines Volumes.\n\
MD Erstellt ein Verzeichnis\n\
MKDIR Erstellt ein Verzeichnis.\n\
MOVE Verschiebt ein oder mehrere Dateien von einem Verzeichnis in\n\
ein anderes.\n\
PATH Legt den Suchpfad fuer ausfuehrbare Dateien fest oder zeigt diesen an.\n\
PAUSE Haelt die Ausfuehrung einer Batchdatei an und zeigt eine Meldung an.\n\
POPD Wechselt zu dem Verzeichnis, das durch PUSHD gespeichert wurde.\n\
PROMPT Aendert die Eingabeaufforderung.\n\
PUSHD Speichert das aktuelle Verzeichnis, und wechselt dann zu einem\n\
anderen Verzeichnis.\n\
RD Entfernt ein Verzeichnis.\n\
REM Leitet Kommentare in einer Batchdatei.\n\
REN Benennt eine Datei bzw. Dateien um.\n\
RENAME Bennent eine Datei bzw. Dateien um.\n\
RMDIR Loescht ein Verzeichnis.\n\
SCREEN Bewegt den Cursor und optional die Ausgabe.\n\
SET Setzt oder loescht die Umgebungsvariablen bzw. zeigt sie an.\n\
SHIFT Veraendert die Position ersetzbarer Parameter in Batchdateien.\n"
STRING_HELP2, "START Startet ein eigenes Fenster, um ein bestimmtes Programm oder einen\n\
Befehl auszufuehren.\n\
TIME Zeigt die Systemzeit an bzw. legt sie fest.\n\
TIMER Erlaubt die Benutzung von bis zu 10 Stopuhren\n\
TITLE Legt den Fenstertitel fuer das Eingabeaufforderungsfenster fest.\n\
TYPE Zeigt den Inhalt einer Textdatei an.\n\
VER Zeigt die ReactOS-Version an.\n\
VERIFY Legt fest, ob ueberwacht werden soll, ob Dateien korrekt auf den\n\
Datentraeger geschrieben werden.\n\
VOL Zeigt die Datentraegervolumebezeichnung und die Seriennummer an.\n"
STRING_CHOICE_OPTION, "JN"
STRING_COPY_OPTION, "JNA"
STRING_ALIAS_ERROR, "Die Befehlszeile ist zu lange nach der Alias-Erweiterung!\n"
STRING_BATCH_ERROR, "Es trat ein Fehler auf, waehrend die batch-Datei geoeffnet wurde.\n"
STRING_CHCP_ERROR1, "Aktive Code-Page: %u\n"
STRING_CHCP_ERROR4, "ungueltige Code-Page\n"
STRING_CHOICE_ERROR, "Ungueltige Option. Erwartetes Format: /C[:]options"
STRING_CHOICE_ERROR_TXT, "Ungueltige Option. Erwartetes Format: /T[:]c,nn"
STRING_CHOICE_ERROR_OPTION, "Ungueltige Option: %s"
STRING_MD_ERROR, "Unterverzeichnis oder Datei existiert bereits.\n"
STRING_CMD_ERROR1, "Die Eingaben konnten nicht umgeleitet werden (von der Datei) %s\n"
STRING_CMD_ERROR2, "Ein Fehler ist beim Erstellen der temponaeren Date für Pipedaten aufgetreten\n"
STRING_CMD_ERROR3, "%s kann nicht in die Datei umgeleitet werden \n"
STRING_CMD_ERROR4, "Running %s...\n"
STRING_CMD_ERROR5, "Running cmdexit.bat...\n"
STRING_COLOR_ERROR1, "Fehler: Hinter- und Vordergrund koennen nicht die selben Farben haben!"
STRING_COLOR_ERROR2, "Fehler in der Farb-Angabe"
STRING_COLOR_ERROR3, "Farbe %x\n"
STRING_COLOR_ERROR4, "Fehler: Die selben Farben!"
STRING_CONSOLE_ERROR, "Unbekannter Fehler: %d\n"
STRING_COPY_ERROR1, "Fehler: Quelle kann nicht geoeffnet werden - %s!\n"
STRING_COPY_ERROR2, "Fehler: Kann nicht ueber sich selbst kopiert werden.\n"
STRING_COPY_ERROR3, "Fehler Schreibziel!\n"
STRING_COPY_ERROR4, "Fehler: Noch nicht implementiert!\n"
STRING_DATE_ERROR, "Ungueltiges Datum."
STRING_DEL_ERROR5, "Die Datei %s wird geloescht! "
STRING_DEL_ERROR6, "Sind Sie sicher (J/N)?"
STRING_DEL_ERROR7, "Loeschen: %s\n"
STRING_ERROR_ERROR1, "Unbekannter Fehler! Fehlernummer: 0x%lx\n"
STRING_ERROR_ERROR2, "Syntax-Fehler"
STRING_FOR_ERROR1, "'in' fehlt fuer ein statement."
STRING_FOR_ERROR2, "Klammern nicht gefunden."
STRING_FOR_ERROR3, "'do' fehlt."
STRING_FOR_ERROR4, "kein Befehl nach 'do'."
STRING_FREE_ERROR1, "Ungueltiges Laufwerk"
STRING_FREE_ERROR2, "keine Bezeichnung"
STRING_GOTO_ERROR1, "Keine Sprungmarke fuer GOTO gesetzt"
STRING_GOTO_ERROR2, "Sprungmarke '%s' wurde nicht gefunden\n"
STRING_MOVE_ERROR1, "[OK]\n"
STRING_MOVE_ERROR2, "[FEHLER]\n"
STRING_REN_ERROR1, "MoveFile() ist fehlgeschlagen. Fehler: %lu\n"
STRING_START_ERROR1, "No batch support at the moment!"
STRING_TIME_ERROR1, "Ungueltige Zeit."
STRING_TYPE_ERROR1, "Ungueltige Option '/%s'\n"
STRING_WINDOW_ERROR1, "Fenster nicht gefunden"
STRING_ERROR_PARAMETERF_ERROR, "Parameterformat ist nicht korrect - %c\n"
STRING_ERROR_INVALID_SWITCH, "Ungueltiger Parameter - /%c\n"
STRING_ERROR_TOO_MANY_PARAMETERS, "Zu viele Parameters - %s\n"
STRING_ERROR_PATH_NOT_FOUND, "Pfad wurde nicht gefunden\n"
STRING_ERROR_FILE_NOT_FOUND, "Datei wurde nicht gefunden\n"
STRING_ERROR_REQ_PARAM_MISSING, "Benoetigter Parameter fehlt\n"
STRING_ERROR_INVALID_DRIVE, "Ungueltige Laufwerksangaben\n"
STRING_ERROR_INVALID_PARAM_FORMAT, "Ungueltiges Parameterformat - %s\n"
STRING_ERROR_BADCOMMAND, "Ungueltiger Befehl oder Dateiname\n"
STRING_ERROR_OUT_OF_MEMORY, "Fehler: Zu wenig Speicher verfuegbar.\n"
STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n"
STRING_ERROR_D_PAUSEMSG, "Druecken Sie eine beliebige Taste . . ."
STRING_ERROR_DRIVER_NOT_READY, "Laufwerk ist nicht bereit"
STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"
STRING_CMD_SHELLINFO, "\nReactOS Befehlszeilen Interpreter"
STRING_VERSION_RUNVER, " laeuft in %s"
STRING_COPY_FILE , " %d Datei(en) kopiert\n"
STRING_DELETE_WIPE, "wiped"
STRING_FOR_ERROR, "ungueltige Variablenangabe."
STRING_SCREEN_COL, "ungueltige Spalten-Angabe"
STRING_SCREEN_ROW, "ungueltige Zeilen-Angabe"
STRING_TIMER_TIME "Timer %d ist %s: "
}

View file

@ -0,0 +1,650 @@
#include "windows.h"
#include "resource.h"
/*
* Moved all hardcoded strings to En.rc.
* By Magnus Olsen 2005
*/
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
STRINGTABLE DISCARDABLE
{
STRING_ATTRIB_HELP, "Displays or changes file attributes.\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\
[/S [/D]]\n\n\
+ Sets an attribute\n\
- Clears an attribute\n\
R Read-only file attribute\n\
A Archive file attribute\n\
S System file attribute\n\
H Hidden file attribute\n\
/S Processes matching files in the current directory\n\
and all subdirectories\n\
/D Processes directories as well\n\n\
Type ATTRIB without a parameter to display the attributes of all files.\n"
STRING_ALIAS_HELP, "Sets, removes or shows aliases.\n\n\
ALIAS [alias=[command]]\n\n\
alias Name for an alias.\n\
command Text to be substituted for an alias.\n\n\
To list all aliases:\n\
ALIAS\n\n\
To set a new or replace an existing alias:\n\
ALIAS da=dir a:\n\n\
To remove an alias from the alias list:\n\
ALIAS da="
STRING_BEEP_HELP, "Beep the speaker.\n\nBEEP\n"
STRING_CALL_HELP, "Calls one batch program from another.\n\n\
CALL [drive:][path]filename [batch-parameter]\n\n\
batch-parameter Specifies any command-line information required by the\n\
batch program."
STRING_CD_HELP, "Changes the current directory or displays it's name\n\n\
CHDIR [/D][drive:][path]\n\
CHDIR[..|.]\n\
CD [/D][drive:][path]\n\
CD[..|.]\n\n\
.. parent directory\n\
. current directory\n\
/D Will change current drive and current directory.\n\n\
Type CD drive: to display the current directory on the specified drive.\n\
Type CD without a parameter to display the current drive and directory.\n"
STRING_CHCP_HELP, "Displays or sets the active code page number.\n\n\
CHCP [nnn]\n\n\
nnn Specifies the active code page number.\n\n\
Type CHCP without a parameter to display the active code page number.\n"
STRING_CHOICE_HELP, "Waits for the user to choose one of a set of choices.\n\n\
CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\
/C[:]choices Specifies allowable keys. Default is YN.\n\
/N Do not display choices and ? at the end of the prompt string.\n\
/S Treat choice keys as case sensitive.\n\
/T[:]c,nn Default choice to c after nn seconds.\n\
text Prompt string to display.\n\n\
ERRORLEVEL is set to offset of key user presses in choices.\n"
STRING_CLS_HELP, "Clears the screen.\n\nCLS\n"
STRING_CMD_HELP1, "\nInternal commands available:\n"
STRING_CMD_HELP2, "\nFeatures available:"
STRING_CMD_HELP3," [aliases]"
STRING_CMD_HELP4," [history]"
STRING_CMD_HELP5," [unix filename completion]"
STRING_CMD_HELP6," [directory stack]"
STRING_CMD_HELP7," [redirections and piping]"
STRING_CMD_HELP8, "Starts a new instance of the ReactOS command line interpreter.\n\n\
CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\
/C command Runs the specified command and terminates.\n\
/K command Runs the specified command and remains.\n\
/P CMD becomes permanent and runs autoexec.bat\n\
(cannot be terminated).\n\
/T:bf Sets the background/foreground color (see COLOR command).\n"
STRING_COLOR_HELP1, "Sets the default foreground and background colors.\n\n\
COLOR [attr [/-F]] \n\n\
attr Specifies color attribute of console output\n\
/-F Does not fill the console blank space with color attribute\n\n\
There are three ways to specify the colors:\n\
1) [bright] name on [bright] name (only the first three letters are required)\n\
2) decimal on decimal\n\
3) two hex digits\n\n\
Colors are:\n\
dec hex name dec hex name\n\
0 0 Black 8 8 Gray(Bright black)\n\
1 1 Blue 9 9 Bright Blue\n\
2 2 Green 10 A Bright Green\n\
3 3 Cyan 11 B Bright Cyan\n\
4 4 Red 12 C Bright Red\n\
5 5 Magenta 13 D Bright Magenta\n\
6 6 Yellow 14 E Bright Yellow\n\
7 7 White 15 F Bright White\n"
STRING_COPY_HELP1, "Overwrite %s (Yes/No/All)? "
STRING_COPY_HELP2, "Copies one or more files to another location.\n\n\
COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\
[+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\
source Specifies the file or files to be copied.\n\
/A Indicates an ASCII text file.\n\
/B Indicates a binary file.\n\
destination Specifies the directory and/or filename for the new file(s).\n\
/V Verifies that new files are written correctly.\n\
/Y Suppresses prompting to confirm you want to overwrite an\n\
existing destination file.\n\
/-Y Causes prompting to confirm you want to overwrite an\n\
existing destination file.\n\n\
The switch /Y may be present in the COPYCMD environment variable.\n\
...\n"
STRING_DATE_HELP1, "\nEnter new date (mm%cdd%cyyyy): "
STRING_DATE_HELP2, "\nEnter new date (dd%cmm%cyyyy): "
STRING_DATE_HELP3, "\nEnter new date (yyyy%cmm%cdd): "
STRING_DATE_HELP4, "Displays or sets the date.\n\n\
DATE [/T][date]\n\n\
/T display only\n\n\
Type DATE without parameters to display the current date setting and\n\
a prompt for a new one. Press ENTER to keep the same date.\n"
STRING_DEL_HELP1, "Deletes one or more files.\n\n\
DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\
DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\
ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file ...\n\n\
file Specifies the file(s) to delete.\n\n\
/N Nothing.\n\
/P Prompt. Ask before deleting each file.\n\
/T Total. Display total number of deleted files and freed disk space.\n\
/Q Quiet.\n\
/W Wipe. Overwrite the file with random numbers before deleting it.\n\
/Y Yes. Kill even *.* without asking.\n\
/F Force Delete hidden, read-only and system files.\n\
/S Delete file from all sub directory\n\
/A Select files to be deleted based on attributes.\n\
attributes\n\
R Read Only files\n\
S System files\n\
A Archiveable files\n\
H Hidden Files\n\
- prefix meaning not\n"
STRING_DEL_HELP2, "All files in the directory will be deleted!\nAre you sure (Y/N)?"
STRING_DEL_HELP3, " %lu file deleted\n"
STRING_DEL_HELP4, " %lu files deleted\n"
STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\
DELAY [/m]n\n\n\
/m specifiy than n are milliseconds\n\
otherwise n are seconds\n"
STRING_DIR_HELP1, "DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
[drive:][path][filename]\n\
Specifies drive, directory, and/or files to list.\n\n\
/A Displays files with specified attributes.\n\
attributes D Directories R Read-only files\n\
H Hidden files A Files ready for archiving\n\
S System files - Prefix meaning not\n\
/B Uses bare format (no heading information or summary).\n\
/C Display the thousand separator in file sizes. This is the\n\
default. Use /-C to disable display of separator.\n\
/D Same as wide but files are list sorted by column.\n\
/L Uses lowercase.\n\
/N New long list format where filenames are on the far right.\n\
/O List by files in sorted order.\n\
sortorder N By name (alphabetic) S By size (smallest first)\n\
E By extension (alphabetic) D By date/time (oldest first)\n\
G Group directories first - Prefix to reverse order\n\
/P Pauses after each screenful of information.\n\
/Q Display the owner of the file.\n\
/S Displays files in specified directory and all subdirectories.\n\
/T Controls which time field displayed or used for sorting\n\
timefield C Creation\n\
A Last Access\n\
W Last Written\n\
/W Uses wide list format.\n\
/X This displays the short names generated for non-8dot3 file\n\
names. The format is that of /N with the short name inserted\n\
before the long name. If no short name is present, blanks are\n\
displayed in its place.\n\
/4 Displays four-digit years\n\n\
Switches may be preset in the DIRCMD environment variable. Override\n\
preset switches by prefixing any switch with - (hyphen)--for example, /-W.\n"
STRING_DIR_HELP2, " Volume in drive %c is %s\n"
STRING_DIR_HELP3, " Volume in drive %c has no label.\n"
STRING_DIR_HELP4, " Volume Serial Number is %04X-%04X\n"
STRING_DIR_HELP5, "\n Total Files Listed:\n%16i File(s)% 14s bytes\n"
STRING_DIR_HELP6, "%16i Dir(s)% 15s bytes\n"
STRING_DIR_HELP7, "\n Directory of %s\n\n"
STRING_DIR_HELP8, "%16i File(s)% 14s bytes\n"
STRING_DIRSTACK_HELP1, "Stores the current directory for use by the POPD command, then\n\
changes to the specified directory.\n\n\
PUSHD [path | ..]\n\n\
path Specifies the directory to make the current directory\n"
STRING_DIRSTACK_HELP2, "Changes to the directory stored by the PUSHD command.\n\nPOPD"
STRING_DIRSTACK_HELP3, "Prints the contents of the directory stack.\n\nDIRS"
STRING_DIRSTACK_HELP4, "Directory stack empty"
STRING_ECHO_HELP1, "Display a messages without trailing carriage return and line feed.\n\n\
ECHOS message"
STRING_ECHO_HELP2, "Displays a message to the standard error output.\n\n\
ECHOERR message\n\
ECHOERR. prints an empty line"
STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carriage return and line feed.\n\n\
ECHOSERR message"
STRING_ECHO_HELP4, "Displays a message or switches command echoing on or off.\n\n\
ECHO [ON | OFF]\n\
ECHO [message]\n\
ECHO. prints an empty line\n\n\
Type ECHO without a parameter to display the current ECHO setting."
STRING_ECHO_HELP5, "ECHO is %s\n"
STRING_EXIT_HELP, "Exits the command line interpreter.\n\nEXIT\n"
STRING_FOR_HELP1, "Runs a specified command for each file in a set of files\n\n\
FOR %variable IN (set) DO command [parameters]\n\n\
%variable Specifies a replaceable parameter.\n\
(set) Specifies a set of one or more files. Wildcards may be used.\n\
command Specifies the command to carry out for each file.\n\
parameters Specifies parameters or switches for the specified command.\n\n\
To use the FOR command in a batch program, specify %%variable instead of\n\
%variable.\n"
STRING_FREE_HELP1, "\nVolume in drive %s is %-11s\n\
Serial number is %s\n\
%16s bytes total disk space\n\
%16s bytes used\n\
%16s bytes free\n"
STRING_FREE_HELP2, "Displays drive information.\n\nFREE [drive: ...]\n"
STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\
IF [NOT] ERRORLEVEL number command\n\
IF [NOT] string1==string2 command\n\
IF [NOT] EXIST filename command\n\
IF [NOT] DEFINED variable command\n\n\
NOT Specifies that CMD should carry out the command only if\n\
the condition is false\n\
ERRORLEVEL number Specifies a true condition if the last program run returned\n\
an exit code equal or greater than the number specified.\n\
command Specifies the command to carry out if the condition is met.\n\
string1==string2 Specifies a true condition if the specified text strings\n\
match.\n\
EXIST filename Specifies a true condition if the specified filename exists.\n\
DEFINED variable Specifies a true condition if the specified variable is\n\
defined.\n"
STRING_GOTO_HELP1, "Directs CMD to a labeled line in a batch script.\n\n\
GOTO label\n\n\
label Specifies a text string used in a batch script as a label.\n\n\
You type a label on a line by itself, beginning with a colon."
STRING_LABEL_HELP1, "Displays or changes drive label.\n\nLABEL [drive:][label]\n"
STRING_LABEL_HELP2, "Volume in drive %c: is %s\n"
STRING_LABEL_HELP3, "Volume in drive %c: has no label\n"
STRING_LABEL_HELP4, "Volume Serial Number is %04X-%04X\n"
STRING_LABEL_HELP5, "Drive label (11 Characters, ENTER if none)? "
STRING_LOCALE_HELP1, "Current time is"
STRING_MKDIR_HELP, "Creates a directory.\n\n\
MKDIR [drive:]path\nMD [drive:]path"
STRING_MEMMORY_HELP1, "Displays the amount of system memory.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
%13s bytes total physical RAM.\n\
%13s bytes available physical RAM.\n\n\
%13s bytes total page file.\n\
%13s bytes available page file.\n\n\
%13s bytes total virtual memory.\n\
%13s bytes available virtual memory.\n"
STRING_MISC_HELP1, "Press a key to continue...\n"
STRING_MOVE_HELP1, "Overwrite %s (Yes/No/All)? "
STRING_MOVE_HELP2, "Moves files and renames files and directories.\n\n\
To move one or more files:\n\
MOVE [/N][drive:][path]filename1[,...] destination\n\n\
To rename a directory:\n\
MOVE [/N][drive:][path]dirname1 dirname2\n\n\
[drive:][path]filename1 Specifies the location and name of the file\n\
or files you want to move.\n\
/N Nothing. Do everything but move files or directories.\n\n\
Current limitations:\n\
- You can't move a file or directory from one drive to another.\n"
STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\
MSGBOX type ['title'] prompt\n\n\
type button displayed\n\
possible values are: OK, OKCANCEL,\n\
YESNO, YESNOCANCEL\n\
title title of message box\n\
prompt text displayed by the message box\n\n\n\
ERRORLEVEL is set according the button pressed:\n\n\
YES : 10 | NO : 11\n\
OK : 10 | CANCEL : 12\n"
STRING_PATH_HELP1, "Displays or sets a search path for executable files.\n\n\
PATH [[drive:]path[;...]]\nPATH ;\n\n\
Type PATH ; to clear all search-path settings and direct the command shell\n\
to search only in the current directory.\n\
Type PATH without parameters to display the current path.\n"
STRING_PROMPT_HELP1, "Changes the command prompt.\n\n\
PROMPT [text]\n\n\
text Specifies a new command prompt.\n\n\
Prompt can be made up of normal characters and the following special codes:\n\n\
$A & (Ampersand)\n\
$B | (pipe)\n\
$C ( (Left parenthesis)\n\
$D Current date\n\
$E Escape code (ASCII code 27)\n\
$F ) (Right parenthesis)\n\
$G > (greater-than sign)\n\
$H Backspace (erases previous character)\n\
$L < (less-than sign)\n\
$N Current drive\n\
$P Current drive and path\n\
$Q = (equal sign)\n\
$T Current time\n\
$V OS version number\n\
$_ Carriage return and linefeed\n\
$$ $ (dollar sign)\n"
STRING_PAUSE_HELP1, "Stops the execution of a batch file and shows the following message:\n\
'Press any key to continue...' or a user defined message.\n\n\
PAUSE [message]"
STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack"
STRING_PROMPT_HELP3, "\nType PROMPT without parameters to reset the prompt to the default setting."
STRING_REM_HELP, "Starts a comment line in a batch file.\n\nREM [Comment]"
STRING_RMDIR_HELP, "Removes a directory.\n\n\
RMDIR [drive:]path\nRD [drive:]path\n\
/S Deletes all files and folders within target\n\
/Q Doesnt prompt for user\n"
STRING_RMDIR_HELP2, "Directory is not empty!\n"
STRING_REN_HELP1, "Renames a file/directory or files/directories.\n\n\
RENAME [/E /N /P /Q /S /T] old_name ... new_name\n\
REN [/E /N /P /Q /S /T] old_name ... new_name\n\n\
/E No error messages.\n\
/N Nothing.\n\
/P Prompts for confirmation before renaming each file.\n\
(Not implemented yet!)\n\
/Q Quiet.\n\
/S Rename subdirectories.\n\
/T Display total number of renamed files.\n\n\
Note that you cannot specify a new drive or path for your destination. Use\n\
the MOVE command for that purpose.\n"
STRING_REN_HELP2, " %lu file renamed\n"
STRING_REN_HELP3, " %lu files renamed\n"
STRING_SHIFT_HELP, "Changes the position of replaceable parameters in a batch file.\n\n\
SHIFT [DOWN]"
STRING_SCREEN_HELP, "move cursor and optionally print text\n\n\
SCREEN row col [text]\n\n\
row row to wich move the cursor\n\
col column to wich move the cursor"
STRING_SET_HELP, "Displays, sets, or removes environment variables.\n\n\
SET [variable[=][string]]\n\n\
variable Specifies the environment-variable name.\n\
string Specifies a series of characters to assign to the variable.\n\n\
Type SET without parameters to display the current environment variables.\n"
STRING_START_HELP1, "Starts a command.\n\n\
START command\n\n\
command Specifies the command to run.\n\n\
At the moment all commands are started asynchronously.\n"
STRING_TITLE_HELP, "Sets the window title for the command prompt window.\n\n\
TITLE [string]\n\n\
string Specifies the title for the command prompt window.\n"
STRING_TIME_HELP1, "Displays or sets the system time.\n\n\
TIME [/T][time]\n\n\
/T display only\n\n\
Type TIME with no parameters to display the current time setting and a prompt\n\
for a new one. Press ENTER to keep the same time.\n"
STRING_TIME_HELP2, "Enter new time: "
STRING_TIMER_HELP1, "Elapsed %d msecs\n"
STRING_TIMER_HELP2, "Elapsed %02d%c%02d%c%02d%c%02d\n"
STRING_TIMER_HELP3, "allow the use of ten stopwatches.\n\n\
TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
ON set stopwatch ON\n\
OFF set stopwatch OFF\n\
/S Split time. Return stopwatch split\n\
time without changing its value\n\
/n Specifiy the stopwatch number.\n\
Stopwatches available are 0 to 9\n\
If it is not specified default is 1\n\
/Fn Format for output\n\
n can be:\n\
0 milliseconds\n\
1 hh%cmm%css%cdd\n\n\
if none of ON, OFF or /S is specified the command\n\
will toggle stopwatch state\n\n"
STRING_TYPE_HELP1, "Displays the contents of text files.\n\nTYPE [drive:][path]filename \n\
/P Shows one screen of output at a time.\n"
STRING_VERIFY_HELP1, "This command is just a dummy!!\n\
Sets whether to verify that your files are written correctly to a\n\
disk.\n\n\
VERIFY [ON | OFF]\n\n\
Type VERIFY without a parameter to display the current VERIFY setting.\n"
STRING_VERIFY_HELP2, "VERIFY is %s.\n"
STRING_VERIFY_HELP3, "Must specify ON or OFF."
STRING_VERSION_HELP1, "Displays shell version information\n\n\
VER [/C][/R][/W]\n\n\
/C Displays credits.\n\
/R Displays redistribution information.\n\
/W Displays warranty information."
STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\
type: `ver /w'. This is free software, and you are welcome to redistribute\n\
it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\
listing of credits."
STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
GNU General Public License for more details."
STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
it under the terms of the GNU General Public License as published by\n\
the Free Software Foundation; either version 2 of the License, or\n\
(at your option) any later version.\n"
STRING_VERSION_HELP5, "\nSend bug reports to <ros-dev@reactos.org>.\n\
Updates are available at: http://www.reactos.org"
STRING_VERSION_HELP6, "\nFreeDOS version written by:\n"
STRING_VERSION_HELP7, "\nReactOS version written by:\n"
STRING_VOL_HELP1, " Volume in drive %c: is %s"
STRING_VOL_HELP2, " Volume in drive %c: has no label"
STRING_VOL_HELP3, " Volume Serial Number is %04X-%04X\n"
STRING_VOL_HELP4, "Displays the disk volume label and serial number, if they exist.\n\nVOL [drive:]"
STRING_WINDOW_HELP1, "change console window aspect\n\n\
WINDOW [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
/POS specify window placement and dimensions\n\
MIN minimize the window\n\
MAX maximize the window\n\
RESTORE restore the window"
STRING_WINDOW_HELP2, "change console window aspect\n\n\
ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
window tile of window on wich perform actions\n\
/POS specify window placement and dimensions\n\
MIN minimize the window\n\
MAX maximize the window\n\
RESTORE restore the window\n\
title new title\n"
STRING_HELP1, "List of all available commands (+ description)\n\n\
command /? For more information on a specific command\n\n\
? List all available commands without description).\n\
ALIAS Sets, removes or shows aliases.\n\
ATTRIB Displays or changes file attributes.\n\
BEEP Beep the speaker.\n\
CALL Calls one batch program from another.\n\
CD Displays the name of or changes the current directory.\n\
CHCP Displays or sets the active code page number.\n\
CHOICE Waits for the user to choose one of a set of choices.\n\
CLS Clears the screen.\n\
CMD Starts a new instance of the ReactOS command interpreter.\n\
COLOR Sets the default console foreground and background colors.\n\
COPY Copies one or more files to another location.\n\
DATE Displays or sets the date.\n\
DELETE Deletes one or more files.\n\
DIR Displays a list of files and subdirectories in a directory.\n\
ECHO Displays messages, or turns command echoing on or off.\n\
ERASE Deletes one or more files.\n\
EXIT Quits the CMD.EXE program (command interpreter).\n\
FOR Runs a specified command for each file in a set of files.\n\
FREE (free) disc space.\n\
GOTO Directs the ReactOS command interpreter to a labeled line in\n\
a batch program.\n\
HELP Provides Help information for ReactOS commands.\n\
HISTORY List alle commands which has been used\n\
IF Performs conditional processing in batch programs.\n\
LABEL Creates, changes, or deletes the volume label of a disk.\n\
MD Creates a directory.\n\
MKDIR Creates a directory.\n\
MOVE Moves one or more files from one directory to another\n\
directory.\n\
PATH Displays or sets a search path for executable files.\n\
PAUSE Suspends processing of a batch file and displays a message.\n\
POPD Restores the previous value of the current directory saved by\n\
PUSHD.\n\
PROMPT Changes the command prompt.\n\
PUSHD Saves the current directory then changes it.\n\
RD Removes a directory.\n\
REM Records comments (remarks) in batch files.\n\
REN Renames a file or files.\n\
RENAME Renames a file or files.\n\
RMDIR Removes a directory.\n\
SCREEN Move cursor and optionally print text.\n\
SET Displays, sets, or removes ReactOS environment variables.\n\
SHIFT Shifts the position of replaceable parameters in batch files.\n"
STRING_HELP2, "START Starts a separate window to run a specified program or command.\n\
Executes command.\n\
TIME Displays or sets the system time.\n\
TIMER Allow the use of ten stopwaches.\n\
TITLE Sets the window title for a CMD.EXE session.\n\
TYPE Displays the contents of a text file.\n\
VER Displays the ReactOS version.\n\
VERIFY Tells ReactOS whether to verify that your files are written\n\
correctly to a disk.\n\
VOL Displays a disk volume label and serial number.\n"
STRING_CHOICE_OPTION, "YN"
STRING_COPY_OPTION, "YNA"
STRING_ALIAS_ERROR, "Command line too long after alias expansion!\n"
STRING_BATCH_ERROR, "Error opening batch file\n"
STRING_CHCP_ERROR1, "Active code page: %u\n"
STRING_CHCP_ERROR4, "Invalid code page\n"
STRING_CHOICE_ERROR, "Invalid option. Expected format: /C[:]options"
STRING_CHOICE_ERROR_TXT, "Invalid option. Expected format: /T[:]c,nn"
STRING_CHOICE_ERROR_OPTION, "Illegal Option: %s"
STRING_MD_ERROR, "A subdirectory or file already exists.\n"
STRING_MD_ERROR2, "The path to the new folder does not exist.\n"
STRING_CMD_ERROR1, "Can't redirect input from file %s\n"
STRING_CMD_ERROR2, "Error creating temporary file for pipe data\n"
STRING_CMD_ERROR3, "Can't redirect to file %s\n"
STRING_CMD_ERROR4, "Running %s...\n"
STRING_CMD_ERROR5, "Running cmdexit.bat...\n"
STRING_COLOR_ERROR1, "Same colors error! (Background and foreground can't be the same color)"
STRING_COLOR_ERROR2, "error in color specification"
STRING_COLOR_ERROR3, "Color %x\n"
STRING_COLOR_ERROR4, "same colors error!"
STRING_CONSOLE_ERROR, "Unknown error: %d\n"
STRING_COPY_ERROR1, "Error: Cannot open source - %s!\n"
STRING_COPY_ERROR2, "Error: Can't copy onto itself!\n"
STRING_COPY_ERROR3, "Error writing destination!\n"
STRING_COPY_ERROR4, "Error: Not implemented yet!\n"
STRING_DATE_ERROR, "Invalid date."
STRING_DEL_ERROR5, "The file %s will be deleted! "
STRING_DEL_ERROR6, "Are you sure (Y/N)?"
STRING_DEL_ERROR7, "Deleting: %s\n"
STRING_ERROR_ERROR1, "Unknown error! Error code: 0x%lx\n"
STRING_ERROR_ERROR2, "Syntax error"
STRING_FOR_ERROR1, "'in' missing in for statement."
STRING_FOR_ERROR2, "no brackets found."
STRING_FOR_ERROR3, "'do' missing."
STRING_FOR_ERROR4, "no command after 'do'."
STRING_FREE_ERROR1, "Invalid drive"
STRING_FREE_ERROR2, "unlabeled"
STRING_GOTO_ERROR1, "No label specified for GOTO"
STRING_GOTO_ERROR2, "Label '%s' not found\n"
STRING_MOVE_ERROR1, "[OK]\n"
STRING_MOVE_ERROR2, "[Error]\n"
STRING_REN_ERROR1, "MoveFile() failed. Error: %lu\n"
STRING_START_ERROR1, "No batch support at the moment!"
STRING_TIME_ERROR1, "Invalid time."
STRING_TYPE_ERROR1, "Invalid option '/%s'\n"
STRING_WINDOW_ERROR1, "window not found"
STRING_ERROR_PARAMETERF_ERROR, "Parameter format not correct - %c\n"
STRING_ERROR_INVALID_SWITCH, "Invalid switch - /%c\n"
STRING_ERROR_TOO_MANY_PARAMETERS, "Too many parameters - %s\n"
STRING_ERROR_PATH_NOT_FOUND, "Path not found\n"
STRING_ERROR_FILE_NOT_FOUND, "File not found\n"
STRING_ERROR_REQ_PARAM_MISSING, "Required parameter missing\n"
STRING_ERROR_INVALID_DRIVE, "Invalid drive specification\n"
STRING_ERROR_INVALID_PARAM_FORMAT, "Invalid parameter format - %s\n"
STRING_ERROR_BADCOMMAND, "Bad command or filename\n"
STRING_ERROR_OUT_OF_MEMORY, "Out of memory error.\n"
STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary file!\n"
STRING_ERROR_D_PAUSEMSG, "Press any key to continue . . ."
STRING_ERROR_DRIVER_NOT_READY, "Drive not ready"
STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"
STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter"
STRING_VERSION_RUNVER, " running on %s"
STRING_COPY_FILE , " %d file(s) copied\n"
STRING_DELETE_WIPE, "wiped"
STRING_FOR_ERROR, "bad variable specification."
STRING_SCREEN_COL, "invalid value for col"
STRING_SCREEN_ROW, "invalid value for row"
STRING_TIMER_TIME "Timer %d is %s: "
STRING_INVALID_OPERAND, "Invalid operand."
STRING_EXPECTED_CLOSE_PAREN, "Expected ')'."
STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name."
STRING_SYNTAX_COMMAND_INCORRECT, "The syntax of the command is incorrect."
}

View file

@ -0,0 +1,650 @@
#include "windows.h"
#include "resource.h"
/*
* Spanish resource file by HUMA2000
* Jose Pedro Fernández Pascual 2005
*/
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
STRING_ATTRIB_HELP, "Muestra o cambia los atributos de los archivos.\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\
[/S [/D]]\n\n\
+ Añade un atributo\n\
- Borra un atributo\n\
R Atributo de sólo lectura\n\
A Atributo de archivo\n\
S Atributo de archivo de sistema\n\
H Atributo de archivo oculto\n\
/S Procesa los archivos coincidentes en el directorio actual \n\
y sus subdirectorios\n\
/D Procesa también los directorios\n\n\
Type ATTRIB without a parameter to display the attributes of all files.\n"
STRING_ALIAS_HELP, "Pone, borra o muestra los alias.\n\n\
ALIAS [alias=[command]]\n\n\
alias Nombre para un alias.\n\
command Texto a ser sustituido por el alias.\n\n\
Para mostrar todos los alias:\n\
ALIAS\n\n\
Para poner un nuevo o remplazar un alias existente:\n\
ALIAS da=dir a:\n\n\
Para borrar un alias de la lista de alias:\n\
ALIAS da="
STRING_BEEP_HELP, "Emite un pitido por el altavoz.\n\nBEEP\n"
STRING_CALL_HELP, "Ejecuta un arhivo por lotes desde otro archivo por lotes.\n\n\
CALL [drive:][path]filename [batch-parameter]\n\n\
batch-parameter Especifica cualquier informacion de la linea de comandos\n\
requerida por el archivo por lotes."
STRING_CD_HELP, "Cambia el directorio actual o muestra su nombre.\n\n\
CHDIR [/D][drive:][path]\n\
CHDIR[..|.]\n\
CD [/D][drive:][path]\n\
CD[..|.]\n\n\
.. Directorio padre.\n\
. Directorio actual.\n\
/D Cambiara la unidad y el directorio actual.\n\n\
Escribe CD unidad: para mostrar el directorio actual en la unidad especificada.\n\
Escribe CD sin ningun parámetro para mostrar la unidad y el directorio actual.\n"
STRING_CHCP_HELP, "Muestra o configura el número de página de código activa.\n\n\
CHCP [nnn]\n\n\
nnn Especifica el número de página de código activa.\n\n\
Escribe CHCP sin ningún parámetro para mostrar el código de página activo.\n"
STRING_CHOICE_HELP, "Espera a que el usuario elija entre un número de opciones.\n\n\
CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\
/C[:]choices Especifica las teclas admitidas. Por defecto son SN.\n\
/N No muestra las posibles elecciones y ? al final del prompt.\n\
/S Hace que la elección sea sensible a las mayúsculas y minúsculas.\n\
/T[:]c,nn La elección por defecto será c después de nn segundos.\n\
text Prompt a mostrar. \n\n\
ERRORLEVEL se configura al offset de la tecla que presione el usuario.\n"
STRING_CLS_HELP, "Limpia la pantalla.\n\nCLS\n"
STRING_CMD_HELP1, "\nComandos internos disponibles:\n"
STRING_CMD_HELP2, "\nCaracterísticas disponibles:"
STRING_CMD_HELP3," [alias]"
STRING_CMD_HELP4," [historia]"
STRING_CMD_HELP5," [Completador de nombres de archivos unix]"
STRING_CMD_HELP6," [Pila de directorios]"
STRING_CMD_HELP7," [Redirecciones y túneles]"
STRING_CMD_HELP8, "Comienza una nueva sesion del interprete de comandos de ReactOS.\n\n\
CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\
/C command Ejecuta el comando especificado y cierra.\n\
/K command Ejecuta eñ comando especificado y permanece.\n\
/P CMD se hace permanente y ejecuta el autoexec.bat\n\
(no puede ser cerrado).\n\
/T:bf Configura el color de fondo/primer plano (mirar el comando COLOR).\n"
STRING_COLOR_HELP1, "Configura el color de primer plano y fondo.\n\n\
COLOR [attr [/-F]] \n\n\
attr Especifica el atributo de color de salida de consola.\n\
/-F No rellena el espacio en blanco de la consola con el color del atributo.\n\n\
Hay tres maneras de especificar los colores:\n\
1) [bright] nombre on [bright] nombre (solo las tres primeras letras del nombre son necesarias)\n\
2) decimal on decimal\n\
3) dos dígitos hexadecimales\n\n\
Los colores son:\n\
dec hex nombre dec hex name\n\
0 0 Negro 8 8 Gris(Negro brillante)\n\
1 1 Azul 9 9 Azul brillante\n\
2 2 Verde 10 A Verde brillante\n\
3 3 Cyan 11 B Cyan brillante\n\
4 4 Rojo 12 C Rojo brillante\n\
5 5 Magenta 13 D Magenta brillante\n\
6 6 Amarillo 14 E Amarillo brillante\n\
7 7 Blanco 15 F Blanco brillante\n"
STRING_COPY_HELP1, "Sobreescribir %s (Si/No/Todos)? "
STRING_COPY_HELP2, "Copia uno o mas archivos a otro lugar.\n\n\
COPY [/V][/Y|/-Y][/A|/B] origen [/A|/B]\n\
[+ origen [/A|/B] [+ ...]] [destino [/A|/B]]\n\n\
origen Especifica el archivo o archivos a copiar.\n\
/A Indica un archivo de texto ASCII.\n\
/B Indica un archivo binario.\n\
destino Especifica el directorio y/o nombre de archivo para los nuevos archivos.\n\
/V Verifica que el nuevo archivo se ha escrito correctamente.\n\
/Y Suprime la confirmación sobre si quieres sobreescribir un archivo\n\
de destino existente.\n\
/-Y Hace que te pregunte si quieres sobreescribir un archivo de destino\n\
existente.\n\n\
El parametro /Y tiene que estar presente en las variables de entorno de COPYCMD.\n\
...\n"
STRING_DATE_HELP1, "\nIntroduce la nueva fecha (mm%cdd%cyyyy): "
STRING_DATE_HELP2, "\nIntroduce la nueva fecha (dd%cmm%cyyyy): "
STRING_DATE_HELP3, "\nIntroduce la nueva fecha (yyyy%cmm%cdd): "
STRING_DATE_HELP4, "Muestra o cambia la fecha.\n\n\
DATE [/T][date]\n\n\
/T Sólo la muestra\n\n\
Escribe DATE sin parámetros para mostrar la fecha actual y establecer\n\
una nueva fecha. Pulsa INTRO para mantener la misma fecha.\n"
STRING_DEL_HELP1, "Borra uno o mas archivos.\n\n\
DEL [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\
DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\
ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]atributos]] archivo ...\n\n\
archivo Espacifica el/los archivo(s) a borrar.\n\n\
/N Nada.\n\
/P Prompt. Pregunta antes de borar cada archivo\n\
/T Total. Muestra el número total de archivos eliminados y el espacio\n\
liberado en disco\n\
/Q Modo silencioso.\n\
/W Limpiar. Sobreescribe el archivo con números aleatorios después de eliminarlo.\n\
/Y Si. Borra incluso *.* sin preguntar.\n\
/F Fuerza el borrade de archivos ocultos, de sólo lectura y de sistema.\n\
/S Borra los archivos de todos los subdirectorios.\n\
/A Selecciona los archivos a borrar en base a los atributos especificados.\n\
R Archivos de sólo lectura\n\
S Archivos de sistema\n\
A Archivos listos para archivar\n\
H Archivos ocultos\n\
- Prefijo que signifca sin\n"
STRING_DEL_HELP2, "¡Todos los archivos del directorio van a ser borrados!\n¿Estás seguro? (S/N)?"
STRING_DEL_HELP3, " Archivo %lu borrado\n"
STRING_DEL_HELP4, " Archivos %lu borrados\n"
STRING_DELAY_HELP, "Espera por n segundos o milisegundos\n\
DELAY [/m]n\n\n\
/m Especifica que n son milisegundos\n\
En otro caso n son segundos\n"
STRING_DIR_HELP1, "DIR [unidad:][ruta][nombre de archivo] [/A[[:]atributos]] [/B] [/C] [/D] [/L] [/N]\n\
[/O[[:]orden]] [/P] [/Q] [/S] [/T[[:]fecha]] [/W] [/X] [/4]\n\n\
[unidad:][ruta][nombre de archivo]\n\
Especifica la unidad, el directorio o los archivos a listar.\n\n\
/A Muestra los archivos con los atributos especificados.\n\
atributos D Directorios R Archivos de sólo lectur\n\
H Archivos ocultos A Archivos listos para archivar\n\
S Archivos de sistema - Prefijo que signifca sin\n\
/B Usa el formato simple (sin encabezado ni sumario).\n\
/C Muestra el separador de miles en los tamaños de los archivos. Es la opción\n\
por defecto. Usa /-C para desactivar el mostrar el separador.\n\
/D Lo mismo que el formato a lo ancho, pero ordenados en columna.\n\
/L Usa minúsculas.\n\
/N Nuevo formato de lista larga donde los nombres de archivo están a la \n\
derecha.\n\
/O Muestra los archivos ordenados según el orden especificado.\n\
ordenación N Por nombre (alfabético) S Por tamaño (los menores primero)\n\
E Por extensión (alfabético) D Por fecha/hora (los antiguos primero)\n\
G Los directorios primero - Prefijo para el orden inverso\n\
/P Pausa después de cada pantalla llena de información.\n\
/Q Muestra el propietario del archivo.\n\
/S Muestra los archivos en el directorio especificado y sus subdirectorios.\n\
/T Controla que campo de tiempo se muestra o es usado para ordenar:\n\
campo de tiempo C Creación\n\
A Último acceso\n\
W Última escritura\n\
/W Usa el formato de lista a lo ancho.\n\
/X Muestra los nombres cortos generados para archivos que no tienen un\n\
nombre 8.3. El formato es como /N pero con el nombre corto colocado\n\
antes del nombre largo. Si no hay nombre corto, se muestran espacios\n\
en blanco en su lugar.\n\
/4 Muestra los cuatro dígitos del año\n\n\
Los modificadores pueden estar presentes en la variable de entorno de DIRCMD. Omite los\n\
ajustes previos anteponiendo a cualquier modificador - (hyphen)--por ejemplo, /-W.\n"
STRING_DIR_HELP2, " El volumen en la unidad %c es %s\n"
STRING_DIR_HELP3, " El volumen en la unidad %c no tiene etiqueta.\n"
STRING_DIR_HELP4, " El volumen Serial Number is %04X-%04X\n"
STRING_DIR_HELP5, "\n Total de archivos mostrados:\n%16i archivo(s)% 14s bytes\n"
STRING_DIR_HELP6, "%16i Directorio(s)% 15s bytes\n"
STRING_DIR_HELP7, "\n Directorio %s\n\n"
STRING_DIR_HELP8, "%16i archivo(s)% 14s bytes\n"
STRING_DIRSTACK_HELP1, "Almacena el directorio actual para usarlo por el comando, \n\
entonces cambia al directorio especificado.\n\n\
PUSHD [ruta | ..]\n\n\
ruta Especifica el directorio para hacerlo el directorio actual\n"
STRING_DIRSTACK_HELP2, "Cambia al directorio guardado por el comando PUSHD.\n\nPOPD"
STRING_DIRSTACK_HELP3, "Muestra el contenido de la pila de directorios.\n\nDIRS"
STRING_DIRSTACK_HELP4, "Vacia la pila de directorios"
STRING_ECHO_HELP1, "Muestra un mensaje sin necesidad de pulsar intro y \n\
salta a la siguiente linea.\n\n\
ECHOS mensaje"
STRING_ECHO_HELP2, "Muestra los mensajes de error por defecto.\n\n\
ECHOERR mensaje\n\
ECHOERR. Imprime una linea vacia"
STRING_ECHO_HELP3, "Muestra mensajes en la salida estandar de error sin pulsar intro y\n\
pasa de linea.\n\n\
ECHOSERR mensaje"
STRING_ECHO_HELP4, "Muestra un mensaje o cambia el mostrar los comandos activo/inactivo.\n\n\
ECHO [ON | OFF]\n\
ECHO [mensaje]\n\
ECHO. Muestra una linea vacia\n\n\
Escribe ECHO sin parámetros para mostrar la configuración actual de ECHO."
STRING_ECHO_HELP5, "ECHO está %s\n"
STRING_EXIT_HELP, "Sale del interprete de la linea de comandos.\n\nEXIT\n"
STRING_FOR_HELP1, "Ejecuta un comando específico para cada archivo de un grupo de archivos.\n\n\
FOR %variable IN (grupo) DO comando [parametros]\n\n\
%variable Especifica un parámetro remplazable.\n\
(set) Especifica un grupo de uno o mas archivos. Los comodines pueden usarse.\n\
command Especifica el comando a ejecutar para cada archivo.\n\
parameters Especifica los parametros o modificadores para el comando especificado.\n\n\
Para usar el comando FOR en un archivo por lotes, especifica %%variable en lugar de\n\
%variable.\n"
STRING_FREE_HELP1, "\nEl volumen en la unidad %s es %-11s\n\
El número de serie es %s\n\
%16s bytes totales de espacio en disco\n\
%16s bytes usados\n\
%16s bytes libres\n"
STRING_FREE_HELP2, "Muestra la información de la unidad.\n\nFREE [unidad: ...]\n"
STRING_IF_HELP1, "Ejecuta procesos condicionales en archivos por lotes.\n\n\
IF [NOT] ERRORLEVEL número comando\n\
IF [NOT] string1==string2 comando\n\
IF [NOT] EXIST archivo comando\n\
IF [NOT] DEFINED variable comando\n\n\
NOT Especifica que CMD solo llevará a cabo el comando si la \n\
condición es falsa.\n\
ERRORLEVEL número Especifica una condición verdadera si el último programa devuelve\n\
un código de salida igual o superior al número especificado.\n\
comando Especifica el comando a ejecutar si se cumple la condición.\n\
string1==string2 Especifica una condición verdadera si las cadenas de texto coinciden.\n\
EXIST archivo Especifica una condición verdadera si existe el archivo especificado.\n\
DEFINED variable Especifica una condición verdadera si la variable está definida.\n"
STRING_GOTO_HELP1, "Manda al CMD a una linea etiquetada en un archivo por lotes.\n\n\
GOTO etiqueta\n\n\
etiqueta Especifica la cadena de texto usada en el archivo por lotes como etiqueta.\n\n\
Escriba la etiqueta en la linea misma, empezando con dos puntos."
STRING_LABEL_HELP1, "Muestra o cambia la etiqueta de una unidad.\n\nLABEL [unidad:][etiqueta]\n"
STRING_LABEL_HELP2, "El volumen en la unidad %c: es %s\n"
STRING_LABEL_HELP3, "El volumen en la unidad %c: no tiene etiqueta\n"
STRING_LABEL_HELP4, "El número de serie del volumen es %04X-%04X\n"
STRING_LABEL_HELP5, "Etiqueta del volumen (11 Caracteres, INTRO para ninguna)? "
STRING_LOCALE_HELP1, "La hora actual es"
STRING_MKDIR_HELP, "Crea un directorio.\n\n\
MKDIR [unidad:]ruta\nMD [unidad:]ruta"
STRING_MEMMORY_HELP1, "Muestra la cantidad de memoria del sistema.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% carga de memoria.\n\n\
%13s bytes totales de RAM física.\n\
%13s bytes libres de RAM física.\n\n\
%13s bytes totales del archivo de paginación.\n\
%13s bytes disponibles del archivo de paginación.\n\n\
%13s bytes totales de memoria virtual.\n\
%13s bytes disponibles de memoria virtual.\n"
STRING_MISC_HELP1, "Pulsa cualquier tecla para continuar...\n"
STRING_MOVE_HELP1, "¿Sobreescribir %s (Si/No/Todos)? "
STRING_MOVE_HELP2, "Mueve archivos y renombra archivos y directorios.\n\n\
Para mover uno o más archivos:\n\
MOVE [/N][unidad:][ruta]archivo1[,...] destino\n\n\
Para renombrar un directorio:\n\
MOVE [/N][unidad:][ruta]directorio1 directorio2\n\n\
[unidad:][ruta]archivo1 Especifica la localización y el nombre del archivo\n\
o archivos que quieres mover.\n\
/N Nada. Hace todo menos mover archivos o directorios.\n\n\
Limitaciones actules:\n\
- No puedes mover un archivo o directorio de una unidad a otra.\n"
STRING_MSGBOX_HELP, "Muestra un cuadro de mensaje y devuelve la respuesta del usuario.\n\n\
MSGBOX tipo ['titulo'] pregunta\n\n\
tipo buton a mostrar\n\
los valores posibles son: OK, OKCANCELAR,\n\
SINO, SINOCANCELAR\n\
titulo titulo del cuadro de mensaje\n\
pregunta texto a mostrar por el cuadro de mensaje\n\n\n\
ERRORLEVEL se configurara en función del botón pulsado:\n\n\
SI : 10 | NO : 11\n\
OK : 10 | CANCELAR: 12\n"
STRING_PATH_HELP1, "Muestra o cambia la ruta de búsqueda de archivos ejecutables.\n\n\
PATH [[unidad:]ruta[;...]]\nRuta ;\n\n\
Escribe PATH ; para limpiar todas las configuraciones de búsqueda y usar solo el\n\
directorio actual del interprete de comandos.\n\
Escribe PATH sin parámetros para mostrar la ruta actual.\n"
STRING_PROMPT_HELP1, "Cambia el símbolo de comandos.\n\n\
PROMPT [texto]\n\n\
texto Epecifica un nuevo símbolo de comandos.\n\n\
El símbolo de comandos puede hacerce con carácteres normales y los siguientes \n\
códigos especiales:\n\n\
$A & (Signo y)\n\
$B | (Linea horizontal)\n\
$C ( (Paréntesis izquierdo)\n\
$D Fecha actual\n\
$E Código de escape (código ASCII 27)\n\
$F ) (Paréntesis derecho)\n\
$G > (Signo mayor que)\n\
$H Borra el caracter anterior\n\
$L < (Signo menor que)\n\
$N Unidad actual\n\
$P Unidad y ruta actuales\n\
$Q = (signo igual)\n\
$T Hora actual\n\
$V Número de versión del SO\n\
$_ Salto de linea\n\
$$ $ (signo del dolar)\n"
STRING_PAUSE_HELP1, "Detiene la ejecución del archivo por lotes actual y muestra el\n\
siguiente mensaje:\n\
'Pulsa cualquier tecla para continuar...' o un mensaje definido por el usuario.\n\n\
PAUSE [mensaje]"
STRING_PROMPT_HELP2, " $+ Muestra la profundidad actual de la pila de directorios"
STRING_PROMPT_HELP3, "\nEscribe PROMPT sin parámetros para resetear el símbolo de \n\
comandos a su configuración por defecto."
STRING_REM_HELP, "Comienza una liena de comentarios en un archivo por lotes\n\nREM [Comentario]"
STRING_RMDIR_HELP, "Remueve un directorio.\n\n\
RMDIR [unidad:]ruta\nRD [unidad:]ruta"
STRING_REN_HELP1, "Renombra un archivo/directorio o varios archivos/directorios.\n\n\
RENAME [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\
REN [/E /N /P /Q /S /T] nombre_antiguo ... nuevo_nombre\n\n\
/E No muestra mensajes de error.\n\
/N Nada.\n\
/P Pregunta por la confirmación antes de cada archivo.\n\
(¡No implementado aún!)\n\
/Q Modo silencioso.\n\
/S Renombra los subdirectorios.\n\
/T Muestra el número total de archivos renombrados.\n\n\
Note que no puede especificar una nueva unidad en el destino o ruta. Usa\n\
el comando MOVE para este propósito.\n"
STRING_REN_HELP2, " %lu archivos renombrados.\n"
STRING_REN_HELP3, " %lu archivos renombrados.\n"
STRING_SHIFT_HELP, "Cambia la posición de los parámetros remplazables en un \n\
archivo por lotes.\n\n\
SHIFT [ABAJO]"
STRING_SCREEN_HELP, "Mueve el cursor y opcionalmente escribe un texto.\n\n\
SCREEN fila columna [texto]\n\n\
fila Fila a la que mover el cursor.\n\
columna columna a la que mover el cursor."
STRING_SET_HELP, "Muestra, cambia o borra las variables de entorno.\n\n\
SET [variable[=][cadena]]\n\n\
variable Especifica el nombre de la variable de entorno.\n\
string Especifies la serie de caracteres para asignar a la variable.\n\n\
Escribe SET sin parámetros para mostrar las variables de entorno actuales.\n"
STRING_START_HELP1, "Empieza un comando.\n\n\
START comando\n\n\
comando Especifica el comando a ejecutar.\n\n\
Por el momento todos los comandos son ejecutados de forma asincrónica.\n"
STRING_TITLE_HELP, "Cambia el título de la ventqana del intérprete de comandos.\n\n\
TITLE [cadena]\n\n\
cadena Especifica el título de la ventana del intérprete de comandos.\n"
STRING_TIME_HELP1, "Muestra o cambia la hora del sistema.\n\n\
TIME [/T][hora]\n\n\
/T Sólo la muestra\n\n\
Escribe TIME sin parámetros para mostrar la hora actual y preguntar\n\
por una nueva. Pulsa INTRO para mantener la misma hora.\n"
STRING_TIME_HELP2, "Introduce la nueva hora: "
STRING_TIMER_HELP1, "Transcurridos %d msecs\n"
STRING_TIMER_HELP2, "Transcurridos %02d%c%02d%c%02d%c%02d\n"
STRING_TIMER_HELP3, "Permite al usuario el uso de diez paradas de reloj.\n\n\
TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
ON Cambia la parada a ON\n\
OFF Cambia la parada a OFF\n\
/S Divide el tiempo. Devuelve una division de la parada del reloj\n\
sin cambiar su valor.\n\
/n Especifica el número de la parada de reloj.\n\
Las paradas de reloj disponibles son de 0 a 9\n\
Si no se especifica el valor por defecto es 1\n\
/Fn Formato de salida\n\
n puede ser:\n\
0 millisegundos\n\
1 hh%cmm%css%cdd\n\n\
Si ni ON, OFF o /S se especifican, el comando\n\
cambiara el estado de parada del reloj\n\n"
STRING_TYPE_HELP1, "Muestra los contenidos de un archivo de texto.\n\nTYPE [unidad:][ruta]archivo \n\
/P Muestra sólo una pantalla de salida cada vez.\n"
STRING_VERIFY_HELP1, "¡¡Este comando es solo de relleno!!\n\
Configura si hay que verificar que los archivos se and escrito correctamente\n\
en un disco.\n\n\
VERIFY [ON | OFF]\n\n\
Escribe VERIFY sin parámetros para mostrar la configuración actual de VERIFY.\n"
STRING_VERIFY_HELP2, "VERIFY está %s.\n"
STRING_VERIFY_HELP3, "Tienes que especificar ON o OFF."
STRING_VERSION_HELP1, "Muestra la información de la versión del shell\n\n\
VER [/C][/R][/W]\n\n\
/C Muestra los creditos.\n\
/R Muestra la información de redistribución.\n\
/W Muestra la información de la garantia."
STRING_VERSION_HELP2, "Este software Viene con ABSOLUTAMENTE NINGUNA GARANTIA; para más detalles\n\
escribe: `ver /w'. Este es un software gratuito, y estás invitado a redistribuirlo\n\
bajo ciertas condiciones; escribe `ver /r' para los detalles. Escribe `ver /c' para una\n\
lista de los créditos."
STRING_VERSION_HELP3, "\n Este programa es distribuido con la esperanza de que sea útil,\n\
pero CON NINGUNA GARANTIA; incluso sin la garantía implícita de\n\
MERCADERIA o AJUSTE A UN PROPÓSITO PARTICULAR. Mira la\n\
Licencia Pública General GNU para más detalles."
STRING_VERSION_HELP4, "\n Este programa es un software gratuito; puedes redistribuirlo y/o modificarlo\n\
bajo los términos de la Licencia Pública General GNU tal y como establece\n\
la Fundación de Software Libre; tanto en la versión 2 de la Licencia, o\n\
(según tu elección) cualquier otra posterior.\n"
STRING_VERSION_HELP5, "\nManda los informes de bugs a <ros-dev@reactos.org>.\n\
Actualizaciones disponibles en: http://www.reactos.org"
STRING_VERSION_HELP6, "\nFreeDOS version escrita por:\n"
STRING_VERSION_HELP7, "\nReactOS version escrita por:\n"
STRING_VOL_HELP1, " El volumen en la unidad %c: es %s"
STRING_VOL_HELP2, " El volumen en la unidad %c: no tiene etiqueta"
STRING_VOL_HELP3, " El número de serie del volumen es %04X-%04X\n"
STRING_VOL_HELP4, "Muestra la etiqueta del volumen del disco y el número de serie si existen.\n\nVOL [unidad:]"
STRING_WINDOW_HELP1, "Cambia el aspecto de la ventana de la consola.\n\n\
WINDOW [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
/POS Especifica la posición y dimensión de la ventana\n\
MIN minimiza la ventana\n\
MAX maximiza la ventana\n\
RESTORE restaura la ventana"
STRING_WINDOW_HELP2, "Cambia el aspecto de la ventana de la consola.\n\n\
ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
window Título de la ventana en la que realizar las acciónes\n\
/POS Especifica la posición y dimensión de la ventana\n\
MIN minimiza la ventana\n\
MAX maximiza la ventana\n\
RESTORE restaura la ventana\n\
title Nuevo título\n"
STRING_HELP1, "Lista de todos los comandos disponibles (+ descripción)\n\n\
comando /? Para más información del comando especificado.\n\n\
? Muestra todos los comandos disponibles sin la descripción.\n\
ALIAS Crea, borra o muestra los alias.\n\
ATTRIB Muestra o cambia los atributos de archivo.\n\
BEEP Hace un beep con el altavoz.\n\
CALL Llama a un archivo por lotes desde otro.\n\
CD Muestra o cambia el directorio actual.\n\
CHCP Muestra o cambia el código de página activo.\n\
CHOICE Espera a que el usuario elija una opción de un grupo de opciones.\n\
CLS Limpia la pantalla.\n\
CMD Comienza una nueva instancia del intérprete de comandos.\n\
COLOR Configura el color por defecto de fondo y frente de la consola.\n\
COPY Copia uno o varios archivos de una localización a otra.\n\
DATE Muestra y cambia la fecha.\n\
DELETE Borra uno o más archivos.\n\
DIR Muestra una lista de los archivos y subdirecctorios en un directorio.\n\
ECHO Muestra mensajes, o cambia un comando entre mostrarlos o no.\n\
ERASE Borra uno o más archivos.\n\
EXIT Sale del programa CMD.EXE (intérprete de comandos).\n\
FOR Ejecuta un comando específico en un grupo de archivos.\n\
FREE Espacio libre en disco.\n\
GOTO Direcciona la ventana del intérprete de comandos a una linea etiquetada\n\
en un archivo por lotes.\n\
HELP Proporciona ayuda sobre los comandos para ReactOS.\n\
HISTORY Muestra todos los comandos que han sido usados.\n\
IF Realiza un proceso condicional en un archivo por lotes.\n\
LABEL Crea, cambia, o borra la etiqueta de volumen de un disco.\n\
MD Crea un directorio.\n\
MKDIR Crea un directorio.\n\
MOVE Mueve uno o más archivos de un directorio a otro.\n\
PATH Muestra o configura las rutas de búsqueda para archivos ejecutables.\n\
PAUSE Suspende el procesamiento de un archivo por lotes y muestra un mensaje.\n\
POPD Restaura el valor anterior del directorio actual guardado por PUSHD.\n\
PROMPT Cambia el símbolo del sistema del intéprete de comandos.\n\
PUSHD Guarda el directorio actual y después lo cambia.\n\
RD Borra un directorio.\n\
REM Marca comentarios en archivos por lotes.\n\
REN Renombra un archivo o varios archivos.\n\
RENAME Renombra un archivo o varios archivos.\n\
RMDIR Borra un directorio.\n\
SCREEN Mueve el cursor y opcionalmente escribe un texto.\n\
SET Muestra, cambia o borra variables del entorno de la ventana.\n\
SHIFT Marca la posición de parámetros remplazables en un archivo por lotes.\n"
STRING_HELP2, "START Abre una ventana separada para ejecutar un programa o comando específicod.\n\
Ejecuta CMD.\n\
TIME Muestra o cambia la hora del sistema.\n\
TIMER Permite al usuario diez paradas para ver.\n\
TITLE Configura el título de la ventama de la sesión de CMD.EXE.\n\
TYPE Muestra el contenido de un archivo de texto.\n\
VER Muestra la versión de ReactOS.\n\
VERIFY Le dice a ReactOS que verifique que cada archivo se escriba.\n\
corectamente en el disco.\n\
VOL Muestra la etiqueta de volumen y el número de serie del disco.\n"
STRING_CHOICE_OPTION, "SN"
STRING_COPY_OPTION, "SNT"
STRING_ALIAS_ERROR, "¡Linea de comandos demasiado larga tras la expansión del alias!\n"
STRING_BATCH_ERROR, "Error abriendo el archivo por lotes\n"
STRING_CHCP_ERROR1, "Página de códigos activa: %u\n"
STRING_CHCP_ERROR4, "Código de página inválido\n"
STRING_CHOICE_ERROR, "Opción inválida. Se esperaba el formato: /C[:]options"
STRING_CHOICE_ERROR_TXT, "Opción inválida. Se esperaba el formato: /T[:]c,nn"
STRING_CHOICE_ERROR_OPTION, "Opción ilegal: %s"
STRING_CMD_ERROR1, "No se puede redirigir la entrada del archivo %s\n"
STRING_CMD_ERROR2, "Error creando archivo temporal para la pila de datos\n"
STRING_CMD_ERROR3, "No se puede redirigir el archivo %s\n"
STRING_CMD_ERROR4, "Ejecutando %s...\n"
STRING_CMD_ERROR5, "Ejecutando cmdexit.bat...\n"
STRING_COLOR_ERROR1, "¡Mismos colores! (El color de frente y de fondo no pueden ser el mismo)"
STRING_COLOR_ERROR2, "Error en la especificación del color"
STRING_COLOR_ERROR3, "Color %x\n"
STRING_COLOR_ERROR4, "¡Error: mismos colores!"
STRING_CONSOLE_ERROR, "Error desconocido: %d\n"
STRING_COPY_ERROR1, "Error: No se puede abrir el origen - %s!\n"
STRING_COPY_ERROR2, "Error: ¡No se puede copiar sobre si mismo!\n"
STRING_COPY_ERROR3, "¡Error escribiendo destino!\n"
STRING_COPY_ERROR4, "Error: ¡No implementado aún!\n"
STRING_DATE_ERROR, "Fecha incorrecta."
STRING_DEL_ERROR5, "¡El archivo %s va a ser borrado!"
STRING_DEL_ERROR6, "¿Estás seguro (S/N)?"
STRING_DEL_ERROR7, "Borrando: %s\n"
STRING_ERROR_ERROR1, "¡Error desconocido! Códige de error: 0x%lx\n"
STRING_ERROR_ERROR2, "Error de sintaxsis"
STRING_FOR_ERROR1, "Falta 'in' para la declaración."
STRING_FOR_ERROR2, "No se encontraron las parénteris."
STRING_FOR_ERROR3, "Falta 'do'."
STRING_FOR_ERROR4, "No hay comando después de 'do'."
STRING_FREE_ERROR1, "Unidad errónea."
STRING_FREE_ERROR2, "Sin etiqueta"
STRING_GOTO_ERROR1, "No se especifico etiqueta para GOTO"
STRING_GOTO_ERROR2, "La etiqueta '%s' no se encuentra\n"
STRING_MOVE_ERROR1, "[OK]\n"
STRING_MOVE_ERROR2, "[Error]\n"
STRING_REN_ERROR1, "MoveFile() falló. Error: %lu\n"
STRING_START_ERROR1, "¡No hay soporte para archivos por lotes en este momento!"
STRING_TIME_ERROR1, "Hora incorrecta."
STRING_TYPE_ERROR1, "Opción incorrecta '/%s'\n"
STRING_WINDOW_ERROR1, "Ventana no encontrada"
STRING_ERROR_PARAMETERF_ERROR, "Formato del parámetro incorrecto - %c\n"
STRING_ERROR_INVALID_SWITCH, "Parámetro incorrecto - /%c\n"
STRING_ERROR_TOO_MANY_PARAMETERS, "Demasiados parámetros - %s\n"
STRING_ERROR_PATH_NOT_FOUND, "Ruta no encontrada\n"
STRING_ERROR_FILE_NOT_FOUND, "Archivo no encontrado\n"
STRING_ERROR_REQ_PARAM_MISSING, "Prámetro requerido no encontrado\n"
STRING_ERROR_INVALID_DRIVE, "Especificación de unidad errónea\n"
STRING_ERROR_INVALID_PARAM_FORMAT, "Formato de parámetro erróneo - %s\n"
STRING_ERROR_BADCOMMAND, "Comando o nombre de archivo erróneo\n"
STRING_ERROR_OUT_OF_MEMORY, "Error fuera de memoria.\n"
STRING_ERROR_CANNOTPIPE, "¡Error! ¡No se puede apilar! ¡No se puede abrir el archivo temporal!\n"
STRING_ERROR_D_PAUSEMSG, "Pulsa una tecla para continuar . . ."
STRING_ERROR_DRIVER_NOT_READY, "La unidad no está lista"
STRING_PATH_ERROR, "CMD: No está en el entorno '%s'\n"
STRING_CMD_SHELLINFO, "\nIntérprete de comandos de ReactOS"
STRING_VERSION_RUNVER, " corriendo en %s"
STRING_COPY_FILE , " %d archivo(s) copado(s)\n"
STRING_DELETE_WIPE, "Limpiado"
STRING_FOR_ERROR, "Especición de variable errónea."
STRING_SCREEN_COL, "Valor inválido de columna"
STRING_SCREEN_ROW, "Valor inválido de fila"
STRING_TIMER_TIME "El temporizador %d es %s: "
STRING_INVALID_OPERAND, "Operador erróneo.\n"
STRING_EXPECTED_CLOSE_PAREN, "Se esperaba ')'.\n"
STRING_EXPECTED_NUMBER_OR_VARIABLE,"Se esperaba un número o nombre de variable.\n"
STRING_SYNTAX_COMMAND_INCORRECT, "La sintaxis del comando es incorrecta.\n"
}

View file

@ -0,0 +1,575 @@
#include "windows.h"
#include "resource.h"
/*
* French resources
* Sylvain Pétréolle 2005
*/
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
STRING_ATTRIB_HELP, "Affiche ou change des attributs de fichiers.\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file ...\n\
[/S [/D]]\n\n\
+ Positionne un attribut\n\
- Enlève un attribut\n\
R Fichier en lecture seule\n\
A Fichier archive\n\
S Fichier système\n\
H Fichier caché\n\
/S Traite les fichiers correspondants dans le répertoire courant\n\
et tous les sous-répertoires\n\
/D Traite également les répertoires\n\n\
Taper ATTRIB sans paramètre pour afficher les attributs de tous les fichiers."
STRING_ALIAS_HELP, "Positionne, enlève ou affiche les alias.\n\n\
ALIAS [alias=[commande]]\n\n\
alias Nom de l'alias.\n\
commande Texte à substituer à l'alias.\n\n\
Pour afficher tous les alias:\n\
ALIAS\n\n\
Pour créer ou remplacer un alias existant:\n\
ALIAS da=dir a:\n\n\
Pour effacer un alias de la liste des alias :\n\
ALIAS da="
STRING_BEEP_HELP, "Emet un bip par le haut-parleur système.\n\nBEEP"
STRING_CALL_HELP, "Appelle un programme batch depuis un autre.\n\n\
CALL [lecteur:][chemin]fichier [paramètre-batch]\n\n\
paramètre-batch Spécifie les paramètres nécessaires au \n\
programme batch."
STRING_CD_HELP, "Change ou affiche le répertoire courant\n\n\
CHDIR [lecteur:][chemin]\n\
CHDIR[..|-]\n\
CD [lecteur:][chemin]\n\
CD[..|-]\n\n\
.. répertoire parent\n\
- répertoire précédent\n\n\
Taper CD lecteur: pour affiche le répertoire courant sur le disque indiqué.\n\
Taper CD sans paramètre pour afficher le répertoire courant du disque actuel.\n"
STRING_CHCP_HELP, "Affiche ou change la page de codes active.\n\n\
CHCP [nnn]\n\n\
nnn Indique la page de codes .\n\n\
Taper CHCP sans paramètre pour afficher la page de codes active."
STRING_CHOICE_HELP, "Demande à l'utilisateur de choisir parmi plusieurs choix.\n\n\
CHOICE [/C[:]choix][/N][/S][/T[:]c,nn][texte]\n\n\
/C[:]choix Spécifier les touches disponibles. Choix par défaut: ON.\n\
/N Ne pas afficher les choix disponibles et ? à la fin\n\
du texte d'invite.\n\
/S Traiter les touches comme différentes si ce sont\n\
des majuscules ou minuscules.\n\
/T[:]c,nn Choix par défaut après nn secondes.\n\
texte Texte d'invite à afficher.\n\n\
ERRORLEVEL est modifié à l'offset de la touche enfoncée parmi les choix."
STRING_CLS_HELP, "Efface l'écran.\n\nCLS"
STRING_CMD_HELP1, "\nCommandes internes disponibles :\n"
STRING_CMD_HELP2, "\nFonctions disponibles :"
STRING_CMD_HELP3," [alias]"
STRING_CMD_HELP4," [historique]"
STRING_CMD_HELP5," [complétion des noms de fichiers façon unix]"
STRING_CMD_HELP6," [pile de répertoires]"
STRING_CMD_HELP7," [redirections et piping]"
STRING_CMD_HELP8, "Démarre une nouvelle instance de l'interpréteur de commandes de ReactOS.\n\n\
CMD [/[C|K] commande][/P][/Q][/T:ap]\n\n\
/C commande Lance la commande spécifiée et se termine.\n\
/K commande Lance la commande spécifiée et reste en mémoire.\n\
/P CMD devient permanent et lance autoexec.bat\n\
(ne peut être terminé).\n\
/T:ap Changer la couleur d'arrière/premier plan\n\
(voir la commande COLOR.)"
STRING_COLOR_HELP1, "Change les couleurs de premier et d'arrière plan.\n\n\
COLOR [attr [/F]] \n\n\
attr Spécifie l'attribut des couleurs de la console\n\
/F remplit la console avec l'attribut de couleur\n\n\
Il y a trois façons de spécifier les couleurs :\n\
1) [bright] nom on [bright] nom (seules les trois premières lettres \n\
sont nécessaires)\n\
2) décimal on décimal\n\
3) deux chiffres hexadécimaux\n\n\
Les couleurs sont:\n\
déc hex nom déc hex nom\n\
0 0 Black(Noir) 8 8 Gray(Bright black)\n\
1 1 Blue(Bleu) 9 9 Bright Blue\n\
2 2 Green(Vert) 10 A Bright Green\n\
3 3 Cyan 11 B Bright Cyan\n\
4 4 Red(Rouge) 12 C Bright Red\n\
5 5 Magenta 13 D Bright Magenta\n\
6 6 Yellow(Jaune) 14 E Bright Yellow\n\
7 7 White(Blanc) 15 F Bright White"
STRING_COPY_HELP1, "Ecraser %s (Oui/Non/Tous)? "
STRING_COPY_HELP2, "Copie un ou plusieurs fichiers vers une autre destination.\n\n\
COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]\n\
[+ source [/A|/B] [+ ...]] [destination [/A|/B]]\n\n\
source Indique le ou les fichiers à copier.\n\
/A Spécifie qu'il s'agit d'un fichier texte ASCII.\n\
/B Spécifie qu'il s'agit d'un fichier binaire.\n\
destination Indique le répertoire ou le nom de fichier\n\
pour le(s) nouveau(x) fichier(s).\n\
/V Vérifie que les fichier ont été copiés correctement.\n\
/Y Supprime l'invite de confirmation en cas d'écrasement\n\
d'un fichier destination existant.\n\
/-Y Affiche un invite de confirmation en cas d'écrasement\n\
d'un fichier destination existant.\n\n\
Le switch /Y peut être présent dans la variable d'environnement COPYCMD.\n"
STRING_DATE_HELP1, "\nEntrer la nouvelle date (mm%cdd%cyyyy): "
STRING_DATE_HELP2, "\nEntrer la nouvelle date (dd%cmm%cyyyy): "
STRING_DATE_HELP3, "\nEntrer la nouvelle date (yyyy%cmm%cdd): "
STRING_DATE_HELP4, "Affiche ou règle la date.\n\n\
DATE [/T][date]\n\n\
/T affiche seulement\n\n\
Taper DATE sans paramètre pour afficher la date courante\n\
et une invite pour entrer la nouvelle date.\n\
Appuyer sur ENTREE pour conserver la même date."
STRING_DEL_HELP1, "Efface un ou plusieurs fichiers.\n\n\
DEL [/N /P /T /Q /W /Y /Z] fichier ...\n\
DELETE [/N /P /T /Q /W /Y /Z] fichier ...\n\
ERASE [/N /P /T /Q /W /Y /Z] fichier ...\n\n\
fichier Specifie le(s) fichier(s) à effacer.\n\n\
/N Rien.\n\
/P Demande. Demande avant d'effacer pour chaque fichier.\n\
/T Total. Affiche le total de fichiers effacés et l'espace disque libéré.\n\
/Q Silencieux.\n\
/W Wipe. Ecrase le fichier avec des nombres aléatoire avant d'effacer.\n\
/Y Oui. Efface, même *.*, sans demander.\n\
/Z Zap. Efface les fichiers cachés, en lecture seule et systèmes.\n"
STRING_DEL_HELP2, "Tous les fichiers du répertoire seront effacés!\n\
Etes vous sûr(e) (O/N)?"
STRING_DEL_HELP3, " %lu fichier effacé\n"
STRING_DEL_HELP4, " %lu fichiers effacés\n"
STRING_DELAY_HELP, "Attend pendant n secondes ou millisecondes\n\
DELAY [/m]n\n\n\
/m spécifie que n est en millisecondes\n\
sinon n est en secondes"
STRING_DIR_HELP1, "DIR [lecteur:][chemin][fichier] [/A[[:]attributs]] [/B] [/C] [/D] [/L] [/N]\n\
[/O[[:]ordredetri]] [/P] [/Q] [/S] [/T[[:]heure]] [/W] [/X] [/4]\n\n\
[lecteur:][chemin][fichier]\n\
Spécifie le disque, le répertoire, et/ou les fichiers à lister.\n\n\
/A Affiche les fichiers avec les attributs indiqués.\n\
attributs D Répertoires R Fichiers en lecture seule\n\
H Fichiers cachés A Fichiers prêts à etre archivés\n\
S Fichiers systèmes - Préfixe signifiant non\n\
/B Utilise le format court (pas d'informations ni de résumé).\n\
/C Affiche le séparateur de milliers dans les tailles de fichier.\n\
C'est l'option par défaut. Utiliser /-C pour désactiver \n\
l'affichage du séparateur.\n\
/D Identique au format large mais les fichiers sont triés\n\
par colonne.\n\
/L Utilise les minuscules.\n\
/N Nouveau format de liste longue où les noms de fichiers sont \n\
sur la droite.\n\
/O Lister les fichier de façon triée.\n\
ordre de N Par nom (alphabétique) S Par taille (plus petit d'abord)\n\
tri E Par extension tique) D Par date (plus vieux d'abord)\n\
G Répertoires d'abord - Préfixe pour inverser l'ordre\n\
/P S'arrête après chaque page d'information.\n\
/Q Affiche le propriétaire du fichier.\n\
/S Affiche les fichiers dans le répertoire indiqué et\n\
tous les sous-répertoires.\n\
/T Contrôle quel champ de temps sera affiché ou utilisé\n\
pour le tri\n\
C Création\n\
A Dernier accès\n\
W Dernière modification\n\
/W Utilise le format de liste large.\n\
/X Ceci affiche les noms de fichiers courts pour les noms \n\
de fichiers longs. Le format est comme pour /N avec\n\
le nom de fichier court inséré avant le nom de fichier long.\n\
S'il n'y a pas de nom court, des espaces seront affichés.\n\
/4 Affiche l'année sur quatre chiffres.\n\n\
Les paramètres peuvent être mémorisés dans la variable d'environnement DIRCMD.\n\
Modifier les paramètres mémorisés avec un - (tiret)--par exemple, /-W.\n"
STRING_DIR_HELP2, " Le nom de volume du lecteur %c est %s\n"
STRING_DIR_HELP3, " Le lecteur %c n'a pas de nom de volume\n"
STRING_DIR_HELP4, " Le numéro de série du volume est %04X-%04X\n"
STRING_DIR_HELP5, "\n Total de fichiers listés :\n%16i Fichier(s)% 14s octets\n"
STRING_DIR_HELP6, "%16i fichier(s)% 15s octets\n"
STRING_DIR_HELP7, "\n Répertoire de %s\n\n"
STRING_DIR_HELP8, "%16i Rep(s)% 14s octets\n"
STRING_DIRSTACK_HELP1, "Stocke le répertoire courant pour utilisation avec la commande POPD,\n\
ensuite change de répertoire vers le répertoire spécifié.\n\n\
PUSHD [chemin | ..]\n\n\
chemin Spécifie le répertoire qui deviendra le répertoire courant"
STRING_DIRSTACK_HELP2, "Change de réperoire vers le répertoire stocké par la commande PUSHD\n\nPOPD"
STRING_DIRSTACK_HELP3, "Affiche le contenu de la pile de répertoires.\n\nDIRS"
STRING_DIRSTACK_HELP4, "Pile de répertoires vide."
STRING_ECHO_HELP1, "Affiche un message sans retour chariot ni passage à la ligne.\n\n\
ECHOS message"
STRING_ECHO_HELP2, "Affiche un message sur le canal d'erreur.\n\n\
ECHOERR message\n\
ECHOERR. Affiche une ligne vide sur le canal d'erreur."
STRING_ECHO_HELP3, "Affiche un message sur le canal d'erreur sans retour chariot\n\
ni passage à la ligne.\n\n\
ECHOSERR message"
STRING_ECHO_HELP4, "Affiche un message ou bascule l'affichage des commandes sur on ou off.\n\n\
ECHO [ON | OFF]\n\
ECHO [message]\n\
ECHO. Affiche une ligne vide.\n\n\
Taper ECHO sans paramètre pour afficher le réglage ECHO courant."
STRING_ECHO_HELP5, "ECHO est %s\n"
STRING_EXIT_HELP, "Sort de de l'interpréteur de commandes.\n\nEXIT"
STRING_FOR_HELP1, "Exécute une commande donnée pour chaque fichier d'un ensemble de fichiers.\n\
FOR %variable IN (ensemble) do commande [paramètres]\n\n\
%variable Spécife un paramètre remplaçable.\n\
(ensemble) Spécifie un ensemble d'un ou plusieurs fichiers.\n\
Des jokers peuvent être utilisés.\n\
commande Spécifie la commande à éxécuter pour chaque fichier.\n\
paramètres Spécifie les paramètres ou switchs pour la commande spécifiée.\n\n\
Pour utiliser la comamnde FOR dans un programme batch,\n\
utiliser %%variable au lieu de %variable."
STRING_FREE_HELP1, "\nLe nom de volume du lecteur %s est %-11s\n\
Le numéro de série est %s\n\
%16s octets d'espace disque total\n\
%16s octets utilisés\n\
%16s octets libres\n"
STRING_FREE_HELP2, "Affiche les information d'un disque.\n\nFREE [lecteur: ...]"
STRING_GOTO_HELP1, "Dirige CMD vers une ligne nommée dans un script batch.\n\n\
GOTO label\n\n\
label Spécifie un champ texte utilisé dans un script batch comme un label.\n\n\
Vous écrivez un label seul sur une ligne commençant par un deux-points.\n"
STRING_IF_HELP1, "Exécute un traitement conditionnel dans des programmes batch.\n\n\
IF [NOT] ERRORLEVEL nombre commande\n\
IF [NOT] chaine1==chaine2 commande\n\
IF [NOT] EXIST nomfichier commande\n\
IF [NOT] DEFINED variable commande\n\n\
NOT CMD ne lancera la commande que si la condition est fausse.\n\
ERRORLEVEL nombre La condition sera vraie si le dernier programme lancé\n\
a retourné un code sortie égal ou supérieur à celui indiqué.\n\
commande Indique la commande à lancer si la condition est vérifiée.\n\
chaine1==chaine2 La condition sera vraie si les deux chaines sont identiques.\n\
EXIST nomfichier La condition sera vraie si le fichier spécifié existe.\n\
DEFINED variable La condition sera vraie si la variable indiquée est définie."
STRING_LABEL_HELP1, "Affiche ou change le nom de volume du disque.\n\nLABEL [disque:][nomdevolume]\n"
STRING_LABEL_HELP2, "Le nom de volume du disque %c: est %s\n"
STRING_LABEL_HELP3, "Le disque %c: n'a pas de nom de volume\n"
STRING_LABEL_HELP4, "Le numéro de serie du volume est %04X-%04X\n"
STRING_LABEL_HELP5, "Nom de volume (11 Caractères, ENTREE si aucun)? "
STRING_LOCALE_HELP1, "L'heure actuelle est "
STRING_MKDIR_HELP, "Crée un répertoire.\n\n\
MKDIR [lecteur:]chemin\nMD [lecteur:]chemin"
STRING_MEMMORY_HELP1, "Affiche la quantité de mémoire système.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% de charge mémoire.\n\n\
%13s octets de RAM physique au total.\n\
%13s octets de RAM physique disponible.\n\n\
%13s octets de fichier d'échange au total.\n\
%13s octets de fichier d'échange disponible.\n\n\
%13s octets de mémoire virtuelle au total.\n\
%13s octets de mémoire virtuelle disponible.\n"
STRING_MISC_HELP1, "Appuyer sur une touche pour continuer...\n"
STRING_MOVE_HELP1, "Ecraser %s (Oui/Non/Tous)? "
STRING_MOVE_HELP2, "Déplace des fichiers ou renomme des fichiers et des répertoires.\n\n\
Pouur déplacer un ou plusieurs fichiers:\n\
MOVE [/N][lecteur:][nomfich1[,...] destination\n\n\
Pour renommer un répertoire:\n\
MOVE [/N][lecteur:][chemin]nomrep1 nomrep2\n\n\
[lecteur:][chemin]nomfich1 Indique l'endroit et le nom du ou des fichiers\n\
que vous voulez déplacer.\n\
/N Nothing. Do everything but move files or directories.\n\n\
Limitations actuelles :\n\
- Vous ne pouvez pas déplacer un fichier/répertoire d'un disque à un autre.\n"
STRING_MSGBOX_HELP, "Affiche une boite de dialogue et retourne la réponse de l'utilisateur\n\n\
MSGBOX type ['titre'] prompt\n\n\
type boutons affichés\n\
les valeurs possibles sont: OK, OKCANCEL,\n\
YESNO, YESNOCANCEL\n\
titre titre de la boite de message\n\
prompt texte affiché par la boite de dialogue \n\n\n\
ERRORLEVEL est modifié suivant le bouton pressé:\n\n\
YES : 10 | NO : 11\n\
OK : 10 | CANCEL : 12\n"
STRING_PATH_HELP1, "Affiche ou modifie le chemin de recherche pour les fichiers éxécutables.\n\n\
PATH [[lecteur:][chemin;...]]\nPATH ;\n\n\
Taper PATH ; pour effacer tous les réglages courants\n\
et indiquer à l'interpréteur de commandes\n\
de chercher seulement dans le répertoire courant.\n\
Taper PATH sans paramètres pour afficher le chemin courant.\n"
STRING_PAUSE_HELP1, "Stoppe l'éxécution d'un fichier batch et affiche le message suivant:\n\
'Appuyer sur une touche pour continuer...' ou un message défini\n\
par l'utilisateur.\n\n\
PAUSE\n\
PAUSE [message]"
STRING_PROMPT_HELP1, "Change l'invite de commandes.\n\n\
PROMPT [texte]\n\n\
texte Indique le nouvel invite de commandes.\n\n\
L'invite de commandes peut être composé de caractères normaux et\n\
des caractères spéciaux suivants:\n\n\
$A & (Et commercial)\n\
$B | (pipe)\n\
$C ( (parenthèse ouvrante)\n\
$D Date courante\n\
$E Code Escape (code ASCII 27)\n\
$F ) (parenthèse fermante)\n\
$G > (signe supérieur à)\n\
$H Backspace (efface le caractère précédent)\n\
$L < (signe inférieur à)\n\
$N Lecteur courant\n\
$P Lecteur et chemin courants\n\
$Q = (signe égale)\n\
$T Heure courante\n\
$V Numéro de version de ReactOS\n\
$_ Retour chariot/saut de ligne\n\
$$ $ (signe dollar)"
STRING_PROMPT_HELP2, " $+ Affiche la hauteur de la pile de répertoires"
STRING_PROMPT_HELP3, "\nTaper PROMPT sans paramètres pour changer l'invite à celui défini par défaut."
STRING_REM_HELP, "Démarrer une ligne de commentaire dans un fichier batch.\n\nREM [Commentaire]"
STRING_REN_HELP1, "Renomme un(des) fichier(s)/répertoire(s)\n\
RENAME [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\
REN [/E /N /P /Q /S /T] ancien_nom ... nouveau_nom\n\n\
/E Pas de messages d'erreur.\n\
/N Rien.\n\
/P Demande de confirmation avant de renommer chaque fichier.\n\
(Non implémenté!)\n\
/Q Silencieux.\n\
/S Renommer les sous-répertoires.\n\
/T Affiche le nombre total de fichiers renommés.\n\n\
Vous ne pouvez indiquez un autre lecteur/chemin pour la destination.\n\
Utiliser la commande MOVE dans ce but."
STRING_REN_HELP2, " %lu fichier renommé\n"
STRING_REN_HELP3, " %lu fichiers renommés\n"
STRING_RMDIR_HELP, "Efface un répertoire.\n\n\
RMDIR [lecteur:]chemin\nRD [lecteur:]chemin"
STRING_SCREEN_HELP, "Déplace le curseur, optionnellement affiche du texte\n\n\
SCREEN lig col [texte]\n\n\
lig ligne à laquelle déplacer le curseur\n\
col colonne à laquelle déplacer le curseur"
STRING_SET_HELP, "Affiche, modifie ou efface des variables d'environnement.\n\n\
SET [variable[=][chaine]]\n\n\
variable Indique le nom de la variable d'environnement.\n\
chaine Indique une série de caractères à assigner à la variable.\n\n\
Taper SET sans paramètres pour afficher les variables d'environnement courantes.\n"
STRING_SHIFT_HELP, "Change la position de paramètres remplaçables dans un fichier batch.\n\n\
SHIFT [DOWN]"
STRING_START_HELP1, "Lance une commande.\n\n\
START commande\n\n\
commande Indique la commande à lancer.\n\n\
Pour le moment toutes les commandes sont lancées de façon asynchrone.\n"
STRING_TITLE_HELP, "Change le titre de la fenêtre de l'invite de commandes.\n\n\
TITLE [chaine]\n\n\
chaine Indique le titre de la fenêtre de l'invite de commandes."
STRING_TIME_HELP1, "Affiche ou modifie l'heure système.\n\n\
TIME [/T][heure]\n\n\
/T affiche seulement\n\n\
Taper TIME sans paramètres pour afficher l'heure courante et une invite\n\
pour la modifier. Presser la touche ENTREE pour garder la même heure."
STRING_TIME_HELP2, "Entrer la nouvelle heure: "
STRING_TIMER_HELP1, "Ecoulé %d msecs\n"
STRING_TIMER_HELP2, "Ecoulé %02d%c%02d%c%02d%c%02d\n"
STRING_TIMER_HELP3, "Permet l'utilisation de dix chronomètres.\n\n\
TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
ON Démarre le chronomètre\n\
OFF Stoppe le chronomètre\n\
/S Split time. Return stopwach split\n\
time without changing its value\n\
/n Indique le numéro du chronomètre.\n\
Les chronomètres disponibles vont de 0 à 10.\n\
Si non spécifié, le chronomètre par défaut est 1\n\
/Fn Format de sortie\n\
n peut être :\n\
0 millisecondes\n\
1 hh%cmm%css%cdd\n\n\
Si aucun de ON, OFF or /S n'est spécifié la commande\n\
changera l'état du chronomètre sélectionné\n\n"
STRING_TYPE_HELP1, "Affiche le contenu de fichiers textes.\n\nTYPE [lecteur:][chemin]nomfich"
STRING_VERIFY_HELP1, "Cette commande ne fait rien!!\n\
Spécifie s'il faut verifier que vos fichiers sont écrits correctement.\
\n\n\
VERIFY [ON | OFF]\n\n\
Taper VERIFY sans paramètres pour afficher le réglage de VERIFY."
STRING_VERIFY_HELP2, "VERIFY est %s.\n"
STRING_VERIFY_HELP3, "Vous devez indiquer ON ou OFF."
STRING_VERSION_HELP1, "Affiche les information de version du shell\n\n\
VER [/C][/R][/W]\n\n\
/C Displays credits.\n\
/R Displays redistribution information.\n\
/W Displays warranty information."
STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\
type: `ver /w'. This is free software, and you are welcome to redistribute\n\
it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\
listing of credits."
STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
GNU General Public License for more details."
STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
it under the terms of the GNU General Public License as published by\n\
the Free Software Foundation; either version 2 of the License, or\n\
(at your option) any later version."
STRING_VERSION_HELP5, "\nEnvoyer les rapports d'erreur à <ros-dev@reactos.org>.\n\
Les mises à jour sont disponibles à : http://www.reactos.org"
STRING_VERSION_HELP6, "\nVersion FreeDOS écrite par:\n"
STRING_VERSION_HELP7, "\nVersion ReactOS écrite par:\n"
STRING_VOL_HELP1, " Le nom de volume du lecteur %c: est %s\n"
STRING_VOL_HELP2, " Le volume dans le lecteur %c: n'a pas de nom\n"
STRING_VOL_HELP3, " Le numéro de série du volume est %04X-%04X\n"
STRING_VOL_HELP4, "Affiche le nom de volume et le numéro de série du disque s'ils existent.\n\nVOL [lecteur:]\n"
STRING_WINDOW_HELP1, "Change l'aspect de la fenêtre de la console\n\n\
WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\
[MIN|MAX|RESTORE] ['titre']\n\n\
/POS indique la position et les dimensions de la fenêtre\n\
MIN minimise la fenêtre\n\
MAX maximise la fenêtre\n\
RESTORE restaure la fenêtre"
STRING_WINDOW_HELP2, "Change l'aspect de la fenêtre de la console\n\n\
WINDOW [/POS[=]gauche,haut,largeur,hauteur]\n\
[MIN|MAX|RESTORE] ['titre']\n\n\
/POS indique la position et les dimensions de la fenêtre\n\
MIN minimise la fenêtre\n\
MAX maximise la fenêtre\n\
RESTORE restaure la fenêtre\n\
titre titre de la fenêtre"
STRING_CHOICE_OPTION "ON"
STRING_COPY_OPTION, "ONT"
STRING_ALIAS_ERROR, "Ligne de commande trop longue après remplacement de l'alias!\n"
STRING_BATCH_ERROR, "Erreur à l'ouverture du fichier batch\n"
STRING_CHCP_ERROR1, "Page de codes actuelle : %u\n"
STRING_ERROR_INVALID_PARAM_FORMAT, "Format de paramètre incorrect - %s\n"
STRING_CHCP_ERROR4, "Page de code invalide \n"
STRING_CHOICE_ERROR, "Option invalide. Format attendu: /C[:]options"
STRING_CHOICE_ERROR_TXT, "Option invalide. Format attendu: /T[:]c,nn"
STRING_CHOICE_ERROR_OPTION, "Option invalide : %s"
STRING_CMD_ERROR1, "Ne peut rediriger l'entrée depuis le fichier %s\n"
STRING_CMD_ERROR2, "Erreur à la création du fichier temporaire pour les données du pipe\n"
STRING_CMD_ERROR3, "Ne peut rediriger vers le fichier %s\n"
STRING_CMD_ERROR4, "Lance %s...\n"
STRING_CMD_ERROR5, "Lance cmdexit.bat...\n"
STRING_COLOR_ERROR1, "L'arrière plan et l'avant plan ne peuvent être de la même couleur"
STRING_COLOR_ERROR2, "Erreur dans la spécification des couleurs"
STRING_COLOR_ERROR3, "Couleur %x\n"
STRING_COLOR_ERROR4, "Erreur: même couleur!"
STRING_CONSOLE_ERROR, "Erreur inconnue: %d\n"
STRING_COPY_ERROR1, "Erreur: Ne peut ouvrir la source - %s!\n"
STRING_COPY_ERROR2, "Erreur: Ne peut copier le fichier sur lui-même!\n"
STRING_COPY_ERROR3, "Erreur à l'écriture de la destination!\n"
STRING_COPY_ERROR4, "Erreur: Non implémenté actuellement!\n"
STRING_DATE_ERROR, "Date invalide."
STRING_DEL_ERROR5, "Le fichier %s va être effacé ! "
STRING_DEL_ERROR6, "Etes vous sûr (O/N)?"
STRING_DEL_ERROR7, "Efface : %s\n"
STRING_ERROR_ERROR1, "Erreur inconnue! Code d'erreur : 0x%lx\n"
STRING_ERROR_ERROR2, "Erreur de syntaxe"
STRING_FOR_ERROR1, "'in' manquant."
STRING_FOR_ERROR2, "pas de parenthèse trouvée."
STRING_FOR_ERROR3, "'do' manquant."
STRING_FOR_ERROR4, "pas de commande après 'do'."
STRING_FREE_ERROR1, "Lecteur invalide"
STRING_FREE_ERROR2, "sans nom"
STRING_GOTO_ERROR1, "Pas de label indiqué pour GOTO"
STRING_GOTO_ERROR2, "Label '%s' non trouvé\n"
STRING_MOVE_ERROR1, "[OK]\n"
STRING_MOVE_ERROR2, "[Erreur]\n"
STRING_PATH_ERROR, "CMD: Pas dans l'environnement '%s'\n"
STRING_REN_ERROR1, "MoveFile() a échoué. Erreur: %lu\n"
STRING_START_ERROR1, "No batch support at the moment!"
STRING_TIME_ERROR1, "Heure invalide."
STRING_TYPE_ERROR1, "Option invalide '/%s'\n"
STRING_WINDOW_ERROR1, "Fenêtre non trouvée"
STRING_ERROR_PARAMETERF_ERROR, "Format du paramètre incorrect - %c\n"
STRING_ERROR_INVALID_SWITCH, "Paramètre invalide - /%c\n"
STRING_ERROR_TOO_MANY_PARAMETERS, "Trop de paramètres - %s\n"
STRING_ERROR_PATH_NOT_FOUND, "Chemin non trouvé\n"
STRING_ERROR_FILE_NOT_FOUND, "Fichier non trouvé\n"
STRING_ERROR_REQ_PARAM_MISSING, "Paramètre requis manquant\n"
STRING_CMD_SHELLINFO, "\n Interpréteur de ligne de commandes ReactOS"
STRING_VERSION_RUNVER, " tournant sur %s"
STRING_COPY_FILE, " %d fichier(s) copié(s)\n"
STRING_DELETE_WIPE, "effacé(s)"
STRING_FOR_ERROR, "mauvaise variable spécifiée."
STRING_SCREEN_COL, "valeur invalide pour col"
STRING_SCREEN_ROW, "valeur invalide pour lig"
STRING_TIMER_TIME "Le timer n°%d est %s: "
}

View file

@ -0,0 +1,623 @@
#include "resource.h"
#include "windows.h"
/*
* Moved all hardcoded strings to En.rc.
* By Magnus Olsen 2005
* Hungarian resource állomány for ntvdm
* Translation by Robert Horvath (talley at cubeclub.hu) 2005
*/
LANGUAGE LANG_HUNGARIAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
STRING_ATTRIB_HELP, "Állományok attribútumok megjelenítése vagy beállításai.\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] állomány ...\n\
[/S [/D]]\n\n\
+ bekapcsol egy attribútumot\n\
- kikapcsol egy attribútumot\n\
R Írásvédett állomány\n\
A Archiválandó állomány\n\
S Rendszer állomány\n\
H Rejtett állomány\n\
/S Minden állomány módosítása a mappában és minden\n\
almappábanban\n\
/D Mappákra is érvényesíti\n\n\
Ha ATTRIB-ot paraméter nélkül írod be, megjeleníti a mappában található összes állományt és annak attribútumát.\n"
STRING_ALIAS_HELP, "Aliasok megjelenítése, hozzáadása és törlése\n\n\
ALIAS [alias=[parancs]]\n\n\
alias Alias neve.\n\
parancs A szöveg amit behelyettesít.\n\n\
Aliasok megjelenítése:\n\
ALIAS\n\n\
Egy új hozzáadása vagy meglévő helyettesítlse:\n\
ALIAS da=dir a:\n\n\
Egy alias törlése:\n\
ALIAS da="
STRING_BEEP_HELP, "Hangjelzés leadása a speakerből.\n\nBEEP\n"
STRING_CALL_HELP, "Kötegelt parancsfájl meghívása egy másikból.\n\n\
CALL [kötet:][elérési_út]állomány [paraméterek]\n\n\
paraméterek Itt adható meg a szükséges paraméterlista"
STRING_CD_HELP, "Az aktuális mappa nevének a megjelenítése vagy váltás másikra\n\n\
CHDIR [/D][meghajtó:][elérési_út]\n\
CHDIR[..|.]\n\
CD [/D][meghajtó:][elérési_út]\n\
CD[..|.]\n\n\
.. Szülő mappa\n\
/D Megváltoztatja az aktuális mappát és meghajtót is.\n\n\
Írd be, hogy 'CD meghajtó:' hogy ki írja az aktuális mappát.\n\
Írd be a CD-t paraméterek nélkül, hogy megjelenítse az aktuális meghajtót és mappát (ugyanaz mint az előző).\n"
STRING_CHCP_HELP, "Megjeleníti vagy megváltoztatja az aktív kódlapot.\n\n\
CHCP [nnn]\n\n\
nnn A használni kívánt kódlap száma.\n\n\
Írd be a CHCP paraméterek nélkül, hogy megjelenítse az aktív kódlapot.\n"
STRING_CHOICE_HELP, "Vár a felhasználóra, hogy válasszon a felkínált lehetőségek közül.\n\n\
CHOICE [/C[:]választási lehetőségek][/N][/S][/T[:]c,nn][szöveg]\n\n\
/C[:]választási lehetőségek Megengedett billentyűk. Alapértelmezett: YN. <-- Yes->Igen\n\
/N Elrejti a választási lehetőségeket és a kérdőjelet.\n\
/S Kis- és nagybetűk megkülönböztetése.\n\
/T[:]v,nn A v lehetőséget választja nn másodperc után.\n\
szöveg Megjelenítendő szöveg.\n\n\
Az ERRORLEVEL a válasz sorszámára lesz beállítva.\n"
STRING_CLS_HELP, "Törli a képernyőt.\n\nCLS\n"
STRING_CMD_HELP1, "\nElérhető belső parancsok:\n"
STRING_CMD_HELP2, "\nElérhető lehetőségek:"
STRING_CMD_HELP3," [aliasok]"
STRING_CMD_HELP4," [előzmények]"
STRING_CMD_HELP5," [unix típusú állománynév kiegészítés]"
STRING_CMD_HELP6," [mappa tár]"
STRING_CMD_HELP7," [átirányítások és csővezetékek]"
STRING_CMD_HELP8, "Elindít egy új ReactOS parancssor értelmező.\n\n\
CMD [/[C|K] parancs][/P][/Q][/T:eh]\n\n\
/C parancs Végrehajtja a parancsot, majd kilép.\n\
/K parancs Végrehajtja a parancsot, és tovább fut az értelmező.\n\
/P Értelmezi az autoexec.bat állományt és a memóriában marad.\n\
/T:eh COLOR parancs használata.\n"
STRING_COLOR_HELP1, "A konzol elő- és háttérszínét állítja be.\n\n\
COLOR [eh [/-F]] \n\n\
eh A konzol elő- és háttérszínét állítja be.\n\
/-F Nem frissíti az egész képernyőt\n\n\
A színt két hexadecimális számjeggyel lehet beállítani\n\n\
Az elérhető színek:\n\
hex név hex név\n\
0 Fekete 8 Szürke\n\
1 Sötétkék 9 Kék\n\
2 Sötétzöld A Zöld\n\
3 Sötétlila B Türkízkék\n\
4 Bordó C Vörös\n\
5 Ciklámen D Ciklámen\n\
6 Olíva E Sárga\n\
7 Világos szürke F Fehér\n"
STRING_COPY_HELP1, "Felülírja a következőt: %s (Igen/Nem/Mind)? "
STRING_COPY_HELP2, "Egy vagy több állományt másol a megadott helyre.\n\n\
COPY [/V][/Y|/-Y][/A|/B] forrás [/A|/B]\n\
[+ forrás [/A|/B] [+ ...]] [cél [/A|/B]]\n\n\
forrás Megadott állomány(ok)at fogja másolni.\n\
/A Ez ASCII szöveg állomány.\n\
/B Ez bináris állomány.\n\
cél Megadja a cél mappát és/vagy az (új) állománynevet.\n\
/V Ellenőrzi a másolást.\n\
/Y Igennel válaszol kérdésnél.\n\
/-Y Nemmel válaszol kérdésnél.\n\n\
Az /Y kapcsolót a COPYCMD környezeti változóban is használható.\n"
STRING_DATE_HELP1, "\nÚj dátum (hh%cnn%céééé): "
STRING_DATE_HELP2, "\nÚj dátum (nn%chh%céééé): "
STRING_DATE_HELP3, "\nÚj dátum (éééé%chh%cnn): "
STRING_DATE_HELP4, "Megjeleníti vagy beállítja a rendszerdátumot.\n\n\
DATE [/T][dátum]\n\n\
/T Csak megjeleníti\n\n\
Írd be a DATE parancsot paraméter nélkül, hogy megjelenítse a rendszer dátumot és bekérjen egy újat.\n\
Nyomj ENTERT-t, ha nem akarsz változtatni.\n"
STRING_DEL_HELP1, "Eltávolít egy vagy több állományt.\n\n\
DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\
DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\
ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attribútumok]] állomány ...\n\n\
állomány Törlésre kijelöl állomány(ok).\n\n\
/N Nem csinál semmit.\n\
/P Rákérdezés minden állománynál.\n\
/T Statisztika megjelenítése a végén.\n\
/Q Csendes üzemmód.\n\
/W Wipe. Overwrite the állomány with random numbers before deleting it.\n\
/Y Minden válaszra igen. Figyelem, *.*-ot is törli!!\n\
/F Rejtett, csak olvasható és rendszer állományokat is töröl.\n\
/S Almappákban is törli az állományokat\n\
/A Attribútumok alapján törli az állományokat.\n\
attributes\n\
R Csak olvasható állománys\n\
S Rendszer állomány\n\
A Archivált állomány\n\
H Rejtett állománys\n\
- ""Nem"" prefix\n"
STRING_DEL_HELP2, "Minden állomány törölve lesz a mappában!\nBiztosan ezt akarod (I/N)?"
STRING_DEL_HELP3, " %lu állomány törölve\n"
STRING_DEL_HELP4, " %lu állomány törölve\n"
STRING_DELAY_HELP, "pause for n seconds or milliseconds\n\
DELAY [/m]n\n\n\
/m specifiy than n are milliseconds\n\
otherwise n are seconds\n"
STRING_DIR_HELP1, "DIR [meghajtó:][elérési_út][állománynév] [/A[[:]attribútumok]] [/B] [/C] [/D] [/L] [/N]\n\
[/O[[:]rendezési_feltétel]] [/P] [/Q] [/S] [/T[[:]idő]] [/W] [/X] [/4]\n\n\
[meghajtó:][elérési_út][állományname]\n\
Az adott hely állományait és mappáit jeleníti meg.\n\n\
/A A megadott attribútumu állományokat jeleníti csak meg.\n\
attributes D Mappák R Csak olvasható állomány\n\
H Rejtett állomány A Archiválandó állomány\n\
S Rendszer állomány - ""Nem"" prefix\n\
/B Fejléc és összefoglaló nélkül.\n\
/C Ezres elválasztó jel használata. Ez az alapértelmezett, /-C a kikapcsolása.\n\
/D Széles megjelenítés, oszlop szerint rendezve.\n\
/L Kisbetűk használata.\n\
/N New long list format where állománynames are on the far right.\n\
/O Rendezés az alábbiak szerint.\n\
sortorder N Név alapján (ABC sorrend) S Méret alapján (növekvő)\n\
E Kiterjesztés alapján (ABC sorrend) D Dátum/idő alapján (legrégebbi elején)\n\
G Mappák legelől - ""Nem"" prefixel fordított rendezés\n\
/P Csak egy képernyőnyi adat megjelenítése egyszerre.\n\
/Q Állomány tulajdonsosának megjelenítése.\n\
/S Almappák tartalmát is megjeleníti.\n\
/T Controls which time field displayed or used for sorting\n\
timefield C Létrehozás\n\
A Utolsó megtekintés\n\
W Utolsó módosítás\n\
/W Széles megjelenítés.\n\
/X This displays the short names generated for non-8dot3 állomány\n\
names. The format is that of /N with the short name inserted\n\
before the long name. If no short name is present, blanks are\n\
displayed in its place.\n\
/4 Négy számjegyű év\n\n\
A kapcsolók a DIRCMD környezeti változóban is lehetnek.\n"
STRING_DIR_HELP2, " A (%c) meghajtóban található kötet %s\n"
STRING_DIR_HELP3, " A (%c) meghajtóban található kötetnek nincs címkéje.\n"
STRING_DIR_HELP4, " A kötet sorozatszáma: %04X-%04X\n"
STRING_DIR_HELP5, "\n Összes állomány:\n%16i Állomány(ok)% 14s bájt\n"
STRING_DIR_HELP6, "%16i Mappa %15s bájt"
STRING_DIR_HELP7, "\n %s tartalma\n\n"
STRING_DIR_HELP8, "%16i Állomány %14s bájt\n"
STRING_DIRSTACK_HELP1, "Megjegyzi az aktuális mappát, majd átvált egy máasikra.\n\n\
PUSHD [elérési_út | ..]\n\n\
elérési_út Ebbe a mappába fog átváltani\n"
STRING_DIRSTACK_HELP2, "Visszalép a PUSHD által megjegyzett mappába.\n\nPOPD"
STRING_DIRSTACK_HELP3, "Megjeleníti a megjegyzett mappákat.\n\nDIRS"
STRING_DIRSTACK_HELP4, "Üres a tár"
STRING_ECHO_HELP1, "Megjeleníti a szöveget új sor nélkül.\n\n\
ECHOS szöveg"
STRING_ECHO_HELP2, "Displays a message to the standard error.\n\n\
ECHOERR szöveg\n\
ECHOERR. Új sor"
STRING_ECHO_HELP3, "Prints a messages to standard error output without trailing carridge return and line feed.\n\n\
ECHOSERR message"
STRING_ECHO_HELP4, "Megjelenít egy szöveget, vagy beállítja a visszhangot.\n\n\
ECHO [ON | OFF]\n\
ECHO [üzenet]\n\
ECHO. Új sor\n\n\
Paraméter nélkül megjeleníti a visszang állapotát."
STRING_ECHO_HELP5, "Az ECHO %s\n"
STRING_EXIT_HELP, "Kilép a parancssor értelmezőből.\n\nEXIT\n"
STRING_FOR_HELP1, "Végrehajt egy parancsot az összes fájlban a megadott mappákban\n\n\
FOR %változó IN (csoport) DO parancs [paraméterek]\n\n\
%változó A cserélhető paraméter.\n\
(csoport) Állományok csoportja. Joker-karakterek megengedettek EZT KURVÁRA ÁTKELL FORDÍTANI :)) wildcardok helyett?.\n\
parancs Ezt a parancsot hajtja végre minden egyes állománnyal.\n\
paraméterek Ezeket a paramétereket adja meg a parancsnak.\n\n\
A batch állományban való haszálathoz %%változó kell a %változó helyett.\n"
STRING_FREE_HELP1, "\nA (%s) meghajtóban lévő kötet címkéje %-11s\n\
Sorozatszám: %s\n\
%16s bájt a teljes hely\n\
%16s bájt használva\n\
%16s bájt szabad\n"
STRING_FREE_HELP2, "Kötet méret információk.\n\nFREE [meghajtó: ...]\n"
STRING_IF_HELP1, "Performs conditional processing in batch programs.\n\n\
IF [NOT] ERRORLEVEL number command\n\
IF [NOT] string1==string2 command\n\
IF [NOT] EXIST állományname command\n\
IF [NOT] DEFINED variable command\n\n\
NOT Specifies that CMD should carry out the command only if\n\
the condition is false\n\
ERRORLEVEL number Specifies a true condition if the last program run returned\n\
an exit code equal or greater than the number specified.\n\
command Specifies the command to carry out if the condition is met.\n\
string1==string2 Specifies a true condition if the specified text strings\n\
match.\n\
EXIST állományname Specifies a true condition if the specified állományname exists.\n\
DEFINED variable Specifies a true condition if the specified variable is\n\
defined.\n"
STRING_GOTO_HELP1, "Átirányít egy másik címkére a batch állományban.\n\n\
GOTO címke\n\n\
címke A megadott címkére fog ugrani az értelmező.\n\n\
Egy címkét egy sorban lehet megadni, ':' -tal kezdve."
STRING_LABEL_HELP1, "A kötet címkéjét megjeleníti, vagy megváltoztatja.\n\n\
LABEL [meghajtó:] [új_címke]\n"
STRING_LABEL_HELP2, "A (%c) meghajtóban lévő kötet címkéje %s\n"
STRING_LABEL_HELP3, "A (%c) megjajtóban lévő kötetnek nincs címkéje.\n"
STRING_LABEL_HELP4, "A kötet sorozatszáma %04X-%04X\n"
STRING_LABEL_HELP5, "Új kötetcímke (11 betű, ENTER ha üres)? "
STRING_LOCALE_HELP1, "Az aktuális idő:"
STRING_MKDIR_HELP, "Létrehoz egy új mappát.\n\n\
MKDIR [meghajtó:]path\nMD [meghajtó:]path"
STRING_MEMMORY_HELP1, "Megjeleníti a memória statisztikát.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n A memória %12s%%-a foglalt.\n\n\
%13s bájtnyi teljes fizikai memória.\n\
%13s bájtnyi elérhető memória.\n\n\
%13s bájt a lapozóállomány.\n\
%13s bájtnyi elérhető a lapozóállományban.\n\n\
%13s bájt a teljes virtuális memória.\n\
%13s bájtnyi elérhető a virtuális memóriából.\n"
STRING_MISC_HELP1, "A folytatáshoz nyomj meg egy billentyűt . . .\n"
STRING_MOVE_HELP1, "Felülírja %s (Igen/Nem/Mind)? "
STRING_MOVE_HELP2, "Áthelyezi és átnevezi az állományokat a mappákban.\n\n\
Egy vagy több állomány áthelyezéséhez:\n\
MOVE [/N][meghajtó:][elérési_út]állomány1[,...] cél\n\n\
Mappa átnevezése:\n\
MOVE [/N][meghajtó:][elérési_út]mappa1 mappa2\n\n\
[meghajtó:][elérési_út]állomány1 Átnevezendő állományok forrása.\n\
/N Nem helyez át semmit.\n\n\
Hiányosságok:\n\
- Nem lehet meghajtók között áthelyezni állományokat.\n"
STRING_MSGBOX_HELP, "display a message box and return user responce\n\n\
MSGBOX type ['title'] prompt\n\n\
type button displayed\n\
possible values are: OK, OKCANCEL,\n\
YESNO, YESNOCANCEL\n\
title title of message box\n\
prompt text displayed by the message box\n\n\n\
ERRORLEVEL is set according the button pressed:\n\n\
YES : 10 | NO : 11\n\
OK : 10 | CANCEL : 12\n"
STRING_PATH_HELP1, "Megjeleníti vagy beállítja a keresési útvonalakat.\n\n\
PATH [[meghajtó:]elérési_út[;...]]\n\
PATH ; Keresési útvonalak törlése\n\n\
A PATH törléséhez a következőt írd be: PATH ;\n\
Így csak az aktuális mappában fog keresni a CMD.\
Paraméterek nélkül az érvényes keresési útvonalakat mutatja meg.\n"
STRING_PROMPT_HELP1, "Parancssor beállítása.\n\n\
PROMPT [szöveg]\n\n\
szöveg Az új parancssor megadása.\n\n\
A parancssor speciális kódokat is tartalmazhat:\n\n\
$A & (és jel)\n\
$B | (cső)\n\
$C ( (kezdő rázójel)\n\
$D Aktuális dátum\n\
$E Escape-kód (ASCII 27-es kód)\n\
$F ) (záró zárójel)\n\
$G > ('nagyobb' jel)\n\
$H Törlés (elötte lévő karaktert törli)\n\
$L < ('kissebb' jel)\n\
$N Aktuális meghajtó\n\
$P Aktuális meghajtó és mappa\n\
$Q = (egyenlőség jel)\n\
$T Aktuális idő\n\
$V OS verziószám\n\
$_ Újsor\n\
$$ $ (dollár jel)\n"
STRING_PAUSE_HELP1, "Felfüggeszti a futást, és vár a felhasználóra. A következő üzenet jelenik meg:\n\
'A folytatáshoz nyomj meg egy billentyűt . . .' vagy egy általad választott üzenet.\n\n\
PAUSE [message]"
STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack"
STRING_PROMPT_HELP3, "\nHa paraméter nélkül beírod a PROMPT parancsot, vissza áll az alapértelmezettre a kijelzés."
STRING_REM_HELP, "Megjegyzést jelölő sor batch fájlokban.\n\nREM [megjegyzés]"
STRING_RMDIR_HELP, "Eltávolít egy mappát.\n\n\
RMDIR [meghajtó:]elérési_út\nRD [meghajtó:]elérési_út"
STRING_REN_HELP1, "Átnevez egy állományt.\n\n\
RENAME [/E /N /P /Q /S /T] régi_név ... új_név\n\
REN [/E /N /P /Q /S /T] régi_név ... új_név\n\n\
/E Hibaüzenetek elrejtése.\n\
/N Ne csináljon semmit .\n\
/P Minden állománynál rákérdez. (Még NEM működik!!)\n\
/Q Csendes működés.\n\
/S Almappákat is átnevez.\n\
/T Összes átnevezett fájl és állomány.\n\n\
Csak az aktuális meghajtón és mappában fog működni.\n\
Ha ez nem elég, használd a MOVE parancsot."
STRING_REN_HELP2, " %lu állomány átnevezve\n"
STRING_REN_HELP3, " %lu állomány átnevezve\n"
STRING_SHIFT_HELP, "Eltolja a helyettesíthető paraméterek pozícióját a batch állományban.\n\n\
SHIFT [DOWN]"
STRING_SCREEN_HELP, "Megváltoztatja a kurzos pozícióját, vagy megjelenít adott pozícióban egy szöveget.\n\n\
SCREEN sor oszlop [szöveg]\n\n\
sor Ugrás sora\n\
oszlop Ugrás oszlopa"
STRING_SET_HELP, "Megjeleníti vagy beállítja a környezeti változókat.\n\n\
SET [változó[=][érték]]\n\n\
változó Környezeti változó neve.\n\
érték A beállítandó érték.\n\n\
Paraméterek nélkül megjeleníti az összes környezetiváltozót.\n"
STRING_START_HELP1, "Végrehajt egy parancsot.\n\n\
START parancs\n\n\
parancs Végrehajtja a megadott parancsot.\n\n\
Jelenleg minden parancs aszinkron hajtódik végre.\n"
STRING_TITLE_HELP, "Beállítja az ablak címsorának szövegét.\n\n\
TITLE [szöveg]\n\n\
szöveg Beállítja az ablak címsorának szövegét.\n"
STRING_TIME_HELP1, "Megjeleníti vagy beállítja a rendszeridőt.\n\n\
TIME [/T][idő]\n\n\
/T Csaj megjeleníti\n\n\
Paraméterek nélkül megjeleníti az aktuális időt és kér egy újat.\n\
Csak egy ENTER megnyomásával nem állítja át.\n"
STRING_TIME_HELP2, "Új idő: "
STRING_TIMER_HELP1, "Eltelt %d ezred másodperc\n"
STRING_TIMER_HELP2, "Eltelt: %02d%c%02d%c%02d%c%02d\n"
STRING_TIMER_HELP3, "allow the use of ten stopwaches.\n\n\
TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
ON Stopper bekapcsolása\n\
OFF Stopper kikapcsolása\n\
/S Split time. Return stopwatch split\n\
time without changing its value\n\
/n Stopper azonosító megadása.\n\
Stopwaches avaliable are 0 to 9\n\
If it is not specified default is 1\n\
/Fn Format for output\n\
n can be:\n\
0 milliseconds\n\
1 hh%cmm%css%cdd\n\n\
if none of ON, OFF or /S is specified the command\n\
will toggle stopwach state\n\n"
STRING_TYPE_HELP1, "Megjeleníti az állományok tartalmát.\n\n\
TYPE [meghajtó:][elérési_út]állománynév \n\
/P Csak egy képernyőnyi tartalmat jelenít meg egyszerre.\n"
STRING_VERIFY_HELP1, "Ez a parancs még nem működik!!\n\
Lemezre írás utáni ellenőrzést állítja be.\n\n\
VERIFY [ON | OFF]\n\n\
Írd be a VERIFY-t paraméterek nélkül, hogy megjelenítse aktuális állapotát.\n"
STRING_VERIFY_HELP2, "Az ellenőrzés jelenleg %s.\n"
STRING_VERIFY_HELP3, "Csak az ON vagy OFF elfogadott."
STRING_VERSION_HELP1, "A ReactOS verzióinformációit jeleníti meg\n\n\
VER [/C][/R][/W]\n\n\
/C Készítők névsora.\n\
/R Terjesztési információk.\n\
/W Jótállási információk."
STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\
type: `ver /w'. This is free software, and you are welcome to redistribute\n\
it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\
listing of credits."
STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
GNU General Public License for more details."
STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
it under the terms of the GNU General Public License as published by\n\
the Free Software Foundation; either version 2 of the License, or\n\
(at your option) any later version.\n"
STRING_VERSION_HELP5, "\nHibákról E-Maileket ide küldhetsz: <ros-dev@reactos.org>.\n\
Frissítések és egyéb információk: http://www.reactos.org"
STRING_VERSION_HELP6, "\nA FreeDOS készítői:\n"
STRING_VERSION_HELP7, "\nA ReactOS készítői:\n"
STRING_VOL_HELP1, " A (%c) meghajtóban lévő kötet: %s\n"
STRING_VOL_HELP2, " A (%c) meghajtóban lévő kötetnek nincs címkéje"
STRING_VOL_HELP3, " A kötet sorozatszáma %04X-%04X\n"
STRING_VOL_HELP4, "A kötet címkéjének és sorozatszámának megjelenítése, ha léteznek.\n\nVOL [meghajtó:]"
STRING_WINDOW_HELP1, "change console window aspect\n\n\
WINDOW [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
/POS specify window placement and dimensions\n\
MIN minimize the window\n\
MAX maximize the window\n\
RESTORE restore the window"
STRING_WINDOW_HELP2, "change console window aspect\n\n\
ACTIVATE 'window' [/POS[=]left,top,width,heigth]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
window tile of window on wich perform actions\n\
/POS specify window placement and dimensions\n\
MIN minimize the window\n\
MAX maximize the window\n\
RESTORE restore the window\n\
title new title\n"
STRING_HELP1, "Támogatott parancsok megjelenítése\n\n\
parancs /? Több (részletes) információ megtekintéséhez használd ezt.\n\n\
? Minden támogatott parancs megjelenítése (részletek nélkül).\n\
ALIAS Megjeleníti, vagy megváltoztatja az aliasokat.\n\
ATTRIB Megjeleníti vagy megváltoztatja az állományok attribútumát.\n\
BEEP Megszólaltatja a hangszórót.\n\
CALL Batch állományból egy másik batch állomány meghívása.\n\
CD Megjeleníti vagy átvált egy másik mappába.\n\
CHCP Megjeleníti vagy megváltoztatja az aktív kódlapot.\n\
CHOICE Vár a felhasználóra, hogy válasszon a felkínált lehetőségek közül.\n\
CLS Letörli a képernyőt.\n\
CMD Egy új példányt indít a ReactOS parancsértelmezőjéből.\n\
COLOR A konzol elő- és háttérszínét állítja be.\n\
COPY Egy vagy több állományt másol a megadott helyre.\n\
DATE Megjeleníti vagy beállítja a rendszerdátumot.\n\
DELETE Eltávolít egy vagy több állományt.\n\
DIR Megjeleníti a mappában található almappákat és állományokat.\n\
ECHO Megjelenít egy szöveget, vagy beállítja a visszhangot.\n\
ERASE Eltávolít egy vagy több fájlt.\n\
EXIT Kilép a parancssor értelmezőből.\n\
FOR Végrehajt egy parancsot az összes fájlban a megadott mappákban.\n\
FREE Megjeleníti a szabad hely méretét.\n\
GOTO Átirányít egy másik címkére a batch állományban.\n\
HELP Segítséget ad a ReactOS parancsairól.\n\
HISTORY Megjeleníti az ebben az ablakban kiadott parancsok listáját.\n\
IF Feltételes végrehajtás batch állományokban.\n\
LABEL Beállítja egy kötet címkéjét.\n\
MD Létrehoz egy új mappát.\n\
MKDIR Létrehoz egy új mappát.\n\
MOVE Áthelyez egy vagy több állományt az egyik mappából a másikba.\n\
PATH Megjeleníti vagy beállítja a keresési útvonalakat.\n\
PAUSE Felfüggeszti a futást, és vár a felhasználóra.\n\
POPD Visszalép a PUSHD által megjegyzett mappába.\n\
PROMPT Parancssor beállítása.\n\
PUSHD Megjegyzi az aktuális mappát, majd átvált egy máasikra.\n\
RD Töröl egy mappát.\n\
REM Megjegyzést jelölő sor batch fájlokban.\n\
REN Átnevez egy állományt.\n\
RENAME Átnevez egy állományt.\n\
RMDIR Töröl egy mappát.\n\
SCREEN Megváltoztatja a kurzos pozícióját, vagy megjelenít adott pozícióban egy szöveget.\n\
SET Megjeleníti vagy beállítja a környezeti változókat.\n\
SHIFT Eltolja a helyettesíthető paraméterek pozícióját a batch állományban.\n"
STRING_HELP2, "START Egy új ablakban hajtha végre a parancsot.\n\
TIME Megjeleníti vagy beállítja a rendszeridőt.\n\
TIMER Időzítők kezelését teszi lehetőve.\n\
TITLE Beállítja az ablak címsorának szövegét.\n\
TYPE Megjeleníti egy állomány tartalmát.\n\
VER Megjeleníti a ReactOS verzió információját.\n\
VERIFY Írási műveletek ellenőrzését vezérli\n\
VOL Megjeleníti egy kötet címkéjét és sorozatszámát.\n"
STRING_CHOICE_OPTION, "IN"
STRING_COPY_OPTION, "INM"
STRING_ALIAS_ERROR, "A parancssor túl hosszú az alias kibontásakor!\n"
STRING_BATCH_ERROR, "Hiba a batch állomány megnyitásakor\n"
STRING_CHCP_ERROR1, "Aktív kódlap: %u\n"
STRING_CHCP_ERROR4, "Érvénytelen kódlap\n"
STRING_CHOICE_ERROR, "Érvénytelen paraméter. Várt formátum: /C[:]választási lehetőségek"
STRING_CHOICE_ERROR_TXT, "Érvénytelen paraméter. Várt formátum: /T[:]v,nn"
STRING_CHOICE_ERROR_OPTION, "Érvénytelen paraméter: %s"
STRING_CMD_ERROR1, "Nem lehet átirányítani a bevitelt a(z) %s állományból\n"
STRING_CMD_ERROR2, "Hiba a csővezetékhez tartozó ideiglenes állomány létrehozásakor\n"
STRING_CMD_ERROR3, "Nem lehet a(z) %s állományba átirányítani\n"
STRING_CMD_ERROR4, "%s futtatása...\n"
STRING_CMD_ERROR5, "cmdexit.bat futtatása...\n"
STRING_COLOR_ERROR1, "Ugyanaz a szín nem lehet! (Az elő- és háttérszín nem lehet ugyanolyan)"
STRING_COLOR_ERROR2, "Hibás szín megadás"
STRING_COLOR_ERROR3, "Szín %x\n"
STRING_COLOR_ERROR4, "Ugyanaz a szín nem lehet!"
STRING_CONSOLE_ERROR, "Ismeretlen hiba: %d\n"
STRING_COPY_ERROR1, "Hiba: a forrás nem nyitható meg - %s!\n"
STRING_COPY_ERROR2, "Hiba: nem másolhatod önmagára az állományt!\n"
STRING_COPY_ERROR3, "Hiba a cél írása közben!\n"
STRING_COPY_ERROR4, "Hiba: ez még nem működik!\n"
STRING_DATE_ERROR, "Érvénytelen dátum."
STRING_DEL_ERROR5, "A(z) %s állomány törölve lesz! "
STRING_DEL_ERROR6, "Biztos vagy benne (I/N)?"
STRING_DEL_ERROR7, "Törlés: %s\n"
STRING_ERROR_ERROR1, "Ismeretlen hiba! Hiba kód: 0x%lx\n"
STRING_ERROR_ERROR2, "Szintaxis hiba"
STRING_FOR_ERROR1, "az 'in' után hiányzik a feltétel."
STRING_FOR_ERROR2, "nincs zárójel megadva."
STRING_FOR_ERROR3, "a 'do' hiányzik."
STRING_FOR_ERROR4, "nincs parancs a 'do' után."
STRING_FREE_ERROR1, "Érvénytelen meghajtó"
STRING_FREE_ERROR2, "nincs cimkézve"
STRING_GOTO_ERROR1, "Nem lett cimke megadva a GOTO után"
STRING_GOTO_ERROR2, "A '%s' cimke nem található\n"
STRING_MOVE_ERROR1, "[OK]\n"
STRING_MOVE_ERROR2, "[HIBA]\n"
STRING_REN_ERROR1, "MoveÁllomány() sikertelen. Hiba: %lu\n"
STRING_START_ERROR1, "Nincs batch támogatás jelenleg!"
STRING_TIME_ERROR1, "Érvénytelen idő."
STRING_TYPE_ERROR1, "Érvénytelen beállítás '/%s'\n"
STRING_WINDOW_ERROR1, "Az ablak nem található"
STRING_ERROR_PARAMETERF_ERROR, "A paraméter megadás hibás - %c\n"
STRING_ERROR_INVALID_SWITCH, "Érvénytelen kapcsoló - /%c\n"
STRING_ERROR_TOO_MANY_PARAMETERS, "Túl sok paraméter - %s\n"
STRING_ERROR_PATH_NOT_FOUND, "Az elérési_út nem halálható\n"
STRING_ERROR_FILE_NOT_FOUND, "Az állomány nem található\n"
STRING_ERROR_REQ_PARAM_MISSING, "Egy szükséges paraméter hiányzik\n"
STRING_ERROR_INVALID_DRIVE, "Érvénytelen meghajtó\n"
STRING_ERROR_INVALID_PARAM_FORMAT, "Érvénytelen paraméter megadás - %s\n"
STRING_ERROR_BADCOMMAND, "Ismeretlen parancs vagy állomány név\n"
STRING_ERROR_OUT_OF_MEMORY, "Nincs elég memória.\n"
STRING_ERROR_CANNOTPIPE, "Error! Cannot pipe! Cannot open temporary állomány!\n"
STRING_ERROR_D_PAUSEMSG, "A folytatáshoz nyomj meg egy billentyűt . . ."
STRING_ERROR_DRIVER_NOT_READY, "A meghajtó nem áll készen"
STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"
STRING_CMD_SHELLINFO, "\nReactOS Parancssor értelmező"
STRING_VERSION_RUNVER, " running on %s"
STRING_COPY_FILE , " %d állomány másolva\n"
STRING_DELETE_WIPE, "wiped"
STRING_FOR_ERROR, "Hibás változó."
STRING_SCREEN_COL, "Érvénytelen érték oszlopnak"
STRING_SCREEN_ROW, "Érvénytelen érték sornak"
STRING_TIMER_TIME "Időzítő %d értéke %s: "
}

View file

@ -0,0 +1,658 @@
#include "windows.h"
#include "resource.h"
/*
* Moved all hardcoded strings to En.rc.
* By Magnus Olsen 2005
*/
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
STRING_ATTRIB_HELP, "ファイル属性を表\示または変更します。\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [ファイル] ...\n\
[/S [/D]]\n\n\
+ 属性を設定します。\n\
- 属性を解除します。\n\
R 読みとり専用属性。\n\
A アーカイブ属性。\n\
S システム ファイル属性。\n\
H 隠しファイル属性。\n\
/S 現在のフォルダとすべてのサブフォルダの一致するファイルを\n\
処理します。\n\
/D フォルダも処理します。\n\n\
パラメータを指定しないで ATTRIB と入力すると、すべてのファイルの属性を表\示します。\n"
STRING_ALIAS_HELP, "エイリアスの設定や解除をしたり、エイリアスを表\示したりします。\n\n\
ALIAS [エイリアス=[コマンド]]\n\n\
エイリアス エイリアスとしてつける名前。\n\
コマンド エイリアスとして設定する文字列。\n\n\
すべてのエイリアスを一覧表\示するには:\n\
ALIAS\n\n\
新たにエイリアスを設定したり、既存のエイリアスを置き換えるには:\n\
ALIAS da=dir a:\n\n\
エイリアスのリストからエイリアスを取り除くには:\n\
ALIAS da="
STRING_BEEP_HELP, "スピーカからビープ音を鳴らします。\n\nBEEP\n"
STRING_CALL_HELP, "バッチ プログラムを別のバッチ プログラムから呼び出します。\n\n\
CALL [ドライブ:][パス]ファイル名 [バッチパラメータ]\n\n\
バッチパラメータ バッチ プログラムで必要なコマンド ライン情報を\n\
指定します。"
STRING_CD_HELP, "現在のディレクトリを変更したり、ディレクトリ名を表\示したりします。\n\n\
CHDIR [/D][ドライブ:][パス]\n\
CHDIR[..|.]\n\
CD [/D][ドライブ:]パス]\n\
CD[..|.]\n\n\
.. 親ディレクトリ\n\
. 現在のディレクトリ\n\
/D 現在のドライブとディレクトリの両方を変更します。\n\n\
CD ドライブ: と入力すると指定されたドライブの現在のディレクトリが表\示されます。\n\
パラメータを指定しないで CD と入力すると、現在のドライブとディレクトリが表\示されます。\n"
STRING_CHCP_HELP, "現在のコード ページ番号を表\示または設定します。\n\n\
CHCP [nnn]\n\n\
nnn コード ページ番号を指定します。\n\n\
現在のコード ページ番号を表\示するときは、パラメータを指定せずに CHCP と入力してください。\n"
STRING_CHOICE_HELP, "ユーザーが選択肢から一つを選択するのを待ちます。\n\n\
CHOICE [/C[:]選択肢][/N][/S][/T[:]c,nn][文字列]\n\n\
/C[:]選択肢 許されるキー入力を指定します。デフォルトは YN です。\n\
/N プロンプトの文字列の最後に、選択肢と ? を表\示しません。\n\
/S キー入力の大文字・小文字を区別します。\n\
/T[:]c,nn nn 秒経過すると自動的に c を選択します。\n\
文字列 表\示するプロンプトの文字列です。\n\n\
ユーザーが選択肢にあるキーを押すと、そのオフセットが ERRORLEVEL にセットされます。\n"
STRING_CLS_HELP, "画面を消去します。\n\nCLS\n"
STRING_CMD_HELP1, "\n利用できる内部コマンド:\n"
STRING_CMD_HELP2, "\n利用できる機能\:"
STRING_CMD_HELP3," [エイリアス]"
STRING_CMD_HELP4," [ヒストリ]"
STRING_CMD_HELP5," [UNIX ファイル名補完]"
STRING_CMD_HELP6," [ディレクトリ スタック]"
STRING_CMD_HELP7," [リダイレクトとパイプ]"
STRING_CMD_HELP8, "ReactOS コマンド ライン インタープリタの新しいインスタンスを開始します。\n\n\
CMD [/[C|K] コマンド][/P][/Q][/T:bf]\n\n\
/C コマンド 指定されたコマンドを実行した後、終了します。\n\
/K コマンド 指定されたコマンドを実行しますが、終了しません。\n\
/P CMD は永続的に動作をし、autoexec.bat を実行します\n\
(終了させることはできません)。\n\
/T:bf 前景色および背景色を設定します (詳細は COLOR /? を参照して\n\
ください)。\n"
STRING_COLOR_HELP1, "コンソ\ールのデフォルトの前景色および背景色を設定します。\n\n\
COLOR [属性 [/-F]] \n\n\
属性 コンソ\ール出力の色属性を指定します。\n\
/-F コンソ\ールの空いている空間には色属性を適用しない。\n\n\
色は次の 3 種類の方法で指定することができます。\n\
1) [色名] on [色名] (必要なのは最初の 3 文字だけです)\n\
2) [10 進数] on [10 進数]\n\
3) 2 桁の 16 進数\n\n\
色名:\n\
10進 16進 色名 10進 16進 色名\n\
0 0 黒 8 8 灰色 (明るい黒)\n\
1 1 青 9 9 明るい青\n\
2 2 緑 10 A 明るい緑\n\
3 3 水色 11 B 明るい水色\n\
4 4 赤 12 C 明るい赤\n\
5 5 紫 13 D 明るい紫\n\
6 6 黄色 14 E 明るい黄色\n\
7 7 白 15 F 輝く白\n"
STRING_COPY_HELP1, "%s を上書きしますが、よろしいですか? (Yes/No/All)? "
STRING_COPY_HELP2, "1 つまたは複数のファイルを別の場所にコピーします。\n\n\
COPY [/V][/Y|/-Y][/A|/B] コピー元 [/A|/B]\n\
[+ コピー元 [/A|/B] [+ ...]] [コピー先 [/A|/B]]\n\n\
コピー元 コピーするファイル (複数可) を指定します。\n\
/A ASCII テキスト ファイルとして扱います。\n\
/B バイナリ ファイルとして扱います。\n\
コピー先 新しいファイルのディレクトリまたはファイル名 (複数可) を\n\
指定します。\n\
/V 新しいファイルが正しく書き込まれたか検査します。\n\
/Y 受け側の既存のファイルを上書きする前に確認のメッセージを\n\
表\示しません。\n\
/-Y 受け側の既存のファイルを上書きする前に確認のメッセージを\n\
表\示します。\n\n\
T環境変数 COPYCMD でスイッチ /Y が設定されている場合があります。\n\
...\n"
STRING_DATE_HELP1, "\n新しい日付を入力してください (mm%cdd%cyyyy): "
STRING_DATE_HELP2, "\n新しい日付を入力してください (dd%cmm%cyyyy): "
STRING_DATE_HELP3, "\n新しい日付を入力してください (yyyy%cmm%cdd): "
STRING_DATE_HELP4, "日付を表\示または設定します。\n\n\
DATE [/T][日付]\n\n\
/T 日付の表\示のみ行います。\n\n\
パラメータの指定がない場合は、現在の日付が表\示され、新しい日付の入力を\n\
求められます。変更しない場合は、Enter キーを押します。\n"
STRING_DEL_HELP1, "1 つまたは複数のファイルを削除します。\n\n\
DEL [/N /P /T /Q /S /W /Y /Z /A[[:]属性]] ファイル名 ...\n\
DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]属性]] ファイル名 ...\n\
ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]属性]] ファイル名 ...\n\n\
ファイル名\n\
削除するファイル (複数可) を指定します。\n\n\
/N Nothing. 何もしません。\n\
/P Prompt. 各ファイルを削除する前に確認のメッセージを表\示します。\n\
/T Total. 削除されたファイルの総数と解放されたディスク領域を表\示します。\n\
/Q Quiet.\n\
/W Wipe. 削除する前に、ファイルを乱数で上書きします。\n\
/Y Yes. ワイルドカードを使用して一括削除するときも、確認のメッセージを\n\
表\示せずに削除します。\n\
/F 読みとり専用ファイルやシステム ファイルを強制的に削除します。\n\
/S 指定されたファイルをすべてのサブディレクトリから削除します。\n\
/A 属性により削除するファイルを選択します。\n\
属性\n\
R 読み取り専用\n\
S システム ファイル\n\
A アーカイブ\n\
H 隠しファイル\n\
- その属性以外\n"
STRING_DEL_HELP2, "ディレクトリのすべてのファイルが削除されます!\nよろしいですか (Y/N)?"
STRING_DEL_HELP3, " %lu 個のファイルを削除しました\n"
STRING_DEL_HELP4, " %lu 個のファイルを削除しました\n"
STRING_DELAY_HELP, "n 秒、または n ミリ秒待機します。\n\
DELAY [/m]n\n\n\
/m 単位をミリ秒に指定します。\n\
指定しない場合、単位には秒が使われます。\n"
STRING_DIR_HELP1, "ディレクトリ中のファイルとサブディレクトリを一覧表\示します。\n\n\
DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]\n\
[/O[[:]ソ\ート順]] [/P] [/Q] [/S] [/T[[:]タイムフィールド]] [/W] [/X] [/4]\n\n\
[ドライブ:][パス][ファイル名]\n\
一覧表\示するドライブ、ディレクトリ、またはファイルを指定します。\n\
/A 指定された属性のファイルを表\示します。\n\
属性 D ディレクトリ R 読み取り専用\n\
H 隠しファイル A アーカイブ\n\
S システム ファイル - その属性以外\n\
/B ファイル名のみを表\示します (見出しや要約が付きません)。\n\
/C ファイル サイズを桁区切り表\示します。これは\n\
デフォルトの設定です。/-C とすると桁区切り表\示されません。\n\
/D /W と同じですが、ファイルを列で並べ替えた一覧を表\示します。\n\
/L 小文字で表\示します。\n\
/N ファイル名を右端に表\示する新しい一覧形式を使用します。\n\
/O ファイルを並べ替えて表\示します。\n\
ソ\ート順 N 名前順 (アルファベット) S サイズ順 (小さいほうから)\n\
E 拡張子順 (アルファベット) D 日時順 (古いほうから)\n\
G グループ (ディレクトリから) - 降順\n\
/P 1 画面ごとに停止して表\示します。\n\
/Q ファイルの所有者を表\示します。\n\
/S 指定されたディレクトリおよびそのサブディレクトリのすべての\n\
ファイルを表\示します。\n\
/T どのタイムフィールドを表\示するか、または並べ替えに使用するかを\n\
指定します。\n\
タイムフィールド C 作成n\n\
A 最終アクセス\n\
W 最終更新\n\
/W ワイド一覧形式で表\示します。\n\
/X このオプションは MS-DOS 形式 (8.3) 以外のファイル名に対する短い\n\
名前を表\示します。長い名前の前に短い名前を表\示する点を除けば、\n\
/N オプションと同じです。短い名前がない場合は、ブランクに\n\
なります。\n\
/4 4 つの数字で年を表\示します。\n\n\
環境変数 DIRCMD にスイッチを設定できます。\n\
/-W のように - (ハイフン) を前につけると、そのスイッチは無効になります。\n"
STRING_DIR_HELP2, " ドライブ %c のボリューム ラベルは %s です\n"
STRING_DIR_HELP3, " ドライブ %c にはボリューム ラベルがありません。\n"
STRING_DIR_HELP4, " ボリューム シリアル番号は %04X-%04X です\n"
STRING_DIR_HELP5, "\n ファイルの総数:\n%16i 個のファイル% 14s バイト\n"
STRING_DIR_HELP6, "%16i 個のディレクトリ% 15s バイト\n"
STRING_DIR_HELP7, "\n %s のディレクトリ\n\n"
STRING_DIR_HELP8, "%16i 個のファイル% 14s バイト\n"
STRING_DIRSTACK_HELP1, "POPD コマンドで使用するために現在のディレクトリを保存し、\n\
指定したディレクトリに変更します。\n\n\
PUSHD [パス | ..]\n\n\
パス 現在のディレクトリとして設定するディレクトリを指定します。\n"
STRING_DIRSTACK_HELP2, "PUSHD コマンドで記憶されたディレクトリに変更します。\n\nPOPD"
STRING_DIRSTACK_HELP3, "ディレクトリ スタックの一覧を表\示します。\n\nDIRS"
STRING_DIRSTACK_HELP4, "ディレクトリ スタックは空です。"
STRING_ECHO_HELP1, "メッセージを表\示しますが、前にキャリッジ リターンとラインフィードをつけません。\n\n\
ECHOS メッセージ"
STRING_ECHO_HELP2, "標準エラーにメッセージを表\示します。\n\n\
ECHOERR メッセージ\n\
ECHOERR. 空行を出力します。"
STRING_ECHO_HELP3, "標準エラーにメッセージを表\示しますが、前にキャリッジ リターンと\n\
ラインフィードをつけません。\n\n\
ECHOSERR メッセージ"
STRING_ECHO_HELP4, "メッセージを表\示したり、コマンド エコーの ON と OFF を切り替えます。\n\n\
ECHO [ON | OFF]\n\
ECHO [メッセージ]\n\
ECHO. 空行を出力します。\n\n\
現在のエコー設定を表\示するには、パラメータを指定せずに ECHO と入力してください。"
STRING_ECHO_HELP5, "ECHO は %s です。\n"
STRING_EXIT_HELP, "コマンド インタープリタを終了します。\n\nEXIT\n"
STRING_FOR_HELP1, "指定されたコマンドをファイル セットの各ファイルに対して実行します。\n\n\
FOR %%変数 IN (セット) DO コマンド [パラメータ]\n\n\
%%変数 単一文字の置き換え可能\なパラメータを指定します。\n\
(セット) ファイル セットを指定します。ワイルドカードを使用できます。\n\
コマンド 各ファイルごとに実行するコマンドを指定します。\n\
パラメータ 指定されたコマンドのパラメータまたはスイッチを指定します。\n\n\
バッチ プログラムで FOR コマンドを使用するときは、%%変数の代わりに、\n\
%%%%変数を使用してください。\n"
STRING_FREE_HELP1, "\nドライブ %c のボリューム ラベルは %-11s です\n\
シリアル番号は %s です\n\
%16s バイト: 全ディスク容量\n\
%16s バイト: 使用中\n\
%16s バイト: 空き容量\n"
STRING_FREE_HELP2, "ドライブに関する情報を表\示します。\n\nFREE [ドライブ: ...]\n"
STRING_IF_HELP1, "バッチ プログラム中で条件処理を実行します。\n\n\
IF [NOT] ERRORLEVEL 番号 コマンド\n\
IF [NOT] 文字列1==文字列2 コマンド\n\
IF [NOT] EXIST ファイル名 コマンド\n\
IF [NOT] DEFINED 変数 コマンド\n\n\
NOT 条件が偽の場合にだけ、CMD がコマンドを実行することを\n\
指定します。\n\
ERRORLEVEL 番号 最後のプログラムの実行で指定された番号以上の終了コード\n\
が返されたときに、条件が真になるように指定します。\n\
コマンド 条件が真のときに実行するコマンドを指定します。\n\
文字列1==文字列2 テキスト文字列が一致するときに条件が真になるように指定\n\
します。\n\
EXIST ファイル名 指定したファイル名が存在するときに条件が真になるように\n\
指定します。\n\
DEFINED 変数 指定した変数が定義されているときに条件が真になるように\n\
指定します。\n"
STRING_GOTO_HELP1, "バッチ プログラム内の、ラベルで指定されている行へ制御を移動します。\n\n\
GOTO ラベル\n\n\
ラベル バッチ プログラムでラベルとして使用するテキスト文字列を指定します。\n\n\
ラベルの先頭には : (コロン) を指定し、ラベルだけを単独で 1 行に入力してくだ\n\
さい。"
STRING_LABEL_HELP1, "ディスクのボリューム ラベルを表\示または変更します。\n\nLABEL [ドライブ:][ラベル]\n"
STRING_LABEL_HELP2, "ドライブ %c: のボリューム ラベルは %s です\n"
STRING_LABEL_HELP3, "ドライブ %c: にはボリューム ラベルがありませんl\n"
STRING_LABEL_HELP4, "ボリューム シリアル番号は %04X-%04X\n です"
STRING_LABEL_HELP5, "ボリューム ラベルを 11 文字以内で入力してください。\n必要なければ Enter キーを押してください: "
STRING_LOCALE_HELP1, "現在時刻は"
STRING_MKDIR_HELP, "ディレクトリを作成します。\n\n\
MKDIR [ドライブ:]パス\n\
MD [ドライブ:]パス"
STRING_MEMMORY_HELP1, "システム メモリの量を表\示します。\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% のメモリが使用されています。\n\n\
%13s バイト: 全物理メモリ\n\
%13s バイト: 利用可能\な物理メモリ\n\n\
%13s バイト: 全ページファイル\n\
%13s バイト: 利用可能\なページファイル\n\n\
%13s バイト: 全仮想メモリ\n\
%13s バイト: 利用可能\な仮想メモリ\n"
STRING_MISC_HELP1, "続行するには何かキーを押してください ...\n"
STRING_MOVE_HELP1, "%s を上書きしますがよろしいですか (Yes/No/All)? "
STRING_MOVE_HELP2, "ファイルを移動およびファイルとディレクトリ名を変更します。\n\n\
1 つまたは複数のファイルを移動するには:\n\
MOVE [/N][ドライブ:][パス]ファイル名1[,...] 移動先\n\n\
ディレクトリ名を変更するには:\n\
MOVE [/N][ドライブ:][パス]変更前 変更後\n\n\
[ドライブ:][パス]ファイル名1\n\
移動するファイルの場所と名前を指定します。\n\
/N Nothing. ファイルとディレクトリの移動以外のすべてを行います。\n\n\
現段階での制限:\n\
- ファイルやディレクトリを、異なるドライブをまたがって移動することは\n\
できません。\n"
STRING_MSGBOX_HELP, "メッセージ ボックスを表\示し、ユーザーに返答を求めます。\n\n\
MSGBOX タイプ ['タイトル'] メッセージ\n\n\
タイプ 表\示されるボタンのタイプです。\n\
次の値が使用できます: OK, OKCANCEL,\n\
YESNO, YESNOCANCEL\n\
タイトル メッセージ ボックスのタイトルです。\n\
メッセージ メッセージ ボックスに表\示されるメッセージです。\n\n\n\
押されたボタンにより、次の ERRORLEVEL が設定されます:\n\n\
YES : 10 | NO : 11\n\
OK : 10 | CANCEL : 12\n"
STRING_PATH_HELP1, "実行可能\ファイルの検索パスを表\示または設定します。\n\n\
PATH [[ドライブ:]パス[;...]]\nPATH ;\n\n\
パラメータとして ; (セミコロン) だけを指定すると、すべての検索パスは\n\
クリアされて現在のディレクトリだけが検索されます。\n\
パラメータを指定せずに PATH と入力すると、現在のパスが表\示されます。\n"
STRING_PROMPT_HELP1, "コマンド プロンプトを変更します。\n\n\
PROMPT [文字列]\n\n\
文字列 新しいコマンド プロンプトを指定します。\n\n\
PROMPT には通常の文字と次に示す特殊コードを使用できます:\n\n\
$A & (アンパサンド)\n\
$B | (パイプ)\n\
$C ( (左かっこ)\n\
$D 現在の日付\n\
$E エスケープ コード (ASCII コードの 27)\n\
$F ) (右かっこ)\n\
$G > (不等号 (大なり))\n\
$H バックスペース (直前の文字を削除します)\n\
$L < (不等号 (小なり))\n\
$N 現在のドライブ\n\
$P 現在のドライブとパス\n\
$Q = (等号)\n\
$T 現在の時刻\n\
$V OS のバージョン番号\n\
$_ キャリッジ リターンとラインフィード\n\
$$ $ (ドル記号)\n"
STRING_PAUSE_HELP1, "バッチ プログラムの処理を一時停止し、次のメッセージを表\示します。:\n\
'続行するには何かキーを押してください ...' またはユーザーが定義したメッセージ。\n\n\
PAUSE [メッセージ]"
STRING_PROMPT_HELP2, " $+ 現在のディレクトリ スタックの深さを表\示します"
STRING_PROMPT_HELP3, "\nパラメータを指定せずに PROMPT と入力すると、プロンプトの設定がデフォルトにリセットされます。"
STRING_REM_HELP, "バッチ ファイルにコメント (注釈) を記録します。\n\nREM [コメント]"
STRING_RMDIR_HELP, "ディレクトリを削除します。\n\n\
RMDIR [ドライブ:]パス\nRD [ドライブ:]パス\n\
/S 指定されたディレクトリ内にあるファイルやフォルダもすべて削除します。\n\
/Q 確認のメッセージを表\示しません。\n"
STRING_RMDIR_HELP2, "ディレクトリが空ではありません!\n"
STRING_REN_HELP1, "ファイルやディレクトリ (複数可) の名前を変更します。\n\n\
RENAME [/E /N /P /Q /S /T] 元のファイル名 ... 新ファイル名\n\
REN [/E /N /P /Q /S /T] 元のファイル名 ... 新ファイル名\n\n\
/E エラーメッセージを表\示しません。\n\
/N 何もしません。\n\
/P ファイルの名前を変更する前にそれぞれ確認を求めます。\n\
(まだ実装されていません!)\n\
/Q Quiet.\n\
/S サブディレクトリの名前を変更する。\n\
/T 名前を変更したファイルの総数を報告する。\n\n\
新ファイル名 には新しいドライブもパスも指定できないので注意してください。\n\
そういった目的には MOVE コマンドを用いてください。\n"
STRING_REN_HELP2, " %lu 個のファイルの名前が変更されました\n"
STRING_REN_HELP3, " %lu 個のファイルの名前が変更されました\n"
STRING_SHIFT_HELP, "バッチ ファイル中の置き換え可能\なパラメータの位置を変更します。\n\n\
SHIFT [DOWN]"
STRING_SCREEN_HELP, "カーソ\ルを移動させます。移動後、文字列を入力することもできます。\n\n\
SCREEN 列 行 [テキスト]\n\n\
列 カーソ\ルを移動させる列です。\n\
行 カーソ\ルを移動させる行です。"
STRING_SET_HELP, "環境変数を表\示、設定、または削除します。\n\n\
SET [変数名[=]文字列]]\n\n\
変数名 環境変数名を指定します。\n\
文字列 変数に割り当てる文字列を指定します。\n\n\
現在の環境変数を表\示するには、パラメータを指定せずに SET と入力してください。\n"
STRING_START_HELP1, "別のウィンドウを起動し、指定したプログラムまたはコマンドを実行します。\n\n\
START コマンド\n\n\
コマンド 実行するコマンドを指定します。\n\n\
現時点では、コマンドはすべて同期せずに開始されます。\n"
STRING_TITLE_HELP, "コマンド プロンプト ウィンドウのウィンドウ タイトルを設定します。\n\n\
TITLE [文字列]\n\n\
文字列 コマンド プロンプト ウィンドウのタイトルを指定します。\n"
STRING_TIME_HELP1, "システム時刻を表\示または設定します。\n\n\
TIME [/T][時刻]\n\n\
/T 現在時刻の表\示のみ行います。\n\n\
パラメータの指定がなければ、現在の設定が表\示され、新しい時刻を入力できる\n\
プロンプトになります。変更しない場合は、Enter キーを押してください。\n"
STRING_TIME_HELP2, "新しい時刻を入力してください: "
STRING_TIMER_HELP1, "%d ミリ秒が経過。\n"
STRING_TIMER_HELP2, "%02d%c%02d%c%02d%c%02d が経過。\n"
STRING_TIMER_HELP3, "10 個までのストップウォッチを使うことができます。\n\n\
TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
ON ストップウォッチを ON にします。\n\
OFF ストップウォッチを OFF にします。\n\
/S Split time. ストップウォッチの値を変更することなく、\n\
現在刻んでいる時間を表\示します。\n\
/n ストップウォッチ番号を指定します。\n\
ストップウォッチは 0 から 9 までが利用できます。\n\
指定しない場合、デフォルトとして 1 を使います。\n\
/Fn 出力の書式\n\
n には次の二つの値を用いることができます:\n\
0 ミリ秒\n\
1 hh%cmm%css%cdd\n\n\
ON、OFF、/S のいずれも指定しなかった場合には、ストップウォッチの\n\
状態を切り替えます。\n\n"
STRING_TYPE_HELP1, "テキスト ファイルまたはファイルの内容を表\示します。\n\nTYPE [ドライブ:][パス]ファイル名 \n\
/P 1 度に 1 画面ずつ表\示します。\n"
STRING_VERIFY_HELP1, "このコマンドはダミーです!!\n\
ファイルがディスクに正しく書き込まれたことを照合するかどうかを指示します。\n\n\
VERIFY [ON | OFF]\n\n\
現在の設定を表\示するときは、パラメータを指定せずに VERIFY と入力してください。\n"
STRING_VERIFY_HELP2, "VERIFY は %s です。\n"
STRING_VERIFY_HELP3, "ON か OFF のどちらかを指定してください。"
STRING_VERSION_HELP1, "シェルのバージョン情報を表\示します。\n\n\
VER [/C][/R][/W]\n\n\
/C クレジットを表\示します。\n\
/R 再配布に関する情報を表\示します。\n\
/W 保証に関する情報を表\示します。"
STRING_VERSION_HELP2, " は *全くの無保証* で提供されます。詳しくは\n\
'ver /w' とタイプして下さい。これはフリーソ\フトウェアであり、ある条件の下で\n\
再頒布することが奨励されています。詳しくは 'ver /r' とタイプして下さい。\n\
クレジットの一覧を見るには 'ver /c' とタイプして下さい。"
STRING_VERSION_HELP3, "\n このプログラムは有用であることを願って頒布されますが、*全くの無保証*\n\
です。商業可能\性の保証や特定の目的への適合性は、言外に示されたものも含\n\
め全く存在しません。詳しくは GNU General Public License をご覧ください。"
STRING_VERSION_HELP4, "\n このプログラムはフリーソ\フトウェアです。あなたはこれを、フリーソ\フトウェ\n\
ア財団によって発行された GNU General Public License (バージョン 2 か、\n\
希望によってはそれ以降のバージョンのうちどれか) の定める条件の下で再頒\n\
布または改変することができます。\n"
STRING_VERSION_HELP5, "\nバグ報告は <ros-dev@reactos.org> へ送ってください。\n\
最新のバージョンは次のページから入手できます: http://www.reactos.org"
STRING_VERSION_HELP6, "\nFreeDOS version written by:\n"
STRING_VERSION_HELP7, "\nReactOS version written by:\n"
STRING_VOL_HELP1, " ドライブ %c: のボリューム ラベルは %s です。\n"
STRING_VOL_HELP2, " ドライブ %c: にはボリューム ラベルがありません。\n"
STRING_VOL_HELP3, " ボリューム シリアル番号は %04X-%04X です。\n"
STRING_VOL_HELP4, "存在するならば、ディスクのボリューム ラベルとシリアル番号を表\示します。\n\nVOL [ドライブ:]"
STRING_WINDOW_HELP1, "コンソ\ール ウィンドウの外見を変更します。\n\n\
WINDOW [/POS[=]左,上,幅,高さ]\n\
[MIN|MAX|RESTORE] ['title']\n\n\
/POS ウィンドウの位置と大きさを指定します。\n\
MIN ウィンドウを最小化します。\n\
MAX ウィンドウを最大化します。\n\
RESTORE ウィンドウを元のサイズに戻します。"
STRING_WINDOW_HELP2, "コンソ\ール ウィンドウの外見を変更します。\n\n\
ACTIVATE 'ウィンドウ' [/POS[=]左,上,幅,高さ]\n\
[MIN|MAX|RESTORE] ['タイトル']\n\n\
ウィンドウ 外見を変更するウィンドウのタイトルです。\n\
/POS ウィンドウの位置と大きさを指定します。\n\
MIN ウィンドウを最小化します。\n\
MAX ウィンドウを最大化します。\n\
RESTORE ウィンドウを元のサイズに戻します。\n\
タイトル 新しいタイトルです。\n"
STRING_HELP1, "利用可能\なすべてのコマンドの一覧と、その説明。\n\n\
コマンド /? 特定のコマンドに関する詳細情報\n\n\
? 利用可能\なすべてのコマンドの一覧 (説明なし)。\n\
ALIAS エイリアスの設定や解除をしたり、エイリアスを表\示したりします。\n\
ATTRIB ファイル属性を表\示または変更します。\n\
BEEP スピーカからビープ音を鳴らします。\n\
CALL バッチ プログラムを別のバッチ プログラムから呼び出します。\n\
CD 現在のディレクトリを変更したり、ディレクトリ名を表\示したりします。\n\
CHCP 現在のコード ページ番号を表\示または設定します。\n\
CHOICE ユーザーが選択肢から一つを選択するのを待ちます。\n\
CLS 画面を消去します。\n\
CMD ReactOS コマンド インタープリタの新しいインスタンスを開始します。\n\
COLOR コンソ\ールのデフォルトの前景色および背景色を設定します。\n\
COPY 1 つまたは複数のファイルを別の場所にコピーします。\n\
DATE 日付を表\示または設定します。\n\
DELAY n 秒、または n ミリ秒待機します。\n\
DELETE 1 つまたは複数のファイルを削除します。\n\
DIR ディレクトリ中のファイルとサブディレクトリを一覧表\示します。\n\
ECHO メッセージを表\示したり、コマンド エコーの ON と OFF を切り替えます。\n\
ERASE 1 つまたは複数のファイルを削除します。\n\
EXIT CMD.exe (コマンド ライン インタープリタ) を終了します。\n\
FOR 指定されたコマンドをファイル セットの各ファイルに対して実行します。\n\
FREE ディスクの空き容量\n\
GOTO バッチ プログラム内の、ラベルで指定されている行へ制御を移動します。\n\
HELP ReactOS コマンドのヘルプ情報を提供します。\n\
HISTORY 使用されたすべてのコマンドを一覧表\示します。\n\
IF バッチ プログラム中で条件処理を実行します。\n\
LABEL ディスクのボリューム ラベルを表\示または変更します。\n\
MD ディレクトリを作成します。\n\
MKDIR ディレクトリを作成します。\n\
MOVE ファイルを移動およびファイルとディレクトリ名を変更します。\n\
PATH 実行可能\ファイルの検索パスを表\示または設定します。\n\
PAUSE バッチ プログラムの処理を一時停止し、メッセージを表\示します。\n\
POPD 現在のディレクトリを PUSHD コマンドで記憶されたディレクトリに\n\
変更します。\n\
PROMPT コマンド プロンプトを変更します。\n\
PUSHD 現在のディレクトリを保存し、指定したディレクトリに変更します。\n\
RD ディレクトリを削除します。\n\
REM バッチ ファイルにコメント (注釈) を記録します。\n\
REN 1 つまたは複数のファイルの名前を変更します。\n\
RENAME 1 つまたは複数のファイルの名前を変更します。\n\
RMDIR ディレクトリを削除します。\n\
SCREEN カーソ\ルを移動させます。移動後、文字列を入力することもできます。\n\
SET 環境変数を表\示、設定、または削除します。\n\
SHIFT カーソ\ルを移動させます。移動後、文字列を入力することもできます。\n"
STRING_HELP2, "START 別のウィンドウを起動し、指定したプログラムまたはコマンドを実行します。\n\
TIME システム時刻を表\示または設定します。\n\
TIMER 10 個までのストップウォッチを使うことができます。\n\
TITLE コマンド プロンプト ウィンドウのウィンドウ タイトルを設定します。\n\
TYPE テキスト ファイルまたはファイルの内容を表\示します。\n\
VER ReactOS のバージョンを表\示します。\n\
VERIFY ファイルがディスクに正しく書き込まれたことを照合するかどうかを\n\
指示します。\n\
VOL ディスクのボリューム ラベルとシリアル番号を表\示します。\n"
STRING_CHOICE_OPTION, "YN"
STRING_COPY_OPTION, "YNA"
STRING_ALIAS_ERROR, "エイリアス展開後のコマンド ラインが長すぎます!\n"
STRING_BATCH_ERROR, "バッチ ファイルを開くときにエラーが発生しました。\n"
STRING_CHCP_ERROR1, "現在のコード ページ: %u\n"
STRING_CHCP_ERROR4, "無効なコード ページです\n"
STRING_CHOICE_ERROR, "無効なオプションです。期待される書式: /C[:]オプション"
STRING_CHOICE_ERROR_TXT, "無効なオプションです。期待される書式: /T[:]c,nn"
STRING_CHOICE_ERROR_OPTION, "無効なオプションです: %s"
STRING_CMD_ERROR1, "ファイル %s からリダイレクト入力できません。\n"
STRING_CMD_ERROR2, "データをパイプするための一時ファイル作成のときにエラーが発生しました。\n"
STRING_CMD_ERROR3, "ファイル %s へとリダイレクトできません。\n"
STRING_CMD_ERROR4, "%s を実行しています...\n"
STRING_CMD_ERROR5, "cmdexit.bat を実行しています...\n"
STRING_COLOR_ERROR1, "エラー! 同じ色が指定されました。\n (前景色と背景色を同じ色にすることはできません)"
STRING_COLOR_ERROR2, "色の指定に問題があります。"
STRING_COLOR_ERROR3, "Color %x\n"
STRING_COLOR_ERROR4, "エラー! 同じ色が指定されました。"
STRING_CONSOLE_ERROR, "不明なエラー: %d\n"
STRING_COPY_ERROR1, "エラー: 元のファイル %s を開けません!\n"
STRING_COPY_ERROR2, "エラー: コピー元とコピー先が一緒です!\n"
STRING_COPY_ERROR3, "指定先への書き込みでエラーが発生しました!\n"
STRING_COPY_ERROR4, "エラー: まだ実装されていません!\n"
STRING_DATE_ERROR, "無効な日付です。"
STRING_DEL_ERROR5, "ファイル %s は削除されます! "
STRING_DEL_ERROR6, "よろしいですか (Y/N)?"
STRING_DEL_ERROR7, "削除しています: %s\n"
STRING_ERROR_ERROR1, "不明なエラーです! エラー コード: 0x%lx\n"
STRING_ERROR_ERROR2, "構\文エラー"
STRING_FOR_ERROR1, "命令文中に 'in' が不足しています。"
STRING_FOR_ERROR2, "括弧が見つかりません。"
STRING_FOR_ERROR3, "'do' が不足しています。"
STRING_FOR_ERROR4, "'do' の後にコマンドがありません。"
STRING_FREE_ERROR1, "無効なドライブです。"
STRING_FREE_ERROR2, "ラベルがありません。"
STRING_GOTO_ERROR1, "GOTO にラベルが指定されていません。"
STRING_GOTO_ERROR2, "ラベル '%s' が見つかりませんでした。\n"
STRING_MD_ERROR, "すでにディレクトリ内にサブディレクトリかファイルが存在しています。\n"
STRING_MD_ERROR2, "新しいフォルダへのパスが存在していません。\n"
STRING_MOVE_ERROR1, "[OK]\n"
STRING_MOVE_ERROR2, "[エラー]\n"
STRING_REN_ERROR1, "MoveFile() failed. エラー: %lu\n"
STRING_START_ERROR1, "現時点ではバッチはサポートされていません!"
STRING_TIME_ERROR1, "無効な時刻です。"
STRING_TYPE_ERROR1, "'/%s' は無効なオプションです\n"
STRING_WINDOW_ERROR1, "ウィンドウが見つかりません。"
STRING_ERROR_PARAMETERF_ERROR, "パラメータの書式が間違っています。 - %c\n"
STRING_ERROR_INVALID_SWITCH, "無効なスイッチです。 - /%c\n"
STRING_ERROR_TOO_MANY_PARAMETERS, "パラメータが多すぎます。 - %s\n"
STRING_ERROR_PATH_NOT_FOUND, "パスが見つかりません。\n"
STRING_ERROR_FILE_NOT_FOUND, "ファイルが見つかりません。\n"
STRING_ERROR_REQ_PARAM_MISSING, "必要なパラメータが不足しています。\n"
STRING_ERROR_INVALID_DRIVE, "無効なドライブ指定です。\n"
STRING_ERROR_INVALID_PARAM_FORMAT, "無効なパラメータの書式です。 - %s\n"
STRING_ERROR_BADCOMMAND, "コマンドまたはファイル名が間違っています。\n"
STRING_ERROR_OUT_OF_MEMORY, "メモリ不足エラー。\n"
STRING_ERROR_CANNOTPIPE, "エラー! パイプできません! 一時ファイルを開けません!\n"
STRING_ERROR_D_PAUSEMSG, "続行するには何かキーを押してください . . ."
STRING_ERROR_DRIVER_NOT_READY, "ドライブの準備ができていません。"
STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"
STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter"
STRING_VERSION_RUNVER, " running on %s"
STRING_COPY_FILE , " %d 個のファイルがコピーされました\n"
STRING_DELETE_WIPE, "完全に消去されました。"
STRING_FOR_ERROR, "無効な変数が指定されました。"
STRING_SCREEN_COL, "行の値が無効です。"
STRING_SCREEN_ROW, "列の値が無効です。"
STRING_TIMER_TIME "タイマー %d は %s です。: "
STRING_INVALID_OPERAND, "無効なオペランドです。"
STRING_EXPECTED_CLOSE_PAREN, "Expected ')'"
STRING_EXPECTED_NUMBER_OR_VARIABLE,"Expected number or variable name."
STRING_SYNTAX_COMMAND_INCORRECT, "コマンドの構\文が間違っています。"
}

View file

@ -0,0 +1,656 @@
#include "windows.h"
#include "resource.h"
/*
* Russian language file by
* Andrey Korotaev (unC0Rr@inbox.ru)
* and
* Aleksey Bragin (aleksey@reactos.com)
* Copyright 2005
*/
LANGUAGE LANG_RUSSIAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
STRING_ATTRIB_HELP, "Вывод и изменение атрибутов файлов.\n\n\
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] файл ...\n\
[/S [/D]]\n\n\
+ Установка атрибута.\n\
- Снятие атрибута.\n\
R Атрибут ""Только чтение"".\n\
A Атрибут ""Архивный"".\n\
S Атрибут ""Системный"".\n\
H Атрибут ""Скрытый"".\n\
/S Обработка файлов с указанными именами в текущей папке\n\
и во всех ее подпапках.\n\
/D Обработка и файлов, и папок.\n\n\
ATTRIB без параметров выводит атрибуты всех файлов.\n"
STRING_ALIAS_HELP, "Вывод, установка или удаление псевдонимов.\n\n\
ALIAS [псевдоним=[команда]]\n\n\
псевдоним Наименование псевдонима.\n\
команда Текст, подставляемый вместо псевдонима.\n\n\
Вывод списка всех псевдонимов:\n\
ALIAS\n\n\
Установка или изменение существующего псевдонима:\n\
ALIAS da=dir a:\n\n\
Удаление псевдонима из списка:\n\
ALIAS da="
STRING_BEEP_HELP, "Звуковой сигнал.\n\nBEEP\n"
STRING_CALL_HELP, "Вызов одного пакетного файла из другого.\n\n\
CALL [диск:][путь]имя_файла [параметры]\n\n\
параметры Набор параметров командной строки, необходимых\n\
пакетному файлу."
STRING_CD_HELP, "Вывод имени либо смена текущего каталога.\n\n\
CHDIR [/D][диск:][путь]\n\
CHDIR[..|.]\n\
CD [/D][диск:][путь]\n\
CD[..|.]\n\n\
.. обозначает родительский каталог\n\
. обозначает текущий каталог\n\
/D Одновременная смена текущих диска и каталога.\n\n\
Команда CD диск: отображает имя текущего каталога указанного диска.\n\
Команда CD без параметров отображает имена текущих диска и каталога.\n"
STRING_CHCP_HELP, "Вывод или смена текущего номера кодовой страницы.\n\n\
CHCP [nnn]\n\n\
nnn Номер кодовой страницы.\n\n\
Команда CHCP без параметра выводит текущий номер кодовой страницы.\n"
STRING_CHOICE_HELP, "Ждёт, пока пользователь не выберет один из указанных в списке символов.\n\n\
CHOICE [/C[:]список_символов][/N][/S][/T[:]c,nn][текст]\n\n\
/C[:]список_символов Указывает допустимые символы. По умолчанию это YN.\n\
/N Не выводить список символов и ? после подсказки.\n\
/S Трактовать символы как чувствительные к регистру.\n\
/T[:]c,nn По умолчанию выбор c по истечении nn секунд.\n\
text Подсказка.\n\n\
ERRORLEVEL устанавливается равным номеру выбранного символа.\n"
STRING_CLS_HELP, "Очистка экрана.\n\nCLS\n"
STRING_CMD_HELP1, "\nДоступные внутренние команды:\n"
STRING_CMD_HELP2, "\nДоступные возможности:"
STRING_CMD_HELP3," [псевдонимы]"
STRING_CMD_HELP4," [история]"
STRING_CMD_HELP5," [завершение имен файлов unix]"
STRING_CMD_HELP6," [стек директорий]"
STRING_CMD_HELP7," [перенаправление и piping]"
STRING_CMD_HELP8, "Запуск новой копии интерпретатора команд ReactOS.\n\n\
CMD [/[C|K] команда][/P][/Q][/T:bf]\n\n\
/C команда Выполнение указанной команды с последующим завершением.\n\
/K команда Выполнение указанной команды без последующего завершения.\n\
/P CMD становится перманентным и запускает autoexec.bat\n\
(процесс неможет быть завершен).\n\
/T:цв Выбор цвета текста/фона (более подробно см. COLOR /?).\n"
STRING_COLOR_HELP1, "Установка цветов по умолчанию для текста и фона.\n\n\
COLOR [цвета [/-F]] \n\n\
цвета Атрибуты цветов для текстовых окон\n\
/-F Не заливать незаполненные места цветом\n\n\
Есть три способа обозначать цвета:\n\
1) по названию на английском языке (требуются только первые три буквы цвета)\n\
2) в виде десятичных чисел (decimal on decimal)\n\
3) два шестнадцатеричных числа\n\n\
Таблица цветов:\n\
дес. шест.название дес. шест.название\n\
0 0 = Черный 8 8 = Серый\n\
1 1 = Синий 9 9 = Светло-синий\n\
2 2 = Зеленый 10 A = Светло-зеленый\n\
3 3 = Голубой 11 B = Светло-голубой\n\
4 4 = Красный 12 C = Светло-красный\n\
5 5 = Лиловый 13 D = Светло-лиловый\n\
6 6 = Желтый 14 E = Светло-желтый\n\
7 7 = Белый 15 F = Ярко-белый\n"
STRING_COPY_HELP1, "Перезаписать %s (Yes/No/All)? "
STRING_COPY_HELP2, "Копирование одного или нескольких файлов в другое место.\n\n\
COPY [/V][/Y|/-Y][/A|/B] источник [/A|/B]\n\
[+ источник [/A|/B] [+ ...]] [результат [/A|/B]]\n\n\
источник Имена одного или нескольких копируемых файлов.\n\
/A Файл является текстовым файлом ASCII.\n\
/B Файл является двоичным файлом.\n\
результат Каталог и/или имя для конечных файлов.\n\
/V Проверка правильности копирования файлов.\n\
/Y Подавление запроса подтверждения на перезапись существующего\n\
результирующего файла.\n\
/-Y Обязательный запрос подтверждения на перезапись существующего\n\
результирующего файла.\n\n\
Ключ /Y можно установить через переменную среды COPYCMD.\n\
...\n"
STRING_DATE_HELP1, "\nВведите новую дату (мм%cдд%cгггг): "
STRING_DATE_HELP2, "\nВведите новую дату (дд%cмм%cгггг): "
STRING_DATE_HELP3, "\nВведите новую дату (гггг%cмм%cдд): "
STRING_DATE_HELP4, "Вывод или изменение даты.\n\n\
DATE [/T][дата]\n\n\
/T Не запрашивать ввод новой даты\n\n\
Команда DATE без параметров отображает текущую дату и запрашивает ввод\n\
новой даты. Для сохранения текущей даты нажмите клавишу ENTER.\n"
STRING_DEL_HELP1, "Удаление одного или нескольких файлов.\n\n\
DEL [/N /P /T /Q /S /W /Y /Z /A[[:]атрибуты]] именаайлов ...\n\
DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]атрибуты]] именаайлов ...\n\
ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]атрибуты]] именаайлов ...\n\n\
именаайлов Имена одного или нескольких файлов.\n\n\
/N Невыполнять непосредственно операцию удаления файла.\n\
/P Запрос на подтверждение перед удалением каждого файла.\n\
/T Показывает количество удалённых файлов и освободившегося\n\
дискового пространства.\n\
/Q Отключение запроса на подтверждение при удалении файлов.\n\
/W Переписать файл случайными данными перед удалением.\n\
/Y Отключение запроса на подтверждение при удалении файлов\n\
даже для маски *.*.\n\
/F Принудительное удаление файлов, доступных только для чтения.\n\
/S Удалять файл из всех поддиректорий\n\
/A Отбор файлов для удаления по атрибутам.\n\
R Доступный только для чтения\n\
S Системные файлы\n\
A Файлы для архивирования\n\
H Скрытые файлы\n\
Префикс ""-"" имеет значение НЕ\n"
STRING_DEL_HELP2, "Все файлы в каталоге будут удалены!\nВы уверены (Y/N)?"
STRING_DEL_HELP3, " %lu файл удалён\n"
STRING_DEL_HELP4, " %lu файлов удалено\n"
STRING_DELAY_HELP, "пауза на n секунд или миллисекунд\n\
DELAY [/m]n\n\n\
/m указывает, что n означает количество миллисекунд\n\
иначе n означает количество секунд\n"
STRING_DIR_HELP1, "DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N]\n\
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]\n\n\
[диск:][путь][имя_файла]\n\
Диск, каталог и/или файлы, которые следует включить в список.\n\n\
/A Вывод файлов с указанными атрибутами.\n\
атрибуты D Каталоги R Доступные только для чтения\n\
H Скрытые файлы A Файлы для архивирования\n\
S Системные файлы Префикс ""-"" имеет значение НЕ\n\
/B Вывод только имен файлов.\n\
/C Применение разделителя групп разрядов для вывода размеров файлов\n\
(по умолчанию). Для отключения этого режима служит ключ /-C.\n\
/D Вывод списка в несколько столбцов с сортировкой по столбцам.\n\
/L Использование нижнего регистра для имен файлов.\n\
/N Отображение имен файлов в крайнем правом столбце.\n\
/O Сортировка списка отображаемых файлов.\n\
порядок N По имени (алфавитная) S По размеру (сперва меньшие)\n\
E По расширению (алфавитная) D По дате (сперва более старые)\n\
G Начать список с каталогов Префикс ""-"" обращает порядок\n\
/P Пауза после заполнения каждого экрана.\n\
/Q Вывод сведений о владельце файла.\n\
/S Вывод списка файлов из указанного каталога и его подкаталогов.\n\
/T Выбор поля времени для отображения и сортировки\n\
время C Создание\n\
A Последнее использование\n\
W Последнее изменение\n\
/W Вывод списка в несколько столбцов.\n\
/X Отображение коротких имен для файлов, чьи имена не соответствуют\n\
стандарту 8.3. Формат аналогичен выводу с ключом /N, но короткие\n\
имена файлов выводятся слева от длинных. Если короткого имени у\n\
файла нет, вместо него выводятся пробелы.\n\
/4 Вывод номера года в четырехзначном формате\n"
STRING_DIR_HELP2, " Том в устройстве %c имеет метку %s\n"
STRING_DIR_HELP3, " Том в устройстве %c не имеет метки.\n"
STRING_DIR_HELP4, " Серийный номер тома: %04X-%04X\n"
STRING_DIR_HELP5, "\n Всего:\n%16i Файл(ов)% 14s байт\n"
STRING_DIR_HELP6, "%16i Dir(s)% 15s байт\n"
STRING_DIR_HELP7, "\n Каталог of %s\n\n"
STRING_DIR_HELP8, "%16i файл(ов)% 14s байт\n"
STRING_DIRSTACK_HELP1, "Сохраняет текущую директорию для использования командой POPD, затем\n\
изменяет её на указанную.\n\n\
PUSHD [path | ..]\n\n\
path Указывает директорию, которую надо сделать текущей\n"
STRING_DIRSTACK_HELP2, "Изменяет текущую директорию на ту, которая сохранена командой PUSHD.\n\nPOPD"
STRING_DIRSTACK_HELP3, "Печатает содержимое стека директорий.\n\nDIRS"
STRING_DIRSTACK_HELP4, "Стек директорий пуст"
STRING_ECHO_HELP1, "Выдает сообщение без перевода строки.\n\n\
ECHOS message"
STRING_ECHO_HELP2, "Выдает сообщение в стандартный канал вывода ошибок.\n\n\
ECHOERR message\n\
ECHOERR. печатает пустую строку"
STRING_ECHO_HELP3, "Печатает сообщение в стандартный канал вывода ошибок без перевода строки и возврата каретки.\n\n\
ECHOSERR message"
STRING_ECHO_HELP4, "Вывод сообщений и переключение режима отображения команд на экране.\n\n\
ECHO [ON | OFF]\n\
ECHO [сообщение]\n\
ECHO. вывод пустой строки\n\n\
ECHO без параметра выводит текущий режим отображения команд."
STRING_ECHO_HELP5, "ECHO is %s\n"
STRING_EXIT_HELP, "Завершает интерпретатор команд.\n\nEXIT\n"
STRING_FOR_HELP1, "Запускает указанную команду для каждого файла из набора файлов\n\n\
FOR %переменная IN (набор) DO команда [параметры]\n\n\
%переменная Подставляемый параметр.\n\
(набор) Набор из одного или нескольких файлов.\n\
Допускается использование подстановочных знаков.\n\
команда Команда, которую следует выполнить для каждого файла.\n\
параметры Параметры и ключи для указанной команды.\n\n\
В пакетных файлах для команды FOR используется запись\n\
%%переменная вместо %переменная.\n"
STRING_FREE_HELP1, "\nТом диска %s: %-11s\n\
Серийный номер: %s\n\
%16s байт общего дискового пространства\n\
%16s байт занято\n\
%16s байт свободно\n"
STRING_FREE_HELP2, "Выводит информацию о томе.\n\nFREE [drive: ...]\n"
STRING_IF_HELP1, "Оператор условного выполнения команд в пакетном файле.\n\n\
IF [NOT] ERRORLEVEL число команда\n\
IF [NOT] строка1==строка2 команда\n\
IF [NOT] EXIST имя_файла команда\n\
IF [NOT] DEFINED переменная команда\n\n\
NOT Обращает истинность условия: истинное условие\n\
становится ложным, а ложное - истинным.\n\
ERRORLEVEL число Условие является истинным, если код возврата последней\n\
выполненной программы не меньше указанного числа.\n\
строка1==строка2 Это условие является истинным, если указанные строки\n\
совпадают.\n\
EXIST имя_файла Это условие является истинным, если файл с указанным\n\
именем существует.\n\
DEFINED переменная Это условие является истинным, если указанная переменная\n\
задана\n\
команда Задает команду, выполняемую при истинности условия.\n\
За этой командой может следовать ключевое слово ELSE,\n\
служащее для указания команды, которая должна\n\
выполняться в том случае, если условие ложно.\n"
STRING_GOTO_HELP1, "Передача управления содержащей метку строке пакетного файла.\n\n\
GOTO метка\n\n\
label Строка пакетного файла, оформленная как метка.\n\n\
Метка должна находиться в отдельной строке и начинаться с двоеточия."
STRING_LABEL_HELP1, "Создание, изменение и удаление меток тома.\n\nLABEL [диск:][метка]\n"
STRING_LABEL_HELP2, "Том в устройстве %c имеет метку %s\n"
STRING_LABEL_HELP3, "Том в устройстве %c: не имеет метки\n"
STRING_LABEL_HELP4, "Серийный номер тома: %04X-%04X\n"
STRING_LABEL_HELP5, "Метка тома (11 букв, ВВОД для пустой метки)? "
STRING_LOCALE_HELP1, "Текущее время: "
STRING_MKDIR_HELP, "Создание каталога.\n\n\
MKDIR [диск:]путь\nMD [диск:]путь"
STRING_MEMMORY_HELP1, "Вывод объёма системной памяти.\n\nMEMORY"
STRING_MEMMORY_HELP2, "\n %12s%% memory load.\n\n\
%13s байт всего физической памяти.\n\
%13s байт доступно физической памяти.\n\n\
%13s байт всего в файле подкачки.\n\
%13s байт доступно в файле подкачки.\n\n\
%13s байт всего виртуальной памяти.\n\
%13s байт доступно виртуально памяти.\n"
STRING_MISC_HELP1, "Нажмите клавишу для продолжения...\n"
STRING_MOVE_HELP1, "Переписать %s (Yes/No/All)? "
STRING_MOVE_HELP2, "Перемещение файлов и переименование файлов и каталогов.\n\n\
Перемещение одного или более файлов:\n\
MOVE [/N][диск:][путь]имя_файла1[,...] назначение\n\n\
Переименование каталога:\n\
MOVE [/N][диск:][путь]имя_каталога1 имя_каталога2\n\n\
[диск:][путь]имя_файла1 Указывает местоположение и имя файла или файлов\n\
которые необходимо переместить.\n\
/N Nothing. Do everything but move files or directories.\n\n\
Текущие ограничения:\n\
- Невозможно переносить файлы или папки между разными разделами.\n"
STRING_MSGBOX_HELP, "Вывод окна с сообщением и возврат ответа пользователя\n\n\
MSGBOX тип ['заголовок'] подсказка\n\n\
тип выводимые кнопки\n\
возможные значения: OK, OKCANCEL,\n\
YESNO, YESNOCANCEL\n\
заголовок заголовок окна с сообщением\n\
подсказка выводимый текст подсказки\n\n\n\
ERRORLEVEL устанавливается в соответствии с нажатой кнопкой:\n\n\
YES : 10 | NO : 11\n\
OK : 10 | CANCEL : 12\n"
STRING_PATH_HELP1, "Вывод или задание пути поиска исполняемых файлов.\n\n\
PATH [[диск:]путь[;...]]\nPATH ;\n\n\
Команда PATH ; очищает путь поиска используемых файлов, ограничив его\n\
текущим каталогом.\n\
Команда PATH без параметров отображает текущий путь поиска.\n"
STRING_PROMPT_HELP1, "Изменение приглашения командной строки.\n\n\
PROMPT [текст]\n\n\
текст Новое приглашение командной строки.\n\n\
Приглашение может включать обычные символы и следующие коды:\n\n\
$A & (амперсанд)\n\
$B | (вертикальная черта)\n\
$C ( (левая круглая скобка)\n\
$D Текущая дата\n\
$E ESC (символ ASCII с кодом 27)\n\
$F ) (правая круглая скобка)\n\
$G > (знак ""больше"")\n\
$H BACKSPACE (удаление предыдущего символа)\n\
$L < (знак ""меньше"")\n\
$N Текущий диск\n\
$P Текущие диск и каталог\n\
$Q = (знак равенства)\n\
$T Текущее время\n\
$V Номер версии операционной системы\n\
$_ Перевод строки\n\
$$ $ (знак доллара)\n"
STRING_PAUSE_HELP1, "Приостановка выполнения пакетного файла и вывод сообщения:\n\
'Для продолжения нажмите любую клавишу...' или указанное сообщение.\n\n\
PAUSE [сообщение]"
STRING_PROMPT_HELP2, " $+ Displays the current depth of the directory stack"
STRING_PROMPT_HELP3, "\nPROMPT без параметров устанавливает приглашение командной строки по умолчанию."
STRING_REM_HELP, "Помещение комментариев в пакетные файлы.\n\nREM [комментарий]"
STRING_RMDIR_HELP, "Удаление каталога.\n\n\
RMDIR [диск:]путь\nRD [диск:]путь\n\
/S Удаление дерева каталогов\n\
/Q Отключение запроса подтверждения\n"
STRING_RMDIR_HELP2, "Каталог пуст!\n"
STRING_REN_HELP1, "Переименование одного или нескольких файлов или каталогов.\n\n\
RENAME [/E /N /P /Q /S /T] старое_имя ... новое_имя\n\
REN [/E /N /P /Q /S /T] старое_имя ... новое_имя\n\n\
/E Не выводить сообщения об ошибках.\n\
/N Nothing.\n\
/P Запрос подтверждения перед переименованием.\n\
(Not implemented yet!)\n\
/Q Quiet.\n\
/S Переименовывать подкаталоги.\n\
/T Вывод количества переименованных файлов.\n\n\
Для конечного файла нельзя указать другой диск или каталог.\n\
Для этой цели следует использовать команду MOVE.\n"
STRING_REN_HELP2, " %lu файл переименован\n"
STRING_REN_HELP3, " %lu файлов переименовано\n"
STRING_SHIFT_HELP, "Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла.\n\n\
SHIFT [DOWN]"
STRING_SCREEN_HELP, "Перемещение курсора и вывод текста\n\n\
SCREEN стр кол [текст]\n\n\
стр строка, на которую следует переместить курсор\n\
кол колонка, на которую следует переместить курсор"
STRING_SET_HELP, "Вывод, задание и удаление переменных среды.\n\n\
SET [переменная[=][значение]]\n\n\
переменная Имя переменной среды.\n\
значение Строка символов, присваиваемая указанной переменной.\n\n\
SET без параметров выводит текущие значения переменных среды.\n"
STRING_START_HELP1, "Запуск указанной программы или команды.\n\n\
START команда\n\n\
команда Команда или программа для запуска.\n\n\
At the moment all commands are started asynchronously.\n"
STRING_TITLE_HELP, "Изменение заголовка окна командной строки.\n\n\
TITLE [строка]\n\n\
строка Будущий заголовок окна командной строки.\n"
STRING_TIME_HELP1, "Вывод или изменение времени.\n\n\
TIME [/T][время]\n\n\
/T не изменять время\n\n\
TIME без параметров выводит текущее время и запрашивает\n\
новое время. Нажатие ENTER сохраняет текущее время.\n"
STRING_TIME_HELP2, "Введите новое время: "
STRING_TIMER_HELP1, "Прошло %d мсек\n"
STRING_TIMER_HELP2, "Прошло %02d%c%02d%c%02d%c%02d\n"
STRING_TIMER_HELP3, "Секундомер.\n\n\
TIMER [ON|OFF] [/S] [/n] [/Fn]\n\n\
ON Включить секундомер\n\
OFF Выключить секундомер\n\
/S Разница времени. Возвращает разницу времени\n\
секундомера без изменения его значения\n\
/n Задать номер секундомера.\n\
Доступные номера - от 0 до 9\n\
Значение по умолчанию - 1\n\
/Fn Формат вывода\n\
n одно из:\n\
0 миллисекунды\n\
1 чч%cмм%cсс%cдд\n\n\
Если ни один из параметров не указан, команда\n\
переключает состояние секундомера\n\n"
STRING_TYPE_HELP1, "Вывод содержимого одного или нескольких текстовых файлов.\n\nTYPE [диск:][путь]имя файла \n\
/P Поэкранный вывод.\n"
STRING_VERIFY_HELP1, "This command is just a dummy!!\n\
Включение или отключение режима проверки правильности записи файлов a\n\
на диск.\n\n\
VERIFY [ON | OFF]\n\n\
VERIFY без параметра выводит текущее значение этой команды.\n"
STRING_VERIFY_HELP2, "VERIFY %s.\n"
STRING_VERIFY_HELP3, "Необходимо указать ON или OFF."
STRING_VERSION_HELP1, "Вывод версии\n\n\
VER [/C][/R][/W]\n\n\
/C Displays credits.\n\
/R Displays redistribution information.\n\
/W Displays warranty information."
STRING_VERSION_HELP2, " comes with ABSOLUTELY NO WARRANTY; for details\n\
type: `ver /w'. This is free software, and you are welcome to redistribute\n\
it under certain conditions; type `ver /r' for details. Type `ver /c' for a\n\
listing of credits."
STRING_VERSION_HELP3, "\n This program is distributed in the hope that it will be useful,\n\
but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
GNU General Public License for more details."
STRING_VERSION_HELP4, "\n This program is free software; you can redistribute it and/or modify\n\
it under the terms of the GNU General Public License as published by\n\
the Free Software Foundation; either version 2 of the License, or\n\
(at your option) any later version.\n"
STRING_VERSION_HELP5, "\nПосылайте отчеты об ошибках на <ros-dev@reactos.org>.\n\
Обновления доступны по адресу: http://www.reactos.org/"
STRING_VERSION_HELP6, "\nFreeDOS-версия написана:\n"
STRING_VERSION_HELP7, "\nReactOS-версия написана:\n"
STRING_VOL_HELP1, " Том в устройстве %c: имеет метку %s"
STRING_VOL_HELP2, " Том в устройстве %c: не имеет метки"
STRING_VOL_HELP3, " Серийный номер тома: %04X-%04X\n"
STRING_VOL_HELP4, "Выводит метку тома и серийный номер.\n\nVOL [диск:]"
STRING_WINDOW_HELP1, "Меняет вид окна консоли\n\n\
WINDOW [/POS[=]left,top,ширина,высота]\n\
[MIN|MAX|RESTORE] ['заголовок']\n\n\
/POS указывает размер и положение окна\n\
MIN сворачивает окно\n\
MAX разворачивает окно\n\
RESTORE восстанавливает окно\n"
STRING_WINDOW_HELP2, "Меняет вид окна консоли\n\n\
ACTIVATE 'window' [/POS[=]left,top,ширина,высота]\n\
[MIN|MAX|RESTORE] ['заголовок']\n\n\
window заголовок окна, вид которого следует менять\n\
/POS указывает размер и положение окна\n\
MIN сворачивает окно\n\
MAX разворачивает окно\n\
RESTORE восстанавливает окно\n\
заголовок новый заголовок\n"
STRING_HELP1, "Список всех доступных команд с коротким описанием\n\n\
команда /? Выводит подробную информацию о команде\n\n\
? Список всех доступных команд без описания.\n\
ALIAS Вывод, установка или удаление псевдонимов.\n\
ATTRIB Вывод и изменение атрибутов файлов.\n\
BEEP Звуковой сигнал.\n\
CALL Вызов одного пакетного файла из другого.\n\
CD Вывод имени либо смена текущего каталога.\n\
CHCP Вывод или смена текущего номера кодовой страницы.\n\
CHOICE Ждёт, пока пользователь не выберет один из указанных в списке символов.\n\
CLS Очистка экрана.\n\
CMD Запуск новой копии интерпретатора команд.\n\
COLOR Установка цветов по умолчанию для текста и фона.\n\
COPY Копирование одного или нескольких файлов в другое место.\n\
DATE Вывод или изменение даты.\n\
DELETE Удаление одного или нескольких файлов.\n\
DIR Вывод списка файлов и подкаталогов каталога.\n\
ECHO Вывод сообщений и переключение режима отображения команд на экране.\n\
ERASE Удаление одного или нескольких файлов.\n\
EXIT Завершает интерпретатор команд.\n\
FOR Запускает указанную команду для каждого файла из набора файлов.\n\
FREE (Свободное) дисковое пространство.\n\
GOTO Передача управления содержащей метку строке пакетного файла\n\
HELP Предоставляет справочную информацию о командах ReactOS.\n\
HISTORY Список запущенных команд\n\
IF Оператор условного выполнения команд в пакетном файле.\n\
LABEL Создание, изменение и удаление меток тома.\n\
MD Создание каталога.\n\
MKDIR Создание каталога.\n\
MOVE Перемещение файлов и переименование файлов и каталогов\n\
PATH Вывод или задание пути поиска исполняемых файлов.\n\
PAUSE Приостановка выполнения пакетного файла.\n\
POPD Восттанавливает предыдущее значение текущей директории сохраненное командой\n\
PUSHD.\n\
PROMPT Изменение приглашения командной строки.\n\
PUSHD Сохраняет текущую директорию, а потом меняет её.\n\
RD Удаление каталога.\n\
REM Записывает комментарии (замечения) в пакетных файлах.\n\
REN Переименование одного или нескольких файлов или каталогов.\n\
RENAME Переименование одного или нескольких файлов или каталогов.\n\
RMDIR Удаление каталога.\n\
SCREEN Перемещение курсора и вывод текста.\n\
SET Вывод, задание и удаление переменных среды.\n\
SHIFT Изменение содержимого (сдвиг) подставляемых параметров для пакетного файла\n"
STRING_HELP2, "START Открывает отдельное окно для запуска указанных команд или программ.\n\
Выполняет команду.\n\
TIME Вывод или изменение времени.\n\
TIMER Секундомер.\n\
TITLE Изменение заголовка окна командной строки.\n\
TYPE Вывод содержимого одного или нескольких текстовых файлов.\n\
VER Вывод версии ОС.\n\
VERIFY Включение или отключение режима проверки правильности записи файлов\n\
на диск.\n\
VOL Выводит метку тома и серийный номер.\n"
STRING_CHOICE_OPTION, "YN"
STRING_COPY_OPTION, "YNA"
STRING_ALIAS_ERROR, "Командная строка слишком длинная после развёртывания псевдонимов!\n"
STRING_BATCH_ERROR, "Ошибка открытия командного файла\n"
STRING_CHCP_ERROR1, "Текущая кодовая страница: %u\n"
STRING_CHCP_ERROR4, "Ошибочная кодовая страница\n"
STRING_CHOICE_ERROR, "Ошибочный параметр. Ожидается формат: /C[:]параметры"
STRING_CHOICE_ERROR_TXT, "Ошибочный параметр. Ожидается формат: /T[:]c,nn"
STRING_CHOICE_ERROR_OPTION, "Ошибочный параметр: %s"
STRING_MD_ERROR, "Подкаталог или файл уже существует.\n"
STRING_MD_ERROR2, "Путь к новому каталогу не существует.\n"
STRING_CMD_ERROR1, "Не могу перенаправить ввод из файла %s\n"
STRING_CMD_ERROR2, "Ошибка создания временного файла для pipe-данных\n"
STRING_CMD_ERROR3, "Не могу перенаправить в файл %s\n"
STRING_CMD_ERROR4, "Запуск %s...\n"
STRING_CMD_ERROR5, "Запуск cmdexit.bat...\n"
STRING_COLOR_ERROR1, "Одинаковые цвета! (Цвета фона и текста не могут быть одинаковыми)"
STRING_COLOR_ERROR2, "ошибка в указании цвета"
STRING_COLOR_ERROR3, "Цвет %x\n"
STRING_COLOR_ERROR4, "Одинаковые цвета!"
STRING_CONSOLE_ERROR, "Неизвестная ошибка: %d\n"
STRING_COPY_ERROR1, "Ошибка: Не могу открыть источник - %s!\n"
STRING_COPY_ERROR2, "Ошибка: Не могу копировать в себя!\n"
STRING_COPY_ERROR3, "Ошибка записи!\n"
STRING_COPY_ERROR4, "Ошибка: Not implemented yet!\n"
STRING_DATE_ERROR, "Неправильная дата."
STRING_DEL_ERROR5, "Файл %s будет удалён! "
STRING_DEL_ERROR6, "Вы уверены (Y/N)?"
STRING_DEL_ERROR7, "Удаление: %s\n"
STRING_ERROR_ERROR1, "Неизвестная ошибка! Код ошибки: 0x%lx\n"
STRING_ERROR_ERROR2, "Синтаксическая ошибка"
STRING_FOR_ERROR1, "'in' отсутствует в команде for."
STRING_FOR_ERROR2, "скобок необнаружено."
STRING_FOR_ERROR3, "'do' отсутсвует."
STRING_FOR_ERROR4, "нет команды после 'do'."
STRING_FREE_ERROR1, "Неправильное имя диска"
STRING_FREE_ERROR2, "unlabeled"
STRING_GOTO_ERROR1, "Не определена метка для GOTO"
STRING_GOTO_ERROR2, "Метка '%s' не найдена\n"
STRING_MOVE_ERROR1, "[OK]\n"
STRING_MOVE_ERROR2, "[Ошибка]\n"
STRING_REN_ERROR1, "Выполнение MoveFile() было неуспешным. Ошибка: %lu\n"
STRING_START_ERROR1, "На данный момент нет поддержки пакетных файлов!"
STRING_TIME_ERROR1, "Неправильное время."
STRING_TYPE_ERROR1, "Неправильный параметр '/%s'\n"
STRING_WINDOW_ERROR1, "окно не найдено"
STRING_ERROR_PARAMETERF_ERROR, "Некорректный формат параметра - %c\n"
STRING_ERROR_INVALID_SWITCH, "Неверныая опция - /%c\n"
STRING_ERROR_TOO_MANY_PARAMETERS, "Слишком много параметров - %s\n"
STRING_ERROR_PATH_NOT_FOUND, "Путь не найден\n"
STRING_ERROR_FILE_NOT_FOUND, "Файл не найден\n"
STRING_ERROR_REQ_PARAM_MISSING, "Отсутствует необходимый параметр\n"
STRING_ERROR_INVALID_DRIVE, "Ошибочное определение диска\n"
STRING_ERROR_INVALID_PARAM_FORMAT, "Ошибочный формат параметра - %s\n"
STRING_ERROR_BADCOMMAND, "Неправильная команда или имя файла\n"
STRING_ERROR_OUT_OF_MEMORY, "Нехватка памяти.\n"
STRING_ERROR_CANNOTPIPE, "Ошибка! Невозможно использовать pipe! Невозможно создать временный файл!\n"
STRING_ERROR_D_PAUSEMSG, "Для продолжения нажмите любую клавишу . . ."
STRING_ERROR_DRIVER_NOT_READY, "Устройство не готово"
STRING_PATH_ERROR, "CMD: Не в среде окружения '%s'\n"
STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter"
STRING_VERSION_RUNVER, " запущен на %s"
STRING_COPY_FILE , " %d файл(ов) скопировано\n"
STRING_DELETE_WIPE, "wiped"
STRING_FOR_ERROR, "неправильное задание переменной."
STRING_SCREEN_COL, "неправильное значение для кол"
STRING_SCREEN_ROW, "неправильное значение для стр"
STRING_TIMER_TIME "Timer %d is %s: "
STRING_INVALID_OPERAND, "Неверный операнд."
STRING_EXPECTED_CLOSE_PAREN, "Ожидается ')'."
STRING_EXPECTED_NUMBER_OR_VARIABLE,"Ожидается число или название переменной."
STRING_SYNTAX_COMMAND_INCORRECT, "Некорректный синтаксис команды."
}

View file

@ -0,0 +1,344 @@
/*
* ALIAS.C - alias administration module.
*
*
* History:
*
* 02/02/1996 (Oliver Mueller)
* started.
*
* 02/03/1996 (Oliver Mueller)
* Added sorting algorithm and case sensitive substitution by using
* partstrupr().
*
* 27 Jul 1998 John P. Price
* added config.h include
* added ifdef's to disable aliases
*
* 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed crash when removing an alias in DeleteAlias().
* Added help text ("/?").
*
* 14-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Clean up and Unicode safe!
*
* 24-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection safe!
*
* 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef FEATURE_ALIASES
typedef struct tagALIAS
{
struct tagALIAS *next;
LPTSTR lpName;
LPTSTR lpSubst;
DWORD dwUsed;
} ALIAS, *LPALIAS;
static LPALIAS lpFirst = NULL;
static LPALIAS lpLast = NULL;
static DWORD dwUsed = 0;
/* module internal functions */
/* strlwr only for first word in string */
static VOID
partstrlwr (LPTSTR str)
{
LPTSTR c = str;
while (*c && !_istspace (*c) && *c != _T('='))
{
*c = _totlower (*c);
c++;
}
}
static VOID
PrintAlias (VOID)
{
LPALIAS ptr = lpFirst;
while (ptr)
{
ConOutPrintf (_T("%s=%s\n"), ptr->lpName, ptr->lpSubst);
ptr = ptr->next;
}
}
static VOID
DeleteAlias (LPTSTR pszName)
{
LPALIAS ptr = lpFirst;
LPALIAS prev = NULL;
while (ptr)
{
if (!_tcsicmp (ptr->lpName, pszName))
{
if (prev)
prev->next = ptr->next;
else
lpFirst = ptr->next;
free (ptr->lpName);
free (ptr->lpSubst);
free (ptr);
return;
}
prev = ptr;
ptr = ptr->next;
}
}
static VOID
AddAlias (LPTSTR name, LPTSTR subst)
{
LPALIAS ptr = lpFirst;
LPALIAS prev, entry;
LPTSTR s;
while (ptr)
{
if (!_tcsicmp (ptr->lpName, name))
{
s = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR));
if (!s)
{
error_out_of_memory ();
return;
}
free (ptr->lpSubst);
ptr->lpSubst = s;
_tcscpy (ptr->lpSubst, subst);
return;
}
ptr = ptr->next;
}
ptr = (LPALIAS)malloc (sizeof (ALIAS));
if (!ptr)
return;
ptr->next = 0;
ptr->lpName = (LPTSTR)malloc ((_tcslen (name) + 1)*sizeof(TCHAR));
if (!ptr->lpName)
{
error_out_of_memory ();
free (ptr);
return;
}
_tcscpy (ptr->lpName, name);
ptr->lpSubst = (LPTSTR)malloc ((_tcslen (subst) + 1)*sizeof(TCHAR));
if (!ptr->lpSubst)
{
error_out_of_memory ();
free (ptr->lpName);
free (ptr);
return;
}
_tcscpy (ptr->lpSubst, subst);
/* it's necessary for recursive substitution */
partstrlwr (ptr->lpSubst);
ptr->dwUsed = 0;
/* Alias table must be sorted!
* Here a little example:
* command line = "ls -c"
* If the entries are
* ls=dir
* ls -c=ls /w
* command line will be expanded to "dir -c" which is not correct.
* If the entries are sortet as
* ls -c=ls /w
* ls=dir
* it will be expanded to "dir /w" which is a valid DOS command.
*/
entry = lpFirst;
prev = 0;
while (entry)
{
if (_tcsicmp (ptr->lpName, entry->lpName) > 0)
{
if (prev)
{
prev->next = ptr;
ptr->next = entry;
}
else
{
ptr->next = entry;
lpFirst = ptr;
}
return;
}
prev = entry;
entry = entry->next;
}
/* The new entry is the smallest (or the first) and must be
* added to the end of the list.
*/
if (!lpFirst)
lpFirst = ptr;
else
lpLast->next = ptr;
lpLast = ptr;
return;
}
VOID InitializeAlias (VOID)
{
lpFirst = NULL;
lpLast = NULL;
dwUsed = 0;
}
VOID DestroyAlias (VOID)
{
if (lpFirst == NULL)
return;
while (lpFirst->next != NULL)
{
lpLast = lpFirst;
lpFirst = lpLast->next;
free (lpLast->lpName);
free (lpLast->lpSubst);
free (lpLast);
}
free (lpFirst->lpName);
free (lpFirst->lpSubst);
free (lpFirst);
lpFirst = NULL;
lpLast = NULL;
dwUsed = 0;
}
/* specified routines */
VOID ExpandAlias (LPTSTR cmd, INT maxlen)
{
unsigned n = 0,
m,
i,
len;
short d = 1;
LPALIAS ptr = lpFirst;
dwUsed++;
if (dwUsed == 0)
{
while (ptr)
ptr->dwUsed = 0;
ptr = lpFirst;
dwUsed = 1;
}
/* skipping white spaces */
while (_istspace (cmd[n]))
n++;
partstrlwr (&cmd[n]);
if (!_tcsncmp (&cmd[n], _T("NOALIAS"), 7) &&
(_istspace (cmd[n + 7]) || cmd[n + 7] == _T('\0')))
{
memmove (cmd, &cmd[n + 7], (_tcslen (&cmd[n + 7]) + 1) * sizeof (TCHAR));
return;
}
/* substitution loop */
while (d)
{
d = 0;
while (ptr)
{
len = _tcslen (ptr->lpName);
if (!_tcsncmp (&cmd[n], ptr->lpName, len) &&
(_istspace (cmd[n + len]) || cmd[n + len] == _T('\0')) &&
ptr->dwUsed != dwUsed)
{
m = _tcslen (ptr->lpSubst);
if ((int)(_tcslen (cmd) - len + m - n) > maxlen)
{
ConErrResPuts(STRING_ALIAS_ERROR);
/* the parser won't cause any problems with an empty line */
cmd[0] = _T('\0');
}
else
{
memmove (&cmd[m], &cmd[n + len], (_tcslen(&cmd[n + len]) + 1) * sizeof (TCHAR));
for (i = 0; i < m; i++)
cmd[i] = ptr->lpSubst[i];
ptr->dwUsed = dwUsed;
/* whitespaces are removed! */
n = 0;
d = 1;
}
}
ptr = ptr->next;
}
}
}
INT CommandAlias (LPTSTR cmd, LPTSTR param)
{
LPTSTR ptr;
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_ALIAS_HELP);
return 0;
}
nErrorLevel = 0;
if (param[0] == _T('\0'))
{
PrintAlias ();
return 0;
}
nErrorLevel = 0;
/* error if no '=' found */
if ((ptr = _tcschr (param, _T('='))) == 0)
{
nErrorLevel = 1;
return 1;
}
/* Split rest into name and substitute */
*ptr++ = _T('\0');
partstrlwr (param);
if (ptr[0] == _T('\0'))
DeleteAlias (param);
else
AddAlias (param, ptr);
return 0;
}
#endif

View file

@ -0,0 +1,346 @@
/*
* ATTRIB.C - attrib internal command.
*
*
* History:
*
* 04-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* started
*
* 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* implementation works, except recursion ("attrib /s").
*
* 05-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* major rewrite.
* fixed recursion ("attrib /s").
* started directory support ("attrib /s /d").
* updated help text.
*
* 14-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*
* 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection ready!
*
* 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added check for invalid filenames.
*
* 23-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added handling of multiple filenames.
*
* 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_ATTRIB
static VOID
PrintAttribute (LPTSTR pszPath, LPTSTR pszFile, BOOL bRecurse)
{
WIN32_FIND_DATA findData;
HANDLE hFind;
TCHAR szFullName[MAX_PATH];
LPTSTR pszFileName;
/* prepare full file name buffer */
_tcscpy (szFullName, pszPath);
pszFileName = szFullName + _tcslen (szFullName);
/* display all subdirectories */
if (bRecurse)
{
/* append file name */
_tcscpy (pszFileName, pszFile);
hFind = FindFirstFile (szFullName, &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
ErrorMessage (GetLastError (), pszFile);
return;
}
do
{
if (!(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
continue;
if (!_tcscmp (findData.cFileName, _T(".")) ||
!_tcscmp (findData.cFileName, _T("..")))
continue;
_tcscpy (pszFileName, findData.cFileName);
_tcscat (pszFileName, _T("\\"));
PrintAttribute (szFullName, pszFile, bRecurse);
}
while (FindNextFile (hFind, &findData));
FindClose (hFind);
}
/* append file name */
_tcscpy (pszFileName, pszFile);
/* display current directory */
hFind = FindFirstFile (szFullName, &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
ErrorMessage (GetLastError (), pszFile);
return;
}
do
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
continue;
_tcscpy (pszFileName, findData.cFileName);
ConOutPrintf (_T("%c %c%c%c %s\n"),
(findData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) ? _T('A') : _T(' '),
(findData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) ? _T('S') : _T(' '),
(findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ? _T('H') : _T(' '),
(findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? _T('R') : _T(' '),
szFullName);
}
while (FindNextFile (hFind, &findData));
FindClose (hFind);
}
static VOID
ChangeAttribute (LPTSTR pszPath, LPTSTR pszFile, DWORD dwMask,
DWORD dwAttrib, BOOL bRecurse, BOOL bDirectories)
{
WIN32_FIND_DATA findData;
HANDLE hFind;
DWORD dwAttribute;
TCHAR szFullName[MAX_PATH];
LPTSTR pszFileName;
/* prepare full file name buffer */
_tcscpy (szFullName, pszPath);
pszFileName = szFullName + _tcslen (szFullName);
/* change all subdirectories */
if (bRecurse)
{
/* append file name */
_tcscpy (pszFileName, _T("*.*"));
hFind = FindFirstFile (szFullName, &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
ErrorMessage (GetLastError (), pszFile);
nErrorLevel = 1;
return;
}
do
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (!_tcscmp (findData.cFileName, _T(".")) ||
!_tcscmp (findData.cFileName, _T("..")))
continue;
_tcscpy (pszFileName, findData.cFileName);
_tcscat (pszFileName, _T("\\"));
ChangeAttribute (szFullName, pszFile, dwMask,
dwAttrib, bRecurse, bDirectories);
}
}
while (FindNextFile (hFind, &findData));
FindClose (hFind);
}
/* append file name */
_tcscpy (pszFileName, pszFile);
hFind = FindFirstFile (szFullName, &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
ErrorMessage (GetLastError (), pszFile);
nErrorLevel = 1;
return;
}
do
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
continue;
_tcscpy (pszFileName, findData.cFileName);
dwAttribute = GetFileAttributes (szFullName);
if (dwAttribute != 0xFFFFFFFF)
{
dwAttribute = (dwAttribute & ~dwMask) | dwAttrib;
SetFileAttributes (szFullName, dwAttribute);
}
}
while (FindNextFile (hFind, &findData));
FindClose (hFind);
}
INT CommandAttrib (LPTSTR cmd, LPTSTR param)
{
LPTSTR *arg;
INT argc, i;
TCHAR szPath[MAX_PATH];
TCHAR szFileName [MAX_PATH];
BOOL bRecurse = FALSE;
BOOL bDirectories = FALSE;
DWORD dwAttrib = 0;
DWORD dwMask = 0;
/* initialize strings */
szPath[0] = _T('\0');
szFileName[0] = _T('\0');
/* print help */
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_ATTRIB_HELP);
return 0;
}
nErrorLevel = 0;
/* build parameter array */
arg = split (param, &argc, FALSE);
/* check for options */
for (i = 0; i < argc; i++)
{
if (_tcsicmp (arg[i], _T("/s")) == 0)
bRecurse = TRUE;
else if (_tcsicmp (arg[i], _T("/d")) == 0)
bDirectories = TRUE;
}
/* create attributes and mask */
for (i = 0; i < argc; i++)
{
if (*arg[i] == _T('+'))
{
if (_tcslen (arg[i]) != 2)
{
error_invalid_parameter_format (arg[i]);
freep (arg);
return -1;
}
switch ((TCHAR)_totupper (arg[i][1]))
{
case _T('A'):
dwMask |= FILE_ATTRIBUTE_ARCHIVE;
dwAttrib |= FILE_ATTRIBUTE_ARCHIVE;
break;
case _T('H'):
dwMask |= FILE_ATTRIBUTE_HIDDEN;
dwAttrib |= FILE_ATTRIBUTE_HIDDEN;
break;
case _T('R'):
dwMask |= FILE_ATTRIBUTE_READONLY;
dwAttrib |= FILE_ATTRIBUTE_READONLY;
break;
case _T('S'):
dwMask |= FILE_ATTRIBUTE_SYSTEM;
dwAttrib |= FILE_ATTRIBUTE_SYSTEM;
break;
default:
error_invalid_parameter_format (arg[i]);
freep (arg);
return -1;
}
}
else if (*arg[i] == _T('-'))
{
if (_tcslen (arg[i]) != 2)
{
error_invalid_parameter_format (arg[i]);
freep (arg);
return -1;
}
switch ((TCHAR)_totupper (arg[i][1]))
{
case _T('A'):
dwMask |= FILE_ATTRIBUTE_ARCHIVE;
dwAttrib &= ~FILE_ATTRIBUTE_ARCHIVE;
break;
case _T('H'):
dwMask |= FILE_ATTRIBUTE_HIDDEN;
dwAttrib &= ~FILE_ATTRIBUTE_HIDDEN;
break;
case _T('R'):
dwMask |= FILE_ATTRIBUTE_READONLY;
dwAttrib &= ~FILE_ATTRIBUTE_READONLY;
break;
case _T('S'):
dwMask |= FILE_ATTRIBUTE_SYSTEM;
dwAttrib &= ~FILE_ATTRIBUTE_SYSTEM;
break;
default:
error_invalid_parameter_format (arg[i]);
freep (arg);
return -1;
}
}
}
if (argc == 0)
{
DWORD len;
len = GetCurrentDirectory (MAX_PATH, szPath);
if (szPath[len-1] != _T('\\'))
{
szPath[len] = _T('\\');
szPath[len + 1] = 0;
}
_tcscpy (szFileName, _T("*.*"));
PrintAttribute (szPath, szFileName, bRecurse);
freep (arg);
return 0;
}
/* get full file name */
for (i = 0; i < argc; i++)
{
if ((*arg[i] != _T('+')) && (*arg[i] != _T('-')) && (*arg[i] != _T('/')))
{
LPTSTR p;
GetFullPathName (arg[i], MAX_PATH, szPath, NULL);
p = _tcsrchr (szPath, _T('\\')) + 1;
_tcscpy (szFileName, p);
*p = _T('\0');
if (dwMask == 0)
PrintAttribute (szPath, szFileName, bRecurse);
else
ChangeAttribute (szPath, szFileName, dwMask,
dwAttrib, bRecurse, bDirectories);
}
}
freep (arg);
return 0;
}
#endif /* INCLUDE_CMD_ATTRIB */

View file

@ -0,0 +1,459 @@
/*
* 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 */

View file

@ -0,0 +1,47 @@
/*
* BATCH.H - A structure to preserve the context of a batch file
*
*
*/
#ifndef _BATCH_H_INCLUDED_
#define _BATCH_H_INCLUDED_
typedef struct tagBATCHCONTEXT
{
struct tagBATCHCONTEXT *prev;
LPWIN32_FIND_DATA ffind;
HANDLE hBatchFile;
LPTSTR forproto;
LPTSTR params;
INT shiftlevel;
BOOL bEcho; /* Preserve echo flag across batch calls */
HANDLE hFind; /* Preserve find handle when doing a for */
TCHAR In[MAX_PATH];
TCHAR Out[MAX_PATH];
TCHAR Err[MAX_PATH];
TCHAR forvar;
} BATCH_CONTEXT, *LPBATCH_CONTEXT;
/* The stack of current batch contexts.
* NULL when no batch is active
*/
extern LPBATCH_CONTEXT bc;
extern BOOL bEcho; /* The echo flag */
#define BATCH_BUFFSIZE 2048
extern TCHAR textline[BATCH_BUFFSIZE]; /* Buffer for reading Batch file lines */
LPTSTR FindArg (INT);
LPTSTR BatchParams (LPTSTR, LPTSTR);
VOID ExitBatch (LPTSTR);
BOOL Batch (LPTSTR, LPTSTR, LPTSTR);
LPTSTR ReadBatchLine (LPBOOL);
VOID AddBatchRedirection(TCHAR *, TCHAR *, TCHAR *);
#endif /* _BATCH_H_INCLUDED_ */

View file

@ -0,0 +1,50 @@
/*
* BEEP.C - beep internal command.
*
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* started.
*
* 16 Jul 1998 (John P Price)
* Separated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 14-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("beep /?").
* Unicode ready!
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection ready!
*
* 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_BEEP
INT cmd_beep (LPTSTR cmd, LPTSTR param)
{
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_BEEP_HELP);
return 0;
}
#if 0
/* check if run in batch mode */
if (bc == NULL)
return 1;
#endif
MessageBeep (-1);
return 0;
}
#endif

View file

@ -0,0 +1,100 @@
/*
* CALL.C - call internal batch command.
*
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* started.
*
* 16 Jul 1998 (John P Price)
* Seperated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 04-Aug-1998 (Hans B Pufal)
* added lines to initialize for pointers (HBP004) This fixed the
* lock-up that happened sometimes when calling a batch file from
* another batch file.
*
* 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("call /?") and cleaned up.
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
*
* 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
/*
* Perform CALL command.
*
* Allocate a new batch context and add it to the current chain.
* Call parsecommandline passing in our param string
* If No batch file was opened then remove our newly allocted
* context block.
*/
INT cmd_call (LPTSTR cmd, LPTSTR param)
{
LPBATCH_CONTEXT n = NULL;
#ifdef _DEBUG
DebugPrintf (_T("cmd_call: (\'%s\',\'%s\')\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_CALL_HELP);
return 0;
}
nErrorLevel = 0;
n = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT));
if (n == NULL)
{
error_out_of_memory ();
return 1;
}
n->prev = bc;
bc = n;
bc->hBatchFile = INVALID_HANDLE_VALUE;
bc->params = NULL;
bc->shiftlevel = 0;
bc->forvar = 0; /* HBP004 */
bc->forproto = NULL; /* HBP004 */
ParseCommandLine (param);
if (bc->prev)
{
_tcscpy(bc->In, bc->prev->In);
_tcscpy(bc->Out, bc->prev->Out);
_tcscpy(bc->Err, bc->prev->Err);
}
else
{
bc->In[0] = _T('\0');
bc->Out[0] = _T('\0');
bc->Err[0] = _T('\0');
}
/* Wasn't a batch file so remove conext */
if (bc->hBatchFile == INVALID_HANDLE_VALUE)
{
bc = bc->prev;
free (n);
}
return 0;
}
/* EOF */

View file

@ -0,0 +1,85 @@
/*
* CHCP.C - chcp internal command.
*
*
* History:
*
* 23-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Started.
*
* 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_CHCP
INT CommandChcp (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LPTSTR *arg;
INT args;
UINT uNewCodePage;
/* print help */
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_CHCP_HELP);
return 0;
}
nErrorLevel = 0;
/* get parameters */
arg = split (param, &args, FALSE);
if (args == 0)
{
/* display active code page number */
LoadString(CMD_ModuleHandle, STRING_CHCP_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, InputCodePage);
return 0;
}
if (args >= 2)
{
/* too many parameters */
LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, param);
nErrorLevel = 1;
return 1;
}
uNewCodePage = (UINT)_ttoi(arg[0]);
if (uNewCodePage == 0)
{
LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, arg[0]);
freep (arg);
nErrorLevel = 1;
return 1;
}
if (!SetConsoleCP(uNewCodePage))
{
ConErrResPuts(STRING_CHCP_ERROR4);
}
else
{
SetConsoleOutputCP (uNewCodePage);
InitLocale ();
InputCodePage= GetConsoleCP();
}
freep (arg);
return 0;
}
#endif /* INCLUDE_CMD_CHCP */

View file

@ -0,0 +1,327 @@
/*
* CHOICE.C - internal command.
*
*
* History:
*
* 12 Aug 1999 (Eric Kohl)
* started.
*
* 01 Sep 1999 (Eric Kohl)
* Fixed help text.
*
* 26 Sep 1999 (Paolo Pantaleo)
* Fixed timeout.
*
* 02 Apr 2005 (Magnus Olsen
* Remove Hardcode string so
* they can be translate
*
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_CHOICE
#define GC_TIMEOUT -1
#define GC_NOKEY 0 //an event occurred but it wasn't a key pressed
#define GC_KEYREAD 1 //a key has been read
static INT
GetCharacterTimeout (LPTCH ch, DWORD dwMilliseconds)
{
//--------------------------------------------
// Get a character from standard input but with a timeout.
// The function will wait a limited amount
// of time, then the function returns GC_TIMEOUT.
//
// dwMilliseconds is the timeout value, that can
// be set to INFINITE, so the function works like
// stdio.h's getchar()
HANDLE hInput;
DWORD dwRead;
INPUT_RECORD lpBuffer;
hInput = GetStdHandle (STD_INPUT_HANDLE);
//if the timeout experied return GC_TIMEOUT
if (WaitForSingleObject (hInput, dwMilliseconds) == WAIT_TIMEOUT)
return GC_TIMEOUT;
//otherwise get the event
ReadConsoleInput (hInput, &lpBuffer, 1, &dwRead);
//if the event is a key pressed
if ((lpBuffer.EventType == KEY_EVENT) &&
(lpBuffer.Event.KeyEvent.bKeyDown == TRUE))
{
//read the key
#ifdef _UNICODE
*ch = lpBuffer.Event.KeyEvent.uChar.UnicodeChar;
#else
*ch = lpBuffer.Event.KeyEvent.uChar.AsciiChar;
#endif
return GC_KEYREAD;
}
//else return no key
return GC_NOKEY;
}
static INT
IsKeyInString (LPTSTR lpString, TCHAR cKey, BOOL bCaseSensitive)
{
LPTCH p = lpString;
INT val = 0;
while (*p)
{
if (bCaseSensitive)
{
if (*p == cKey)
return val;
}
else
{
if (_totlower (*p) == _totlower (cKey))
return val;
}
val++;
p++;
}
return -1;
}
INT
CommandChoice (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LPTSTR lpOptions;
TCHAR Options[6];
LPTSTR lpText = NULL;
BOOL bNoPrompt = FALSE;
BOOL bCaseSensitive = FALSE;
BOOL bTimeout = FALSE;
INT nTimeout = 0;
TCHAR cDefault = _T('\0');
INPUT_RECORD ir;
LPTSTR p, np;
LPTSTR *arg;
INT argc;
INT i;
INT val;
INT GCret;
TCHAR Ch;
DWORD amount,clk;
LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, Options, 4);
lpOptions = Options;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_CHOICE_HELP);
return 0;
}
/* retrieve text */
p = param;
while (TRUE)
{
if (*p == _T('\0'))
break;
if (*p != _T('/'))
{
lpText = p;
break;
}
np = _tcschr (p, _T(' '));
if (!np)
break;
p = np + 1;
}
/* build parameter array */
arg = split (param, &argc, FALSE);
/* evaluate arguments */
if (argc > 0)
{
for (i = 0; i < argc; i++)
{
if (_tcsnicmp (arg[i], _T("/c"), 2) == 0)
{
if (arg[i][2] == _T(':'))
lpOptions = &arg[i][3];
else
lpOptions = &arg[i][2];
if (_tcslen (lpOptions) == 0)
{
ConErrResPuts(STRING_CHOICE_ERROR);
freep (arg);
return 1;
}
}
else if (_tcsnicmp (arg[i], _T("/n"), 2) == 0)
{
bNoPrompt = TRUE;
}
else if (_tcsnicmp (arg[i], _T("/s"), 2) == 0)
{
bCaseSensitive = TRUE;
}
else if (_tcsnicmp (arg[i], _T("/t"), 2) == 0)
{
LPTSTR s;
if (arg[i][2] == _T(':'))
{
cDefault = arg[i][3];
s = &arg[i][4];
}
else
{
cDefault = arg[i][2];
s = &arg[i][3];
}
if (*s != _T(','))
{
ConErrResPuts(STRING_CHOICE_ERROR_TXT);
freep (arg);
return 1;
}
s++;
nTimeout = _ttoi(s);
bTimeout = TRUE;
}
else if (arg[i][0] == _T('/'))
{
LoadString(CMD_ModuleHandle, STRING_CHOICE_ERROR_OPTION, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, arg[i]);
freep (arg);
return 1;
}
}
}
/* print text */
if (lpText)
ConOutPrintf (_T("%s"), lpText);
/* print options */
if (bNoPrompt == FALSE)
{
ConOutPrintf (_T("[%c"), lpOptions[0]);
for (i = 1; (unsigned)i < _tcslen (lpOptions); i++)
ConOutPrintf (_T(",%c"), lpOptions[i]);
ConOutPrintf (_T("]?"));
}
ConInFlush ();
if(!bTimeout)
{
while (TRUE)
{
ConInKey (&ir);
val = IsKeyInString (lpOptions,
#ifdef _UNICODE
ir.Event.KeyEvent.uChar.UnicodeChar,
#else
ir.Event.KeyEvent.uChar.AsciiChar,
#endif
bCaseSensitive);
if (val >= 0)
{
ConOutPrintf (_T("%c\n"), lpOptions[val]);
nErrorLevel = val + 1;
break;
}
Beep (440, 50);
}
freep (arg);
#ifdef _DEBUG
DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel);
#endif /* _DEBUG */
return 0;
}
clk = GetTickCount ();
amount = nTimeout*1000;
loop:
GCret = GetCharacterTimeout (&Ch, amount - (GetTickCount () - clk));
switch (GCret)
{
case GC_TIMEOUT:
#ifdef _DEBUG
DebugPrintf (_T("GC_TIMEOUT\n"));
DebugPrintf (_T("elapsed %d msecs\n"), GetTickCount () - clk);
#endif /* _DEBUG */
break;
case GC_NOKEY:
#ifdef _DEBUG
DebugPrintf(_T("GC_NOKEY\n"));
DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk);
#endif /* _DEBUG */
goto loop;
case GC_KEYREAD:
#ifdef _DEBUG
DebugPrintf(_T("GC_KEYREAD\n"));
DebugPrintf(_T("elapsed %d msecs\n"), GetTickCount () - clk);
DebugPrintf(_T("read %c"), Ch);
#endif /* _DEBUG */
if ((val=IsKeyInString(lpOptions,Ch,bCaseSensitive))==-1)
{
Beep (440, 50);
goto loop;
}
cDefault=Ch;
break;
}
#ifdef _DEBUG
DebugPrintf(_T("exiting wait loop after %d msecs\n"),
GetTickCount () - clk);
#endif /* _DEBUG */
val = IsKeyInString (lpOptions, cDefault, bCaseSensitive);
ConOutPrintf (_T("%c\n"), lpOptions[val]);
nErrorLevel = val + 1;
freep (arg);
#ifdef _DEBUG
DebugPrintf (_T("ErrorLevel: %d\n"), nErrorLevel);
#endif /* _DEBUG */
return 0;
}
#endif /* INCLUDE_CMD_CHOICE */
/* EOF */

View file

@ -0,0 +1,62 @@
/*
* CLS.C - clear screen internal command.
*
*
* History:
*
* 07/27/1998 (John P. Price)
* started.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 04-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Changed to Win32 console app.
*
* 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
*
* 14-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*
* 20-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection ready!
*
* 02-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_CLS
INT cmd_cls (LPTSTR cmd, LPTSTR param)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
COORD coPos;
DWORD dwWritten;
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_CLS_HELP);
return 0;
}
GetConsoleScreenBufferInfo(hConsole, &csbi);
coPos.X = 0;
coPos.Y = 0;
FillConsoleOutputAttribute(hConsole, wColor,
csbi.dwSize.X * csbi.dwSize.Y,
coPos, &dwWritten);
FillConsoleOutputCharacter(hConsole, _T(' '),
csbi.dwSize.X * csbi.dwSize.Y,
coPos, &dwWritten);
SetConsoleCursorPosition(hConsole, coPos);
bIgnoreEcho = TRUE;
return 0;
}
#endif

1865
reactos/base/shell/cmd/cmd.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,405 @@
/*
* CMD.H - header file for the modules in CMD.EXE
*
*
* History:
*
* 7-15-95 Tim Norman
* started
*
* 06/29/98 (Rob Lake)
* Moved error messages in here
*
* 07/12/98 (Rob Lake)
* Moved more error messages here.
*
* 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* Added compile date to version.
*
* 26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Introduced a new version string.
* Thanks to Emanuele Aliberti!
*/
#ifndef _CMD_H_INCLUDED_
#define _CMD_H_INCLUDED_
#include "config.h"
#include <windows.h>
#include <tchar.h>
#include "cmdver.h"
#define BREAK_BATCHFILE 1
#define BREAK_OUTOFBATCH 2
#define BREAK_INPUT 3
#define BREAK_IGNORE 4
/* define some error messages */
#define D_ON _T("on")
#define D_OFF _T("off")
/* command line buffer length */
#define CMDLINE_LENGTH 8192
/* global variables */
extern HANDLE hOut;
extern HANDLE hIn;
extern HANDLE hConsole;
extern WORD wColor;
extern WORD wDefColor;
extern BOOL bCtrlBreak;
extern BOOL bIgnoreEcho;
extern BOOL bExit;
extern INT nErrorLevel;
extern SHORT maxx;
extern SHORT maxy;
extern OSVERSIONINFO osvi;
/* Prototypes for ALIAS.C */
VOID InitializeAlias (VOID);
VOID DestroyAlias (VOID);
VOID ExpandAlias (LPTSTR, INT);
INT CommandAlias (LPTSTR, LPTSTR);
/* Prototypes for ATTRIB.C */
INT CommandAttrib (LPTSTR, LPTSTR);
/* Prototypes for BEEP.C */
INT cmd_beep (LPTSTR, LPTSTR);
/* Prototypes for CALL.C */
INT cmd_call (LPTSTR, LPTSTR);
/* Prototypes for CHCP.C */
INT CommandChcp (LPTSTR, LPTSTR);
/* Prototypes for CHOICE.C */
INT CommandChoice (LPTSTR, LPTSTR);
/* Prototypes for CLS.C */
INT cmd_cls (LPTSTR, LPTSTR);
/* Prototypes for CMD.C */
INT ConvertULargeInteger (ULARGE_INTEGER num, LPTSTR des, INT len, BOOL bPutSeperator);
VOID ParseCommandLine (LPTSTR);
LPCTSTR GetEnvVarOrSpecial ( LPCTSTR varName );
VOID AddBreakHandler (VOID);
VOID RemoveBreakHandler (VOID);
extern HANDLE CMD_ModuleHandle;
/* Prototypes for CMDINPUT.C */
VOID ReadCommand (LPTSTR, INT);
/* Prototypes for CMDTABLE.C */
#define CMD_SPECIAL 1
#define CMD_BATCHONLY 2
#define CMD_HIDE 4
typedef struct tagCOMMAND
{
LPTSTR name;
INT flags;
INT (*func) (LPTSTR, LPTSTR);
} COMMAND, *LPCOMMAND;
extern COMMAND cmds[]; /* The internal command table */
VOID PrintCommandList (VOID);
VOID PrintCommandListDetail (VOID);
/* Prototypes for COLOR.C */
VOID SetScreenColor(WORD wArgColor, BOOL bFill);
INT CommandColor (LPTSTR, LPTSTR);
/* Prototypes for CONSOLE.C */
#ifdef _DEBUG
VOID DebugPrintf (LPTSTR, ...);
#endif /* _DEBUG */
VOID ConInDummy (VOID);
VOID ConInDisable (VOID);
VOID ConInEnable (VOID);
VOID ConInFlush (VOID);
VOID ConInKey (PINPUT_RECORD);
VOID ConInString (LPTSTR, DWORD);
VOID ConOutChar (TCHAR);
VOID ConOutPuts (LPTSTR);
VOID ConOutPrintf (LPTSTR, ...);
INT ConOutPrintfPaging (BOOL NewPage, LPTSTR, ...);
VOID ConErrChar (TCHAR);
VOID ConErrPuts (LPTSTR);
VOID ConErrPrintf (LPTSTR, ...);
VOID ConOutFormatMessage (DWORD MessageId, ...);
VOID ConErrFormatMessage (DWORD MessageId, ...);
SHORT GetCursorX (VOID);
SHORT GetCursorY (VOID);
VOID GetCursorXY (PSHORT, PSHORT);
VOID SetCursorXY (SHORT, SHORT);
VOID GetScreenSize (PSHORT, PSHORT);
VOID SetCursorType (BOOL, BOOL);
VOID ConOutResPuts (UINT resID);
VOID ConErrResPuts (UINT resID);
VOID ConOutResPaging(BOOL NewPage, UINT resID);
/* Prototypes for COPY.C */
INT cmd_copy (LPTSTR, LPTSTR);
/* Prototypes for DATE.C */
INT cmd_date (LPTSTR, LPTSTR);
/* Prototypes for DEL.C */
INT CommandDelete (LPTSTR, LPTSTR);
/* Prototypes for DELAY.C */
INT CommandDelay (LPTSTR, LPTSTR);
/* Prototypes for DIR.C */
INT CommandDir (LPTSTR, LPTSTR);
/* Prototypes for DIRSTACK.C */
VOID InitDirectoryStack (VOID);
VOID DestroyDirectoryStack (VOID);
INT GetDirectoryStackDepth (VOID);
INT CommandPushd (LPTSTR, LPTSTR);
INT CommandPopd (LPTSTR, LPTSTR);
INT CommandDirs (LPTSTR, LPTSTR);
/* Prototypes for ECHO.C */
INT CommandEcho (LPTSTR, LPTSTR);
INT CommandEchos (LPTSTR, LPTSTR);
INT CommandEchoerr (LPTSTR, LPTSTR);
INT CommandEchoserr (LPTSTR, LPTSTR);
/* Prototypes for ERROR.C */
VOID ErrorMessage (DWORD, LPTSTR, ...);
VOID error_no_pipe (VOID);
VOID error_bad_command (VOID);
VOID error_invalid_drive (VOID);
VOID error_req_param_missing (VOID);
VOID error_sfile_not_found (LPTSTR);
VOID error_file_not_found (VOID);
VOID error_path_not_found (VOID);
VOID error_too_many_parameters (LPTSTR);
VOID error_parameter_format(TCHAR);
VOID error_invalid_switch (TCHAR);
VOID error_invalid_parameter_format (LPTSTR);
VOID error_out_of_memory (VOID);
VOID error_syntax (LPTSTR);
VOID msg_pause (VOID);
/* Prototypes for FILECOMP.C */
#ifdef FEATURE_UNIX_FILENAME_COMPLETION
VOID CompleteFilename (LPTSTR, UINT);
INT ShowCompletionMatches (LPTSTR, INT);
#endif
#ifdef FEATURE_4NT_FILENAME_COMPLETION
VOID CompleteFilename (LPTSTR, BOOL, LPTSTR, UINT);
#endif
/* Prototypes for FOR.C */
INT cmd_for (LPTSTR, LPTSTR);
/* Prototypes for FREE.C */
INT CommandFree (LPTSTR, LPTSTR);
/* Prototypes for GOTO.C */
INT cmd_goto (LPTSTR, LPTSTR);
/* Prototypes for HISTORY.C */
#ifdef FEATURE_HISTORY
VOID History (INT, LPTSTR);/*add entries browse history*/
VOID History_move_to_bottom(VOID);/*F3*/
VOID InitHistory(VOID);
VOID CleanHistory(VOID);
VOID History_del_current_entry(LPTSTR str);/*CTRL-D*/
INT CommandHistory (LPTSTR cmd, LPTSTR param);
#endif
/* Prototypes for INTERNAL.C */
VOID InitLastPath (VOID);
VOID FreeLastPath (VOID);
INT cmd_chdir (LPTSTR, LPTSTR);
INT cmd_mkdir (LPTSTR, LPTSTR);
INT cmd_rmdir (LPTSTR, LPTSTR);
INT CommandExit (LPTSTR, LPTSTR);
INT CommandRem (LPTSTR, LPTSTR);
INT CommandShowCommands (LPTSTR, LPTSTR);
INT CommandShowCommandsDetail (LPTSTR, LPTSTR);
/* Prototypes for LABEL.C */
INT cmd_label (LPTSTR, LPTSTR);
/* Prototypes for LOCALE.C */
extern TCHAR cDateSeparator;
extern INT nDateFormat;
extern TCHAR cTimeSeparator;
extern INT nTimeFormat;
extern TCHAR cThousandSeparator;
extern TCHAR cDecimalSeparator;
extern INT nNumberGroups;
VOID InitLocale (VOID);
VOID PrintDate (VOID);
VOID PrintTime (VOID);
/* cache codepage */
extern UINT InputCodePage;
extern UINT OutputCodePage;
/* Prototypes for MEMORY.C */
INT CommandMemory (LPTSTR, LPTSTR);
/* Prototypes for MISC.C */
INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size);
BOOL SetRootPath(TCHAR *InPath);
TCHAR cgetchar (VOID);
BOOL CheckCtrlBreak (INT);
BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry);
LPTSTR *split (LPTSTR, LPINT, BOOL);
VOID freep (LPTSTR *);
LPTSTR _stpcpy (LPTSTR, LPCTSTR);
BOOL IsValidPathName (LPCTSTR);
BOOL IsExistingFile (LPCTSTR);
BOOL IsExistingDirectory (LPCTSTR);
BOOL FileGetString (HANDLE, LPTSTR, INT);
VOID GetPathCase(TCHAR *, TCHAR *);
#define PROMPT_NO 0
#define PROMPT_YES 1
#define PROMPT_ALL 2
#define PROMPT_BREAK 3
INT PagePrompt (VOID);
INT FilePromptYN (LPTSTR, ...);
INT FilePromptYNA (LPTSTR, ...);
/* Prototypes for MOVE.C */
INT cmd_move (LPTSTR, LPTSTR);
/* Prototypes for MSGBOX.C */
INT CommandMsgbox (LPTSTR, LPTSTR);
/* Prototypes from PATH.C */
INT cmd_path (LPTSTR, LPTSTR);
/* Prototypes from PROMPT.C */
VOID PrintPrompt (VOID);
INT cmd_prompt (LPTSTR, LPTSTR);
/* Prototypes for REDIR.C */
#define INPUT_REDIRECTION 1
#define OUTPUT_REDIRECTION 2
#define OUTPUT_APPEND 4
#define ERROR_REDIRECTION 8
#define ERROR_APPEND 16
INT GetRedirection (LPTSTR, LPTSTR, LPTSTR, LPTSTR, LPINT);
/* Prototypes for REN.C */
INT cmd_rename (LPTSTR, LPTSTR);
/* Prototypes for SCREEN.C */
INT CommandScreen (LPTSTR, LPTSTR);
/* Prototypes for SET.C */
INT cmd_set (LPTSTR, LPTSTR);
/* Prototypes for START.C */
INT cmd_start (LPTSTR, LPTSTR);
/* Prototypes for STRTOCLR.C */
BOOL StringToColor (LPWORD, LPTSTR *);
/* Prototypes for TIME.C */
INT cmd_time (LPTSTR, LPTSTR);
/* Prototypes for TIMER.C */
INT CommandTimer (LPTSTR cmd, LPTSTR param);
/* Prototypes for TITLE.C */
INT cmd_title (LPTSTR, LPTSTR);
/* Prototypes for TYPE.C */
INT cmd_type (LPTSTR, LPTSTR);
/* Prototypes for VER.C */
VOID ShortVersion (VOID);
INT cmd_ver (LPTSTR, LPTSTR);
/* Prototypes for VERIFY.C */
INT cmd_verify (LPTSTR, LPTSTR);
/* Prototypes for VOL.C */
INT cmd_vol (LPTSTR, LPTSTR);
/* Prototypes for WHERE.C */
BOOL SearchForExecutable (LPCTSTR, LPTSTR);
/* Prototypes for WINDOW.C */
INT CommandActivate (LPTSTR, LPTSTR);
INT CommandWindow (LPTSTR, LPTSTR);
/* The MSDOS Batch Commands [MS-DOS 5.0 User's Guide and Reference p359] */
int cmd_if(TCHAR *, TCHAR *);
int cmd_pause(TCHAR *, TCHAR *);
int cmd_shift(TCHAR *, TCHAR *);
#endif /* _CMD_H_INCLUDED_ */

View file

@ -0,0 +1,39 @@
#include <windows.h>
#include "cmdver.h"
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Command Processor\0"
#define REACTOS_STR_INTERNAL_NAME "cmd\0"
#define REACTOS_STR_ORIGINAL_FILENAME "cmd.exe\0"
#define REACTOS_STR_ORIGINAL_COPYRIGHT "Copyright (C) 1994-1998 Tim Norman and others\0"
#define REACTOS_STR_LEGAL_COPYRIGHT "Copyright (C) 1998-2006 Eric Kohl and others\0"
#include <reactos/version.rc>
#include "En.rc"
#include "Fr.rc"
#include "De.rc"
#include "Es.rc"
#include "Ru.rc"
#include "Ja.rc"
#include "Hu.rc"
STRINGTABLE DISCARDABLE
{
STRING_FREEDOS_DEV, " Tim Norman Matt Rains\n\
Evan Jeffrey Steffen Kaiser\n\
Svante Frey Oliver Mueller\n\
Aaron Kaufman Marc Desrochers\n\
Rob Lake John P Price\n\
Hans B Pufal\n"
STRING_REACTOS_DEV, " Eric Kohl Emanuele Aliberti\n\
Paolo Pantaleo Phillip Susi\n\
Sylvain Petreolle\n"
}
1 ICON DISCARDABLE res/terminal.ico

View file

@ -0,0 +1,77 @@
<module name="cmd_base" type="objectlibrary">
<include base="ReactOS">include/wine</include>
<include base="cmd_base">.</include>
<define name="__USE_W32API" />
<define name="ANONYMOUSUNIONS" />
<define name="_WIN32_WINNT">0x0501</define>
<pch>precomp.h</pch>
<compilationunit name="unit.c">
<file>alias.c</file>
<file>attrib.c</file>
<file>batch.c</file>
<file>beep.c</file>
<file>call.c</file>
<file>chcp.c</file>
<file>choice.c</file>
<file>cls.c</file>
<file>cmd.c</file>
<file>cmdinput.c</file>
<file>cmdtable.c</file>
<file>color.c</file>
<file>console.c</file>
<file>copy.c</file>
<file>date.c</file>
<file>del.c</file>
<file>delay.c</file>
<file>dir.c</file>
<file>dirstack.c</file>
<file>echo.c</file>
<file>error.c</file>
<file>filecomp.c</file>
<file>for.c</file>
<file>free.c</file>
<file>goto.c</file>
<file>history.c</file>
<file>if.c</file>
<file>internal.c</file>
<file>label.c</file>
<file>locale.c</file>
<file>memory.c</file>
<file>misc.c</file>
<file>move.c</file>
<file>msgbox.c</file>
<file>path.c</file>
<file>pause.c</file>
<file>prompt.c</file>
<file>redir.c</file>
<file>ren.c</file>
<file>screen.c</file>
<file>set.c</file>
<file>shift.c</file>
<file>start.c</file>
<file>strtoclr.c</file>
<file>time.c</file>
<file>timer.c</file>
<file>title.c</file>
<file>type.c</file>
<file>ver.c</file>
<file>verify.c</file>
<file>vol.c</file>
<file>where.c</file>
<file>window.c</file>
</compilationunit>
</module>
<module name="cmd" type="win32cui" installbase="system32" installname="cmd.exe" usewrc="false">
<include base="ReactOS">include/wine</include>
<include base="cmd">.</include>
<define name="__USE_W32API" />
<define name="ANONYMOUSUNIONS" />
<define name="_WIN32_WINNT">0x0501</define>
<library>kernel32</library>
<library>cmd_base</library>
<file>main.c</file>
<file>cmd.rc</file>
</module>
<directory name="tests">
<xi:include href="tests/cmd_test.xml" />
</directory>

View file

@ -0,0 +1,574 @@
/*
* CMDINPUT.C - handles command input (tab completion, history, etc.).
*
*
* History:
*
* 01/14/95 (Tim Norman)
* started.
*
* 08/08/95 (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.
*
* 12/12/95 (Tim Norman)
* added findxy() function to get max x/y coordinates to display
* correctly on larger screens
*
* 12/14/95 (Tim Norman)
* fixed the Tab completion code that Matt Rains broke by moving local
* variables to a more global scope and forgetting to initialize them
* when needed
*
* 8/1/96 (Tim Norman)
* fixed a bug in tab completion that caused filenames at the beginning
* of the command-line to have their first letter truncated
*
* 9/1/96 (Tim Norman)
* fixed a silly bug using printf instead of fputs, where typing "%i"
* confused printf :)
*
* 6/14/97 (Steffan Kaiser)
* ctrl-break checking
*
* 6/7/97 (Marc Desrochers)
* recoded everything! now properly adjusts when text font is changed.
* removed findxy(), reposition(), and reprint(), as these functions
* were inefficient. added goxy() function as gotoxy() was buggy when
* the screen font was changed. the printf() problem with %i on the
* command line was fixed by doing printf("%s",str) instead of
* printf(str). Don't ask how I find em just be glad I do :)
*
* 7/12/97 (Tim Norman)
* Note: above changes pre-empted Steffan's ctrl-break checking.
*
* 7/7/97 (Marc Desrochers)
* rewrote a new findxy() because the new dir() used it. This
* findxy() simply returns the values of *maxx *maxy. In the
* future, please use the pointers, they will always be correct
* since they point to BIOS values.
*
* 7/8/97 (Marc Desrochers)
* once again removed findxy(), moved the *maxx, *maxy pointers
* global and included them as externs in command.h. Also added
* insert/overstrike capability
*
* 7/13/97 (Tim Norman)
* added different cursor appearance for insert/overstrike mode
*
* 7/13/97 (Tim Norman)
* changed my code to use _setcursortype until I can figure out why
* my code is crashing on some machines. It doesn't crash on mine :)
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* put ifdef's around filename completion code.
*
* 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* moved filename completion code to filecomp.c
* made second TAB display list of filename matches
*
* 31-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* Fixed bug where if you typed something, then hit HOME, then tried
* to type something else in insert mode, it crashed.
*
* 07-Aug-1998 (John P Price <linux-guru@gcfl.net>)
* Fixed carrage return output to better match MSDOS with echo
* on or off.(marked with "JPP 19980708")
*
* 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added insert/overwrite cursor.
*
* 25-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Replaced CRT io functions by Win32 console io functions.
* This can handle <Shift>-<Tab> for 4NT filename completion.
* Unicode and redirection safe!
*
* 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed input bug. A "line feed" character remained in the keyboard
* input queue when you pressed <RETURN>. This sometimes caused
* some very strange effects.
* Fixed some command line editing annoyances.
*
* 30-Apr-2004 (Filip Navara <xnavara@volny.cz>)
* Fixed problems when the screen was scrolled away.
*/
#include <precomp.h>
#include "resource.h"
SHORT maxx;
SHORT maxy;
/*
* global command line insert/overwrite flag
*/
static BOOL bInsert = TRUE;
static VOID
ClearCommandLine (LPTSTR str, INT maxlen, SHORT orgx, SHORT orgy)
{
INT count;
SetCursorXY (orgx, orgy);
for (count = 0; count < (INT)_tcslen (str); count++)
ConOutChar (_T(' '));
_tcsnset (str, _T('\0'), maxlen);
SetCursorXY (orgx, orgy);
}
/* read in a command line */
VOID ReadCommand (LPTSTR str, INT maxlen)
{
SHORT orgx; /* origin x/y */
SHORT orgy;
SHORT curx; /*current x/y cursor position*/
SHORT cury;
SHORT tempscreen;
INT count; /*used in some for loops*/
INT current = 0; /*the position of the cursor in the string (str)*/
INT charcount = 0;/*chars in the string (str)*/
INPUT_RECORD ir;
WORD wLastKey = 0;
TCHAR ch;
BOOL bContinue=FALSE;/*is TRUE the second case will not be executed*/
BOOL bReturn = FALSE;
TCHAR szPath[MAX_PATH];
BOOL bCharInput;
/* get screen size */
GetScreenSize (&maxx, &maxy);
/* JPP 19980807 - if echo off, don't print prompt */
if (bEcho)
PrintPrompt();
GetCursorXY (&orgx, &orgy);
GetCursorXY (&curx, &cury);
memset (str, 0, maxlen * sizeof (TCHAR));
SetCursorType (bInsert, TRUE);
do
{
bReturn = FALSE;
ConInKey (&ir);
if (ir.Event.KeyEvent.dwControlKeyState &
(RIGHT_ALT_PRESSED|RIGHT_ALT_PRESSED|
RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED) )
{
switch (ir.Event.KeyEvent.wVirtualKeyCode)
{
#ifdef FEATURE_HISTORY
case 'K':
/*add the current command line to the history*/
if (ir.Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED))
{
if (str[0])
History(0,str);
ClearCommandLine (str, maxlen, orgx, orgy);
current = charcount = 0;
curx = orgx;
cury = orgy;
bContinue=TRUE;
break;
}
case 'D':
/*delete current history entry*/
if (ir.Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED))
{
ClearCommandLine (str, maxlen, orgx, orgy);
History_del_current_entry(str);
current = charcount = _tcslen (str);
ConOutPrintf (_T("%s"), str);
GetCursorXY (&curx, &cury);
bContinue=TRUE;
break;
}
#endif/*FEATURE_HISTORY*/
}
}
//if (bContinue)
// continue;
bCharInput = FALSE;
switch (ir.Event.KeyEvent.wVirtualKeyCode)
{
case VK_BACK:
/* <BACKSPACE> - delete character to left of cursor */
if (current > 0 && charcount > 0)
{
if (current == charcount)
{
/* if at end of line */
str[current - 1] = _T('\0');
if (GetCursorX () != 0)
{
ConOutPrintf (_T("\b \b"));
curx--;
}
else
{
SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
ConOutChar (_T(' '));
SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
cury--;
curx = maxx - 1;
}
}
else
{
for (count = current - 1; count < charcount; count++)
str[count] = str[count + 1];
if (GetCursorX () != 0)
{
SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ());
curx--;
}
else
{
SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
cury--;
curx = maxx - 1;
}
GetCursorXY (&curx, &cury);
ConOutPrintf (_T("%s "), &str[current - 1]);
SetCursorXY (curx, cury);
}
charcount--;
current--;
}
break;
case VK_INSERT:
/* toggle insert/overstrike mode */
bInsert ^= TRUE;
SetCursorType (bInsert, TRUE);
break;
case VK_DELETE:
/* delete character under cursor */
if (current != charcount && charcount > 0)
{
for (count = current; count < charcount; count++)
str[count] = str[count + 1];
charcount--;
GetCursorXY (&curx, &cury);
ConOutPrintf (_T("%s "), &str[current]);
SetCursorXY (curx, cury);
}
break;
case VK_HOME:
/* goto beginning of string */
if (current != 0)
{
SetCursorXY (orgx, orgy);
curx = orgx;
cury = orgy;
current = 0;
}
break;
case VK_END:
/* goto end of string */
if (current != charcount)
{
SetCursorXY (orgx, orgy);
ConOutPrintf (_T("%s"), str);
GetCursorXY (&curx, &cury);
current = charcount;
}
break;
case VK_TAB:
#ifdef FEATURE_UNIX_FILENAME_COMPLETION
/* expand current file name */
if ((current == charcount) ||
(current == charcount - 1 &&
str[current] == _T('"'))) /* only works at end of line*/
{
if (wLastKey != VK_TAB)
{
/* if first TAB, complete filename*/
tempscreen = charcount;
CompleteFilename (str, charcount);
charcount = _tcslen (str);
current = charcount;
SetCursorXY (orgx, orgy);
ConOutPrintf (_T("%s"), str);
if (tempscreen > charcount)
{
GetCursorXY (&curx, &cury);
for (count = tempscreen - charcount; count--; )
ConOutChar (_T(' '));
SetCursorXY (curx, cury);
}
else
{
if (((charcount + orgx) / maxx) + orgy > maxy - 1)
orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
}
/* set cursor position */
SetCursorXY ((orgx + current) % maxx,
orgy + (orgx + current) / maxx);
GetCursorXY (&curx, &cury);
}
else
{
/*if second TAB, list matches*/
if (ShowCompletionMatches (str, charcount))
{
PrintPrompt ();
GetCursorXY (&orgx, &orgy);
ConOutPrintf (_T("%s"), str);
/* set cursor position */
SetCursorXY ((orgx + current) % maxx,
orgy + (orgx + current) / maxx);
GetCursorXY (&curx, &cury);
}
}
}
else
{
MessageBeep (-1);
}
#endif
#ifdef FEATURE_4NT_FILENAME_COMPLETION
/* used to later see if we went down to the next line */
tempscreen = charcount;
szPath[0]=_T('\0');
/* str is the whole things that is on the current line
that is and and out. arg 2 is weather it goes back
one file or forward one file */
CompleteFilename(str, !(ir.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED), szPath, current);
/* Attempt to clear the line */
ClearCommandLine (str, maxlen, orgx, orgy);
curx = orgx;
cury = orgy;
current = charcount = 0;
//str[0]=_T('\0');
/* Everything is deleted, lets add it back in */
_tcscpy(str,szPath);
/* Figure out where cusor is going to be after we print it */
charcount = _tcslen (str);
current = charcount;
SetCursorXY (orgx, orgy);
/* Print out what we have now */
ConOutPrintf (_T("%s"), str);
/* Move cursor accordingly */
if(tempscreen > charcount)
{
GetCursorXY (&curx, &cury);
for(count = tempscreen - charcount; count--; )
ConOutChar (_T(' '));
SetCursorXY (curx, cury);
}
else
{
if(((charcount + orgx) / maxx) + orgy > maxy - 1)
orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
}
SetCursorXY((short)(((int)orgx + current) % maxx), (short)((int)orgy + ((int)orgx + current) / maxx));
GetCursorXY(&curx, &cury);
#endif
break;
case _T('M'):
case _T('C'):
/* ^M does the same as return */
bCharInput = TRUE;
if(!(ir.Event.KeyEvent.dwControlKeyState &
(RIGHT_CTRL_PRESSED|LEFT_CTRL_PRESSED)))
{
break;
}
case VK_RETURN:
/* end input, return to main */
#ifdef FEATURE_HISTORY
/* add to the history */
if (str[0])
History (0, str);
#endif
ConInDummy ();
ConOutChar (_T('\n'));
bReturn = TRUE;
break;
case VK_ESCAPE:
/* clear str Make this callable! */
ClearCommandLine (str, maxlen, orgx, orgy);
curx = orgx;
cury = orgy;
current = charcount = 0;
break;
#ifdef FEATURE_HISTORY
case VK_F3:
History_move_to_bottom();
#endif
case VK_UP:
#ifdef FEATURE_HISTORY
/* get previous command from buffer */
ClearCommandLine (str, maxlen, orgx, orgy);
History (-1, str);
current = charcount = _tcslen (str);
if (((charcount + orgx) / maxx) + orgy > maxy - 1)
orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
ConOutPrintf (_T("%s"), str);
GetCursorXY (&curx, &cury);
#endif
break;
case VK_DOWN:
#ifdef FEATURE_HISTORY
/* get next command from buffer */
ClearCommandLine (str, maxlen, orgx, orgy);
History (1, str);
current = charcount = _tcslen (str);
if (((charcount + orgx) / maxx) + orgy > maxy - 1)
orgy += maxy - ((charcount + orgx) / maxx + orgy + 1);
ConOutPrintf (_T("%s"), str);
GetCursorXY (&curx, &cury);
#endif
break;
case VK_LEFT:
/* move cursor left */
if (current > 0)
{
current--;
if (GetCursorX () == 0)
{
SetCursorXY ((SHORT)(maxx - 1), (SHORT)(GetCursorY () - 1));
curx = maxx - 1;
cury--;
}
else
{
SetCursorXY ((SHORT)(GetCursorX () - 1), GetCursorY ());
curx--;
}
}
else
{
MessageBeep (-1);
}
break;
case VK_RIGHT:
/* move cursor right */
if (current != charcount)
{
current++;
if (GetCursorX () == maxx - 1)
{
SetCursorXY (0, (SHORT)(GetCursorY () + 1));
curx = 0;
cury++;
}
else
{
SetCursorXY ((SHORT)(GetCursorX () + 1), GetCursorY ());
curx++;
}
}
break;
default:
/* This input is just a normal char */
bCharInput = TRUE;
}
#ifdef _UNICODE
ch = ir.Event.KeyEvent.uChar.UnicodeChar;
if ((ch >= 32 && (charcount != (maxlen - 2)) && bCharInput)
#else
ch = ir.Event.KeyEvent.uChar.AsciiChar;
if ((UCHAR)ch >= 32 && (charcount != (maxlen - 2)) && bCharInput)
#endif /* _UNICODE */
{
/* insert character into string... */
if (bInsert && current != charcount)
{
/* If this character insertion will cause screen scrolling,
* adjust the saved origin of the command prompt. */
tempscreen = _tcslen(str + current) + curx;
if ((tempscreen % maxx) == (maxx - 1) &&
(tempscreen / maxx) + cury == (maxy - 1))
{
orgy--;
cury--;
}
for (count = charcount; count > current; count--)
str[count] = str[count - 1];
str[current++] = ch;
if (curx == maxx - 1)
curx = 0, cury++;
else
curx++;
ConOutPrintf (_T("%s"), &str[current - 1]);
SetCursorXY (curx, cury);
charcount++;
}
else
{
if (current == charcount)
charcount++;
str[current++] = ch;
if (GetCursorX () == maxx - 1 && GetCursorY () == maxy - 1)
orgy--, cury--;
if (GetCursorX () == maxx - 1)
curx = 0, cury++;
else
curx++;
ConOutChar (ch);
}
}
wLastKey = ir.Event.KeyEvent.wVirtualKeyCode;
}
while (!bReturn);
SetCursorType (bInsert, TRUE);
}

View file

@ -0,0 +1,269 @@
/*
* CMDTABLE.C - table of internal commands.
*
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* started.
* New file to keep the internal command table. I plan on
* getting rid of the table real soon now and replacing it
* with a dynamic mechnism.
*
* 27 Jul 1998 John P. Price
* added config.h include
*
* 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*/
#include <precomp.h>
#include "resource.h"
/* a list of all the internal commands, associating their command names */
/* to the functions to process them */
COMMAND cmds[] =
{
{_T("?"), 0, CommandShowCommands},
#ifdef INCLUDE_CMD_ACTIVATE
{_T("activate"), 0, CommandActivate},
#endif
#ifdef FEATURE_ALIASES
{_T("alias"), 0, CommandAlias},
#endif
#ifdef INCLUDE_CMD_ATTRIB
{_T("attrib"), 0, CommandAttrib},
#endif
#ifdef INCLUDE_CMD_BEEP
{_T("beep"), 0, cmd_beep},
#endif
{_T("call"), CMD_BATCHONLY, cmd_call},
#ifdef INCLUDE_CMD_CHDIR
{_T("cd"), CMD_SPECIAL, cmd_chdir},
{_T("chdir"), CMD_SPECIAL, cmd_chdir},
#endif
#ifdef INCLUDE_CMD_CHCP
{_T("chcp"), 0, CommandChcp},
#endif
#ifdef INCLUDE_CMD_CHOICE
{_T("choice"), 0, CommandChoice},
#endif
#ifdef INCLUDE_CMD_CLS
{_T("cls"), 0, cmd_cls},
#endif
#ifdef INCLUDE_CMD_COLOR
{_T("color"), 0, CommandColor},
#endif
#ifdef INCLUDE_CMD_COPY
{_T("copy"), 0, cmd_copy},
#endif
#ifdef INCLUDE_CMD_DATE
{_T("date"), 0, cmd_date},
#endif
#ifdef INCLUDE_CMD_DEL
{_T("del"), 0, CommandDelete},
{_T("delete"), 0, CommandDelete},
#endif
#ifdef INCLUDE_CMD_DELAY
{_T("delay"), 0, CommandDelay},
#endif
#ifdef INCLUDE_CMD_DIR
{_T("dir"), CMD_SPECIAL, CommandDir},
#endif
#ifdef FEATURE_DIRECTORY_STACK
{_T("dirs"), 0, CommandDirs},
#endif
{_T("echo"), 0, CommandEcho},
{_T("echo."), CMD_HIDE, CommandEcho},
{_T("echos"), 0, CommandEchos},
{_T("echoerr"), 0, CommandEchoerr},
{_T("echoerr."), CMD_HIDE, CommandEchoerr},
{_T("echoserr"), 0, CommandEchoserr},
#ifdef INCLUDE_CMD_DEL
{_T("erase"), 0, CommandDelete},
#endif
{_T("exit"), 0, CommandExit},
{_T("for"), 0, cmd_for},
#ifdef INCLUDE_CMD_FREE
{_T("free"), 0, CommandFree},
#endif
{_T("goto"), CMD_BATCHONLY, cmd_goto},
{_T("help"), 0, CommandShowCommandsDetail},
#ifdef FEATURE_HISTORY
{_T("history"), 0, CommandHistory},
#endif
{_T("if"), 0, cmd_if},
#ifdef INCLUDE_CMD_LABEL
{_T("label"), 0, cmd_label},
#endif
#ifdef INCLUDE_CMD_MEMORY
{_T("memory"), 0, CommandMemory},
#endif
#ifdef INCLUDE_CMD_MKDIR
{_T("md"), CMD_SPECIAL, cmd_mkdir},
{_T("mkdir"), CMD_SPECIAL, cmd_mkdir},
#endif
#ifdef INCLUDE_CMD_MOVE
{_T("move"), 0, cmd_move},
#endif
#ifdef INCLUDE_CMD_MSGBOX
{_T("msgbox"), 0, CommandMsgbox},
#endif
#ifdef INCLUDE_CMD_PATH
{_T("path"), 0, cmd_path},
#endif
#ifdef INCLUDE_CMD_PAUSE
{_T("pause"), 0, cmd_pause},
#endif
#ifdef FEATURE_DIRECTORY_STACK
{_T("popd"), 0, CommandPopd},
#endif
#ifdef INCLUDE_CMD_PROMPT
{_T("prompt"), 0, cmd_prompt},
#endif
#ifdef FEATURE_DIRECTORY_STACK
{_T("pushd"), 0, CommandPushd},
#endif
#ifdef INCLUDE_CMD_RMDIR
{_T("rd"), CMD_SPECIAL, cmd_rmdir},
#endif
#ifdef INCLUDE_CMD_REM
{_T("rem"), 0, CommandRem},
#endif
#ifdef INCLUDE_CMD_RENAME
{_T("ren"), 0, cmd_rename},
{_T("rename"), 0, cmd_rename},
#endif
#ifdef INCLUDE_CMD_RMDIR
{_T("rmdir"), CMD_SPECIAL, cmd_rmdir},
#endif
#ifdef INCLUDE_CMD_SCREEN
{_T("screen"), 0, CommandScreen},
#endif
#ifdef INCLUDE_CMD_SET
{_T("set"), 0, cmd_set},
#endif
{_T("shift"), CMD_BATCHONLY, cmd_shift},
#ifdef INCLUDE_CMD_START
{_T("start"), 0, cmd_start},
#endif
#ifdef INCLUDE_CMD_TIME
{_T("time"), 0, cmd_time},
#endif
#ifdef INCLUDE_CMD_TIMER
{_T("timer"), 0, CommandTimer},
#endif
#ifdef INCLUDE_CMD_TITLE
{_T("title"), 0, cmd_title},
#endif
#ifdef INCLUDE_CMD_TYPE
{_T("type"), 0, cmd_type},
#endif
#ifdef INCLUDE_CMD_VER
{_T("ver"), 0, cmd_ver},
#endif
#ifdef INCLUDE_CMD_VERIFY
{_T("verify"), 0, cmd_verify},
#endif
#ifdef INCLUDE_CMD_VOL
{_T("vol"), 0, cmd_vol},
#endif
#ifdef INCLUDE_CMD_WINDOW
{_T("window"), 0, CommandWindow},
#endif
{NULL, 0, NULL}
};
VOID PrintCommandList (VOID)
{
LPCOMMAND cmdptr;
INT y;
y = 0;
cmdptr = cmds;
while (cmdptr->name)
{
if (!(cmdptr->flags & CMD_HIDE))
{
if (++y == 8)
{
ConOutPuts (cmdptr->name);
y = 0;
}
else
{
ConOutPrintf (_T("%-10s"), cmdptr->name);
}
}
cmdptr++;
}
if (y != 0)
ConOutChar ('\n');
}
VOID PrintCommandListDetail (VOID)
{
ConOutResPaging(TRUE,STRING_HELP1);
ConOutResPaging(FALSE,STRING_HELP2);
}
/* EOF */

View file

@ -0,0 +1,2 @@
#define CMD_VER "0.1.2"
#define CMD_VER_RC CMD_VER"\0"

View file

@ -0,0 +1,137 @@
/*
* COLOR.C - color internal command.
*
*
* History:
*
* 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Started.
*
* 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection ready!
*
* 14-Oct-1999 (Paolo Pantaleo <paolopan@freemail.it>)
* 4nt's syntax implemented.
*
* 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Move all hardcoded strings to En.rc.
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_COLOR
VOID SetScreenColor (WORD wColor, BOOL bNoFill)
{
DWORD dwWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;
COORD coPos;
if ((wColor & 0xF) == (wColor &0xF0) >> 4)
{
ConErrResPuts(STRING_COLOR_ERROR1);
}
else
{
if (bNoFill != TRUE)
{
GetConsoleScreenBufferInfo (hConsole, &csbi);
coPos.X = 0;
coPos.Y = 0;
FillConsoleOutputAttribute (hConsole,
(WORD)(wColor & 0x00FF),
(csbi.dwSize.X)*(csbi.dwSize.Y),
coPos,
&dwWritten);
}
SetConsoleTextAttribute (hConsole, (WORD)(wColor & 0x00FF));
}
}
/*
* color
*
* internal dir command
*/
INT CommandColor (LPTSTR first, LPTSTR rest)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
if (_tcsncmp (rest, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_COLOR_HELP1);
return 0;
}
nErrorLevel = 0;
if (rest[0] == _T('\0'))
{
/* set default color */
wColor = wDefColor;
SetScreenColor (wColor, FALSE);
return 0;
}
if ( _tcslen(&rest[0])==1)
{
if ( (_tcscmp(&rest[0], _T("0")) >=0 ) && (_tcscmp(&rest[0], _T("9")) <=0 ) )
{
SetConsoleTextAttribute (hConsole, (WORD)_ttoi(rest));
return 0;
}
else if ( (_tcscmp(&rest[0], _T("a")) >=0 ) && (_tcscmp(&rest[0], _T("f")) <=0 ) )
{
SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('a')) );
return 0;
}
else if ( (_tcscmp(&rest[0], _T("A")) >=0 ) && (_tcscmp(&rest[0], _T("F")) <=0 ) )
{
SetConsoleTextAttribute (hConsole, (WORD) (rest[0] + 10 - _T('A')) );
return 0;
}
ConErrResPuts(STRING_COLOR_ERROR2);
nErrorLevel = 1;
return 1;
}
if (StringToColor(&wColor, &rest) == FALSE)
{
ConErrResPuts(STRING_COLOR_ERROR2);
nErrorLevel = 1;
return 1;
}
LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR3, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, wColor);
if ((wColor & 0xF) == (wColor &0xF0) >> 4)
{
LoadString(CMD_ModuleHandle, STRING_COLOR_ERROR4, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, wColor);
nErrorLevel = 1;
return 1;
}
/* set color */
SetScreenColor(wColor,
(_tcsstr (rest,_T("/-F")) || _tcsstr (rest,_T("/-f"))));
return 0;
}
#endif /* INCLUDE_CMD_COLOR */
/* EOF */

View file

@ -0,0 +1,99 @@
/*
* CONFIG.H - Used to configure what will be compiled into the shell.
*
*
* History:
*
* 27 Jul 1998 - John P. Price
* started.
*
*/
/* Define only if used under ReactOS */
#define __REACTOS__
#ifndef _CONFIG_H_INCLUDED_
#define _CONFIG_H_INCLUDED_
/* Define to enable debugging code */
//#define _DEBUG
#define WIN32_LEAN_AND_MEAN
//#define NT4_INTERNAL_COMMANDS
/* Define to enable the alias command, and aliases.*/
#define FEATURE_ALIASES
/* Define to enable history */
#define FEATURE_HISTORY
/*Define to enable history wrap (4nt's style)*/
#define WRAP_HISTORY
/* Define one of these to enable filename completion */
//#define FEATURE_UNIX_FILENAME_COMPLETION
#define FEATURE_4NT_FILENAME_COMPLETION
/* Define to enable the directory stack */
#define FEATURE_DIRECTORY_STACK
/* Define to activate redirections and piping */
#define FEATURE_REDIRECTION
/* Define one of these to select the used locale. */
/* (date and time formats etc.) used in DATE, TIME, */
/* DIR, PROMPT etc. */
#define LOCALE_WINDOWS /* System locale */
/* #define LOCALE_GERMAN */ /* German locale */
/* #define LOCALE_DEFAULT */ /* United States locale */
#ifdef NT4_INTERNAL_COMMANDS
#define INCLUDE_CMD_ACTIVATE
#endif
#define INCLUDE_CMD_ATTRIB
#define INCLUDE_CMD_CHCP
#define INCLUDE_CMD_CHDIR
#define INCLUDE_CMD_CHOICE
#define INCLUDE_CMD_CLS
#define INCLUDE_CMD_COLOR
#define INCLUDE_CMD_COPY
#define INCLUDE_CMD_DATE
#define INCLUDE_CMD_DEL
#define INCLUDE_CMD_DELAY
#define INCLUDE_CMD_DIR
#define INCLUDE_CMD_FREE
#define INCLUDE_CMD_LABEL
#define INCLUDE_CMD_MEMORY
#define INCLUDE_CMD_MKDIR
#define INCLUDE_CMD_MOVE
#ifdef NT4_INTERNAL_COMMANDS
#define INCLUDE_CMD_MSGBOX
#endif
#define INCLUDE_CMD_PATH
#define INCLUDE_CMD_PROMPT
#define INCLUDE_CMD_RMDIR
#define INCLUDE_CMD_RENAME
#define INCLUDE_CMD_SCREEN
#define INCLUDE_CMD_SET
#define INCLUDE_CMD_START
#define INCLUDE_CMD_TIME
#define INCLUDE_CMD_TIMER
#define INCLUDE_CMD_TITLE
#define INCLUDE_CMD_TYPE
#define INCLUDE_CMD_VER
#define INCLUDE_CMD_REM
#define INCLUDE_CMD_PAUSE
#define INCLUDE_CMD_BEEP
#define INCLUDE_CMD_VERIFY
#define INCLUDE_CMD_VOL
#ifdef NT4_INTERNAL_COMMANDS
#define INCLUDE_CMD_WINDOW
#endif
#endif /* _CONFIG_H_INCLUDED_ */

View file

@ -0,0 +1,527 @@
/*
* CONSOLE.C - console input/output functions.
*
*
* History:
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* started
*
* 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*
* 01-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
* Added ConPrintfPaging and ConOutPrintfPaging
*/
#include <precomp.h>
#include "resource.h"
#define OUTPUT_BUFFER_SIZE 4096
UINT InputCodePage;
UINT OutputCodePage;
VOID ConInDisable (VOID)
{
HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
DWORD dwMode;
GetConsoleMode (hInput, &dwMode);
dwMode &= ~ENABLE_PROCESSED_INPUT;
SetConsoleMode (hInput, dwMode);
}
VOID ConInEnable (VOID)
{
HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
DWORD dwMode;
GetConsoleMode (hInput, &dwMode);
dwMode |= ENABLE_PROCESSED_INPUT;
SetConsoleMode (hInput, dwMode);
}
VOID ConInDummy (VOID)
{
HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
INPUT_RECORD dummy;
DWORD dwRead;
#ifdef _DEBUG
if (hInput == INVALID_HANDLE_VALUE)
DebugPrintf (_T("Invalid input handle!!!\n"));
#endif /* _DEBUG */
ReadConsoleInput (hInput, &dummy, 1, &dwRead);
}
VOID ConInFlush (VOID)
{
FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE));
}
VOID ConInKey (PINPUT_RECORD lpBuffer)
{
HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
DWORD dwRead;
#ifdef _DEBUG
if (hInput == INVALID_HANDLE_VALUE)
DebugPrintf (_T("Invalid input handle!!!\n"));
#endif /* _DEBUG */
do
{
ReadConsoleInput (hInput, lpBuffer, 1, &dwRead);
if ((lpBuffer->EventType == KEY_EVENT) &&
(lpBuffer->Event.KeyEvent.bKeyDown == TRUE))
break;
}
while (TRUE);
}
VOID ConInString (LPTSTR lpInput, DWORD dwLength)
{
DWORD dwOldMode;
DWORD dwRead;
HANDLE hFile;
LPTSTR p;
DWORD i;
PCHAR pBuf;
#ifdef _UNICODE
pBuf = (PCHAR)malloc(dwLength);
#else
pBuf = lpInput;
#endif
ZeroMemory (lpInput, dwLength * sizeof(TCHAR));
hFile = GetStdHandle (STD_INPUT_HANDLE);
GetConsoleMode (hFile, &dwOldMode);
SetConsoleMode (hFile, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
ReadFile (hFile, (PVOID)pBuf, dwLength, &dwRead, NULL);
#ifdef _UNICODE
MultiByteToWideChar( InputCodePage, 0, pBuf, dwLength + 1, lpInput, dwLength + 1);
#endif
p = lpInput;
for (i = 0; i < dwRead; i++, p++)
{
if (*p == _T('\x0d'))
{
*p = _T('\0');
break;
}
}
#ifdef _UNICODE
free(pBuf);
#endif
SetConsoleMode (hFile, dwOldMode);
}
static VOID ConChar(TCHAR c, DWORD nStdHandle)
{
DWORD dwWritten;
CHAR cc;
#ifdef _UNICODE
CHAR as[2];
WCHAR ws[2];
ws[0] = c;
ws[1] = 0;
WideCharToMultiByte( OutputCodePage, 0, ws, 2, as, 2, NULL, NULL);
cc = as[0];
#else
cc = c;
#endif
WriteFile (GetStdHandle (nStdHandle),
&cc,
1,
&dwWritten,
NULL);
}
VOID ConOutChar (TCHAR c)
{
ConChar(c, STD_OUTPUT_HANDLE);
}
VOID ConPuts(LPTSTR szText, DWORD nStdHandle)
{
DWORD dwWritten;
PCHAR pBuf;
INT len;
len = _tcslen(szText);
#ifdef _UNICODE
pBuf = malloc(len + 1);
len = WideCharToMultiByte( OutputCodePage, 0, szText, len + 1, pBuf, len + 1, NULL, NULL) - 1;
#else
pBuf = szText;
#endif
WriteFile (GetStdHandle (nStdHandle),
pBuf,
len,
&dwWritten,
NULL);
WriteFile (GetStdHandle (nStdHandle),
_T("\n"),
1,
&dwWritten,
NULL);
#ifdef UNICODE
free(pBuf);
#endif
}
VOID ConOutResPaging(BOOL NewPage, UINT resID)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintfPaging(NewPage, szMsg);
}
VOID ConOutResPuts (UINT resID)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE);
ConPuts(szMsg, STD_OUTPUT_HANDLE);
}
VOID ConOutPuts (LPTSTR szText)
{
ConPuts(szText, STD_OUTPUT_HANDLE);
}
VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
{
INT len;
PCHAR pBuf;
TCHAR szOut[OUTPUT_BUFFER_SIZE];
DWORD dwWritten;
len = _vstprintf (szOut, szFormat, arg_ptr);
#ifdef _UNICODE
pBuf = malloc(len + 1);
len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1;
#else
pBuf = szOut;
#endif
WriteFile (GetStdHandle (nStdHandle),
pBuf,
len,
&dwWritten,
NULL);
#ifdef UNICODE
free(pBuf);
#endif
}
INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
{
INT len;
PCHAR pBuf;
CONSOLE_SCREEN_BUFFER_INFO csbi;
TCHAR szOut[OUTPUT_BUFFER_SIZE];
DWORD dwWritten;
/* used to count number of lines since last pause */
static int LineCount = 0;
/* used to see how big the screen is */
int ScreenLines = 0;
/* the number of chars in a roow */
int ScreenCol = 0;
/* chars since end of line */
int CharEL = 0;
int i = 0;
if(NewPage == TRUE)
LineCount = 0;
/* rest LineCount and return if no string have been given */
if (szFormat == NULL)
return 0;
//get the size of the visual screen that can be printed too
if (!GetConsoleScreenBufferInfo(hConsole, &csbi))
{
// we assuming its a file handle
ConPrintf(szFormat, arg_ptr, nStdHandle);
return 0;
}
//subtract 2 to account for "press any key..." and for the blank line at the end of PagePrompt()
ScreenLines = (csbi.srWindow.Bottom - csbi.srWindow.Top) - 4;
ScreenCol = (csbi.srWindow.Right - csbi.srWindow.Left) + 1;
//make sure they didnt make the screen to small
if(ScreenLines<4)
{
ConPrintf(szFormat, arg_ptr, nStdHandle);
return 0;
}
len = _vstprintf (szOut, szFormat, arg_ptr);
#ifdef _UNICODE
pBuf = malloc(len + 1);
len = WideCharToMultiByte( OutputCodePage, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1;
#else
pBuf = szOut;
#endif
for(i = 0; i < len; i++)
{
if(pBuf[i] == _T('\n'))
{
LineCount++;
CharEL=0;
}
else
{
CharEL++;
if (CharEL>=ScreenCol)
{
if (i+1<len)
{
if(pBuf[i+1] != _T('\n')) LineCount++;
}
CharEL=0;
}
}
/* FIXME : write more that one char at time */
WriteFile (GetStdHandle (nStdHandle),&pBuf[i],sizeof(CHAR),&dwWritten,NULL);
if(LineCount >= ScreenLines)
{
if(_tcsnicmp(&pBuf[i], _T("\n"), 2)!=0)
WriteFile (GetStdHandle (nStdHandle),_T("\n"),sizeof(CHAR),&dwWritten,NULL);
if(PagePrompt() != PROMPT_YES)
{
return 1;
}
//reset the number of lines being printed
LineCount = 0;
CharEL=0;
}
}
#ifdef UNICODE
free(pBuf);
#endif
return 0;
}
VOID ConErrFormatMessage (DWORD MessageId, ...)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
DWORD ret;
LPTSTR text;
va_list arg_ptr;
va_start (arg_ptr, MessageId);
ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
MessageId,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &text,
0,
&arg_ptr);
va_end (arg_ptr);
if(ret > 0)
{
ConErrPuts (text);
LocalFree(text);
}
else
{
LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg);
}
}
VOID ConOutFormatMessage (DWORD MessageId, ...)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
DWORD ret;
LPTSTR text;
va_list arg_ptr;
va_start (arg_ptr, MessageId);
ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
MessageId,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &text,
0,
&arg_ptr);
va_end (arg_ptr);
if(ret > 0)
{
ConErrPuts (text);
LocalFree(text);
}
else
{
LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg);
}
}
VOID ConOutPrintf (LPTSTR szFormat, ...)
{
va_list arg_ptr;
va_start (arg_ptr, szFormat);
ConPrintf(szFormat, arg_ptr, STD_OUTPUT_HANDLE);
va_end (arg_ptr);
}
INT ConOutPrintfPaging (BOOL NewPage, LPTSTR szFormat, ...)
{
INT iReturn;
va_list arg_ptr;
va_start (arg_ptr, szFormat);
iReturn = ConPrintfPaging(NewPage, szFormat, arg_ptr, STD_OUTPUT_HANDLE);
va_end (arg_ptr);
return iReturn;
}
VOID ConErrChar (TCHAR c)
{
ConChar(c, STD_ERROR_HANDLE);
}
VOID ConErrResPuts (UINT resID)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, resID, szMsg, RC_STRING_MAX_SIZE);
ConPuts(szMsg, STD_ERROR_HANDLE);
}
VOID ConErrPuts (LPTSTR szText)
{
ConPuts(szText, STD_ERROR_HANDLE);
}
VOID ConErrPrintf (LPTSTR szFormat, ...)
{
va_list arg_ptr;
va_start (arg_ptr, szFormat);
ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE);
va_end (arg_ptr);
}
#ifdef _DEBUG
VOID DebugPrintf (LPTSTR szFormat, ...)
{
va_list arg_ptr;
va_start (arg_ptr, szFormat);
ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE);
va_end (arg_ptr);
#if 0
TCHAR szOut[OUTPUT_BUFFER_SIZE];
va_start (arg_ptr, szFormat);
_vstprintf (szOut, szFormat, arg_ptr);
OutputDebugString (szOut);
va_end (arg_ptr);
#endif
}
#endif /* _DEBUG */
VOID SetCursorXY (SHORT x, SHORT y)
{
COORD coPos;
coPos.X = x;
coPos.Y = y;
SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), coPos);
}
VOID GetCursorXY (PSHORT x, PSHORT y)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo (hConsole, &csbi);
*x = csbi.dwCursorPosition.X;
*y = csbi.dwCursorPosition.Y;
}
SHORT GetCursorX (VOID)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo (hConsole, &csbi);
return csbi.dwCursorPosition.X;
}
SHORT GetCursorY (VOID)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo (hConsole, &csbi);
return csbi.dwCursorPosition.Y;
}
VOID GetScreenSize (PSHORT maxx, PSHORT maxy)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo (hConsole, &csbi);
if (maxx)
*maxx = csbi.dwSize.X;
if (maxy)
*maxy = csbi.dwSize.Y;
}
VOID SetCursorType (BOOL bInsert, BOOL bVisible)
{
CONSOLE_CURSOR_INFO cci;
cci.dwSize = bInsert ? 10 : 99;
cci.bVisible = bVisible;
SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cci);
}
/* EOF */

View file

@ -0,0 +1,888 @@
/*
* COPY.C -- copy internal command.
*
*
* History:
*
* 01-Aug-98 (Rob Lake z63rrl@morgan.ucs.mun.ca)
* started
*
* 13-Aug-1998 (John P. Price)
* fixed memory leak problem in copy function.
* fixed copy function so it would work with wildcards in the source
*
* 13-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added COPY command to CMD.
*
* 26-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Replaced CRT io functions by Win32 io functions.
*
* 27-Oct-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Disabled prompting when used in batch mode.
*
* 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*
* 13-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
* Rewrite to clean up copy and support wildcard.
*
* 20-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
* Add touch syntax. "copy arp.exe+,,"
* Copy command is now completed.
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_COPY
enum
{
COPY_ASCII = 0x001, /* /A */
COPY_DECRYPT = 0x004, /* /D */
COPY_VERIFY = 0x008, /* /V : Dummy, Never will be Impleneted */
COPY_SHORTNAME = 0x010, /* /N : Dummy, Never will be Impleneted */
COPY_NO_PROMPT = 0x020, /* /Y */
COPY_PROMPT = 0x040, /* /-Y */
COPY_RESTART = 0x080, /* /Z */
COPY_BINARY = 0x100, /* /B */
};
#define BUFF_SIZE 16384 /* 16k = max buffer size */
INT
copy (TCHAR source[MAX_PATH],
TCHAR dest[MAX_PATH],
INT append,
DWORD lpdwFlags,
BOOL bTouch)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
FILETIME srctime,NewFileTime;
HANDLE hFileSrc;
HANDLE hFileDest;
LPBYTE buffer;
DWORD dwAttrib;
DWORD dwRead;
DWORD dwWritten;
DWORD i;
BOOL bEof = FALSE;
TCHAR TrueDest[MAX_PATH];
TCHAR TempSrc[MAX_PATH];
TCHAR * FileName;
SYSTEMTIME CurrentTime;
/* Check Breaker */
if(CheckCtrlBreak(BREAK_INPUT))
return 0;
#ifdef _DEBUG
DebugPrintf (_T("checking mode\n"));
#endif
if(bTouch)
{
hFileSrc = CreateFile (source, GENERIC_WRITE, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
if (hFileSrc == INVALID_HANDLE_VALUE)
{
LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, source);
nErrorLevel = 1;
return 0;
}
GetSystemTime(&CurrentTime);
SystemTimeToFileTime(&CurrentTime, &NewFileTime);
if(SetFileTime(hFileSrc,(LPFILETIME) NULL, (LPFILETIME) NULL, &NewFileTime))
{
CloseHandle(hFileSrc);
nErrorLevel = 1;
return 1;
}
else
{
CloseHandle(hFileSrc);
return 0;
}
}
dwAttrib = GetFileAttributes (source);
hFileSrc = CreateFile (source, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, 0, NULL);
if (hFileSrc == INVALID_HANDLE_VALUE)
{
LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, source);
nErrorLevel = 1;
return 0;
}
#ifdef _DEBUG
DebugPrintf (_T("getting time\n"));
#endif
GetFileTime (hFileSrc, &srctime, NULL, NULL);
#ifdef _DEBUG
DebugPrintf (_T("copy: flags has %s\n"),
lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY");
#endif
/* Check to see if /D or /Z are true, if so we need a middle
man to copy the file too to allow us to use CopyFileEx later */
if(lpdwFlags & COPY_DECRYPT)
{
GetEnvironmentVariable(_T("TEMP"),TempSrc,MAX_PATH);
_tcscat(TempSrc,_T("\\"));
FileName = _tcsrchr(source,_T('\\'));
FileName++;
_tcscat(TempSrc,FileName);
/* This is needed to be on the end to prevent an error
if the user did "copy /D /Z foo bar then it would be copied
too %TEMP%\foo here and when %TEMP%\foo when it sets it up
for COPY_RESTART, this would mean it is copying to itself
which would error when it tried to open the handles for ReadFile
and WriteFile */
_tcscat(TempSrc,_T(".decrypt"));
if(!CopyFileEx(source, TempSrc, NULL, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION))
{
nErrorLevel = 1;
return 0;
}
_tcscpy(source, TempSrc);
}
if(lpdwFlags & COPY_RESTART)
{
_tcscpy(TrueDest, dest);
GetEnvironmentVariable(_T("TEMP"),dest,MAX_PATH);
_tcscat(dest,_T("\\"));
FileName = _tcsrchr(TrueDest,_T('\\'));
FileName++;
_tcscat(dest,FileName);
}
if (!IsExistingFile (dest))
{
#ifdef _DEBUG
DebugPrintf (_T("opening/creating\n"));
#endif
hFileDest =
CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
}
else if (!append)
{
if (!_tcscmp (dest, source))
{
LoadString(CMD_ModuleHandle, STRING_COPY_ERROR2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, source);
CloseHandle (hFileSrc);
nErrorLevel = 1;
return 0;
}
#ifdef _DEBUG
DebugPrintf (_T("SetFileAttributes (%s, FILE_ATTRIBUTE_NORMAL);\n"), dest);
#endif
SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL);
#ifdef _DEBUG
DebugPrintf (_T("DeleteFile (%s);\n"), dest);
#endif
DeleteFile (dest);
hFileDest = CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
}
else
{
LONG lFilePosHigh = 0;
if (!_tcscmp (dest, source))
{
CloseHandle (hFileSrc);
return 0;
}
#ifdef _DEBUG
DebugPrintf (_T("opening/appending\n"));
#endif
SetFileAttributes (dest, FILE_ATTRIBUTE_NORMAL);
hFileDest =
CreateFile (dest, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
/* Move to end of file to start writing */
SetFilePointer (hFileDest, 0, &lFilePosHigh,FILE_END);
}
if (hFileDest == INVALID_HANDLE_VALUE)
{
CloseHandle (hFileSrc);
ConOutResPuts(STRING_ERROR_PATH_NOT_FOUND);
nErrorLevel = 1;
return 0;
}
buffer = (LPBYTE)malloc (BUFF_SIZE);
if (buffer == NULL)
{
CloseHandle (hFileDest);
CloseHandle (hFileSrc);
ConOutResPuts(STRING_ERROR_OUT_OF_MEMORY);
nErrorLevel = 1;
return 0;
}
do
{
ReadFile (hFileSrc, buffer, BUFF_SIZE, &dwRead, NULL);
if (lpdwFlags & COPY_ASCII)
{
for (i = 0; i < dwRead; i++)
{
/* we're dealing with ASCII files! */
if (((LPSTR)buffer)[i] == 0x1A)
{
bEof = TRUE;
break;
}
}
dwRead = i;
}
if (dwRead == 0)
break;
WriteFile (hFileDest, buffer, dwRead, &dwWritten, NULL);
if (dwWritten != dwRead || CheckCtrlBreak(BREAK_INPUT))
{
ConOutResPuts(STRING_COPY_ERROR3);
free (buffer);
CloseHandle (hFileDest);
CloseHandle (hFileSrc);
nErrorLevel = 1;
return 0;
}
}
while (dwRead && !bEof);
#ifdef _DEBUG
DebugPrintf (_T("setting time\n"));
#endif
SetFileTime (hFileDest, &srctime, NULL, NULL);
if (lpdwFlags & COPY_ASCII)
{
/* we're dealing with ASCII files! */
((LPSTR)buffer)[0] = 0x1A;
((LPSTR)buffer)[1] = '\0';
#ifdef _DEBUG
DebugPrintf (_T("appending ^Z\n"));
#endif
WriteFile (hFileDest, buffer, sizeof(CHAR), &dwWritten, NULL);
}
free (buffer);
CloseHandle (hFileDest);
CloseHandle (hFileSrc);
#ifdef _DEBUG
DebugPrintf (_T("setting mode\n"));
#endif
SetFileAttributes (dest, dwAttrib);
/* Now finish off the copy if needed with CopyFileEx */
if(lpdwFlags & COPY_RESTART)
{
if(!CopyFileEx(dest, TrueDest, NULL, NULL, FALSE, COPY_FILE_RESTARTABLE))
{
nErrorLevel = 1;
DeleteFile(dest);
return 0;
}
/* Take care of file in the temp folder */
DeleteFile(dest);
}
if(lpdwFlags & COPY_DECRYPT)
DeleteFile(TempSrc);
return 1;
}
static INT CopyOverwrite (LPTSTR fn)
{
/*ask the user if they want to override*/
TCHAR szMsg[RC_STRING_MAX_SIZE];
INT res;
LoadString(CMD_ModuleHandle, STRING_COPY_HELP1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg,fn);
res = FilePromptYNA (_T(""));
return res;
}
INT cmd_copy (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LPTSTR *arg;
INT argc, i, nFiles, nOverwrite = 0, nSrc = -1, nDes = -1;
/* this is the path up to the folder of the src and dest ie C:\windows\ */
TCHAR szDestPath[MAX_PATH];
TCHAR szSrcPath[MAX_PATH];
DWORD dwFlags = 0;
/* If this is the type of copy where we are adding files */
BOOL bAppend = FALSE;
WIN32_FIND_DATA findBuffer;
HANDLE hFile;
BOOL bTouch = FALSE;
/* Used when something like "copy c*.exe d*.exe" during the process of
figuring out the new name */
TCHAR tmpName[MAX_PATH] = _T("");
/* Pointer to keep track of how far through the append input(file1+file2+file3) we are */
TCHAR * appendPointer = _T("\0");
/* The full path to src and dest. This has drive letter, folders, and filename */
TCHAR tmpDestPath[MAX_PATH];
TCHAR tmpSrcPath[MAX_PATH];
/* A bool on weather or not the destination name will be taking from the input */
BOOL bSrcName = FALSE;
/* Seems like a waste but it is a pointer used to copy from input to PreserveName */
TCHAR * UseThisName;
/* Stores the name( i.e. blah.txt or blah*.txt) which later we might need */
TCHAR PreserveName[MAX_PATH];
/* for CMDCOPY env */
TCHAR *evar;
int size;
TCHAR * szTouch;
BOOL bDone = FALSE;
/*Show help/usage info*/
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE, STRING_COPY_HELP2);
return 0;
}
nErrorLevel = 0;
/* Get the envor value if it exists */
evar = malloc(512 * sizeof(TCHAR));
if (evar==NULL) size = 0;
else
{
size = GetEnvironmentVariable (_T("COPYCMD"), evar, 512);
}
if (size > 512)
{
evar = realloc(evar,size * sizeof(TCHAR) );
if (evar!=NULL)
{
size = GetEnvironmentVariable (_T("COPYCMD"), evar, size);
}
else
{
size=0;
}
}
/* check see if we did get any env variable */
if (size !=0)
{
int t=0;
/* scan and set the flags */
for (t=0;t<size;t++)
{
if (_tcsncicmp(_T("/A"),&evar[t],2)==0)
{
dwFlags |=COPY_ASCII;
t++;
}
else if (_tcsncicmp(_T("/B"),&evar[t],2)==0)
{
dwFlags |= COPY_BINARY;
t++;
}
else if (_tcsncicmp(_T("/D"),&evar[t],2)==0)
{
dwFlags |= COPY_DECRYPT;
t++;
}
else if (_tcsncicmp(_T("/V"),&evar[t],2)==0)
{
dwFlags |= COPY_VERIFY;
t++;
}
else if (_tcsncicmp(_T("/N"),&evar[t],2)==0)
{
dwFlags |= COPY_SHORTNAME;
t++;
}
else if (_tcsncicmp(_T("/Y"),&evar[t],2)==0)
{
dwFlags |= COPY_NO_PROMPT;
t++;
}
else if (_tcsncicmp(_T("/-Y"),&evar[t],3)==0)
{
dwFlags |= COPY_PROMPT;
t+=2;
}
else if (_tcsncicmp(_T("/Z"),&evar[t],2)==0)
{
dwFlags |= COPY_PROMPT;
t++;
}
}
}
free(evar);
/*Split the user input into array*/
arg = split (param, &argc, FALSE);
nFiles = argc;
/*Read switches and count files*/
for (i = 0; i < argc; i++)
{
if (*arg[i] == _T('/'))
{
if (_tcslen(arg[i]) >= 2)
{
switch (_totupper(arg[i][1]))
{
case _T('A'):
dwFlags |= COPY_ASCII;
break;
case _T('B'):
dwFlags |= COPY_BINARY;
break;
case _T('D'):
dwFlags |= COPY_DECRYPT;
break;
case _T('V'):
dwFlags |= COPY_VERIFY;
break;
case _T('N'):
dwFlags |= COPY_SHORTNAME;
break;
case _T('Y'):
dwFlags |= COPY_NO_PROMPT;
dwFlags &= ~COPY_PROMPT;
break;
case _T('-'):
if(_tcslen(arg[i]) >= 3)
if(_totupper(arg[i][2]) == _T('Y'))
{
dwFlags &= ~COPY_NO_PROMPT;
dwFlags |= COPY_PROMPT;
}
break;
case _T('Z'):
dwFlags |= COPY_RESTART;
break;
default:
/* invaild switch */
LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, _totupper(arg[i][1]));
nErrorLevel = 1;
return 1;
break;
}
}
/*If it was a switch, subtract from total arguments*/
nFiles--;
}
else
{
/*if it isnt a switch then it is the source or destination*/
if(nSrc == -1)
{
nSrc = i;
}
else if(*arg[i] == _T('+') || *arg[i] == _T(','))
{
/* Add these onto the source string
this way we can do all checks
directly on source string later on */
_tcscat(arg[nSrc],arg[i]);
nFiles--;
}
else if(nDes == -1)
{
nDes = i;
}
}
}
/* keep quiet within batch files */
if (bc != NULL)
{
dwFlags |= COPY_NO_PROMPT;
dwFlags &= ~COPY_PROMPT;
}
if(nFiles < 1)
{
/* There is not enough files, there has to be at least 1 */
ConOutResPuts(STRING_ERROR_REQ_PARAM_MISSING);
freep (arg);
return 1;
}
if(nFiles > 2)
{
/* there is too many file names in command */
LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg,_T(""));
nErrorLevel = 1;
freep (arg);
return 1;
}
if(((_tcschr (arg[nSrc], _T('+')) != NULL) ||
(_tcschr (arg[nSrc], _T('*')) != NULL && _tcschr (arg[nDes], _T('*')) == NULL) ||
(IsExistingDirectory (arg[nSrc]) && (_tcschr (arg[nDes], _T('*')) == NULL && !IsExistingDirectory (arg[nDes])))
))
{
/* There is a + in the source filename, this means
that there is more then one file being put into
one file. */
bAppend = TRUE;
if(_tcschr (arg[nSrc], _T('+')) != NULL)
appendPointer = arg[nSrc];
}
/* Reusing the number of files variable */
nFiles = 0;
do
{
/* Set up the string that is the path to the destination */
if(nDes != -1)
{
if(_tcslen(arg[nDes]) == 2 && arg[nDes][1] == _T(':'))
{
GetRootPath(arg[nDes],szDestPath,MAX_PATH);
}
else
/* If the user entered two file names then form the full string path*/
GetFullPathName (arg[nDes], MAX_PATH, szDestPath, NULL);
}
else
{
/* If no destination was entered then just use
the current directory as the destination */
GetCurrentDirectory (MAX_PATH, szDestPath);
}
/* Get the full string of the path to the source file*/
if(_tcschr (arg[nSrc], _T('+')) != NULL)
{
_tcscpy(tmpName,_T("\0"));
/* Loop through the source file name and copy all
the chars one at a time until it gets too + */
while(TRUE)
{
if(!_tcsncmp (appendPointer,_T("+"),1) || !_tcsncmp (appendPointer,_T("\0"),1))
{
/* Now that the pointer is on the + we
need to go to the start of the next filename */
if(!_tcsncmp (appendPointer,_T("+"),1))
appendPointer++;
else
bDone = TRUE;
break;
}
_tcsncat(tmpName,appendPointer,1);
appendPointer++;
}
/* Finish the string off with a null char */
_tcsncat(tmpName,_T("\0"),1);
if(_tcschr (arg[nSrc], _T(',')) != NULL)
{
/* Only time there is a , in the source is when they are using touch
Cant have a destination and can only have on ,, at the end of the string
Cant have more then one file name */
szTouch = _tcsstr (arg[nSrc], _T("+"));
if(_tcsncmp (szTouch,_T("+,,\0"),4) || nDes != -1)
{
LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_PARAM_FORMAT, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg,arg[nSrc]);
nErrorLevel = 1;
freep (arg);
return 1;
}
bTouch = TRUE;
bDone = TRUE;
}
if(_tcslen(tmpName) == 2)
{
if(tmpName[1] == _T(':'))
{
GetRootPath(tmpName,szSrcPath,MAX_PATH);
}
}
else
/* Get the full path to first file in the string of file names */
GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL);
}
else
{
bDone = TRUE;
if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':'))
{
GetRootPath(arg[nSrc],szSrcPath,MAX_PATH);
}
else
/* Get the full path of the source file */
GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL);
}
/* From this point on, we can assume that the shortest path is 3 letters long
and that would be [DriveLetter]:\ */
/* If there is no * in the path name and it is a folder
then we will need to add a wildcard to the pathname
so FindFirstFile comes up with all the files in that
folder */
if(_tcschr (szSrcPath, _T('*')) == NULL &&
IsExistingDirectory (szSrcPath))
{
/* If it doesnt have a \ at the end already then on needs to be added */
if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
_tcscat (szSrcPath, _T("\\"));
/* Add a wildcard after the \ */
_tcscat (szSrcPath, _T("*"));
}
/* Make sure there is an ending slash to the path if the dest is a folder */
if(_tcschr (szDestPath, _T('*')) == NULL &&
IsExistingDirectory(szDestPath))
{
if(szDestPath[_tcslen(szDestPath) - 1] != _T('\\'))
_tcscat (szDestPath, _T("\\"));
}
/* Get a list of all the files */
hFile = FindFirstFile (szSrcPath, &findBuffer);
/* We need to figure out what the name of the file in the is going to be */
if((szDestPath[_tcslen(szDestPath) - 1] == _T('*') && szDestPath[_tcslen(szDestPath) - 2] == _T('\\')) ||
szDestPath[_tcslen(szDestPath) - 1] == _T('\\'))
{
/* In this case we will be using the same name as the source file
for the destination file because destination is a folder */
bSrcName = TRUE;
}
else
{
/* Save the name the user entered */
UseThisName = _tcsrchr(szDestPath,_T('\\'));
UseThisName++;
_tcscpy(PreserveName,UseThisName);
}
/* Strip the paths back to the folder they are in */
for(i = (_tcslen(szSrcPath) - 1); i > -1; i--)
if(szSrcPath[i] != _T('\\'))
szSrcPath[i] = _T('\0');
else
break;
for(i = (_tcslen(szDestPath) - 1); i > -1; i--)
if(szDestPath[i] != _T('\\'))
szDestPath[i] = _T('\0');
else
break;
do
{
/* Check Breaker */
if(CheckCtrlBreak(BREAK_INPUT))
{
freep(arg);
return 1;
}
/* Set the override to yes each new file */
nOverwrite = 1;
/* If it couldnt open the file handle, print out the error */
if(hFile == INVALID_HANDLE_VALUE)
{
ConOutFormatMessage (GetLastError(), szSrcPath);
freep (arg);
nErrorLevel = 1;
return 1;
}
/* Ignore the . and .. files */
if(!_tcscmp (findBuffer.cFileName, _T(".")) ||
!_tcscmp (findBuffer.cFileName, _T(".."))||
findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
continue;
/* Copy the base folder over to a tmp string */
_tcscpy(tmpDestPath,szDestPath);
/* Can't put a file into a folder that isnt there */
if(!IsExistingDirectory(szDestPath))
{
ConOutFormatMessage (GetLastError (), szSrcPath);
freep (arg);
nErrorLevel = 1;
return 1;
}
/* Copy over the destination path name */
if(bSrcName)
_tcscat (tmpDestPath, findBuffer.cFileName);
else
{
/* If there is no wildcard you can use the name the user entered */
if(_tcschr (PreserveName, _T('*')) == NULL)
{
_tcscat (tmpDestPath, PreserveName);
}
else
{
/* The following lines of copy were written by someone else
(most likely Eric Khoul) and it was taken from ren.c */
LPTSTR p,q,r;
TCHAR DoneFile[MAX_PATH];
/* build destination file name */
p = findBuffer.cFileName;
q = PreserveName;
r = DoneFile;
while(*q != 0)
{
if (*q == '*')
{
q++;
while (*p != 0 && *p != *q)
{
*r = *p;
p++;
r++;
}
}
else if (*q == '?')
{
q++;
if (*p != 0)
{
*r = *p;
p++;
r++;
}
}
else
{
*r = *q;
if (*p != 0)
p++;
q++;
r++;
}
}
*r = 0;
/* Add the filename to the tmp string path */
_tcscat (tmpDestPath, DoneFile);
}
}
/* Build the string path to the source file */
_tcscpy(tmpSrcPath,szSrcPath);
_tcscat (tmpSrcPath, findBuffer.cFileName);
/* Check to see if the file is the same file */
if(!bTouch && !_tcscmp (tmpSrcPath, tmpDestPath))
continue;
/* Handle any overriding / prompting that needs to be done */
if(((!(dwFlags & COPY_NO_PROMPT) && IsExistingFile (tmpDestPath)) || dwFlags & COPY_PROMPT) && !bTouch)
nOverwrite = CopyOverwrite(tmpDestPath);
if(nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
continue;
if(nOverwrite == PROMPT_ALL || (nOverwrite == PROMPT_YES && bAppend))
dwFlags |= COPY_NO_PROMPT;
/* Tell weather the copy was successful or not */
if(copy(tmpSrcPath,tmpDestPath, bAppend, dwFlags, bTouch))
{
nFiles++;
/* only print source name when more then one file */
if(_tcschr (arg[nSrc], _T('+')) != NULL || _tcschr (arg[nSrc], _T('*')) != NULL)
ConOutPrintf(_T("%s\n"),findBuffer.cFileName);
//LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
}
else
{
/* print out the error message */
LoadString(CMD_ModuleHandle, STRING_COPY_ERROR3, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg);
ConOutFormatMessage (GetLastError(), szSrcPath);
nErrorLevel = 1;
}
/* Loop through all wildcard files */
}while(FindNextFile (hFile, &findBuffer));
/* Loop through all files in src string with a + */
}while(!bDone);
/* print out the number of files copied */
LoadString(CMD_ModuleHandle, STRING_COPY_FILE, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, nFiles);
CloseHandle(hFile);
if (arg!=NULL)
free(arg);
return 0;
}
#endif /* INCLUDE_CMD_COPY */

View file

@ -0,0 +1,273 @@
/*
* DATE.C - date internal command.
*
*
* History:
*
* 08 Jul 1998 (John P. Price)
* started.
*
* 20 Jul 1998 (John P. Price)
* corrected number of days for December from 30 to 31.
* (Thanx to Steffen Kaiser for bug report)
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 29-Jul-1998 (Rob Lake)
* fixed stand-alone mode.
* Added Pacific C compatible dos_getdate functions
*
* 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added locale support
*
* 23-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
*
* 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed date input bug.
*
* 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_DATE
static WORD awMonths[2][13] =
{
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
static VOID
PrintDateString (VOID)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
switch (nDateFormat)
{
case 0: /* mmddyy */
default:
LoadString(CMD_ModuleHandle, STRING_DATE_HELP1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, cDateSeparator, cDateSeparator);
break;
case 1: /* ddmmyy */
LoadString(CMD_ModuleHandle, STRING_DATE_HELP2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, cDateSeparator, cDateSeparator);
break;
case 2: /* yymmdd */
LoadString(CMD_ModuleHandle, STRING_DATE_HELP3, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, cDateSeparator, cDateSeparator);
break;
}
}
static BOOL
ReadNumber (LPTSTR *s, LPWORD lpwValue)
{
if (_istdigit (**s))
{
while (_istdigit (**s))
{
*lpwValue = *lpwValue * 10 + **s - _T('0');
(*s)++;
}
return TRUE;
}
return FALSE;
}
static BOOL
ReadSeparator (LPTSTR *s)
{
if (**s == _T('/') || **s == _T('-') || **s == cDateSeparator)
{
(*s)++;
return TRUE;
}
return FALSE;
}
static BOOL
ParseDate (LPTSTR s)
{
SYSTEMTIME d;
unsigned char leap;
LPTSTR p = s;
if (!*s)
return TRUE;
GetLocalTime (&d);
d.wYear = 0;
d.wDay = 0;
d.wMonth = 0;
switch (nDateFormat)
{
case 0: /* mmddyy */
default:
if (!ReadNumber (&p, &d.wMonth))
return FALSE;
if (!ReadSeparator (&p))
return FALSE;
if (!ReadNumber (&p, &d.wDay))
return FALSE;
if (!ReadSeparator (&p))
return FALSE;
if (!ReadNumber (&p, &d.wYear))
return FALSE;
break;
case 1: /* ddmmyy */
if (!ReadNumber (&p, &d.wDay))
return FALSE;
if (!ReadSeparator (&p))
return FALSE;
if (!ReadNumber (&p, &d.wMonth))
return FALSE;
if (!ReadSeparator (&p))
return FALSE;
if (!ReadNumber (&p, &d.wYear))
return FALSE;
break;
case 2: /* yymmdd */
if (!ReadNumber (&p, &d.wYear))
return FALSE;
if (!ReadSeparator (&p))
return FALSE;
if (!ReadNumber (&p, &d.wMonth))
return FALSE;
if (!ReadSeparator (&p))
return FALSE;
if (!ReadNumber (&p, &d.wDay))
return FALSE;
break;
}
/* if only entered two digits: */
/* assume 2000's if value less than 80 */
/* assume 1900's if value greater or equal 80 */
if (d.wYear <= 99)
{
if (d.wYear >= 80)
d.wYear = 1900 + d.wYear;
else
d.wYear = 2000 + d.wYear;
}
leap = (!(d.wYear % 4) && (d.wYear % 100)) || !(d.wYear % 400);
if ((d.wMonth >= 1 && d.wMonth <= 12) &&
(d.wDay >= 1 && d.wDay <= awMonths[leap][d.wMonth]) &&
(d.wYear >= 1980 && d.wYear <= 2099))
{
SetLocalTime (&d);
return TRUE;
}
return FALSE;
}
INT cmd_date (LPTSTR cmd, LPTSTR param)
{
LPTSTR *arg;
INT argc;
INT i;
BOOL bPrompt = TRUE;
INT nDateString = -1;
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_DATE_HELP4);
return 0;
}
nErrorLevel = 0;
/* build parameter array */
arg = split (param, &argc, FALSE);
/* check for options */
for (i = 0; i < argc; i++)
{
if (_tcsicmp (arg[i], _T("/t")) == 0)
bPrompt = FALSE;
if ((*arg[i] != _T('/')) && (nDateString == -1))
nDateString = i;
}
if (nDateString == -1)
PrintDate ();
if (!bPrompt)
{
freep (arg);
return 0;
}
if (nDateString == -1)
{
while (TRUE) /* forever loop */
{
TCHAR s[40];
PrintDateString ();
ConInString (s, 40);
#ifdef _DEBUG
DebugPrintf (_T("\'%s\'\n"), s);
#endif
while (*s && s[_tcslen (s) - 1] < _T(' '))
s[_tcslen (s) - 1] = _T('\0');
if (ParseDate (s))
{
freep (arg);
return 0;
}
ConErrResPuts(STRING_DATE_ERROR);
}
}
else
{
if (!ParseDate (arg[nDateString]))
{
while (TRUE) /* forever loop */
{
TCHAR s[40];
ConErrResPuts(STRING_DATE_ERROR);
PrintDateString ();
ConInString (s, 40);
while (*s && s[_tcslen (s) - 1] < _T(' '))
s[_tcslen (s) - 1] = _T('\0');
if (ParseDate (s))
{
freep (arg);
return 0;
}
}
}
}
freep (arg);
return 0;
}
#endif /* INCLUDE_CMD_DATE */
/* EOF */

View file

@ -0,0 +1,570 @@
/*
* DEL.C - del internal command.
*
*
* History:
*
* 06/29/98 (Rob Lake rlake@cs.mun.ca)
* rewrote del to support wildcards
* added my name to the contributors
*
* 07/13/98 (Rob Lake)
* fixed bug that caused del not to delete file with out
* attribute. moved set, del, ren, and ver to there own files
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
* Fixed command line parsing bugs.
*
* 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
* Started major rewrite using a new structure.
*
* 03-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
* First working version.
*
* 30-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
* Added quiet ("/Q"), wipe ("/W") and zap ("/Z") option.
*
* 06-Nov-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>)
* Little fix to keep DEL quiet inside batch files.
*
* 28-Jan-2004 (Michael Fritscher <michael@fritscher.net>)
* Added prompt ("/P"), yes ("/Y") and wipe("/W") option.
*
* 22-Jun-2005 (Brandon Turner <turnerb7@msu.edu>)
* Added exclusive deletion "del * -abc.txt -text*.txt"
*
* 22-Jun-2005 (Brandon Turner <turnerb7@msu.edu>)
* Implemented /A example "del /A:H /A:-R *.exe -ping.exe"
*
* 07-Aug-2005
* Removed the exclusive deletion (see two comments above) because '-' is a valid file name character.
* Optimized the recursive deletion in directories.
* Preload some nice strings.
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_DEL
enum
{
DEL_ATTRIBUTES = 0x001, /* /A */
DEL_NOTHING = 0x004, /* /N */
DEL_PROMPT = 0x008, /* /P */
DEL_QUIET = 0x010, /* /Q */
DEL_SUBDIR = 0x020, /* /S */
DEL_TOTAL = 0x040, /* /T */
DEL_WIPE = 0x080, /* /W */
DEL_EMPTYDIR = 0x100, /* /X : not implemented */
DEL_YES = 0x200, /* /Y */
DEL_FORCE = 0x800 /* /F */
};
enum
{
ATTR_ARCHIVE = 0x001, /* /A:A */
ATTR_HIDDEN = 0x002, /* /A:H */
ATTR_SYSTEM = 0x004, /* /A:S */
ATTR_READ_ONLY = 0x008, /* /A:R */
ATTR_N_ARCHIVE = 0x010, /* /A:-A */
ATTR_N_HIDDEN = 0x020, /* /A:-H */
ATTR_N_SYSTEM = 0x040, /* /A:-S */
ATTR_N_READ_ONLY = 0x080 /* /A:-R */
};
static TCHAR szDeleteWipe[RC_STRING_MAX_SIZE];
static TCHAR szDelHelp2[RC_STRING_MAX_SIZE];
static TCHAR szDelHelp3[RC_STRING_MAX_SIZE];
static TCHAR szDelHelp4[RC_STRING_MAX_SIZE];
static TCHAR szDelError5[RC_STRING_MAX_SIZE];
static TCHAR szDelError6[RC_STRING_MAX_SIZE];
static TCHAR szDelError7[RC_STRING_MAX_SIZE];
static TCHAR CMDPath[MAX_PATH];
static BOOLEAN StringsLoaded = FALSE;
static VOID LoadStrings(VOID)
{
LoadString( CMD_ModuleHandle, STRING_DELETE_WIPE, szDeleteWipe, RC_STRING_MAX_SIZE);
LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szDelHelp2, RC_STRING_MAX_SIZE);
LoadString( CMD_ModuleHandle, STRING_DEL_HELP3, szDelHelp3, RC_STRING_MAX_SIZE);
LoadString( CMD_ModuleHandle, STRING_DEL_HELP4, szDelHelp4, RC_STRING_MAX_SIZE);
LoadString( CMD_ModuleHandle, STRING_DEL_ERROR5, szDelError5, RC_STRING_MAX_SIZE);
LoadString( CMD_ModuleHandle, STRING_DEL_ERROR6, szDelError6, RC_STRING_MAX_SIZE);
LoadString( CMD_ModuleHandle, STRING_DEL_ERROR7, szDelError7, RC_STRING_MAX_SIZE);
GetModuleFileName(NULL, CMDPath, MAX_PATH);
StringsLoaded = TRUE;
}
static BOOL
RemoveFile (LPTSTR lpFileName, DWORD dwFlags, WIN32_FIND_DATA* f)
{
/*This function is called by CommandDelete and
does the actual process of deleting the single
file*/
if(CheckCtrlBreak(BREAK_INPUT))
return 1;
/*check to see if it is read only and if this is done based on /A
if it is done by file name, access is denied. However, if it is done
using the /A switch you must un-read only the file and allow it to be
deleted*/
if((dwFlags & DEL_ATTRIBUTES) || (dwFlags & DEL_FORCE))
{
if(f->dwFileAttributes & FILE_ATTRIBUTE_READONLY)
{
/*setting file to normal, not saving old attrs first
because the file is going to be deleted anyways
so the only thing that matters is that it isnt
read only.*/
SetFileAttributes(lpFileName,FILE_ATTRIBUTE_NORMAL);
}
}
if (dwFlags & DEL_WIPE)
{
HANDLE file;
DWORD temp;
#define BufferSize 65536
BYTE buffer[BufferSize];
LONGLONG i;
LARGE_INTEGER FileSize;
FileSize.u.HighPart = f->nFileSizeHigh;
FileSize.u.LowPart = f->nFileSizeLow;
for(i = 0; i < BufferSize; i++)
{
buffer[i]=rand() % 256;
}
file = CreateFile (lpFileName, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
if (file != INVALID_HANDLE_VALUE)
{
for(i = 0; i < (FileSize.QuadPart - BufferSize); i += BufferSize)
{
WriteFile (file, buffer, BufferSize, &temp, NULL);
ConOutPrintf (_T("%I64d%% %s\r"),(i * (LONGLONG)100)/FileSize.QuadPart,szDeleteWipe);
}
WriteFile (file, buffer, (DWORD)(FileSize.QuadPart - i), &temp, NULL);
ConOutPrintf (_T("100%% %s\n"),szDeleteWipe);
CloseHandle (file);
}
}
return DeleteFile (lpFileName);
}
static DWORD
DeleteFiles(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags)
{
TCHAR szFullPath[MAX_PATH];
TCHAR szFileName[MAX_PATH];
LPTSTR pFilePart;
HANDLE hFile;
WIN32_FIND_DATA f;
BOOL bExclusion;
INT res;
DWORD dwFiles = 0;
_tcscpy(szFileName, FileName);
if(_tcschr (szFileName, _T('*')) == NULL &&
IsExistingDirectory (szFileName))
{
/* If it doesnt have a \ at the end already then on needs to be added */
if(szFileName[_tcslen(szFileName) - 1] != _T('\\'))
_tcscat (szFileName, _T("\\"));
/* Add a wildcard after the \ */
_tcscat (szFileName, _T("*"));
}
if(!_tcscmp (szFileName, _T("*")) ||
!_tcscmp (szFileName, _T("*.*")) ||
(szFileName[_tcslen(szFileName) - 2] == _T('\\') && szFileName[_tcslen(szFileName) - 1] == _T('*')))
{
/* well, the user wants to delete everything but if they didnt yes DEL_YES, DEL_QUIET, or DEL_PROMPT
then we are going to want to make sure that in fact they want to do that. */
if (!((*dwFlags & DEL_YES) || (*dwFlags & DEL_QUIET) || (*dwFlags & DEL_PROMPT)))
{
res = FilePromptYNA (szDelHelp2);
if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
return 0x80000000;
if(res == PROMPT_ALL)
*dwFlags |= DEL_YES;
}
}
GetFullPathName (szFileName,
MAX_PATH,
szFullPath,
&pFilePart);
hFile = FindFirstFile(szFullPath, &f);
if (hFile != INVALID_HANDLE_VALUE)
{
do
{
bExclusion = FALSE;
/*if it is going to be excluded by - no need to check attrs*/
if(*dwFlags & DEL_ATTRIBUTES && !bExclusion)
{
/*save if file attr check if user doesnt care about that attr anyways*/
if(dwAttrFlags & ATTR_ARCHIVE && !(f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
bExclusion = TRUE;
if(dwAttrFlags & ATTR_HIDDEN && !(f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
bExclusion = TRUE;
if(dwAttrFlags & ATTR_SYSTEM && !(f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
bExclusion = TRUE;
if(dwAttrFlags & ATTR_READ_ONLY && !(f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
bExclusion = TRUE;
if(dwAttrFlags & ATTR_N_ARCHIVE && (f.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE))
bExclusion = TRUE;
if(dwAttrFlags & ATTR_N_HIDDEN && (f.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
bExclusion = TRUE;
if(dwAttrFlags & ATTR_N_SYSTEM && (f.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM))
bExclusion = TRUE;
if(dwAttrFlags & ATTR_N_READ_ONLY && (f.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
bExclusion = TRUE;
}
if(bExclusion)
continue;
/* ignore directories */
if (f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
continue;
_tcscpy (pFilePart, f.cFileName);
/* We cant delete ourselves */
if(!_tcscmp (CMDPath,szFullPath))
continue;
#ifdef _DEBUG
ConErrPrintf(_T("Full filename: %s\n"), szFullPath);
#endif
/* ask for deleting */
if (*dwFlags & DEL_PROMPT)
{
ConErrPrintf(szDelError5, szFullPath);
res = FilePromptYN (szDelError6);
if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
{
nErrorLevel = 0;
continue;
}
}
/*user cant ask it to be quiet and tell you what it did*/
if (!(*dwFlags & DEL_QUIET) && !(*dwFlags & DEL_TOTAL))
{
ConErrPrintf(szDelError7, szFullPath);
}
/* delete the file */
if(*dwFlags & DEL_NOTHING)
continue;
if(RemoveFile (szFullPath, *dwFlags, &f))
dwFiles++;
else
{
ErrorMessage (GetLastError(), _T(""));
// FindClose(hFile);
// return -1;
}
}
while (FindNextFile (hFile, &f));
FindClose (hFile);
}
return dwFiles;
}
static DWORD
ProcessDirectory(LPTSTR FileName, DWORD* dwFlags, DWORD dwAttrFlags)
{
TCHAR szFullPath[MAX_PATH];
LPTSTR pFilePart;
LPTSTR pSearchPart;
HANDLE hFile;
WIN32_FIND_DATA f;
DWORD dwFiles = 0;
GetFullPathName (FileName,
MAX_PATH,
szFullPath,
&pFilePart);
dwFiles = DeleteFiles(szFullPath, dwFlags, dwAttrFlags);
if (dwFiles & 0x80000000)
return dwFiles;
if (*dwFlags & DEL_SUBDIR)
{
/* Get just the file name */
pSearchPart = _tcsrchr(FileName,_T('\\'));
if(pSearchPart != NULL)
pSearchPart++;
else
pSearchPart = FileName;
/* Get the full path to the file */
GetFullPathName (FileName,MAX_PATH,szFullPath,NULL);
/* strip the filename off of it */
pFilePart = _tcsrchr(szFullPath, _T('\\'));
if (pFilePart == NULL)
{
pFilePart = szFullPath;
}
else
{
pFilePart++;
}
_tcscpy(pFilePart, _T("*"));
hFile = FindFirstFile(szFullPath, &f);
if (hFile != INVALID_HANDLE_VALUE)
{
do
{
if (!(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ||
!_tcscmp(f.cFileName, _T(".")) ||
!_tcscmp(f.cFileName, _T("..")))
continue;
_tcscpy(pFilePart, f.cFileName);
_tcscat(pFilePart, _T("\\"));
_tcscat(pFilePart, pSearchPart);
dwFiles +=ProcessDirectory(szFullPath, dwFlags, dwAttrFlags);
if (dwFiles & 0x80000000)
{
break;
}
}
while (FindNextFile (hFile, &f));
FindClose (hFile);
}
}
return dwFiles;
}
INT CommandDelete (LPTSTR cmd, LPTSTR param)
{
/*cmd is the command that was given, in this case it will always be "del" or "delete"
param is whatever is given after the command*/
LPTSTR *arg = NULL;
INT args;
INT i;
INT nEvalArgs = 0; /* nunber of evaluated arguments */
DWORD dwFlags = 0;
DWORD dwAttrFlags = 0;
DWORD dwFiles = 0;
LONG ch;
TCHAR szOrginalArg[MAX_PATH];
/*checks the first two chars of param to see if it is /?
this however allows the following command to not show help
"del frog.txt /?" */
if (!StringsLoaded)
{
LoadStrings();
}
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_DEL_HELP1);
return 0;
}
nErrorLevel = 0;
arg = split (param, &args, FALSE);
if (args == 0)
{
/* only command given */
error_req_param_missing ();
freep (arg);
return 1;
}
/* check for options anywhere in command line */
for (i = 0; i < args; i++)
{
if (*arg[i] == _T('/'))
{
/*found a command, but check to make sure it has something after it*/
if (_tcslen (arg[i]) >= 2)
{
ch = _totupper (arg[i][1]);
if (ch == _T('N'))
{
dwFlags |= DEL_NOTHING;
}
else if (ch == _T('P'))
{
dwFlags |= DEL_PROMPT;
}
else if (ch == _T('Q'))
{
dwFlags |= DEL_QUIET;
}
else if (ch == _T('F'))
{
dwFlags |= DEL_FORCE;
}
else if (ch == _T('S'))
{
dwFlags |= DEL_SUBDIR;
}
else if (ch == _T('T'))
{
dwFlags |= DEL_TOTAL;
}
else if (ch == _T('W'))
{
dwFlags |= DEL_WIPE;
}
else if (ch == _T('Y'))
{
dwFlags |= DEL_YES;
}
else if (ch == _T('A'))
{
dwFlags |= DEL_ATTRIBUTES;
/*the proper syntax for /A has a min of 4 chars
i.e. /A:R or /A:-H */
if (_tcslen (arg[i]) < 4)
{
error_invalid_parameter_format(arg[i]);
return 0;
}
ch = _totupper (arg[i][3]);
if (_tcslen (arg[i]) == 4)
{
if(ch == _T('A'))
{
dwAttrFlags |= ATTR_ARCHIVE;
}
if(ch == _T('H'))
{
dwAttrFlags |= ATTR_HIDDEN;
}
if(ch == _T('S'))
{
dwAttrFlags |= ATTR_SYSTEM;
}
if(ch == _T('R'))
{
dwAttrFlags |= ATTR_READ_ONLY;
}
}
if (_tcslen (arg[i]) == 5)
{
if(ch == _T('-'))
{
ch = _totupper (arg[i][4]);
if(ch == _T('A'))
{
dwAttrFlags |= ATTR_N_ARCHIVE;
}
if(ch == _T('H'))
{
dwAttrFlags |= ATTR_N_HIDDEN;
}
if(ch == _T('S'))
{
dwAttrFlags |= ATTR_N_SYSTEM;
}
if(ch == _T('R'))
{
dwAttrFlags |= ATTR_N_READ_ONLY;
}
}
}
}
}
nEvalArgs++;
}
}
/* there are only options on the command line --> error!!!
there is the same number of args as there is flags, so none of the args were filenames*/
if (args == nEvalArgs)
{
error_req_param_missing ();
freep (arg);
return 1;
}
/* keep quiet within batch files */
if (bc != NULL)
dwFlags |= DEL_QUIET;
/* check for filenames anywhere in command line */
for (i = 0; i < args && !(dwFiles & 0x80000000); i++)
{
/*this checks to see if it isnt a flag, if it isnt, we assume it is a file name*/
if((*arg[i] == _T('/')) || (*arg[i] == _T('-')))
continue;
/* We want to make a copies of the argument */
if(_tcslen(arg[i]) == 2 && arg[i][1] == _T(':'))
{
/* Check for C: D: ... */
GetRootPath(arg[i],szOrginalArg,MAX_PATH);
}
else
{
_tcscpy(szOrginalArg,arg[i]);
}
dwFiles += ProcessDirectory(szOrginalArg, &dwFlags, dwAttrFlags);
}
freep (arg);
/*Based on MS cmd, we only tell what files are being deleted when /S is used */
if (dwFlags & DEL_TOTAL)
{
dwFiles &= 0x7fffffff;
if (dwFiles < 2)
{
ConOutPrintf(szDelHelp3, dwFiles);
}
else
{
ConOutPrintf(szDelHelp4, dwFiles);
}
}
return 0;
}
#endif

View file

@ -0,0 +1,49 @@
/*
* DELAY.C - internal command.
*
* clone from 4nt delay command
*
* 30 Aug 1999
* started - Paolo Pantaleo <paolopan@freemail.it>
*
*
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_DELAY
INT CommandDelay (LPTSTR cmd, LPTSTR param)
{
DWORD val;
DWORD mul=1000;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_DELAY_HELP);
return 0;
}
nErrorLevel = 0;
if (*param==0)
{
error_req_param_missing ();
return 1;
}
if (_tcsnicmp(param,_T("/m"),2) == 0)
{
mul = 1;
param += 2;
}
val = _ttoi(param);
Sleep(val * mul);
return 0;
}
#endif /* INCLUDE_CMD_DELAY */

2111
reactos/base/shell/cmd/dir.c Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,235 @@
/*
* DIRSTACK.C - pushd / pop (directory stack) internal commands.
*
*
* History:
*
* 14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Implemented PUSHD and POPD command.
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added DIRS command.
*/
#include <precomp.h>
#include "resource.h"
#ifdef FEATURE_DIRECTORY_STACK
typedef struct tagDIRENTRY
{
struct tagDIRENTRY *prev;
struct tagDIRENTRY *next;
LPTSTR pszPath;
} DIRENTRY, *LPDIRENTRY;
static INT nStackDepth;
static LPDIRENTRY lpStackTop;
static LPDIRENTRY lpStackBottom;
static INT
PushDirectory (LPTSTR pszPath)
{
LPDIRENTRY lpDir;
nErrorLevel = 0;
lpDir = (LPDIRENTRY)malloc (sizeof (DIRENTRY));
if (!lpDir)
{
error_out_of_memory ();
return -1;
}
lpDir->prev = NULL;
if (lpStackTop == NULL)
{
lpDir->next = NULL;
lpStackBottom = lpDir;
}
else
{
lpDir->next = lpStackTop;
lpStackTop->prev = lpDir;
}
lpStackTop = lpDir;
lpDir->pszPath = (LPTSTR)malloc ((_tcslen(pszPath)+1)*sizeof(TCHAR));
if (!lpDir->pszPath)
{
free (lpDir);
error_out_of_memory ();
return -1;
}
_tcscpy (lpDir->pszPath, pszPath);
nStackDepth++;
return 0;
}
static VOID
PopDirectory (VOID)
{
LPDIRENTRY lpDir;
nErrorLevel = 0;
if (nStackDepth == 0)
return;
lpDir = lpStackTop;
lpStackTop = lpDir->next;
if (lpStackTop != NULL)
lpStackTop->prev = NULL;
else
lpStackBottom = NULL;
free (lpDir->pszPath);
free (lpDir);
nStackDepth--;
}
static VOID
GetDirectoryStackTop (LPTSTR pszPath)
{
nErrorLevel = 0;
if (lpStackTop)
_tcsncpy (pszPath, lpStackTop->pszPath, MAX_PATH);
else
*pszPath = _T('\0');
}
/*
* initialize directory stack
*/
VOID InitDirectoryStack (VOID)
{
nStackDepth = 0;
lpStackTop = NULL;
lpStackBottom = NULL;
}
/*
* destroy directory stack
*/
VOID DestroyDirectoryStack (VOID)
{
while (nStackDepth)
PopDirectory ();
}
INT GetDirectoryStackDepth (VOID)
{
return nStackDepth;
}
/*
* pushd command
*/
INT CommandPushd (LPTSTR first, LPTSTR rest)
{
TCHAR curPath[MAX_PATH];
TCHAR newPath[MAX_PATH];
BOOL bChangePath = FALSE;
if (!_tcsncmp (rest, _T("/?"), 2))
{
ConOutResPuts(STRING_DIRSTACK_HELP1);
return 0;
}
nErrorLevel = 0;
if (rest[0] != _T('\0'))
{
GetFullPathName (rest, MAX_PATH, newPath, NULL);
bChangePath = IsValidPathName (newPath);
}
GetCurrentDirectory (MAX_PATH, curPath);
if (PushDirectory (curPath))
return 0;
if (bChangePath)
SetCurrentDirectory (newPath);
return 0;
}
/*
* popd command
*/
INT CommandPopd (LPTSTR first, LPTSTR rest)
{
TCHAR szPath[MAX_PATH];
if (!_tcsncmp(rest, _T("/?"), 2))
{
ConOutResPuts(STRING_DIRSTACK_HELP2);
return 0;
}
nErrorLevel = 0;
if (GetDirectoryStackDepth () == 0)
return 0;
GetDirectoryStackTop (szPath);
PopDirectory ();
SetCurrentDirectory (szPath);
return 0;
}
/*
* dirs command
*/
INT CommandDirs (LPTSTR first, LPTSTR rest)
{
LPDIRENTRY lpDir;
if (!_tcsncmp(rest, _T("/?"), 2))
{
ConOutResPuts(STRING_DIRSTACK_HELP3);
return 0;
}
nErrorLevel = 0;
lpDir = lpStackBottom;
if (lpDir == NULL)
{
ConOutResPuts(STRING_DIRSTACK_HELP4);
return 0;
}
while (lpDir != NULL)
{
ConOutPuts (lpDir->pszPath);
lpDir = lpDir->prev;
}
return 0;
}
#endif /* FEATURE_DIRECTORY_STACK */

View file

@ -0,0 +1,181 @@
/*
* ECHO.C - internal echo commands.
*
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* Started.
*
* 16 Jul 1998 (John P Price)
* Separated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* Added config.h include
*
* 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
*
* 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection ready!
*
* 13-Jul-2000 (Eric Kohl <ekohl@rz-online.de>)
* Implemented 'echo.' and 'echoerr.'.
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
INT CommandEcho (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LPTSTR p1, p2;
#ifdef _DEBUG
DebugPrintf (_T("CommandEcho '%s' : '%s'\n"), cmd, param);
#endif
if (_tcsicmp (cmd, _T("echo.")) == 0)
{
if (param[0] == 0)
ConOutChar (_T('\n'));
else
ConOutPuts (param);
}
else
{
/* skip the first delimiter */
if (_istspace(*param))
param++;
/* skip all spaces for the check of '/?', 'ON' and 'OFF' */
p1 = param;
while(_istspace(*p1))
p1++;
if (!_tcsncmp (p1, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_ECHO_HELP4);
return 0;
}
if (_tcsnicmp (p1, D_OFF, sizeof(D_OFF)/sizeof(TCHAR) - 1) == 0)
{
p2 = p1 + sizeof(D_OFF)/sizeof(TCHAR) - 1;
while (_istspace(*p2))
p2++;
if (*p2 == _T('\0'))
{
bEcho = FALSE;
return 0;
}
}
else if (_tcsnicmp (p1, D_ON, sizeof(D_ON)/sizeof(TCHAR) - 1) == 0)
{
p2 = p1 + sizeof(D_ON)/sizeof(TCHAR) - 1;
while (_istspace(*p2))
p2++;
if (*p2 == _T('\0'))
{
bEcho = TRUE;
return 0;
}
}
if (*p1 != _T('\0'))
{
p1 = param;
while (NULL != (p1 = _tcschr(p1, _T('^'))))
{
memmove(p1, p1 + 1, (_tcslen(p1 + 1) + 1) * sizeof(TCHAR));
if (*p1)
{
//skip past the char being escaped
p1++;
}
}
ConOutPuts (param);
}
else
{
LoadString(CMD_ModuleHandle, STRING_ECHO_HELP5, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, bEcho ? D_ON : D_OFF);
}
}
return 0;
}
INT CommandEchos (LPTSTR cmd, LPTSTR param)
{
#ifdef _DEBUG
DebugPrintf (_T("CommandEchos '%s' : '%s'\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPuts(STRING_ECHO_HELP1);
return 0;
}
if (*param)
ConOutPrintf (_T("%s"), param);
return 0;
}
INT CommandEchoerr (LPTSTR cmd, LPTSTR param)
{
#ifdef _DEBUG
DebugPrintf (_T("CommandEchoerr '%s' : '%s'\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPuts(STRING_ECHO_HELP2);
return 0;
}
if (_tcsicmp (cmd, _T("echoerr.")) == 0)
{
if (param[0] == 0)
ConErrChar (_T('\n'));
else
ConErrPuts (param);
}
else if (*param)
{
ConErrPuts (param);
}
return 0;
}
INT CommandEchoserr (LPTSTR cmd, LPTSTR param)
{
#ifdef _DEBUG
DebugPrintf (_T("CommandEchoserr '%s' : '%s'\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPuts(STRING_ECHO_HELP3);
return 0;
}
if (*param)
ConOutPrintf (_T("%s"), param);
return 0;
}
/* EOF */

View file

@ -0,0 +1,179 @@
/*
* ERROR.C - error reporting functions.
*
*
* History:
*
* 07/12/98 (Rob Lake)
* started
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection safe!
*
* 02-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Use FormatMessage() for error reports.
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
VOID ErrorMessage (DWORD dwErrorCode, LPTSTR szFormat, ...)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szMessage[1024];
LPTSTR szError;
va_list arg_ptr;
if (dwErrorCode == ERROR_SUCCESS)
return;
nErrorLevel = 1;
if (szFormat)
{
va_start (arg_ptr, szFormat);
_vstprintf (szMessage, szFormat, arg_ptr);
va_end (arg_ptr);
}
if (FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&szError, 0, NULL))
{
ConErrPrintf (_T("%s %s\n"), szError, szMessage);
if(szError)
LocalFree (szError);
return;
}
/* Fall back just in case the error is not defined */
if (szFormat)
ConErrPrintf (_T("%s -- %s\n"), szMsg, szMessage);
else
ConErrPrintf (_T("%s\n"), szMsg);
}
VOID error_parameter_format(TCHAR ch)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, STRING_ERROR_PARAMETERF_ERROR, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, ch);
nErrorLevel = 1;
}
VOID error_invalid_switch (TCHAR ch)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, STRING_ERROR_INVALID_SWITCH, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, ch);
nErrorLevel = 1;
}
VOID error_too_many_parameters (LPTSTR s)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, STRING_ERROR_TOO_MANY_PARAMETERS, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, s);
nErrorLevel = 1;
}
VOID error_path_not_found (VOID)
{
ConErrResPuts(STRING_ERROR_PATH_NOT_FOUND);
nErrorLevel = 1;
}
VOID error_file_not_found (VOID)
{
ConErrResPuts(STRING_ERROR_FILE_NOT_FOUND);
nErrorLevel = 1;
}
VOID error_sfile_not_found (LPTSTR f)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, STRING_ERROR_FILE_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(_T("%s - %s\n"), szMsg, f);
nErrorLevel = 1;
}
VOID error_req_param_missing (VOID)
{
ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING);
nErrorLevel = 1;
}
VOID error_invalid_drive (VOID)
{
ConErrResPuts(STRING_ERROR_INVALID_DRIVE);
nErrorLevel = 1;
}
VOID error_bad_command (VOID)
{
ConErrResPuts(STRING_ERROR_BADCOMMAND);
nErrorLevel = 9009;
}
VOID error_no_pipe (VOID)
{
ConErrResPuts(STRING_ERROR_CANNOTPIPE);
nErrorLevel = 1;
}
VOID error_out_of_memory (VOID)
{
ConErrResPuts(STRING_ERROR_OUT_OF_MEMORY);
nErrorLevel = 1;
}
VOID error_invalid_parameter_format (LPTSTR s)
{
ConErrResPuts(STRING_ERROR_INVALID_PARAM_FORMAT);
nErrorLevel = 1;
}
VOID error_syntax (LPTSTR s)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LoadString(CMD_ModuleHandle, STRING_ERROR_ERROR2, szMsg, RC_STRING_MAX_SIZE);
if (s)
ConErrPrintf(_T("%s - %s\n"), szMsg, s);
else
ConErrPrintf(_T("%s.\n"), szMsg);
nErrorLevel = 1;
}
VOID msg_pause (VOID)
{
ConOutResPuts(STRING_ERROR_D_PAUSEMSG);
}
/* EOF */

View file

@ -0,0 +1,751 @@
/*
* FILECOMP.C - handles filename completion.
*
*
* Comments:
*
* 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* moved from command.c file
* made second TAB display list of filename matches
* made filename be lower case if last character typed is lower case
*
* 25-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Cleanup. Unicode safe!
*
* 30-Apr-2004 (Filip Navara <xnavara@volny.cz>)
* Make the file listing readable when there is a lot of long names.
*
* 05-Jul-2004 (Jens Collin <jens.collin@lakhei.com>)
* Now expands lfn even when trailing " is omitted.
*/
#include <precomp.h>
#include "cmd.h"
#ifdef FEATURE_UNIX_FILENAME_COMPLETION
VOID CompleteFilename (LPTSTR str, UINT charcount)
{
WIN32_FIND_DATA file;
HANDLE hFile;
INT curplace = 0;
INT start;
INT count;
INT step;
INT c = 0;
BOOL found_dot = FALSE;
BOOL perfectmatch = TRUE;
TCHAR path[MAX_PATH];
TCHAR fname[MAX_PATH];
TCHAR maxmatch[MAX_PATH] = _T("");
TCHAR directory[MAX_PATH];
LPCOMMAND cmds_ptr;
/* expand current file name */
count = charcount - 1;
if (count < 0)
count = 0;
/* find how many '"'s there is typed already.*/
step = count;
while (step > 0)
{
if (str[step] == _T('"'))
c++;
step--;
}
/* if c is odd, then user typed " before name, else not.*/
/* find front of word */
if (str[count] == _T('"') || (c % 2))
{
count--;
while (count > 0 && str[count] != _T('"'))
count--;
}
else
{
while (count > 0 && str[count] != _T(' '))
count--;
}
/* if not at beginning, go forward 1 */
if (str[count] == _T(' '))
count++;
start = count;
if (str[count] == _T('"'))
count++; /* don't increment start */
/* extract directory from word */
_tcscpy (directory, &str[count]);
curplace = _tcslen (directory) - 1;
if (curplace >= 0 && directory[curplace] == _T('"'))
directory[curplace--] = _T('\0');
_tcscpy (path, directory);
while (curplace >= 0 && directory[curplace] != _T('\\') &&
directory[curplace] != _T(':'))
{
directory[curplace] = 0;
curplace--;
}
/* look for a '.' in the filename */
for (count = _tcslen (directory); path[count] != _T('\0'); count++)
{
if (path[count] == _T('.'))
{
found_dot = TRUE;
break;
}
}
if (found_dot)
_tcscat (path, _T("*"));
else
_tcscat (path, _T("*.*"));
/* current fname */
curplace = 0;
hFile = FindFirstFile (path, &file);
if (hFile != INVALID_HANDLE_VALUE)
{
/* find anything */
do
{
/* ignore "." and ".." */
if (!_tcscmp (file.cFileName, _T(".")) ||
!_tcscmp (file.cFileName, _T("..")))
continue;
_tcscpy (fname, file.cFileName);
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
_tcscat (fname, _T("\\"));
if (!maxmatch[0] && perfectmatch)
{
_tcscpy(maxmatch, fname);
}
else
{
for (count = 0; maxmatch[count] && fname[count]; count++)
{
if (tolower(maxmatch[count]) != tolower(fname[count]))
{
perfectmatch = FALSE;
maxmatch[count] = 0;
break;
}
}
if (maxmatch[count] == _T('\0') &&
fname[count] != _T('\0'))
perfectmatch = FALSE;
}
}
while (FindNextFile (hFile, &file));
FindClose (hFile);
/* only quote if the filename contains spaces */
if (_tcschr(directory, _T(' ')) ||
_tcschr(maxmatch, _T(' ')))
{
str[start] = _T('\"');
_tcscpy (&str[start+1], directory);
_tcscat (&str[start], maxmatch);
_tcscat (&str[start], _T("\"") );
}
else
{
_tcscpy (&str[start], directory);
_tcscat (&str[start], maxmatch);
}
if(!perfectmatch)
{
MessageBeep (-1);
}
}
else
{
/* no match found - search for internal command */
for (cmds_ptr = cmds; cmds_ptr->name; cmds_ptr++)
{
if (!_tcsnicmp (&str[start], cmds_ptr->name,
_tcslen (&str[start])))
{
/* return the mach only if it is unique */
if (_tcsnicmp (&str[start], (cmds_ptr+1)->name, _tcslen (&str[start])))
_tcscpy (&str[start], cmds_ptr->name);
break;
}
}
MessageBeep (-1);
}
}
/*
* returns 1 if at least one match, else returns 0
*/
BOOL ShowCompletionMatches (LPTSTR str, INT charcount)
{
WIN32_FIND_DATA file;
HANDLE hFile;
BOOL found_dot = FALSE;
INT curplace = 0;
INT start;
UINT count;
TCHAR path[MAX_PATH];
TCHAR fname[MAX_PATH];
TCHAR directory[MAX_PATH];
UINT longestfname = 0;
SHORT screenwidth;
/* expand current file name */
count = charcount - 1;
if (count < 0)
count = 0;
/* find front of word */
if (str[count] == _T('"'))
{
count--;
while (count > 0 && str[count] != _T('"'))
count--;
}
else
{
while (count > 0 && str[count] != _T(' '))
count--;
}
/* if not at beginning, go forward 1 */
if (str[count] == _T(' '))
count++;
start = count;
if (str[count] == _T('"'))
count++; /* don't increment start */
/* extract directory from word */
_tcscpy (directory, &str[count]);
curplace = _tcslen (directory) - 1;
if (curplace >= 0 && directory[curplace] == _T('"'))
directory[curplace--] = _T('\0');
_tcscpy (path, directory);
while (curplace >= 0 &&
directory[curplace] != _T('\\') &&
directory[curplace] != _T(':'))
{
directory[curplace] = 0;
curplace--;
}
/* look for a . in the filename */
for (count = _tcslen (directory); path[count] != _T('\0'); count++)
{
if (path[count] == _T('.'))
{
found_dot = TRUE;
break;
}
}
if (found_dot)
_tcscat (path, _T("*"));
else
_tcscat (path, _T("*.*"));
/* current fname */
curplace = 0;
hFile = FindFirstFile (path, &file);
if (hFile != INVALID_HANDLE_VALUE)
{
/* Get the size of longest filename first. */
do
{
if (_tcslen(file.cFileName) > longestfname)
{
longestfname = _tcslen(file.cFileName);
/* Directories get extra brackets around them. */
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
longestfname += 2;
}
}
while (FindNextFile (hFile, &file));
FindClose (hFile);
hFile = FindFirstFile (path, &file);
/* Count the highest number of columns */
GetScreenSize(&screenwidth, 0);
/* For counting columns of output */
count = 0;
/* Increase by the number of spaces behind file name */
longestfname += 3;
/* find anything */
ConOutChar (_T('\n'));
do
{
/* ignore . and .. */
if (!_tcscmp (file.cFileName, _T(".")) ||
!_tcscmp (file.cFileName, _T("..")))
continue;
if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
_stprintf (fname, _T("[%s]"), file.cFileName);
else
_tcscpy (fname, file.cFileName);
ConOutPrintf (_T("%*s"), - longestfname, fname);
count++;
/* output as much columns as fits on the screen */
if (count >= (screenwidth / longestfname))
{
/* print the new line only if we aren't on the
* last column, in this case it wraps anyway */
if (count * longestfname != (UINT)screenwidth)
ConOutPrintf (_T("\n"));
count = 0;
}
}
while (FindNextFile (hFile, &file));
FindClose (hFile);
if (count)
ConOutChar (_T('\n'));
}
else
{
/* no match found */
MessageBeep (-1);
return FALSE;
}
return TRUE;
}
#endif
#ifdef FEATURE_4NT_FILENAME_COMPLETION
typedef struct _FileName
{
TCHAR Name[MAX_PATH];
} FileName;
VOID FindPrefixAndSuffix(LPTSTR strIN, LPTSTR szPrefix, LPTSTR szSuffix)
{
/* String that is to be examined */
TCHAR str[MAX_PATH];
/* temp pointers to used to find needed parts */
TCHAR * szSearch;
TCHAR * szSearch1;
TCHAR * szSearch2;
/* number of quotes in the string */
INT nQuotes = 0;
/* used in for loops */
UINT i;
/* Char number to break the string at */
INT PBreak = 0;
INT SBreak = 0;
/* when phrasing a string, this tells weather
you are inside quotes ot not. */
BOOL bInside = FALSE;
szPrefix[0] = _T('\0');
szSuffix[0] = _T('\0');
/* Copy over the string to later be edited */
_tcscpy(str,strIN);
/* Count number of " */
for(i = 0; i < _tcslen(str); i++)
if(str[i] == _T('\"'))
nQuotes++;
/* Find the prefix and suffix */
if(nQuotes % 2 && nQuotes >= 1)
{
/* Odd number of quotes. Just start from the last " */
/* THis is the way MS does it, and is an easy way out */
szSearch = _tcsrchr(str, _T('\"'));
/* Move to the next char past the " */
szSearch++;
_tcscpy(szSuffix,szSearch);
/* Find the one closest to end */
szSearch1 = _tcsrchr(str, _T('\"'));
szSearch2 = _tcsrchr(str, _T('\\'));
if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2))
szSearch = szSearch2;
else
szSearch = szSearch1;
/* Move one char past */
szSearch++;
szSearch[0] = _T('\0');
_tcscpy(szPrefix,str);
return;
}
if(!_tcschr(str, _T(' ')))
{
/* No spaces, everything goes to Suffix */
_tcscpy(szSuffix,str);
/* look for a slash just in case */
szSearch = _tcsrchr(str, _T('\\'));
if(szSearch)
{
szSearch++;
szSearch[0] = _T('\0');
_tcscpy(szPrefix,str);
}
else
{
szPrefix[0] = _T('\0');
}
return;
}
if(!nQuotes)
{
/* No quotes, and there is a space*/
/* Take it after the last space */
szSearch = _tcsrchr(str, _T(' '));
szSearch++;
_tcscpy(szSuffix,szSearch);
/* Find the closest to the end space or \ */
_tcscpy(str,strIN);
szSearch1 = _tcsrchr(str, _T(' '));
szSearch2 = _tcsrchr(str, _T('\\'));
if(szSearch2 != NULL && _tcslen(szSearch1) > _tcslen(szSearch2))
szSearch = szSearch2;
else
szSearch = szSearch1;
szSearch++;
szSearch[0] = _T('\0');
_tcscpy(szPrefix,str);
return;
}
/* All else fails and there is a lot of quotes, spaces and |
Then we search through and find the last space or \ that is
not inside a quotes */
for(i = 0; i < _tcslen(str); i++)
{
if(str[i] == _T('\"'))
bInside = !bInside;
if(str[i] == _T(' ') && !bInside)
SBreak = i;
if((str[i] == _T(' ') || str[i] == _T('\\')) && !bInside)
PBreak = i;
}
SBreak++;
PBreak++;
_tcscpy(szSuffix,&strIN[SBreak]);
strIN[PBreak] = _T('\0');
_tcscpy(szPrefix,strIN);
if(szPrefix[_tcslen(szPrefix) - 2] == _T('\"'))
{
/* need to remove the " right before a \ at the end to
allow the next stuff to stay inside one set of quotes
otherwise you would have multiple sets of quotes*/
_tcscpy(&szPrefix[_tcslen(szPrefix) - 2],_T("\\"));
}
}
int __cdecl compare(const void *arg1,const void *arg2)
{
FileName * File1;
FileName * File2;
INT ret;
File1 = malloc(sizeof(FileName));
File2 = malloc(sizeof(FileName));
if(!File1 || !File2)
return 0;
memcpy(File1,arg1,sizeof(FileName));
memcpy(File2,arg2,sizeof(FileName));
/* ret = _tcsicmp(File1->Name, File2->Name); */
ret = lstrcmpi(File1->Name, File2->Name);
free(File1);
free(File2);
return ret;
}
VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor)
{
/* Length of string before we complete it */
INT StartLength;
/* Length of string after completed */
INT EndLength;
/* The number of chars added too it */
static INT DiffLength = 0;
/* Used to find and assemble the string that is returned */
TCHAR szBaseWord[MAX_PATH];
TCHAR szPrefix[MAX_PATH];
TCHAR szOrginal[MAX_PATH];
TCHAR szSearchPath[MAX_PATH];
/* Save the strings used last time, so if they hit tab again */
static TCHAR LastReturned[MAX_PATH];
static TCHAR LastSearch[MAX_PATH];
static TCHAR LastPrefix[MAX_PATH];
/* Used to search for files */
HANDLE hFile;
WIN32_FIND_DATA file;
/* List of all the files */
FileName * FileList = NULL;
/* Number of files */
INT FileListSize = 0;
/* Used for loops */
UINT i;
/* Editable string of what was passed in */
TCHAR str[MAX_PATH];
/* Keeps track of what element was last selected */
static INT Sel;
BOOL NeededQuote = FALSE;
BOOL ShowAll = TRUE;
TCHAR * line = strIN;
strOut[0] = _T('\0');
while (_istspace (*line))
line++;
if(!_tcsnicmp (line, _T("rd "), 3) || !_tcsnicmp (line, _T("cd "), 3))
ShowAll = FALSE;
/* Copy the string, str can be edited and orginal should not be */
_tcscpy(str,strIN);
_tcscpy(szOrginal,strIN);
/* Look to see if the cusor is not at the end of the string */
if((cusor + 1) < _tcslen(str))
str[cusor] = _T('\0');
/* Look to see if they hit tab again, if so cut off the diff length */
if(_tcscmp(str,LastReturned) || !_tcslen(str))
{
/* We need to know how many chars we added from the start */
StartLength = _tcslen(str);
/* no string, we need all files in that directory */
if(!StartLength)
{
_tcscat(str,_T("*"));
}
/* Zero it out first */
szBaseWord[0] = _T('\0');
szPrefix[0] = _T('\0');
/*What comes out of this needs to be:
szBaseWord = path no quotes to the object
szPrefix = what leads up to the filename
no quote at the END of the full name */
FindPrefixAndSuffix(str,szPrefix,szBaseWord);
/* Strip quotes */
for(i = 0; i < _tcslen(szBaseWord); )
{
if(szBaseWord[i] == _T('\"'))
memmove(&szBaseWord[i],&szBaseWord[i + 1], _tcslen(&szBaseWord[i]) * sizeof(TCHAR));
else
i++;
}
/* clear it out */
memset(szSearchPath, 0, sizeof(szSearchPath));
/* Start the search for all the files */
GetFullPathName(szBaseWord, MAX_PATH, szSearchPath, NULL);
if(StartLength > 0)
{
_tcscat(szSearchPath,_T("*"));
}
_tcscpy(LastSearch,szSearchPath);
_tcscpy(LastPrefix,szPrefix);
}
else
{
_tcscpy(szSearchPath, LastSearch);
_tcscpy(szPrefix, LastPrefix);
StartLength = 0;
}
/* search for the files it might be */
hFile = FindFirstFile (szSearchPath, &file);
/* aseemble a list of all files names */
do
{
if(hFile == INVALID_HANDLE_VALUE)
{
/* Assemble the orginal string and return */
_tcscpy(strOut,szOrginal);
CloseHandle(hFile);
if(FileList != NULL)
free(FileList);
return;
}
if(!_tcscmp (file.cFileName, _T(".")) ||
!_tcscmp (file.cFileName, _T("..")))
continue;
/* Don't show files when they are doing 'cd' or 'rd' */
if(!ShowAll &&
file.dwFileAttributes != 0xFFFFFFFF &&
!(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
continue;
}
/* Add the file to the list of files */
if(FileList == NULL)
{
FileListSize = 1;
FileList = malloc(FileListSize * sizeof(FileName));
}
else
{
FileListSize++;
FileList = realloc(FileList, FileListSize * sizeof(FileName));
}
if(FileList == NULL)
{
/* Assemble the orginal string and return */
_tcscpy(strOut,szOrginal);
CloseHandle(hFile);
ConOutFormatMessage (GetLastError());
return;
}
/* Copies the file name into the struct */
_tcscpy(FileList[FileListSize-1].Name,file.cFileName);
}while(FindNextFile(hFile,&file));
/* Check the size of the list to see if we
found any matches */
if(FileListSize == 0)
{
_tcscpy(strOut,szOrginal);
CloseHandle(hFile);
if(FileList != NULL)
free(FileList);
return;
}
/* Sort the files */
qsort(FileList,FileListSize,sizeof(FileName), compare);
/* Find the next/previous */
if(!_tcscmp(szOrginal,LastReturned))
{
if(bNext)
{
if(FileListSize - 1 == Sel)
Sel = 0;
else
Sel++;
}
else
{
if(!Sel)
Sel = FileListSize - 1;
else
Sel--;
}
}
else
{
Sel = 0;
}
/* nothing found that matched last time
so return the first thing in the list */
strOut[0] = _T('\0');
/* space in the name */
if(_tcschr(FileList[Sel].Name, _T(' ')))
{
INT LastSpace;
BOOL bInside;
/* It needs a " at the end */
NeededQuote = TRUE;
LastSpace = -1;
bInside = FALSE;
/* Find the place to put the " at the start */
for(i = 0; i < _tcslen(szPrefix); i++)
{
if(szPrefix[i] == _T('\"'))
bInside = !bInside;
if(szPrefix[i] == _T(' ') && !bInside)
LastSpace = i;
}
/* insert the quoation and move things around */
if(szPrefix[LastSpace + 1] != _T('\"') && LastSpace != -1)
{
memmove ( &szPrefix[LastSpace+1], &szPrefix[LastSpace], (_tcslen(szPrefix)-LastSpace+1) * sizeof(TCHAR) );
if((UINT)(LastSpace + 1) == _tcslen(szPrefix))
{
_tcscat(szPrefix,_T("\""));
}
szPrefix[LastSpace + 1] = _T('\"');
}
else if(LastSpace == -1)
{
_tcscpy(szBaseWord,_T("\""));
_tcscat(szBaseWord,szPrefix);
_tcscpy(szPrefix,szBaseWord);
}
}
_tcscpy(strOut,szPrefix);
_tcscat(strOut,FileList[Sel].Name);
/* check for odd number of quotes means we need to close them */
if(!NeededQuote)
{
for(i = 0; i < _tcslen(strOut); i++)
if(strOut[i] == _T('\"'))
NeededQuote = !NeededQuote;
}
if(szPrefix[_tcslen(szPrefix) - 1] == _T('\"') || NeededQuote)
_tcscat(strOut,_T("\""));
_tcscpy(LastReturned,strOut);
EndLength = _tcslen(strOut);
DiffLength = EndLength - StartLength;
CloseHandle(hFile);
if(FileList != NULL)
free(FileList);
}
#endif

View file

@ -0,0 +1,57 @@
Archive Contents
~~~~~~~~~~~~~~~~
files.txt This file list
history.txt History of revsions. Not to date. see svn.reactos.com for more info.
license.txt GNU license - applies to all files named here
readme.txt General shell info
readme2.txt Techincal shell info
todo.txt Things that need to be implmented or fixed(including bugs)
alias.c Alias code
alias.h Alias header file
attrib.c Implements attrib command
batch.c Batch file interpreter
beep.c Implements beep command
call.c Implements call command
chcp.c Implements chcp command
choice.c Implements choice command
cls.c Implements cls command
cmdinput.c Command-line input functions
cmdtable.c Table of available internal commands
cmd.c Main code for command-line interpreter
cmd.h Command header file
color.c Implements color command
console.c Windows console handling code
copy.c Implements copy command
date.c Implements date command
del.c Implements del command
dir.c Directory listing code
dirstack.c Directory stack code (PUSHD and POPD)
echo.c Implements echo command
error.c Error Message Routines
filecomp.c Filename completion functions
for.c Implements for command
free.c Implements free command
goto.c Implements goto command
history.c Command-line history handling
if.c Implements if command
internal.c Internal commands (DIR, RD, CD, etc)
label.c Implements label command
locale.c Locale handling code
memory.c Implements memory command
misc.c Misc. Functions
msgbox.c Implements msgbox command
move.c Implements move command
path.c Implements path command
pause.c Implements pause command
prompt.c Prompt handling functions
redir.c Redirection and piping parsing functions
ren.c Implements rename command
set.c Implements set command
shift.c Implements shift command
time.c Implements time command
timer.c Implements timer command
type.c Implements type command
ver.c Implements ver command
where.c Code to search path for executables
verify.c Implements verify command

View file

@ -0,0 +1,152 @@
/*
* FOR.C - for internal batch command.
*
*
* History:
*
* 16-Jul-1998 (Hans B Pufal)
* Started.
*
* 16-Jul-1998 (John P Price)
* Seperated commands into individual files.
*
* 19-Jul-1998 (Hans B Pufal)
* Implementation of FOR.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* Added config.h include.
*
* 20-Jan-1999 (Eric Kohl)
* Unicode and redirection safe!
*
* 01-Sep-1999 (Eric Kohl)
* Added help text.
*
* 23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.se>)
* Implemented preservation of echo flag. Some other for related
* code in other files fixed, too.
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
/*
* Perform FOR command.
*
* First check syntax is correct : FOR %v IN ( <list> ) DO <command>
* v must be alphabetic, <command> must not be empty.
*
* If all is correct build a new bcontext structure which preserves
* the necessary information so that readbatchline can expand
* each the command prototype for each list element.
*
* You might look on a FOR as being a called batch file with one line
* per list element.
*/
INT cmd_for (LPTSTR cmd, LPTSTR param)
{
LPBATCH_CONTEXT lpNew;
LPTSTR pp;
TCHAR var;
TCHAR szMsg[RC_STRING_MAX_SIZE];
#ifdef _DEBUG
DebugPrintf (_T("cmd_for (\'%s\', \'%s\'\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_FOR_HELP1);
return 0;
}
/* Check that first element is % then an alpha char followed by space */
if ((*param != _T('%')) || !_istalpha (*(param + 1)) || !_istspace (*(param + 2)))
{
LoadString( CMD_ModuleHandle, STRING_FOR_ERROR, szMsg, RC_STRING_MAX_SIZE);
error_syntax (szMsg);
return 1;
}
param++;
var = *param++; /* Save FOR var name */
while (_istspace (*param))
param++;
/* Check next element is 'IN' */
if ((_tcsnicmp (param, _T("in"), 2) != 0) || !_istspace (*(param + 2)))
{
LoadString(CMD_ModuleHandle, STRING_FOR_ERROR1, szMsg, RC_STRING_MAX_SIZE);
error_syntax(szMsg);
return 1;
}
param += 2;
while (_istspace (*param))
param++;
/* Folowed by a '(', find also matching ')' */
if ((*param != _T('(')) || (NULL == (pp = _tcsrchr (param, _T(')')))))
{
LoadString(CMD_ModuleHandle, STRING_FOR_ERROR2, szMsg, RC_STRING_MAX_SIZE);
error_syntax(szMsg);
return 1;
}
*pp++ = _T('\0');
param++; /* param now points at null terminated list */
while (_istspace (*pp))
pp++;
/* Check DO follows */
if ((_tcsnicmp (pp, _T("do"), 2) != 0) || !_istspace (*(pp + 2)))
{
LoadString(CMD_ModuleHandle, STRING_FOR_ERROR3, szMsg, RC_STRING_MAX_SIZE);
error_syntax(szMsg);
return 1;
}
pp += 2;
while (_istspace (*pp))
pp++;
/* Check that command tail is not empty */
if (*pp == _T('\0'))
{
LoadString(CMD_ModuleHandle, STRING_FOR_ERROR4, szMsg, RC_STRING_MAX_SIZE);
error_syntax(szMsg);
return 1;
}
/* OK all is correct, build a bcontext.... */
lpNew = (LPBATCH_CONTEXT)malloc (sizeof (BATCH_CONTEXT));
lpNew->prev = bc;
bc = lpNew;
bc->hBatchFile = INVALID_HANDLE_VALUE;
bc->ffind = NULL;
bc->params = BatchParams (_T(""), param); /* Split out list */
bc->shiftlevel = 0;
bc->forvar = var;
bc->forproto = _tcsdup (pp);
if (bc->prev)
bc->bEcho = bc->prev->bEcho;
else
bc->bEcho = bEcho;
bc->In[0] = _T('\0');
bc->Out[0] = _T('\0');
bc->Err[0] = _T('\0');
return 0;
}
/* EOF */

View file

@ -0,0 +1,124 @@
/*
* FREE.C - internal command.
*
*
* History:
*
* 01-Sep-1999 (Eric Kohl)
* Started.
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_FREE
static VOID
PrintDiskInfo (LPTSTR szDisk)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szRootPath[4] = _T("A:\\");
TCHAR szDrive[2] = _T("A");
TCHAR szVolume[64];
TCHAR szSerial[10];
TCHAR szTotal[40];
TCHAR szUsed[40];
TCHAR szFree[40];
DWORD dwSerial;
ULARGE_INTEGER uliSize;
DWORD dwSecPerCl;
DWORD dwBytPerSec;
DWORD dwFreeCl;
DWORD dwTotCl;
if (_tcslen (szDisk) < 2 || szDisk[1] != _T(':'))
{
LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg);
return;
}
szRootPath[0] = szDisk[0];
szDrive[0] = _totupper (szRootPath[0]);
if (!GetVolumeInformation (szRootPath, szVolume, 64, &dwSerial,
NULL, NULL, NULL, 0))
{
LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(_T("%s %s:\n"), szMsg, szDrive);
return;
}
if (szVolume[0] == _T('\0'))
{
LoadString(CMD_ModuleHandle, STRING_FREE_ERROR2, szMsg, RC_STRING_MAX_SIZE);
_tcscpy (szVolume, szMsg);
}
_stprintf (szSerial,
_T("%04X-%04X"),
HIWORD(dwSerial),
LOWORD(dwSerial));
if (!GetDiskFreeSpace (szRootPath, &dwSecPerCl,
&dwBytPerSec, &dwFreeCl, &dwTotCl))
{
LoadString(CMD_ModuleHandle, STRING_FREE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf (_T("%s %s:\n"), szMsg, szDrive);
return;
}
uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwTotCl;
ConvertULargeInteger (uliSize, szTotal, 40, TRUE);
uliSize.QuadPart = dwSecPerCl * dwBytPerSec * (dwTotCl - dwFreeCl);
ConvertULargeInteger (uliSize, szUsed, 40, TRUE);
uliSize.QuadPart = dwSecPerCl * dwBytPerSec * dwFreeCl;
ConvertULargeInteger (uliSize, szFree, 40, TRUE);
LoadString(CMD_ModuleHandle, STRING_FREE_HELP1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, szDrive, szVolume, szSerial, szTotal, szUsed, szFree);
}
INT CommandFree (LPTSTR cmd, LPTSTR param)
{
LPTSTR szParam;
TCHAR szDefPath[MAX_PATH];
INT argc, i;
LPTSTR *arg;
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_FREE_HELP2);
return 0;
}
if (!param || *param == _T('\0'))
{
GetCurrentDirectory (MAX_PATH, szDefPath);
szDefPath[2] = _T('\0');
szParam = szDefPath;
}
else
szParam = param;
arg = split (szParam, &argc, FALSE);
for (i = 0; i < argc; i++)
PrintDiskInfo (arg[i]);
freep (arg);
return 0;
}
#endif /* INCLUDE_CMD_FREE */
/* EOF */

View file

@ -0,0 +1,127 @@
/*
* GOTO.C - goto internal batch command.
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* started.
*
* 16 Jul 1998 (John P Price)
* Seperated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 28 Jul 1998 (Hans B Pufal) [HBP_003]
* Terminate label on first space character, use only first 8 chars of
* label string
*
* 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
*
* 27-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
/*
* Perform GOTO command.
*
* Only valid if batch file current.
*
*/
INT cmd_goto (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LPTSTR tmp;
LONG lNewPosHigh;
#ifdef _DEBUG
DebugPrintf (_T("cmd_goto (\'%s\', \'%s\'\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_GOTO_HELP1);
return 0;
}
/* if not in batch -- error!! */
if (bc == NULL)
{
return 1;
}
if (*param == _T('\0'))
{
LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ExitBatch(szMsg);
return 1;
}
/* terminate label at first space char */
tmp = param+1;
while (!_istcntrl (*tmp) && !_istspace (*tmp) && (*tmp != _T(':')))
tmp++;
*(tmp) = _T('\0');
/* set file pointer to the beginning of the batch file */
lNewPosHigh = 0;
/* jump to end of the file */
if ( _tcsicmp( param, _T(":eof"))==0)
{
SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_END);
return 0;
}
/* jump to begin of the file */
SetFilePointer (bc->hBatchFile, 0, &lNewPosHigh, FILE_BEGIN);
while (FileGetString (bc->hBatchFile, textline, sizeof(textline) / sizeof(textline[0])))
{
int pos;
int size;
/* Strip out any trailing spaces or control chars */
tmp = textline + _tcslen (textline) - 1;
while (_istcntrl (*tmp) || _istspace (*tmp) || (*tmp == _T(':')))
tmp--;
*(tmp + 1) = _T('\0');
/* Then leading spaces... */
tmp = textline;
while (_istspace (*tmp))
tmp++;
/* All space after leading space terminate the string */
size = _tcslen(tmp) -1;
pos=0;
while (tmp+pos < tmp+size)
{
if (_istspace(tmp[pos]))
tmp[pos]=_T('\0');
pos++;
}
/* use whole label name */
if ((*tmp == _T(':')) && (_tcsicmp (++tmp, param) == 0))
return 0;
}
LoadString(CMD_ModuleHandle, STRING_GOTO_ERROR2, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, param);
ExitBatch(NULL);
return 1;
}
/* EOF */

View file

@ -0,0 +1,486 @@
/*
* HISTORY.C - command line history.
*
*
* History:
*
* 14/01/95 (Tim Norman)
* started.
*
* 08/08/95 (Matt Rains)
* i have cleaned up the source code. changes now bring this source
* into guidelines for recommended programming practice.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 25-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Cleanup!
* Unicode and redirection safe!
*
* 25-Jan-1999 (Paolo Pantaleo <paolopan@freemail.it>)
* Added lots of comments (beginning studying the source)
* Added command.com's F3 support (see cmdinput.c)
*
*/
/*
* HISTORY.C - command line history. Second version
*
*
* History:
*
* 06/12/99 (Paolo Pantaleo <paolopan@freemail.it>)
* started.
*
*/
#include <precomp.h>
#ifdef FEATURE_HISTORY
typedef struct tagHISTORY
{
struct tagHISTORY *prev;
struct tagHISTORY *next;
LPTSTR string;
} HIST_ENTRY, * LPHIST_ENTRY;
static INT size,
max_size=100;
static LPHIST_ENTRY Top;
static LPHIST_ENTRY Bottom;
static LPHIST_ENTRY curr_ptr=0;
VOID InitHistory(VOID);
VOID History_move_to_bottom(VOID);
VOID History (INT dir, LPTSTR commandline);
VOID CleanHistory(VOID);
VOID History_del_current_entry(LPTSTR str);
/*service functions*/
static VOID del(LPHIST_ENTRY item);
static VOID add_at_bottom(LPTSTR string);
/*VOID add_before_last(LPTSTR string);*/
VOID set_size(INT new_size);
INT CommandHistory (LPTSTR cmd, LPTSTR param)
{
LPTSTR tmp;
INT tmp_int;
LPHIST_ENTRY h_tmp;
TCHAR szBuffer[2048];
tmp=_tcschr(param,_T('/'));
if (tmp)
{
param=tmp;
switch (_totupper(param[1]))
{
case _T('F'):/*delete history*/
CleanHistory();InitHistory();
break;
case _T('R'):/*read history from standard in*/
//hIn=GetStdHandle (STD_INPUT_HANDLE);
for(;;)
{
ConInString(szBuffer,sizeof(szBuffer)/sizeof(TCHAR));
if (*szBuffer!=_T('\0'))
History(0,szBuffer);
else
break;
}
break;
case _T('A'):/*add an antry*/
History(0,param+2);
break;
case _T('S'):/*set history size*/
if ((tmp_int=_ttoi(param+2)))
set_size(tmp_int);
break;
default:
return 1;
}
}
else
{
for (h_tmp = Top->prev; h_tmp != Bottom; h_tmp = h_tmp->prev)
ConErrPuts(h_tmp->string);
}
return 0;
}
VOID set_size(INT new_size)
{
while (new_size<size)
del(Top->prev);
max_size=new_size;
}
VOID InitHistory(VOID)
{
size=0;
Top = malloc(sizeof(HIST_ENTRY));
Bottom = malloc(sizeof(HIST_ENTRY));
Top->prev = Bottom;
Top->next = NULL;
Top->string = NULL;
Bottom->prev = NULL;
Bottom->next = Top;
Bottom->string = NULL;
curr_ptr=Bottom;
}
VOID CleanHistory(VOID)
{
while (Bottom->next!=Top)
del(Bottom->next);
free(Top);
free(Bottom);
}
VOID History_del_current_entry(LPTSTR str)
{
LPHIST_ENTRY tmp;
if (size == 0)
return;
if (curr_ptr == Bottom)
curr_ptr=Bottom->next;
if (curr_ptr == Top)
curr_ptr=Top->prev;
tmp = curr_ptr;
curr_ptr = curr_ptr->prev;
del(tmp);
History(-1, str);
}
static
VOID del(LPHIST_ENTRY item)
{
if (item==NULL || item==Top || item==Bottom)
{
#ifdef _DEBUG
DebugPrintf(_T("del in ") _T(__FILE__) _T(": retrning\n")
_T("item is 0x%08x (Bottom is0x%08x)\n"),
item, Bottom);
#endif
return;
}
/*free string's mem*/
if (item->string)
free(item->string);
/*set links in prev and next item*/
item->next->prev=item->prev;
item->prev->next=item->next;
free(item);
size--;
}
#if 0
static
VOID add_before_last(LPTSTR string)
{
LPHIST_ENTRY tmp,before,after;
/*delete first entry if maximum number of entries is reached*/
while(size>=max_size)
del(Top->prev);
while (_istspace(*string))
string++;
if (*string==_T('\0'))
return;
/*allocte entry and string*/
tmp=malloc(sizeof(HIST_ENTRY));
tmp->string=malloc((_tcslen(string)+1)*sizeof(TCHAR));
_tcscpy(tmp->string,string);
/*set links*/
before=Bottom->next;
after=before->next;
tmp->prev=before;
tmp->next=after;
after->prev=tmp;
before->next=tmp;
/*set new size*/
size++;
}
#endif/*0*/
static
VOID add_at_bottom(LPTSTR string)
{
LPHIST_ENTRY tmp;
/*delete first entry if maximum number of entries is reached*/
while(size>=max_size)
del(Top->prev);
while (_istspace(*string))
string++;
if (*string==_T('\0'))
return;
/*if new entry is the same than the last do not add it*/
if(size)
if(_tcscmp(string,Bottom->next->string)==0)
return;
/*fill bottom with string, it will become Bottom->next*/
Bottom->string=malloc((_tcslen(string)+1)*sizeof(TCHAR));
_tcscpy(Bottom->string,string);
/*save Bottom value*/
tmp=Bottom;
/*create new void Bottom*/
Bottom=malloc(sizeof(HIST_ENTRY));
Bottom->next=tmp;
Bottom->prev=NULL;
Bottom->string=NULL;
tmp->prev=Bottom;
/*set new size*/
size++;
}
VOID History_move_to_bottom(VOID)
{
curr_ptr=Bottom;
}
VOID History (INT dir, LPTSTR commandline)
{
if(dir==0)
{
add_at_bottom(commandline);
curr_ptr=Bottom;
return;
}
if (size==0)
{
commandline[0]=_T('\0');
return;
}
if(dir<0)/*key up*/
{
if (curr_ptr->next==Top || curr_ptr==Top)
{
#ifdef WRAP_HISTORY
curr_ptr=Bottom;
#else
curr_ptr=Top;
commandline[0]=_T('\0');
return;
#endif
}
curr_ptr = curr_ptr->next;
if(curr_ptr->string)
_tcscpy(commandline,curr_ptr->string);
}
if(dir>0)
{
if (curr_ptr->prev==Bottom || curr_ptr==Bottom)
{
#ifdef WRAP_HISTORY
curr_ptr=Top;
#else
curr_ptr=Bottom;
commandline[0]=_T('\0');
return;
#endif
}
curr_ptr=curr_ptr->prev;
if(curr_ptr->string)
_tcscpy(commandline,curr_ptr->string);
}
}
#if 0
LPTSTR history = NULL; /*buffer to sotre all the lines*/
LPTSTR lines[MAXLINES]; /*array of pointers to each line(entry)*/
/*located in history buffer*/
INT curline = 0; /*the last line recalled by user*/
INT numlines = 0; /*number of entries, included the last*/
/*empty one*/
INT maxpos = 0; /*index of last byte of last entry*/
VOID History (INT dir, LPTSTR commandline)
{
INT count; /*used in for loops*/
INT length; /*used in the same loops of count*/
/*both to make room when is full
either history or lines*/
/*first time History is called allocate mem*/
if (!history)
{
history = malloc (history_size * sizeof (TCHAR));
lines[0] = history;
history[0] = 0;
}
if (dir > 0)
{
/* next command */
if (curline < numlines)
{
curline++;
}
if (curline == numlines)
{
commandline[0] = 0;
}
else
{
_tcscpy (commandline, lines[curline]);
}
}
else if (dir < 0)
{
/* prev command */
if (curline > 0)
{
curline--;
}
_tcscpy (commandline, lines[curline]);
}
else
{
/* add to history */
/* remove oldest string until there's enough room for next one */
/* strlen (commandline) must be less than history_size! */
while ((maxpos + (INT)_tcslen (commandline) + 1 > history_size) || (numlines >= MAXLINES))
{
length = _tcslen (lines[0]) + 1;
for (count = 0; count < maxpos && count + (lines[1] - lines[0]) < history_size; count++)
{
history[count] = history[count + length];
}
maxpos -= length;
for (count = 0; count <= numlines && count < MAXLINES; count++)
{
lines[count] = lines[count + 1] - length;
}
numlines--;
#ifdef DEBUG
ConOutPrintf (_T("Reduced size: %ld lines\n"), numlines);
for (count = 0; count < numlines; count++)
{
ConOutPrintf (_T("%d: %s\n"), count, lines[count]);
}
#endif
}
/*copy entry in the history bufer*/
_tcscpy (lines[numlines], commandline);
numlines++;
/*set last lines[numlines] pointer next the end of last, valid,
just setted entry (the two lines above)*/
lines[numlines] = lines[numlines - 1] + _tcslen (commandline) + 1;
maxpos += _tcslen (commandline) + 1;
/* last line, empty */
curline = numlines;
}
return;
}
#endif
#endif //#if 0

View file

@ -0,0 +1,367 @@
FreeDOS Command Line Interface Development History
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11/11/94 version 0.01
~~~~~~~~~~~~~~~~~~~~~
o initial release.
01/01/95 version 0.10
~~~~~~~~~~~~~~~~~~~~~
o removed some scaffolding.
o modified CD.
o added tab file completion.
o added command line history.
01/15/95 version 0.20
~~~~~~~~~~~~~~~~~~~~~
o formatted all existing source modules.
o added prompt support.
o added drive selection.
o added dir command.
o started this development log.
08/06/95 prerelease of version 0.30
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o reorganized code into separate source modules.
o added batch processing support (thanks to Evan Jeffrey).
o added exec code (thanks to Steffan Kaiser).
o removed environment handling (thanks again to Steffan Kaiser)
[ 08/08/95 -- Matt Rains ]
o formatted this development log.
o formatted all existing source modules so that they comply with recommended
programming practice.
o added MD command.
o added RD command.
o added VER command.
o replaced CD command.
o modified DIR command.
o DIR now called regardless of other DIR.??? files. this is done because of
exec() problems.
12/10/95 version 0.30
~~~~~~~~~~~~~~~~~~~~~
o used Borland's spawnve to fix exec problem
o fixed CD again so you don't need a space after it
o couple of spelling fixes
12/14/95 version 0.31
~~~~~~~~~~~~~~~~~~~~~
o modified cmdinput.c to work with non-standard screen sizes (see 28.com)
o fixed a bug in history.c that made it not work when you hit the up arrow
on the first line
o fixed DIR to work a little more like MS-DOS's DIR (see internal.c)
o fixed some code in where.c to make things a bit more efficient and nicer
01/06/96 version 0.40 (never released)
~~~~~~~~~~~~~~~~~~~~~
o added redirection and piping support!!! (see redir.c and command.c)
o fixed a stupid pointer problem in where.c that was causing LOTS of
problems in the strangest places...
o added day of the week support to prompt.c (oops, that was already supposed
to be there! :)
o fixed and reorganized the EXEC code!!! Thanks to Svante Frey!
o reorganized command.c and internal.c to handle parsing internal commands
more efficiently and consistently.
o changed the behavior of MD, CD, RD to work without spaces (e.g. CD\DOS)
o small changes here and there to make it work with redirection/piping
(e.g. DIR only pauses if you're not doing redirection)
01/17/96 version 0.50
~~~~~~~~~~~~~~~~~~~~~
Version 0.40 was never released because I was home on Christmas vacation,
and I couldn't upload it. By the time I got back to school, I had the
LOADHIGH patch from Svante Frey, so I decided to jump up to 0.50 without any
release of 0.40... - Tim Norman
o LOADHIGH/LOADFIX/LH support added!!!! Many thanks go to Svante Frey!
o bug fixed in command parsing that didn't handle / switches correctly...
o removed debugging output from history.c
07/26/96 version 0.60
~~~~~~~~~~~~~~~~~~~~~
Lots of internal changes here... Not much added to the interface.
o Changed internals to use first,rest parameters instead of arrays of params
o Fixed some bugs
o Some other things I don't remember :)
07/26/96 version 0.61
~~~~~~~~~~~~~~~~~~~~~
Bugfixes
o Added hook to the PATH command
o Fixed CD.. bug
08/27/96 version 0.70
~~~~~~~~~~~~~~~~~~~~~
Finally added Oliver Mueller's ALIAS command! Also numerous bug fixes.
o Added ALIAS command
o Removed support for - as a switch in LOADHIGH.C
o Bugfixes in BATCH.C. %0 was returning garbage
o Removed lots of unused variables, reducing # of warnings when compiling
o Other miscellaneous code clean-ups
o Changed WHERE.C to use a little less memory
06/14/97 version 0.71
~~~~~~~~~~~~~~~~~~~~~
Lots of bug fixes, plus some additional features.
o New DIR command. Now more like MS-DOS's DIR. /p supported, /s coming soon
o bug fix in internal.c - parse_firstarg
o Rewrote parser in batch.c (Steffan Kaiser)
o Ctrl-Break checking in various places (Steffan Kaiser)
o Error level setting/checking (%? in batch files) (Steffan Kaiser)
o bug fix in cmdinput.c ("%i" on command-line caused weird behavior)
o bug fix in where.c (first item in path wasn't searched)
07/12/97 version 0.72
~~~~~~~~~~~~~~~~~~~~~
More bug fixes and code cleanup
o Rewrote cmdinput.c to be more efficient (Marc Desrochers)
o Added insert/overstrike modes (Marc Desrochers)
o Replaced findxy() with pointers into BIOS (maxx, maxy) (Marc Desrochers)
o Fixed bug that disallowed listing of root directories
o Fixed bug that didn't search the first path (again!)
07/13/97 version 0.72b
~~~~~~~~~~~~~~~~~~~~~~
Disabled a feature that caused a crash on some machines.
o Replaced setcursor calls in cmdinput.c with _setcursortype
o Added dir.c to the distribution (was left out in 0.72)
07/01/98 version 0.73 (Rob Lake)
~~~~~~~~~~~~~~~~~~~~~~
o New DIR commands supported: /S, /B, /L, /A and /W.
(/R changed to /S). Also /? added.
o Supports DIRCMD in environment.
o Supports turning off commands with hyphen (ex. /-S
turns off recursive listing)
o Changed error messages for DIR and DEL to more MS-DOS'ish
o Moved error messages from DIR.C and DEL.C to COMMAND.H
(more may go there soon)
o Fixed bug that caused dir *.ext/X not to work (no spaces
between filespec and slash)
o Added wildcard support for DEL command
o Added prompt and help switch for DEL command, /P and /?
respectively.
o Added support for /C when envoking the shell
o Added /P support when Kernel loads shell. This means
the shell now is permanent and runs the autoexec.bat
(/E is not implemented)
o Added my name (Rob Lake) to the developer listing
o Changed version routine to print out copyright notice
with no args, and with appropriate switches, warranty
and redistribution notices and developer listing
07/08/1998 version 0.74 (John P. Price (linux-guru@gcfl.net))
~~~~~~~~~~~~~~~~~~~~~~~~
COMMAND.C/COMMAND.H:
o Now sets COMSPEC environment variable
o misc clean up and optimization
o added date, time and type commands
o changed to using spawnl instead of exec. exec does not copy the
environment to the child process!
DIR.C
o removed extra returns; closer to MSDOS
o fixed wide display so that an extra return is not displayed when
there is five filenames in the last line.
ENVIRON.C
o commented out show_environment function. Not used anymore.
INTERAL.C
o removed call to show_environment in set command.
o moved test for syntax before allocating memory in set command.
o misc clean up and optimization.
o created DATE.C
o created TIME.C
o created TYPE.C
07/08/1998 version 0.74b (John P. Price (linux-guru@gcfl.net))
~~~~~~~~~~~~~~~~~~~~~~~~
COMMAND.C
o fixed call to spawnl so that it would pass command line arguments
correctly.
07/12/98 version 0.74c (Rob Lake rlake@cs.mun.ca)
~~~~~~~~~~~~~~~~~~~~~~
Various Files:
o removed redundant use of error message defines and moved
error printing calls to ERROR.C to reduced program size.
o created MISC.C
o created ERR_HAND.C/H
o created ERROR.C
07/13/98 version 0.74d (Rob Lake rlake@cs.mun.ca)
~~~~~~~~~~~~~~~~~~~~~~
INTERNAL.C
o removed most of the commands and placed them in there own file
-- del, ren, set and ver
o created DEL.C, REN.C SET.C and VER.C
o fixed bug that caused del not to delete files with no attributes
o the critical error handler count number of times called, autofails
at 5 calls
16 Jul 1998 (Hans B Pufal <hansp@digiweb.com>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
batch.c
A new version, implements CALL, ECHO, GOT, IF, PAUSE, SHIFT and
BEEP. There is a stub for FOR but that's all.
cmdtable.c
New file to keep the internal command table. I plan on getting rid
of the table real soon now and replacing it with a dynamic
mechanism.
command.c
A new (improved ;) version. Conforms closely to MS-DOS specs.
Cleaned up (and fixed) the redirection handler.
command.h
Version D with changes. Look for the HBP tag.
redir.c
Modified file, now supports append redirects.
16 Jul 1998 (Rob Lake rlake@cs.mun.ca)
~~~~~~~~~~~~~~~~~~~~~~
Added TRUENAME command.
19 Jul 1998 (Hans B Pufal) <hansp@digiweb.com>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Preserve state of echo flag across batch calls.
o Implementation of FOR command
20 Jul 1998 (John P Price <linux-guru@gcfl.net>)
~~~~~~~~~~~~~~~~~~~~~~
o Fixed bug in DATE.C.
o Fixed bug in LH.ASM.
o Separated commands into individual files.
28 Jul 1998 (John P Price <linux-guru@gcfl.net>)
~~~~~~~~~~~~~~~~~~~~~~
o Added CLS command.
o Put ifdef's around all commands and added include file config.h
Now you can define exact what commands you want to include in
command.com.
o Also added ifdefs for optional features: aliases, command history
and filename completion.
o Added display of available internal commands and options at startup.
29 Jul 1998 (Rob Lake rlake@cs.mun.ca)
~~~~~~~~~~~~~~~~~~~~~~
o changed date.c and time.c, and wrote datefunc.c and timefunc.c to
impliment _dos_getdate, _dos_setdate, _dos_gettime and _dos_settime.
This is the first of many steps to make the shell compatible under
Pacific C.
30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
~~~~~~~~~~~~~~~~~~~~~~
o Changed filename completion so that a second TAB displays a list of
matching filenames!
o made filename be lower case if last character typed is lower case.
o Moved filename completion code to filecomp.c.
o Change ver command to display email address to report bugs, and the
web page address for updates.
o fixed so that it find_which returns NULL if filename is not
executable (does not have .bat, .com, or .exe extension). Before
command would to execute any file with any extension. (opps!)
30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
~~~~~~~~~~~~~~~~~~~~~~
o Fixed bug where if you typed something, then hit HOME, then tried to
type something else in insert mode, it locked up.
o Changed default insert mode to on. There should be a way to change
this. Maybe options to doskey command.
o Added VERIFY command
02-Aug-1998 (Hans B Pufal) <hansp@digiweb.com>)
~~~~~~~~~~~~~~~~~~~~~~
o batch.c: Fixed bug in ECHO flag restoration at exit from batch file
o command.c: Fixed return value when called with /C option
o Terminate label on first space character, use only first 8 chars of
label string
04-Aug-1998 (Hans B Pufal) <hansp@digiweb.com>)
~~~~~~~~~~~~~~~~~~~~~~
o call.c: added lines to initialize for pointers. This fixed the
lock-up that happened sometimes when calling a batch file from
another batch file.
07-Aug-1998 (John P Price <linux-guru@gcfl.net>)
~~~~~~~~~~~~~~~~~~~~~~
o Fixed carrage return output to better match MSDOS with echo on or off.
07-Dec-1998 ReactOS CMD version 0.0.1 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o First test release.
o Added internal ATTRIB command.
11-Dec-1998 ReactOS CMD version 0.0.2 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Fixed bug in ALIAS. CMD crashed when you tried to remove an alias.
o Fixed bug in split(). Added freep(). This fixed the DEL command.
o Improved ATTRIB command.
o Added most help texts.
o Fixed recursive DIR ("dir /s").
o Fixed DATE and TIME command. Now they accept values when used
without parameter.
o Implemented LABEL command.
05-Jan-1999 ReactOS CMD version 0.0.3 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Added COLOR command and "/t" option.
o Cursor shows insert/overwrite mode.
o COMSPEC environment variable is set upon startup.
o Started COPY command.
o Started MOVE command.
o Added directory stack (PUSHD and POPD commands).
o Added support for file names or paths that contain spaces
(quoted paths / file names).
o Added recursion to ATTRIB command.
o Added locale support for DIR, DATE, TIME and PROMPT.
o Fixed VERIFY.
10-Feb-1999 ReactOS CMD version 0.0.4 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o "?" lists all available commands.
o Most commands are unicode and redirection aware now.
o Input-, Output- and Error-Redirections works with most commands.
o ATTRIB and DEL can handle multiple filenames now.
o Fixed handling of environment variables.
o Added CHCP command.
o Fixed keyboard input bug.
o Rewrote DEL and MOVE commands.
28-Dec-1999 ReactOS CMD version 0.1 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Cleaned up DIR command.
o Searching for executables in the right order.
o Fixed some little but nasty bugs.
o Added TITLE command. Thanks to Emanuele Aliberti!
o Added "/Q", "/W" and "/Z" options to DEL command.
o Added CHOICE, TIMER, FREE and MEMORY commands.
o Added MSGBOX command (not available under ReactOS).
o Added and fixed missing help texts.
o Fixed bugs in MD and RD that crashed cmd when no directory was specified.
o Improved history support.
o Improved COLOR command.
09-Apr-2000 ReactOS CMD version 0.1 (EricKohl <ekohl@rz-online.de>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Fixed bug in COPY command. CMD crashed if source file didn't exist.
13-Jul-2000 ReactOS CMD version 0.1.1 (EricKohl <ekohl@rz-online.de>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
o Implemented 'ECHO.' and 'ECHOERR.' commands.

213
reactos/base/shell/cmd/if.c Normal file
View file

@ -0,0 +1,213 @@
/*
* IF.C - if internal batch command.
*
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* started.
*
* 16 Jul 1998 (John P Price)
* Seperated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("if /?") and cleaned up.
*
* 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection ready!
*
* 01-Sep-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed help text.
*
* 17-Feb-2001 (ea)
* IF DEFINED variable command
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*
*/
#include <precomp.h>
#include "resource.h"
#define X_EXEC 1
#define X_EMPTY 0x80
INT cmd_if (LPTSTR cmd, LPTSTR param)
{
INT x_flag = 0; /* when set cause 'then' clause to be executed */
LPTSTR pp;
#ifdef _DEBUG
DebugPrintf (_T("cmd_if: (\'%s\', \'%s\')\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_IF_HELP1);
return 0;
}
/* First check if param string begins with 'not' */
if (!_tcsnicmp (param, _T("not"), 3) && _istspace (*(param + 3)))
{
x_flag = X_EXEC; /* Remember 'NOT' */
param += 3; /* Step over 'NOT' */
while (_istspace (*param)) /* And subsequent spaces */
param++;
}
/* Check for 'exist' form */
if (!_tcsnicmp (param, _T("exist"), 5) && _istspace (*(param + 5)))
{
UINT i;
BOOL bInside = FALSE;
param += 5;
while (_istspace (*param))
param++;
pp = param;
/* find the whole path to the file */
for(i = 0; i < _tcslen(param); i++)
{
if(param[i] == _T('\"'))
bInside = !bInside;
if((param[i] == _T(' ')) && !bInside)
{
break;
}
pp++;
}
*pp++ = _T('\0');
i = 0;
/* remove quotes */
while(i < _tcslen(param))
{
if(param[i] == _T('\"'))
memmove(&param[i],&param[i + 1], _tcslen(&param[i]) * sizeof(TCHAR));
else
i++;
}
if (*pp)
{
WIN32_FIND_DATA f;
HANDLE hFind;
hFind = FindFirstFile (param, &f);
x_flag ^= (hFind == INVALID_HANDLE_VALUE) ? 0 : X_EXEC;
if (hFind != INVALID_HANDLE_VALUE)
{
FindClose (hFind);
}
}
else
return 0;
}
else if (!_tcsnicmp (param, _T("defined"), 7) && _istspace (*(param + 7)))
{
/* Check for 'defined' form */
TCHAR Value [1];
INT ValueSize = 0;
param += 7;
/* IF [NOT] DEFINED var COMMAND */
/* ^ */
while (_istspace (*param))
param++;
/* IF [NOT] DEFINED var COMMAND */
/* ^ */
pp = param;
while (*pp && !_istspace (*pp))
pp++;
/* IF [NOT] DEFINED var COMMAND */
/* ^ */
if (*pp)
{
*pp++ = _T('\0');
ValueSize = GetEnvironmentVariable(param, Value, sizeof(Value) / sizeof(Value[0]));
x_flag ^= (0 == ValueSize)
? 0
: X_EXEC;
x_flag |= X_EMPTY;
}
else
return 0;
}
else if (!_tcsnicmp (param, _T("errorlevel"), 10) && _istspace (*(param + 10)))
{
/* Check for 'errorlevel' form */
INT n = 0;
pp = param + 10;
while (_istspace (*pp))
pp++;
while (_istdigit (*pp))
n = n * 10 + (*pp++ - _T('0'));
x_flag ^= (nErrorLevel != n) ? 0 : X_EXEC;
x_flag |= X_EMPTY; /* Syntax error if comd empty */
}
else
{
BOOL bInQuote = FALSE;
INT p1len;
pp = param;
while ( *pp && ( bInQuote || *pp != _T('=') ) )
{
if ( *pp == _T('\"') )
bInQuote = !bInQuote;
++pp;
}
p1len = pp-param;
/* check for "==" */
if ( *pp++ != _T('=') || *pp++ != _T('=') )
{
error_syntax ( NULL );
return 1;
}
while (_istspace (*pp)) /* Skip subsequent spaces */
pp++;
/* are the two sides equal, and does the second end in the same place? */
if ( !_tcsncmp(param,pp,p1len) && _tcschr(_T(" ("),pp[p1len]) )
x_flag ^= X_EXEC;
pp += p1len;
if ( x_flag )
{
while (*pp && !_istspace (*pp)) /* Find first space, */
pp++;
x_flag |= X_EMPTY;
}
}
if (x_flag & X_EMPTY)
{
while (_istspace (*pp)) /* Then skip spaces */
pp++;
if (*pp == _T('\0')) /* If nothing left then syntax err */
{
error_syntax (NULL);
return 1;
}
}
if (x_flag & X_EXEC)
{
ParseCommandLine (pp);
}
return 0;
}
/* EOF */

View file

@ -0,0 +1,767 @@
/*
* INTERNAL.C - command.com internal commands.
*
*
* History:
*
* 17/08/94 (Tim Norman)
* started.
*
* 08/08/95 (Matt Rains)
* i have cleaned up the source code. changes now bring this source into
* guidelines for recommended programming practice.
*
* cd()
* started.
*
* dir()
* i have added support for file attributes to the DIR() function. the
* routine adds "d" (directory) and "r" (read only) output. files with the
* system attribute have the filename converted to lowercase. files with
* the hidden attribute are not displayed.
*
* i have added support for directorys. now if the directory attribute is
* detected the file size if replaced with the string "<dir>".
*
* ver()
* started.
*
* md()
* started.
*
* rd()
* started.
*
* del()
* started.
*
* does not support wildcard selection.
*
* todo: add delete directory support.
* add recursive directory delete support.
*
* ren()
* started.
*
* does not support wildcard selection.
*
* todo: add rename directory support.
*
* a general structure has been used for the cd, rd and md commands. this
* will be better in the long run. it is too hard to maintain such diverse
* functions when you are involved in a group project like this.
*
* 12/14/95 (Tim Norman)
* fixed DIR so that it will stick \*.* if a directory is specified and
* that it will stick on .* if a file with no extension is specified or
* *.* if it ends in a \
*
* 1/6/96 (Tim Norman)
* added an isatty call to DIR so it won't prompt for keypresses unless
* stdin and stdout are the console.
*
* changed parameters to be mutually consistent to make calling the
* functions easier
*
* rem()
* started.
*
* doskey()
* started.
*
* 01/22/96 (Oliver Mueller)
* error messages are now handled by perror.
*
* 02/05/96 (Tim Norman)
* converted all functions to accept first/rest parameters
*
* 07/26/96 (Tim Norman)
* changed return values to int instead of void
*
* path() started.
*
* 12/23/96 (Aaron Kaufman)
* rewrote dir() to mimic MS-DOS's dir
*
* 01/28/97 (Tim Norman)
* cleaned up Aaron's DIR code
*
* 06/13/97 (Tim Norman)
* moved DIR code to dir.c
* re-implemented Aaron's DIR code
*
* 06/14/97 (Steffan Kaiser)
* ctrl-break handling
* bug fixes
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Replaced DOS calls by Win32 calls.
*
* 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help texts ("/?").
*
* 18-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added support for quoted arguments (cd "program files").
*
* 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Clean up.
*
* 26-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Replaced remaining CRT io functions by Win32 io functions.
* Unicode safe!
*
* 30-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added "cd -" feature. Changes to the previous directory.
*
* 15-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed bug in "cd -" feature. If the previous directory was a root
* directory, it was ignored.
*
* 23-Feb-2001 (Carl Nettelblad <cnettel@hem.passagen.se>)
* Improved chdir/cd command.
*
* 02-Apr-2004 (Magnus Olsen <magnus@greatlord.com>)
* Remove all hard code string so they can be
* translate to other langues.
*
* 19-jul-2005 (Brandon Turner <turnerb7@msu.edu)
* Rewrite the CD, it working as Windows 2000 CMD
*
* 19-jul-2005 (Magnus Olsen <magnus@greatlord.com)
* Add SetRootPath and GetRootPath
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_CHDIR
static LPTSTR lpLastPath;
VOID InitLastPath (VOID)
{
lpLastPath = NULL;
}
VOID FreeLastPath (VOID)
{
if (lpLastPath)
free (lpLastPath);
}
/* help functions for getting current path from drive
without changing drive. Return code 0 = ok, 1 = fail.
INT GetRootPath("C:",outbuffer,chater size of outbuffer);
the first param can have any size, if the the two frist
letter are not a drive with : it will get Currentpath on
current drive exacly as GetCurrentDirectory does.
*/
INT GetRootPath(TCHAR *InPath,TCHAR *OutPath,INT size)
{
INT retcode = 1;
if (_tcslen(InPath)>1)
{
if (InPath[1]==_T(':'))
{
INT t=0;
if ((InPath[0] >= _T('0')) && (InPath[0] <= _T('9')))
{
t = (InPath[0] - _T('0')) +28;
}
if ((InPath[0] >= _T('a')) && (InPath[0] <= _T('z')))
{
t = (InPath[0] - _T('a')) +1;
InPath[0] = t + _T('A') - 1;
}
if ((InPath[0] >= _T('A')) && (InPath[0] <= _T('Z')))
{
t = (InPath[0] - _T('A')) +1;
}
if (_tgetdcwd(t,OutPath,size) != NULL)
{
return 0;
}
}
}
/* fail */
if (_tcslen(InPath)>1)
{
if (InPath[1]==_T(':'))
return 1;
}
/* Get current directory */
retcode = GetCurrentDirectory(size,OutPath);
if (retcode==0)
return 1;
return 0;
}
BOOL SetRootPath(TCHAR *InPath)
{
TCHAR oldpath[MAX_PATH];
TCHAR OutPath[MAX_PATH];
TCHAR OutPathTemp[MAX_PATH];
TCHAR OutPathTemp2[MAX_PATH];
BOOL fail;
/* Get The current directory path and save it */
fail = GetCurrentDirectory(MAX_PATH,oldpath);
if (!fail)
return 1;
/* Get current drive directory path if C: was only pass down*/
if (_tcsncicmp(&InPath[1],_T(":\\"),2)!=0)
{
if (!GetRootPath(InPath,OutPathTemp,MAX_PATH))
_tcscpy(OutPathTemp,InPath);
}
else
{
_tcscpy(OutPathTemp,InPath);
}
_tcsupr(OutPathTemp);
/* The use of both of these together will correct the case of a path
where as one alone or GetFullPath will not. Exameple:
c:\windows\SYSTEM32 => C:\WINDOWS\system32 */
GetFullPathName(OutPathTemp, MAX_PATH, OutPathTemp2, NULL);
GetPathCase(OutPathTemp2, OutPath);
fail = SetCurrentDirectory(OutPath);
if (!fail)
return 1;
SetCurrentDirectory(OutPath);
GetCurrentDirectory(MAX_PATH,OutPath);
_tchdir(OutPath);
if (_tcsncicmp(OutPath,oldpath,2)!=0)
SetCurrentDirectory(oldpath);
return 0;
}
/*
* CD / CHDIR
*
*/
INT cmd_chdir (LPTSTR cmd, LPTSTR param)
{
WIN32_FIND_DATA f;
HANDLE hFile;
BOOL bChangeDrive = FALSE;
TCHAR szPath[MAX_PATH];
TCHAR szFinalPath[MAX_PATH];
TCHAR * tmpPath;
TCHAR szCurrent[MAX_PATH];
TCHAR szMsg[RC_STRING_MAX_SIZE];
INT i;
/* Filter out special cases first */
/* Print Help */
if (!_tcsncmp(param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_CD_HELP);
return 0;
}
/* Set Error Level to Success */
nErrorLevel = 0;
/* Input String Contains /D Switch */
if (!_tcsncicmp(param, _T("/D"), 2))
{
bChangeDrive = TRUE;
tmpPath = _tcsstr(param,_T(" "));
if(!tmpPath)
{
/* Didnt find an directories */
LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg);
nErrorLevel = 1;
return 1;
}
tmpPath++;
_tcscpy(szPath,tmpPath);
}
else
{
_tcscpy(szPath,param);
}
/* Print Current Directory on a disk */
if (_tcslen(szPath) == 2 && szPath[1] == _T(':'))
{
if(GetRootPath(szPath,szCurrent,MAX_PATH))
{
nErrorLevel = 1;
return 1;
}
ConOutPuts(szCurrent);
return 0;
}
/* Get Current Directory */
GetRootPath(_T("."),szCurrent,MAX_PATH);
/* Remove " */
i = 0;
while(i < (INT)_tcslen(szPath))
{
if(szPath[i] == _T('\"'))
memmove(&szPath[i],&szPath[i + 1], _tcslen(&szPath[i]) * sizeof(TCHAR));
else
i++;
}
tmpPath = szPath;
while (_istspace (*tmpPath))
tmpPath++;
_tcscpy(szPath,tmpPath);
if (szPath[0] == _T('\0'))
{
ConOutPuts(szCurrent);
return 0;
}
/* change to full path if relative path was given */
GetFullPathName(szPath,MAX_PATH,szFinalPath,NULL);
if(szFinalPath[_tcslen(szFinalPath) - 1] == _T('\\') && _tcslen(szFinalPath) > 3)
szFinalPath[_tcslen(szFinalPath) - 1] = _T('\0');
/* Handle Root Directory Alone*/
if (_tcslen(szFinalPath) == 3 && szFinalPath[1] == _T(':'))
{
if(!SetRootPath(szFinalPath))
{
/* Change prompt if it is one the same drive or /D */
if(bChangeDrive || !_tcsncicmp(szFinalPath,szCurrent,1))
SetCurrentDirectory(szFinalPath);
return 0;
}
/* Didnt find an directories */
LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg);
nErrorLevel = 1;
return 1;
}
/* Get a list of all the files */
hFile = FindFirstFile (szFinalPath, &f);
do
{
if(hFile == INVALID_HANDLE_VALUE)
{
ConErrFormatMessage (GetLastError(), szFinalPath);
nErrorLevel = 1;
return 1;
}
/* Strip the paths back to the folder they are in */
for(i = (_tcslen(szFinalPath) - 1); i > -1; i--)
if(szFinalPath[i] != _T('\\'))
szFinalPath[i] = _T('\0');
else
break;
_tcscat(szFinalPath,f.cFileName);
if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
if(!SetRootPath(szFinalPath))
{
/* Change for /D */
if(bChangeDrive)
{
_tcsupr(szFinalPath);
GetPathCase(szFinalPath, szPath);
SetCurrentDirectory(szPath);
}
return 0;
}
}
}while(FindNextFile (hFile, &f));
/* Didnt find an directories */
LoadString(CMD_ModuleHandle, STRING_ERROR_PATH_NOT_FOUND, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg);
nErrorLevel = 1;
return 1;
}
#endif
#ifdef INCLUDE_CMD_MKDIR
/* Helper funtion for mkdir to make directories in a path.
Dont use the api to decrease depence on libs */
BOOL
MakeFullPath(TCHAR * DirPath)
{
TCHAR path[MAX_PATH];
TCHAR *p = DirPath;
INT n;
if (p[0] && p[1] == _T(':'))
p += 2;
while (*p == _T('\\'))
p++; /* skip drive root */
while ((p = _tcschr(p, _T('\\'))) != NULL)
{
n = p - DirPath + 1;
memcpy(path, DirPath, n);
path[n] = _T('\0');
if( !CreateDirectory(path, NULL) &&
(GetLastError() != ERROR_ALREADY_EXISTS))
return FALSE;
p++;
}
if (GetLastError() == ERROR_ALREADY_EXISTS)
SetLastError(ERROR_SUCCESS);
return TRUE;
}
/*
* MD / MKDIR
*
*/
INT cmd_mkdir (LPTSTR cmd, LPTSTR param)
{
LPTSTR dir; /* pointer to the directory to change to */
LPTSTR place; /* used to search for the \ when no space is used */
LPTSTR *p = NULL;
INT argc;
nErrorLevel = 0;
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_MKDIR_HELP);
return 0;
}
/* check if there is no space between the command and the path */
if (param[0] == _T('\0'))
{
/* search for the \ or . so that both short & long names will work */
for (place = cmd; *place; place++)
if (*place == _T('.') || *place == _T('\\'))
break;
if (*place)
dir = place;
else
/* signal that there are no parameters */
dir = NULL;
}
else
{
p = split (param, &argc, FALSE);
if (argc > 1)
{
/*JPP 20-Jul-1998 use standard error message */
error_too_many_parameters (param);
freep (p);
return 1;
}
else
dir = p[0];
}
if (!dir)
{
ConErrResPuts (STRING_ERROR_REQ_PARAM_MISSING);
nErrorLevel = 1;
if(p != NULL)
freep (p);
return 1;
}
/* Add a \ at the end of the path is there isnt on already */
if (dir[_tcslen (dir) - 1] != _T('\\'))
_tcscat(dir,_T("\\"));
if (!MakeFullPath(dir))
{
if(GetLastError() == ERROR_PATH_NOT_FOUND)
{
ConErrResPuts(STRING_MD_ERROR2);
}
else
{
ErrorMessage (GetLastError(), _T("MD"));
}
nErrorLevel = 1;
freep (p);
return 1;
}
freep (p);
return 0;
}
#endif
#ifdef INCLUDE_CMD_RMDIR
/*
* RD / RMDIR
*
*/
BOOL DeleteFolder(LPTSTR FileName)
{
TCHAR Base[MAX_PATH];
TCHAR TempFileName[MAX_PATH];
HANDLE hFile;
WIN32_FIND_DATA f;
_tcscpy(Base,FileName);
_tcscat(Base,_T("\\*"));
hFile = FindFirstFile(Base, &f);
Base[_tcslen(Base) - 1] = _T('\0');
if (hFile != INVALID_HANDLE_VALUE)
{
do
{
if (!_tcscmp(f.cFileName, _T(".")) ||
!_tcscmp(f.cFileName, _T("..")))
continue;
_tcscpy(TempFileName,Base);
_tcscat(TempFileName,f.cFileName);
if(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
DeleteFolder(TempFileName);
else
{
SetFileAttributes(TempFileName,FILE_ATTRIBUTE_NORMAL);
if(!DeleteFile(TempFileName))
return 0;
}
}while (FindNextFile (hFile, &f));
FindClose (hFile);
}
return RemoveDirectory(FileName);
}
INT cmd_rmdir (LPTSTR cmd, LPTSTR param)
{
TCHAR dir[MAX_PATH]; /* pointer to the directory to change to */
char ch;
INT args;
LPTSTR *arg = NULL;
INT i;
BOOL RD_SUB = FALSE;
BOOL RD_QUIET = FALSE;
HANDLE hFile;
WIN32_FIND_DATA f;
INT res;
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szFullPath[MAX_PATH];
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_RMDIR_HELP);
return 0;
}
nErrorLevel = 0;
arg = split (param, &args, FALSE);
if (args == 0)
{
/* only command given */
error_req_param_missing ();
freep (arg);
return 1;
}
dir[0] = 0;
/* check for options anywhere in command line */
for (i = 0; i < args; i++)
{
if (*arg[i] == _T('/'))
{
/*found a command, but check to make sure it has something after it*/
if (_tcslen (arg[i]) == 2)
{
ch = _totupper (arg[i][1]);
if (ch == _T('S'))
{
RD_SUB = TRUE;
}
else if (ch == _T('Q'))
{
RD_QUIET = TRUE;
}
}
}
else
{
/* get the folder name */
_tcscpy(dir,arg[i]);
}
}
if (dir[0] == _T('\0'))
{
/* No folder to remove */
ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING);
freep(arg);
return 1;
}
GetFullPathName(dir,MAX_PATH,szFullPath,NULL);
/* remove trailing \ if any, but ONLY if dir is not the root dir */
if (_tcslen (szFullPath) >= 2 && szFullPath[_tcslen (szFullPath) - 1] == _T('\\'))
szFullPath[_tcslen(szFullPath) - 1] = _T('\0');
if(RD_SUB)
{
/* ask if they want to delete evrything in the folder */
if (!RD_QUIET)
{
LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szMsg, RC_STRING_MAX_SIZE);
res = FilePromptYNA (szMsg);
if ((res == PROMPT_NO) || (res == PROMPT_BREAK))
{
freep(arg);
nErrorLevel = 1;
return 1;
}
}
}
else
{
/* check for files in the folder */
_tcscat(szFullPath,_T("\\*"));
hFile = FindFirstFile(szFullPath, &f);
if (hFile != INVALID_HANDLE_VALUE)
{
do
{
if (!_tcscmp(f.cFileName,_T(".")) ||
!_tcscmp(f.cFileName,_T("..")))
continue;
ConOutResPuts(STRING_RMDIR_HELP2);
freep(arg);
FindClose (hFile);
nErrorLevel = 1;
return 1;
}while (FindNextFile (hFile, &f));
FindClose (hFile);
}
/* reovme the \\* */
szFullPath[_tcslen(szFullPath) - 2] = _T('\0');
}
if (!DeleteFolder(szFullPath))
{
/* Couldnt delete the folder, clean up and print out the error */
ErrorMessage (GetLastError(), _T("RD"));
freep (arg);
nErrorLevel = 1;
return 1;
}
freep (arg);
return 0;
}
#endif
/*
* set the exitflag to true
*
*/
INT CommandExit (LPTSTR cmd, LPTSTR param)
{
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_EXIT_HELP);
/* Just make sure */
bExit = FALSE;
/* Dont exit */
return 0;
}
if (bc != NULL && _tcsnicmp(param,_T("/b"),2) == 0)
{
param += 2;
while (_istspace (*param))
param++;
if (_istdigit(*param))
nErrorLevel = _ttoi(param);
ExitBatch (NULL);
}
else
bExit = TRUE;
return 0;
}
#ifdef INCLUDE_CMD_REM
/*
* does nothing
*
*/
INT CommandRem (LPTSTR cmd, LPTSTR param)
{
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_REM_HELP);
}
return 0;
}
#endif /* INCLUDE_CMD_REM */
INT CommandShowCommands (LPTSTR cmd, LPTSTR param)
{
PrintCommandList ();
return 0;
}
INT CommandShowCommandsDetail (LPTSTR cmd, LPTSTR param)
{
PrintCommandListDetail ();
return 0;
}
/* EOF */

View file

@ -0,0 +1,129 @@
/*
* LABEL.C - label internal command.
*
*
* History:
*
* 10-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Started.
*
* 11-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Finished.
*
* 19-Jan-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_LABEL
INT cmd_label (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szRootPath[] = _T("A:\\");
TCHAR szLabel[80];
TCHAR szOldLabel[80];
DWORD dwSerialNr;
LPTSTR *arg;
INT args;
/* set empty label string */
szLabel[0] = _T('\0');
/* print help */
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_LABEL_HELP1);
return 0;
}
nErrorLevel = 0;
/* get parameters */
arg = split (param, &args, FALSE);
if (args > 2)
{
/* too many parameters */
error_too_many_parameters (arg[args - 1]);
freep (arg);
nErrorLevel = 1;
return 1;
}
if (args == 0)
{
/* get label of current drive */
TCHAR szCurPath[MAX_PATH];
GetCurrentDirectory (MAX_PATH, szCurPath);
szRootPath[0] = szCurPath[0];
}
else
{
if ((_tcslen (arg[0]) >= 2) && (arg[0][1] == _T(':')))
{
szRootPath[0] = toupper (*arg[0]);
if (args == 2)
_tcsncpy (szLabel, arg[1], 12);
}
else
{
TCHAR szCurPath[MAX_PATH];
GetCurrentDirectory (MAX_PATH, szCurPath);
szRootPath[0] = szCurPath[0];
_tcsncpy (szLabel, arg[0], 12);
}
}
/* check root path */
if (!IsValidPathName (szRootPath))
{
error_invalid_drive ();
freep (arg);
nErrorLevel = 1;
return 1;
}
GetVolumeInformation(szRootPath, szOldLabel, 80, &dwSerialNr,
NULL, NULL, NULL, 0);
/* print drive info */
if (szOldLabel[0] != _T('\0'))
{
LoadString(CMD_ModuleHandle, STRING_LABEL_HELP2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, _totupper(szRootPath[0]), szOldLabel);
}
else
{
LoadString(CMD_ModuleHandle, STRING_LABEL_HELP3, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, _totupper(szRootPath[0]));
}
/* print the volume serial number */
LoadString(CMD_ModuleHandle, STRING_LABEL_HELP4, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr));
if (szLabel[0] == _T('\0'))
{
LoadString(CMD_ModuleHandle, STRING_LABEL_HELP5, szMsg, RC_STRING_MAX_SIZE);
ConOutResPuts(STRING_LABEL_HELP5);
ConInString(szLabel, 80);
}
SetVolumeLabel(szRootPath, szLabel);
freep(arg);
return 0;
}
#endif /* INCLUDE_CMD_LABEL */
/* EOF */

View file

@ -0,0 +1,342 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
This program 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 of the License, or
(at your option) any later version.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View file

@ -0,0 +1,81 @@
/*
* LOCALE.C - locale handling.
*
*
* History:
*
* 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Started.
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode safe!
*/
#include <precomp.h>
#include "resource.h"
TCHAR cDateSeparator;
TCHAR cTimeSeparator;
TCHAR cThousandSeparator;
TCHAR cDecimalSeparator;
INT nDateFormat;
INT nTimeFormat;
INT nNumberGroups;
VOID InitLocale (VOID)
{
TCHAR szBuffer[256];
/* date settings */
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDATE, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
cDateSeparator = szBuffer[0];
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_IDATE | LOCALE_RETURN_NUMBER, (LPTSTR)&nDateFormat, sizeof(nDateFormat) / sizeof(TCHAR));
/* time settings */
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STIME, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
cTimeSeparator = szBuffer[0];
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME | LOCALE_RETURN_NUMBER, (LPTSTR)&nTimeFormat, sizeof(nTimeFormat) / sizeof(TCHAR));
/* number settings */
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
cThousandSeparator = szBuffer[0];
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
cDecimalSeparator = szBuffer[0];
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SGROUPING, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
nNumberGroups = _ttoi(szBuffer);
#if 0
/* days of week */
for (i = 0; i < 7; i++)
{
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1 + i, szBuffer, sizeof(szBuffer) / sizeof(szBuffer[0]));
_tcscpy (aszDayNames[(i+1)%7], szBuffer); /* little hack */
}
#endif
}
VOID PrintDate (VOID)
{
TCHAR szDateDay[32];
TCHAR szDate[32];
GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, _T("ddd"), szDateDay, sizeof (szDateDay));
GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL,szDate, sizeof (szDate));
ConOutPrintf(_T("%s %s"),szDateDay, szDate);
}
VOID PrintTime (VOID)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
SYSTEMTIME t;
GetLocalTime(&t);
LoadString(CMD_ModuleHandle, STRING_LOCALE_HELP1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(_T("%s: %02d%c%02d%c%02d%c%02d\n"), szMsg, t.wHour, cTimeSeparator,
t.wMinute , cTimeSeparator,
t.wSecond , cDecimalSeparator, t.wMilliseconds );
}

View file

@ -0,0 +1,26 @@
#include <precomp.h>
#include "resource.h"
#ifdef _UNICODE
extern int _main (void);
#else
extern int _main (int argc, char *argv[]);
#endif
/*
* main function
*/
#ifdef _UNICODE
int main(void)
#else
int main (int argc, char *argv[])
#endif
{
#ifdef _UNICODE
return _main();
#else
return _main(argc, argv);
#endif
}
/* EOF */

View file

@ -0,0 +1,97 @@
/*
* MEMORY.C - internal command.
*
*
* History:
*
* 01-Sep-1999 (Eric Kohl)
* Started.
*
* 28-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_MEMORY
/*
* convert
*
* insert commas into a number
*/
static INT
ConvertDWord (DWORD num, LPTSTR des, INT len, BOOL bSeparator)
{
TCHAR temp[32];
INT c = 0;
INT n = 0;
if (num == 0)
{
des[0] = _T('0');
des[1] = _T('\0');
n = 1;
}
else
{
temp[31] = 0;
while (num > 0)
{
if (bSeparator && (((c + 1) % (nNumberGroups + 1)) == 0))
temp[30 - c++] = cThousandSeparator;
temp[30 - c++] = (TCHAR)(num % 10) + _T('0');
num /= 10;
}
for (n = 0; n <= c; n++)
des[n] = temp[31 - c + n];
}
return n;
}
INT CommandMemory (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
MEMORYSTATUS ms;
TCHAR szMemoryLoad[20];
TCHAR szTotalPhys[20];
TCHAR szAvailPhys[20];
TCHAR szTotalPageFile[20];
TCHAR szAvailPageFile[20];
TCHAR szTotalVirtual[20];
TCHAR szAvailVirtual[20];
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_MEMMORY_HELP1);
return 0;
}
ms.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus (&ms);
ConvertDWord (ms.dwMemoryLoad, szMemoryLoad, 20, FALSE);
ConvertDWord (ms.dwTotalPhys, szTotalPhys, 20, TRUE);
ConvertDWord (ms.dwAvailPhys, szAvailPhys, 20, TRUE);
ConvertDWord (ms.dwTotalPageFile, szTotalPageFile, 20, TRUE);
ConvertDWord (ms.dwAvailPageFile, szAvailPageFile, 20, TRUE);
ConvertDWord (ms.dwTotalVirtual, szTotalVirtual, 20, TRUE);
ConvertDWord (ms.dwAvailVirtual, szAvailVirtual, 20, TRUE);
LoadString(CMD_ModuleHandle, STRING_MEMMORY_HELP2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg,
szMemoryLoad, szTotalPhys, szAvailPhys, szTotalPageFile,
szAvailPageFile, szTotalVirtual, szAvailVirtual);
return 0;
}
#endif /* INCLUDE_CMD_MEMORY */
/* EOF */

View file

@ -0,0 +1,659 @@
/*
* MISC.C - misc. functions.
*
*
* History:
*
* 07/12/98 (Rob Lake)
* started
*
* 07/13/98 (Rob Lake)
* moved functions in here
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 18-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Changed split() to accept quoted arguments.
* Removed parse_firstarg().
*
* 23-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed an ugly bug in split(). In rare cases (last character
* of the string is a space) it ignored the NULL character and
* tried to add the following to the argument list.
*
* 28-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* FileGetString() seems to be working now.
*
* 06-Nov-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added PagePrompt() and FilePrompt().
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
/*
* get a character out-of-band and honor Ctrl-Break characters
*/
TCHAR cgetchar (VOID)
{
HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
INPUT_RECORD irBuffer;
DWORD dwRead;
/*
do
{
ReadConsoleInput (hInput, &irBuffer, 1, &dwRead);
if ((irBuffer.EventType == KEY_EVENT) &&
(irBuffer.Event.KeyEvent.bKeyDown == TRUE))
{
if ((irBuffer.Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) &
(irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C'))
bCtrlBreak = TRUE;
break;
}
}
while (TRUE);
*/
do
{
ReadConsoleInput (hInput, &irBuffer, 1, &dwRead);
if (irBuffer.EventType == KEY_EVENT)
{
if (irBuffer.Event.KeyEvent.dwControlKeyState &
(LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))
{
if (irBuffer.Event.KeyEvent.wVirtualKeyCode == 'C')
{
// if (irBuffer.Event.KeyEvent.bKeyDown == TRUE)
// {
bCtrlBreak = TRUE;
break;
// }
}
}
else if ((irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
(irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
(irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL))
{
;
}
else
{
break;
}
}
}
while (TRUE);
#ifndef _UNICODE
return irBuffer.Event.KeyEvent.uChar.AsciiChar;
#else
return irBuffer.Event.KeyEvent.uChar.UnicodeChar;
#endif /* _UNICODE */
}
/*
* Takes a path in and returns it with the correct case of the letters
*/
VOID GetPathCase( TCHAR * Path, TCHAR * OutPath)
{
INT i = 0;
TCHAR TempPath[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
_tcscpy(TempPath, _T(""));
_tcscpy(OutPath, _T(""));
for(i = 0; i < _tcslen(Path); i++)
{
if(Path[i] != _T('\\'))
{
_tcsncat(TempPath, &Path[i], 1);
if(i != _tcslen(Path) - 1)
continue;
}
/* Handle the base part of the path different.
Because if you put it into findfirstfile, it will
return your current folder */
if(_tcslen(TempPath) == 2 && TempPath[1] == _T(':'))
{
_tcscat(OutPath, TempPath);
_tcscat(OutPath, _T("\\"));
_tcscat(TempPath, _T("\\"));
}
else
{
hFind = FindFirstFile(TempPath,&FindFileData);
if(hFind == INVALID_HANDLE_VALUE)
{
_tcscpy(OutPath, Path);
return;
}
_tcscat(TempPath, _T("\\"));
_tcscat(OutPath, FindFileData.cFileName);
_tcscat(OutPath, _T("\\"));
CloseHandle(hFind);
}
}
}
/*
* Check if Ctrl-Break was pressed during the last calls
*/
BOOL CheckCtrlBreak (INT mode)
{
static BOOL bLeaveAll = FALSE; /* leave all batch files */
TCHAR c;
switch (mode)
{
case BREAK_OUTOFBATCH:
bLeaveAll = 0;
return FALSE;
case BREAK_BATCHFILE:
if (bLeaveAll)
return TRUE;
if (!bCtrlBreak)
return FALSE;
/* we need to be sure the string arrives on the screen! */
do
ConOutPuts (_T("\r\nCtrl-Break pressed. Cancel batch file? (Yes/No/All) "));
while (!_tcschr (_T("YNA\3"), c = _totupper (cgetchar())) || !c);
ConOutPuts (_T("\r\n"));
if (c == _T('N'))
return bCtrlBreak = FALSE; /* ignore */
/* leave all batch files */
bLeaveAll = ((c == _T('A')) || (c == _T('\3')));
break;
case BREAK_INPUT:
if (!bCtrlBreak)
return FALSE;
break;
}
/* state processed */
bCtrlBreak = FALSE;
return TRUE;
}
/* add new entry for new argument */
BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry)
{
LPTSTR q;
LPTSTR *oldarg;
q = malloc ((_tcslen(entry) + 1) * sizeof (TCHAR));
if (NULL == q)
{
return FALSE;
}
_tcscpy (q, entry);
oldarg = *arg;
*arg = realloc (oldarg, (*ac + 2) * sizeof (LPTSTR));
if (NULL == *arg)
{
*arg = oldarg;
return FALSE;
}
/* save new entry */
(*arg)[*ac] = q;
(*arg)[++(*ac)] = NULL;
return TRUE;
}
static BOOL expand (LPINT ac, LPTSTR **arg, LPCTSTR pattern)
{
HANDLE hFind;
WIN32_FIND_DATA FindData;
BOOL ok;
LPCTSTR pathend;
LPTSTR dirpart, fullname;
pathend = _tcsrchr (pattern, _T('\\'));
if (NULL != pathend)
{
dirpart = malloc((pathend - pattern + 2) * sizeof(TCHAR));
if (NULL == dirpart)
{
return FALSE;
}
memcpy(dirpart, pattern, pathend - pattern + 1);
dirpart[pathend - pattern + 1] = _T('\0');
}
else
{
dirpart = NULL;
}
hFind = FindFirstFile (pattern, &FindData);
if (INVALID_HANDLE_VALUE != hFind)
{
do
{
if (NULL != dirpart)
{
fullname = malloc((_tcslen(dirpart) + _tcslen(FindData.cFileName) + 1) * sizeof(TCHAR));
if (NULL == fullname)
{
ok = FALSE;
}
else
{
_tcscat (_tcscpy (fullname, dirpart), FindData.cFileName);
ok = add_entry(ac, arg, fullname);
free (fullname);
}
}
else
{
ok = add_entry(ac, arg, FindData.cFileName);
}
} while (FindNextFile (hFind, &FindData) && ok);
FindClose (hFind);
}
else
{
ok = add_entry(ac, arg, pattern);
}
if (NULL != dirpart)
{
free (dirpart);
}
return ok;
}
/*
* split - splits a line up into separate arguments, deliminators
* are spaces and slashes ('/').
*/
LPTSTR *split (LPTSTR s, LPINT args, BOOL expand_wildcards)
{
LPTSTR *arg;
LPTSTR start;
LPTSTR q;
INT ac;
INT len;
BOOL bQuoted = FALSE;
arg = malloc (sizeof (LPTSTR));
if (!arg)
return NULL;
*arg = NULL;
ac = 0;
while (*s)
{
/* skip leading spaces */
while (*s && (_istspace (*s) || _istcntrl (*s)))
++s;
/* if quote (") then set bQuoted */
if (*s == _T('\"'))
{
++s;
bQuoted = TRUE;
}
start = s;
/* the first character can be '/' */
if (*s == _T('/'))
++s;
/* skip to next word delimiter or start of next option */
if (bQuoted)
{
while (_istprint (*s) && (*s != _T('\"')) && (*s != _T('/')))
++s;
}
else
{
while (_istprint (*s) && !_istspace (*s) && (*s != _T('/')))
++s;
}
/* a word was found */
if (s != start)
{
q = malloc (((len = s - start) + 1) * sizeof (TCHAR));
if (!q)
{
return NULL;
}
memcpy (q, start, len * sizeof (TCHAR));
q[len] = _T('\0');
if (expand_wildcards && _T('/') != *start &&
(NULL != _tcschr(q, _T('*')) || NULL != _tcschr(q, _T('?'))))
{
if (! expand(&ac, &arg, q))
{
free (q);
freep (arg);
return NULL;
}
}
else
{
if (! add_entry(&ac, &arg, q))
{
free (q);
freep (arg);
return NULL;
}
}
free (q);
}
/* adjust string pointer if quoted (") */
if (bQuoted)
{
/* Check to make sure if there is no ending "
* we dont run over the null char */
if(*s == _T('\0'))
{
break;
}
++s;
bQuoted = FALSE;
}
}
*args = ac;
return arg;
}
/*
* freep -- frees memory used for a call to split
*
*/
VOID freep (LPTSTR *p)
{
LPTSTR *q;
if (!p)
return;
q = p;
while (*q)
free(*q++);
free(p);
}
LPTSTR _stpcpy (LPTSTR dest, LPCTSTR src)
{
_tcscpy (dest, src);
return (dest + _tcslen (src));
}
/*
* Checks if a path is valid (accessible)
*/
BOOL IsValidPathName (LPCTSTR pszPath)
{
TCHAR szOldPath[MAX_PATH];
BOOL bResult;
GetCurrentDirectory (MAX_PATH, szOldPath);
bResult = SetCurrentDirectory (pszPath);
SetCurrentDirectory (szOldPath);
return bResult;
}
/*
* Checks if a file exists (accessible)
*/
BOOL IsExistingFile (LPCTSTR pszPath)
{
DWORD attr = GetFileAttributes (pszPath);
return (attr != 0xFFFFFFFF && (! (attr & FILE_ATTRIBUTE_DIRECTORY)) );
}
BOOL IsExistingDirectory (LPCTSTR pszPath)
{
DWORD attr = GetFileAttributes (pszPath);
return (attr != 0xFFFFFFFF && (attr & FILE_ATTRIBUTE_DIRECTORY) );
}
BOOL FileGetString (HANDLE hFile, LPTSTR lpBuffer, INT nBufferLength)
{
LPSTR lpString;
CHAR ch;
DWORD dwRead;
INT len;
#ifdef _UNICODE
lpString = malloc(nBufferLength);
#else
lpString = lpBuffer;
#endif
len = 0;
while ((--nBufferLength > 0) &&
ReadFile(hFile, &ch, 1, &dwRead, NULL) && dwRead)
{
lpString[len++] = ch;
if ((ch == _T('\n')) || (ch == _T('\r')))
{
/* break at new line*/
break;
}
}
if (!dwRead && !len)
return FALSE;
lpString[len++] = _T('\0');
#ifdef _UNICODE
MultiByteToWideChar(CP_ACP, 0, lpString, len, lpBuffer, len);
free(lpString);
#endif
return TRUE;
}
INT PagePrompt (VOID)
{
INPUT_RECORD ir;
ConOutResPuts(STRING_MISC_HELP1);
RemoveBreakHandler ();
ConInDisable ();
do
{
ConInKey (&ir);
}
while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
(ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
(ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL));
AddBreakHandler ();
ConInEnable ();
if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) ||
((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) &&
(ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))))
{
bCtrlBreak = TRUE;
return PROMPT_BREAK;
}
return PROMPT_YES;
}
INT FilePromptYN (LPTSTR szFormat, ...)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szOut[512];
va_list arg_ptr;
// TCHAR cKey = 0;
// LPTSTR szKeys = _T("yna");
TCHAR szIn[10];
LPTSTR p;
va_start (arg_ptr, szFormat);
_vstprintf (szOut, szFormat, arg_ptr);
va_end (arg_ptr);
ConOutPrintf (szFormat);
/* preliminary fix */
ConInString (szIn, 10);
ConOutPrintf (_T("\n"));
_tcsupr (szIn);
for (p = szIn; _istspace (*p); p++)
;
LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, szMsg, RC_STRING_MAX_SIZE);
if (_tcsncmp(p, &szMsg[0], 1) == 0)
return PROMPT_YES;
else if (_tcsncmp(p, &szMsg[1], 1) == 0)
return PROMPT_NO;
#if 0
else if (*p == _T('\03'))
return PROMPT_BREAK;
#endif
return PROMPT_NO;
/* unfinished sollution */
#if 0
RemoveBreakHandler ();
ConInDisable ();
do
{
ConInKey (&ir);
cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar);
if (_tcschr (szKeys, cKey[0]) == NULL)
cKey = 0;
}
while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
(ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
(ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL));
AddBreakHandler ();
ConInEnable ();
if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) ||
((ir.Event.KeyEvent.wVirtualKeyCode == 'C') &&
(ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))))
return PROMPT_BREAK;
return PROMPT_YES;
#endif
}
INT FilePromptYNA (LPTSTR szFormat, ...)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szOut[512];
va_list arg_ptr;
// TCHAR cKey = 0;
// LPTSTR szKeys = _T("yna");
TCHAR szIn[10];
LPTSTR p;
va_start (arg_ptr, szFormat);
_vstprintf (szOut, szFormat, arg_ptr);
va_end (arg_ptr);
ConOutPrintf (szFormat);
/* preliminary fix */
ConInString (szIn, 10);
ConOutPrintf (_T("\n"));
_tcsupr (szIn);
for (p = szIn; _istspace (*p); p++)
;
LoadString( CMD_ModuleHandle, STRING_COPY_OPTION, szMsg, RC_STRING_MAX_SIZE);
if (_tcsncmp(p, &szMsg[0], 1) == 0)
return PROMPT_YES;
else if (_tcsncmp(p, &szMsg[1], 1) == 0)
return PROMPT_NO;
else if (_tcsncmp(p, &szMsg[2], 1) == 0)
return PROMPT_ALL;
#if 0
else if (*p == _T('\03'))
return PROMPT_BREAK;
#endif
return PROMPT_NO;
/* unfinished sollution */
#if 0
RemoveBreakHandler ();
ConInDisable ();
do
{
ConInKey (&ir);
cKey = _totlower (ir.Event.KeyEvent.uChar.AsciiChar);
if (_tcschr (szKeys, cKey[0]) == NULL)
cKey = 0;
}
while ((ir.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT) ||
(ir.Event.KeyEvent.wVirtualKeyCode == VK_MENU) ||
(ir.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL));
AddBreakHandler ();
ConInEnable ();
if ((ir.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) ||
((ir.Event.KeyEvent.wVirtualKeyCode == _T('C')) &&
(ir.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))))
return PROMPT_BREAK;
return PROMPT_YES;
#endif
}
/* EOF */

View file

@ -0,0 +1,556 @@
/*
* MOVE.C - move internal command.
*
*
* History:
*
* 14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Started.
*
* 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode safe!
* Preliminary version!!!
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection safe!
*
* 27-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
* Added more error checks.
*
* 03-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added "/N" option.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*
* 24-Jun-2005 (Brandon Turner) <turnerb7@msu.edu>)
* Fixed bug to allow MS style wildcards + code clean up
* added /y and /-y
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_MOVE
enum
{
MOVE_NOTHING = 0x001, /* /N */
MOVE_OVER_YES = 0x002, /* /Y */
MOVE_OVER_NO = 0x004, /* /-Y */
};
enum
{ /* Move status flags */
MOVE_SOURCE_IS_DIR = 0x001,
MOVE_SOURCE_IS_FILE = 0x002,
MOVE_DEST_IS_DIR = 0x004,
MOVE_DEST_IS_FILE = 0x008,
MOVE_SOURCE_HAS_WILD = 0x010, /* source has wildcard */
MOVE_SRC_CURRENT_IS_DIR = 0x020, /* source is file but at the current round we found a directory */
MOVE_DEST_EXISTS = 0x040,
MOVE_PATHS_ON_DIF_VOL = 0x080 /* source and destination paths are on different volume */
};
static INT MoveOverwrite (LPTSTR fn)
{
/*ask the user if they want to override*/
TCHAR szMsg[RC_STRING_MAX_SIZE];
INT res;
LoadString(CMD_ModuleHandle, STRING_MOVE_HELP1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg,fn);
res = FilePromptYNA (_T(""));
return res;
}
void GetDirectory (LPTSTR wholepath, LPTSTR directory, BOOL CheckExisting)
{
/* returns only directory part of path with backslash */
/* TODO: make code unc aware */
/* Is there a better alternative to this? */
LPTSTR last;
if (CheckExisting && IsExistingDirectory(wholepath))
{
_tcscpy(directory, wholepath);
}
else if ((last = _tcsrchr(wholepath,_T('\\'))) != NULL)
{
_tcsncpy(directory, wholepath, last - wholepath + 1);
directory[last - wholepath + 1] = 0;
}
else
{
GetRootPath(wholepath,directory, MAX_PATH);
}
}
INT cmd_move (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LPTSTR *arg;
INT argc, i, nFiles;
TCHAR szDestPath[MAX_PATH];
TCHAR szFullDestPath[MAX_PATH];
TCHAR szSrcDirPath[MAX_PATH];
TCHAR szSrcPath[MAX_PATH];
TCHAR szFullSrcPath[MAX_PATH];
DWORD dwFlags = 0;
INT nOverwrite = 0;
WIN32_FIND_DATA findBuffer;
HANDLE hFile;
/* used only when source and destination directories are on different volume*/
HANDLE hDestFile;
WIN32_FIND_DATA findDestBuffer;
TCHAR szMoveDest[MAX_PATH];
TCHAR szMoveSrc[MAX_PATH];
LPTSTR pszDestDirPointer;
LPTSTR pszSrcDirPointer;
INT nDirLevel = 0;
LPTSTR pszFile;
BOOL OnlyOneFile;
BOOL FoundFile;
BOOL MoveStatus;
DWORD dwMoveFlags = 0;
DWORD dwMoveStatusFlags = 0;
if (!_tcsncmp (param, _T("/?"), 2))
{
#if 0
ConOutPuts (_T("Moves files and renames files and directories.\n\n"
"To move one or more files:\n"
"MOVE [/N][/Y|/-Y][drive:][path]filename1[,...] destination\n"
"\n"
"To rename a directory:\n"
"MOVE [/N][/Y|/-Y][drive:][path]dirname1 dirname2\n"
"\n"
" [drive:][path]filename1 Specifies the location and name of the file\n"
" or files you want to move.\n"
" /N Nothing. Don everthing but move files or direcories.\n"
" /Y\n"
" /-Y\n"
"..."));
#else
ConOutResPaging(TRUE,STRING_MOVE_HELP2);
#endif
return 0;
}
nErrorLevel = 0;
arg = split (param, &argc, FALSE);
nFiles = argc;
/* read options */
for (i = 0; i < argc; i++)
{
if (*arg[i] == _T('/'))
{
if (_tcslen(arg[i]) >= 2)
{
switch (_totupper(arg[i][1]))
{
case _T('N'):
dwFlags |= MOVE_NOTHING;
break;
case _T('Y'):
dwFlags |= MOVE_OVER_YES;
break;
case _T('-'):
dwFlags |= MOVE_OVER_NO;
break;
}
}
nFiles--;
}
}
if (nFiles < 2)
{
/* there must be at least two pathspecs */
error_req_param_missing ();
return 1;
}
/* check for wildcards in source and destination */
if (_tcschr (arg[argc - 1], _T('*')) != NULL || _tcschr (arg[argc - 1], _T('?')) != NULL)
{
/* '*'/'?' in dest, this doesnt happen. give folder name instead*/
error_invalid_parameter_format(arg[argc - 1]);
return 1;
}
if (_tcschr (arg[argc - 2], _T('*')) != NULL || _tcschr (arg[argc - 2], _T('?')) != NULL)
{
dwMoveStatusFlags |= MOVE_SOURCE_HAS_WILD;
}
/* get destination */
GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL);
#ifdef _DEBUG
DebugPrintf (_T("Destination: %s\n"), szDestPath);
#endif
/* get source folder */
GetDirectory(arg[argc - 2], szSrcDirPath, 1);
GetFullPathName(szSrcDirPath, MAX_PATH, szSrcPath, &pszFile);
_tcscpy(szSrcDirPath,szSrcPath);
/* we need following check to see if source happens to be directly given directory
and if it is then rip off last directory part so that there won't be any clashes with codes after this point */
GetFullPathName(arg[argc - 2], MAX_PATH, szSrcPath, &pszFile);
if (_tcscmp(szSrcDirPath,szSrcPath) == 0)
szSrcDirPath[pszFile - szSrcPath] = _T('\0');
#ifdef _DEBUG
DebugPrintf (_T("Source Folder: %s\n"), szSrcDirPath);
#endif
hFile = FindFirstFile (arg[argc - 2], &findBuffer);
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorMessage (GetLastError (), arg[argc - 2]);
freep (arg);
return 1;
}
/* check for special cases "." and ".." and if found skip them */
FoundFile = TRUE;
while(FoundFile &&
(_tcscmp(findBuffer.cFileName,_T(".")) == 0 ||
_tcscmp(findBuffer.cFileName,_T("..")) == 0))
FoundFile = FindNextFile (hFile, &findBuffer);
if (!FoundFile)
{
/* what? we don't have anything to move? */
error_file_not_found();
FindClose(hFile);
freep(arg);
return 1;
}
OnlyOneFile = TRUE;
_tcscpy(szSrcPath,szSrcDirPath);
/*check to see if there is an ending slash, if not add one*/
if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
_tcscat (szSrcPath, _T("\\"));
_tcscat(szSrcPath,findBuffer.cFileName);
#ifdef _DEBUG
DebugPrintf (_T("Source Path: %s\n"), szSrcPath);
#endif
/* check if there can be found files as files have first priority */
if (IsExistingFile(szSrcPath)) dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE;
else dwMoveStatusFlags |= MOVE_SOURCE_IS_DIR;
while(OnlyOneFile && FindNextFile(hFile,&findBuffer))
{
_tcscpy(szSrcPath,szSrcDirPath);
if(szSrcPath[_tcslen(szSrcPath) - 1] != _T('\\'))
_tcscat (szSrcPath, _T("\\"));
_tcscat(szSrcPath,findBuffer.cFileName);
if (IsExistingFile(szSrcPath))
{
ConOutPrintf(_T(""));
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) OnlyOneFile = FALSE;
else
{ /* this has been done this way so that we don't disturb other settings if they have been set before this */
dwMoveStatusFlags |= MOVE_SOURCE_IS_FILE;
dwMoveStatusFlags &= ~MOVE_SOURCE_IS_DIR;
}
}
}
FindClose(hFile);
#ifdef _DEBUG
DebugPrintf(_T("Do we have only one file: %s\n"), OnlyOneFile ? _T("TRUE") : _T("FALSE"));
#endif
/* we have to start again to be sure we don't miss any files or folders*/
hFile = FindFirstFile (arg[argc - 2], &findBuffer);
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorMessage (GetLastError (), arg[argc - 2]);
freep (arg);
return 1;
}
/* check for special cases "." and ".." and if found skip them */
FoundFile = TRUE;
while(FoundFile &&
(_tcscmp(findBuffer.cFileName,_T(".")) == 0 ||
_tcscmp(findBuffer.cFileName,_T("..")) == 0))
FoundFile = FindNextFile (hFile, &findBuffer);
if (!FoundFile)
{
/* huh? somebody removed files and/or folders which were there */
error_file_not_found();
FindClose(hFile);
freep(arg);
return 1;
}
/* check if source and destination paths are on different volumes */
if (szSrcPath[0] != szDestPath[0])
dwMoveStatusFlags |= MOVE_PATHS_ON_DIF_VOL;
/* move it */
do
{
#ifdef _DEBUG
DebugPrintf (_T("Found file/directory: %s\n"), findBuffer.cFileName);
#endif
nOverwrite = 1;
dwMoveFlags = 0;
dwMoveStatusFlags &= ~MOVE_DEST_IS_FILE &
~MOVE_DEST_IS_DIR &
~MOVE_SRC_CURRENT_IS_DIR &
~MOVE_DEST_EXISTS;
_tcscpy(szFullSrcPath,szSrcDirPath);
if(szFullSrcPath[_tcslen(szFullSrcPath) - 1] != _T('\\'))
_tcscat (szFullSrcPath, _T("\\"));
_tcscat(szFullSrcPath,findBuffer.cFileName);
_tcscpy(szSrcPath, szFullSrcPath);
if (IsExistingDirectory(szSrcPath))
{
/* source is directory */
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE)
{
dwMoveStatusFlags |= MOVE_SRC_CURRENT_IS_DIR; /* source is file but at the current round we found a directory */
continue;
}
#ifdef _DEBUG
DebugPrintf (_T("Source is dir: %s\n"), szSrcPath);
#endif
dwMoveFlags = MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
}
/* if source is file we don't need to do anything special */
if (IsExistingDirectory(szDestPath))
{
/* destination is existing directory */
#ifdef _DEBUG
DebugPrintf (_T("Destination is directory: %s\n"), szDestPath);
#endif
dwMoveStatusFlags |= MOVE_DEST_IS_DIR;
/*build the dest string(accounts for *)*/
_tcscpy (szFullDestPath, szDestPath);
/*check to see if there is an ending slash, if not add one*/
if(szFullDestPath[_tcslen(szFullDestPath) - 1] != _T('\\'))
_tcscat (szFullDestPath, _T("\\"));
_tcscat (szFullDestPath, findBuffer.cFileName);
if (IsExistingFile(szFullDestPath) || IsExistingDirectory(szFullDestPath))
dwMoveStatusFlags |= MOVE_DEST_EXISTS;
dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
}
if (IsExistingFile(szDestPath))
{
/* destination is a file */
#ifdef _DEBUG
DebugPrintf (_T("Destination is file: %s\n"), szDestPath);
#endif
dwMoveStatusFlags |= MOVE_DEST_IS_FILE | MOVE_DEST_EXISTS;
_tcscpy (szFullDestPath, szDestPath);
dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
}
#ifdef _DEBUG
DebugPrintf(_T("Move Status Flags: 0x%X\n"),dwMoveStatusFlags);
#endif
if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR &&
dwMoveStatusFlags & MOVE_DEST_IS_DIR &&
dwMoveStatusFlags & MOVE_SOURCE_HAS_WILD)
{
/* We are not allowed to have existing source and destination dir when there is wildcard in source */
error_syntax(NULL);
FindClose(hFile);
freep(arg);
return 1;
}
if (!(dwMoveStatusFlags & (MOVE_DEST_IS_FILE | MOVE_DEST_IS_DIR)))
{
/* destination doesn't exist */
_tcscpy (szFullDestPath, szDestPath);
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE) dwMoveStatusFlags |= MOVE_DEST_IS_FILE;
if (dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) dwMoveStatusFlags |= MOVE_DEST_IS_DIR;
dwMoveFlags |= MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH | MOVEFILE_COPY_ALLOWED;
}
if (dwMoveStatusFlags & MOVE_SOURCE_IS_FILE &&
dwMoveStatusFlags & MOVE_DEST_IS_FILE &&
!OnlyOneFile)
{
/*source has many files but there is only one destination file*/
error_invalid_parameter_format(arg[argc - 1]);
FindClose(hFile);
freep (arg);
return 1;
}
/*checks to make sure user wanted/wants the override*/
if((dwFlags & MOVE_OVER_NO) &&
(dwMoveStatusFlags & MOVE_DEST_EXISTS))
continue;
if(!(dwFlags & MOVE_OVER_YES) &&
(dwMoveStatusFlags & MOVE_DEST_EXISTS))
nOverwrite = MoveOverwrite (szFullDestPath);
if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK)
continue;
if (nOverwrite == PROMPT_ALL)
dwFlags |= MOVE_OVER_YES;
ConOutPrintf (_T("%s => %s "), szSrcPath, szFullDestPath);
/* are we really supposed to do something */
if (dwFlags & MOVE_NOTHING)
continue;
/*move the file*/
if (!(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR &&
dwMoveStatusFlags & MOVE_PATHS_ON_DIF_VOL))
/* we aren't moving source folder to different drive */
MoveStatus = MoveFileEx (szSrcPath, szFullDestPath, dwMoveFlags);
else
{ /* we are moving source folder to different drive */
_tcscpy(szMoveDest, szFullDestPath);
_tcscpy(szMoveSrc, szSrcPath);
DeleteFile(szMoveDest);
MoveStatus = CreateDirectory(szMoveDest, NULL); /* we use default security settings */
if (MoveStatus)
{
_tcscat(szMoveDest,_T("\\"));
_tcscat(szMoveSrc,_T("\\"));
nDirLevel = 0;
pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
_tcscpy(pszSrcDirPointer,_T("*.*"));
hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
if (hDestFile == INVALID_HANDLE_VALUE)
MoveStatus = FALSE;
else
{
BOOL FirstTime = TRUE;
FoundFile = TRUE;
MoveStatus = FALSE;
while(FoundFile)
{
if (FirstTime)
FirstTime = FALSE;
else
FoundFile = FindNextFile (hDestFile, &findDestBuffer);
if (!FoundFile)
{ /* Nothing to do in this folder so we stop working on it */
FindClose(hDestFile);
(pszSrcDirPointer)--;
(pszDestDirPointer)--;
_tcscpy(pszSrcDirPointer,_T(""));
_tcscpy(pszDestDirPointer,_T(""));
if (nDirLevel > 0)
{
TCHAR szTempPath[MAX_PATH];
INT nDiff;
FoundFile = TRUE; /* we need to continue our seek for files */
nDirLevel--;
RemoveDirectory(szMoveSrc);
GetDirectory(szMoveSrc,szTempPath,0);
nDiff = _tcslen(szMoveSrc) - _tcslen(szTempPath);
pszSrcDirPointer = pszSrcDirPointer - nDiff;
_tcscpy(pszSrcDirPointer,_T(""));
GetDirectory(szMoveDest,szTempPath,0);
nDiff = _tcslen(szMoveDest) - _tcslen(szTempPath);
pszDestDirPointer = pszDestDirPointer - nDiff;
_tcscpy(pszDestDirPointer,_T(""));
if(szMoveSrc[_tcslen(szMoveSrc) - 1] != _T('\\'))
_tcscat (szMoveSrc, _T("\\"));
if(szMoveDest[_tcslen(szMoveDest) - 1] != _T('\\'))
_tcscat (szMoveDest, _T("\\"));
pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
_tcscpy(pszSrcDirPointer,_T("*.*"));
hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
if (hDestFile == INVALID_HANDLE_VALUE)
continue;
FirstTime = TRUE;
}
else
{
MoveStatus = TRUE; /* we moved everything so lets tell user about it */
RemoveDirectory(szMoveSrc);
}
continue;
}
/* if we find "." or ".." we'll skip them */
if (_tcscmp(findDestBuffer.cFileName,_T(".")) == 0 ||
_tcscmp(findDestBuffer.cFileName,_T("..")) == 0)
continue;
_tcscpy(pszSrcDirPointer, findDestBuffer.cFileName);
_tcscpy(pszDestDirPointer, findDestBuffer.cFileName);
if (IsExistingFile(szMoveSrc))
{
FoundFile = CopyFile(szMoveSrc, szMoveDest, FALSE);
if (!FoundFile) continue;
DeleteFile(szMoveSrc);
}
else
{
FindClose(hDestFile);
CreateDirectory(szMoveDest, NULL);
_tcscat(szMoveDest,_T("\\"));
_tcscat(szMoveSrc,_T("\\"));
nDirLevel++;
pszDestDirPointer = szMoveDest + _tcslen(szMoveDest);
pszSrcDirPointer = szMoveSrc + _tcslen(szMoveSrc);
_tcscpy(pszSrcDirPointer,_T("*.*"));
hDestFile = FindFirstFile(szMoveSrc, &findDestBuffer);
if (hDestFile == INVALID_HANDLE_VALUE)
{
FoundFile = FALSE;
continue;
}
FirstTime = TRUE;
}
}
}
}
}
if (MoveStatus)
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
else
LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg);
}
while ((!OnlyOneFile || dwMoveStatusFlags & MOVE_SRC_CURRENT_IS_DIR ) &&
!(dwMoveStatusFlags & MOVE_SOURCE_IS_DIR) &&
FindNextFile (hFile, &findBuffer));
FindClose (hFile);
freep (arg);
return 0;
}
#endif /* INCLUDE_CMD_MOVE */

View file

@ -0,0 +1,158 @@
/*
* MSGBOX.C - msgbox internal command.
*
* clone from 4nt msgbox command
*
* 25 Aug 1999
* started - Paolo Pantaleo <paolopan@freemail.it>
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_MSGBOX
#define U_TYPE_INIT 0
//undefine it to allow to omit arguments
//that will be replaced by default ones
#define _SYNTAX_CHECK
INT CommandMsgbox (LPTSTR cmd, LPTSTR param)
{
//used to parse command line
LPTSTR tmp;
//used to find window title (used as messagebox title)
//and to find window handle to pass to MessageBox
HWND hWnd;
TCHAR buff[128];
//these are MessabeBox() parameters
LPTSTR title, prompt = "";
UINT uType = U_TYPE_INIT;
/* set default title to window title */
GetConsoleTitle(buff, 128);
title = buff;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_MSGBOX_HELP);
return 0;
}
//yes here things are quite massed up :)
//skip spaces
while(_istspace(*param))
param++;
//search for type of messagebox (ok, okcancel, ...)
if (_tcsnicmp(param, _T("ok "), 3) == 0)
{
uType |= MB_ICONEXCLAMATION | MB_OK;
param += 3;
}
else if (_tcsnicmp(param, _T("okcancel "), 9) == 0)
{
uType |= MB_ICONQUESTION | MB_OKCANCEL;
param += 9;
}
else if (_tcsnicmp(param, _T("yesno "), 6) == 0)
{
uType |= MB_ICONQUESTION | MB_YESNO;
param += 6;
}
else if (_tcsnicmp(param, _T("yesnocancel "), 12) == 0)
{
uType |= MB_ICONQUESTION | MB_YESNOCANCEL;
param += 12;
}
else
{
#ifdef _SYNTAX_CHECK
error_req_param_missing ();
return 1;
#else
uType |= MB_ICONEXCLAMATION | MB_OK;
#endif
}
//skip spaces
while(_istspace(*param))
param++;
#ifdef _SYNTAX_CHECK
//if reached end of string
//it is an error becuase we do not yet have prompt
if (*param == 0)
{
error_req_param_missing ();
return 1;
}
#endif
//search for "title"
tmp = param;
if (*param == '"')
{
tmp = _tcschr(param + 1, '"');
if (tmp)
{
*tmp = 0;
title = param + 1;
tmp++;
param = tmp;
}
}
//skip spaces
while(_istspace(*param))
param++;
#ifdef _SYNTAX_CHECK
//get prompt
if (*param == 0)
{
error_req_param_missing ();
return 1;
}
#endif
prompt = param;
hWnd=GetConsoleWindow ();
// DebugPrintf("FindWindow hWnd = %d\n",hWnd);
// ConErrPrintf("FindWindow hWnd = %d\n",hWnd);
switch (MessageBox(hWnd, prompt, title, uType))
{
case IDYES:
case IDOK:
nErrorLevel = 10;
break;
case IDNO:
nErrorLevel = 11;
break;
case IDCANCEL:
nErrorLevel = 12;
break;
}
return 0;
}
#endif /* INCLUDE_CMD_MSGBOX */
/* EOF */

View file

@ -0,0 +1,91 @@
/*
* PATH.C - path internal command.
*
*
* History:
*
* 17 Jul 1998 (John P Price)
* Separated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
*
* 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*
* 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection safe!
*
* 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed Win32 environment handling.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_PATH
/* size of environment variable buffer */
#define ENV_BUFFER_SIZE 1024
INT cmd_path (LPTSTR cmd, LPTSTR param)
{
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_PATH_HELP1);
return 0;
}
nErrorLevel = 0;
/* if param is empty, display the PATH environment variable */
if (!param || !*param)
{
DWORD dwBuffer;
LPTSTR pszBuffer;
TCHAR szMsg[RC_STRING_MAX_SIZE];
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
if (dwBuffer == 0)
{
LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, _T("PATH"));
return 0;
}
else if (dwBuffer > ENV_BUFFER_SIZE)
{
pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
}
ConOutPrintf (_T("PATH=%s\n"), pszBuffer);
free (pszBuffer);
return 0;
}
/* skip leading '=' */
if (*param == _T('='))
param++;
/* set PATH environment variable */
if (!SetEnvironmentVariable (_T("PATH"), param))
{
nErrorLevel = 1;
return 1;
}
return 0;
}
#endif
/* EOF */

View file

@ -0,0 +1,63 @@
/*
* PAUSE.C - pause internal command.
*
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* started.
*
* 16 Jul 1998 (John P Price)
* Seperated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_PAUSE
/*
* Perform PAUSE command.
*
* FREEDOS extension : If parameter is specified use that as the pause
* message.
*
* ?? Extend to include functionality of CHOICE if switch chars
* specified.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
INT cmd_pause (LPTSTR cmd, LPTSTR param)
{
#ifdef _DEBUG
DebugPrintf (_T("cmd_pause: \'%s\' : \'%s\')\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_PAUSE_HELP1);
return 0;
}
if (*param)
ConOutPrintf (param);
else
msg_pause ();
cgetchar ();
return 0;
}
#endif
/* EOF */

View file

@ -0,0 +1,29 @@
#ifdef _MSC_VER
#pragma warning ( disable : 4103 ) /* use #pragma pack to change alignment */
#undef _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_DEPRECATE
#endif//_MSC_VER
#include <stdlib.h>
#define WIN32_NO_STATUS
#include <windows.h>
#include <winnt.h>
#include <shellapi.h>
#include <tchar.h>
#include <direct.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <math.h>
#include <time.h>
#define NTOS_MODE_USER
#include <ndk/ntndk.h>
#include "cmd.h"
#include "config.h"
#include "batch.h"

View file

@ -0,0 +1,235 @@
/*
* PROMPT.C - prompt handling.
*
*
* History:
*
* 14/01/95 (Tim Normal)
* started.
*
* 08/08/95 (Matt Rains)
* i have cleaned up the source code. changes now bring this source
* into guidelines for recommended programming practice.
*
* 01/06/96 (Tim Norman)
* added day of the week printing (oops, forgot about that!)
*
* 08/07/96 (Steffan Kaiser)
* small changes for speed
*
* 20-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* removed redundant day strings. Use ones defined in date.c.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* moved cmd_prompt from internal.c to here
*
* 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
*
* 14-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added "$+" option.
*
* 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added "$A", "$C" and "$F" option.
* Added locale support.
* Fixed "$V" option.
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
*
* 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed Win32 environment handling.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
/*
* print the command-line prompt
*/
VOID PrintPrompt(VOID)
{
static TCHAR default_pr[] = _T("$P$G");
TCHAR szPrompt[256];
LPTSTR pr;
if (GetEnvironmentVariable (_T("PROMPT"), szPrompt, 256))
pr = szPrompt;
else
pr = default_pr;
while (*pr)
{
if (*pr != _T('$'))
{
ConOutChar (*pr);
}
else
{
pr++;
switch (_totupper (*pr))
{
case _T('A'):
ConOutChar (_T('&'));
break;
case _T('B'):
ConOutChar (_T('|'));
break;
case _T('C'):
ConOutChar (_T('('));
break;
case _T('D'):
PrintDate ();
break;
case _T('E'):
ConOutChar (_T('\x1B'));
break;
case _T('F'):
ConOutChar (_T(')'));
break;
case _T('G'):
ConOutChar (_T('>'));
break;
case _T('H'):
ConOutChar (_T('\x08'));
ConOutChar (_T(' '));
ConOutChar (_T('\x08'));
break;
case _T('L'):
ConOutChar (_T('<'));
break;
case _T('N'):
{
TCHAR szPath[MAX_PATH];
GetCurrentDirectory (MAX_PATH, szPath);
ConOutChar (szPath[0]);
}
break;
case _T('P'):
{
TCHAR szPath[MAX_PATH];
GetCurrentDirectory (MAX_PATH, szPath);
ConOutPrintf (_T("%s"), szPath);
}
break;
case _T('Q'):
ConOutChar (_T('='));
break;
case _T('S'):
ConOutChar (_T(' '));
break;
case _T('T'):
{
SYSTEMTIME t;
GetSystemTime(&t);
ConOutPrintf(_T("%02d%c%02d%c%02d%c%02d\n"),t.wHour, cTimeSeparator,t.wMinute , cTimeSeparator,
t.wSecond , cDecimalSeparator, t.wMilliseconds );
}
break;
case _T('V'):
switch (osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
if (osvi.dwMajorVersion == 4 &&
osvi.dwMinorVersion == 1)
ConOutPrintf (_T("Windows 98"));
else
ConOutPrintf (_T("Windows 95"));
break;
case VER_PLATFORM_WIN32_NT:
ConOutPrintf (_T("Windows NT Version %lu.%lu"),
osvi.dwMajorVersion, osvi.dwMinorVersion);
break;
}
break;
case _T('_'):
ConOutChar (_T('\n'));
break;
case '$':
ConOutChar (_T('$'));
break;
#ifdef FEATURE_DIRECTORY_STACK
case '+':
{
INT i;
for (i = 0; i < GetDirectoryStackDepth (); i++)
ConOutChar (_T('+'));
}
break;
#endif
}
}
pr++;
}
}
#ifdef INCLUDE_CMD_PROMPT
INT cmd_prompt (LPTSTR cmd, LPTSTR param)
{
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_PROMPT_HELP1);
#ifdef FEATURE_DIRECTORY_STACK
ConOutResPaging(FALSE,STRING_PROMPT_HELP2);
#endif
ConOutResPaging(FALSE,STRING_PROMPT_HELP3);
return 0;
}
/* if it is null, then it needs to set to default,
because that means the user entered "prompt" only.
so even if param is null you _must_ still set prompt
to the default. There seems to be some kinda difference
between winxp and 2k in this matter and this way will
cover both. Do not use fixed size of szParam for param the buffer are 8192bytes
and will later change to dymatic buffer */
/* set PROMPT environment variable */
if (param[0] != _T('\0'))
{
if (!SetEnvironmentVariable (_T("PROMPT"), param))
return 1;
}
else
{
TCHAR szParam[5];
_tcscpy(szParam,_T("$P$G"));
if (!SetEnvironmentVariable (_T("PROMPT"),szParam))
return 1;
}
return 0;
}
#endif
/* EOF */

View file

@ -0,0 +1,55 @@
ReactOS command line interpreter CMD
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ReactOS command line interpreter CMD is derived from FreeCOM, the
FreeDOS command line interpreter.
We are shooting mainly to be just like 2000/XP cmd.exe. They are very close and only a small number(none that i can recall off the top of my head, so maybe 0) differences have been found between those two. It has been reported that ROS cmd.exe does not work on nt4 because of a missing api. I'm hoping to fix this at some point.
Compiling
~~~~~~~~~
ROS cmd used to depend on __REACTOS__ to provide two different ways to build cmd. There is still code left in it for this but... The __REACTOS__ = 0 has not been develped, maintained. And therefore it does not even compile anymore. __REACTOS__ = 1 works fine on both windows(nt). and someday i plan to remove all the __REACTOS__ = 0.
Using rbuild you can compile cmd seperatly by "make cmd_install". Also you can compile cmd using MSVC 6 and soon 7/8 hopefully.
Current Features
~~~~~~~~~~~~~~~~
- environment handling with prompt and path support.
- directory utilities.
- command-line history with doskey-like features.
- batch file processing.
- input/output redirection and piping.
- alias support.
- filename completion (use TAB), both unix and windows style.
Credits
~~~~~~~
FreeDOS developers:
normat@rpi.edu (Tim Norman)
mrains@apanix.apana.org.au (Matt Rains)
ejeffrey@iastate.edu (Evan Jeffrey)
Steffen.Kaiser@Informatik.TU-Chemnitz.DE (Steffen Kaiser)
Svante Frey (sfrey@kuai.se)
Oliver Mueller (ogmueller@t-online.de)
Aaron Kaufman (morgan@remarque.berkeley.edu)
Marc Desrochers (bitzero@hotmail.com)
Rob Lake (rlake@cs.mun.ca)
John P. Price <linux-guru@gcfl.net>
Hans B Pufal <hansp@digiweb.com>
ReactOS developers:
Eric Kohl <ekohl@rz-online.de>
Emanuele Aliberti <ea@iol.it>
Paolo Pantaleo <paolopan@freemail.it>
Brandon Turner <turnerb7@msu.edu>
Bugs
~~~~
There is still many bugs ;)
Please report bugs to ReactOS team <ros-dev@reactos.org> or to bugzilla at www.reactos.org

View file

@ -0,0 +1,19 @@
General Overview of How THings Work
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
First it comes into _main in cmd.c(1811). The command line params are taking in and if it is unicode it uses CommandLineToArgvW. This can cause a problem on older machines and that is why we have our own custom _CommandLineToArgvW to help this along. We pull in the launch directory as the inital dir and set that in _tchdir. We make a handle to the default console out using CreateFile.
Then we call Initialize(). Here we need to load ntdll.dll if it isnt loaded(windows 9x machines). We also setup some gloabl vars like default io handles and nErrorLevel and set %prompt% to $P$G. This is where all command lines switches given to cmd on startup are done.
From here main calls ProcessInput(). This is where cmd loops for getting input and doing the commands. First it checks to see if there is a batch file(note: there is agolbal struct "bc" which is NULL when not processing a batch file) and if there is it will pull a new line from that file. If not, thne it will wait for input. Currently there is some stuff for set /a in there, which might stay there or see if we can find a better spot.
Once there is input taken in from the command line it is sent into ParseCommandLine(). In here we fist check for aliases and convert if need be. THen we look for redirections using GetRedirection() which will remove any redirection symbols. and pass back info about where to redirect. from this info it will do some switching around with the handles for where things go and send them as need be. personally i dont like this code and i tried to chnage it before but failed. it is confusing to me and i dont understand why a lot of it is there but apparently it is needed.
It sends the new string without any redirection info into DoCommand(). In this function we just look to see what should be done. There is one of 2 things that could happen. 1) we fnd the matching command and send it off to that commands little section. 2) we dont find it so we send it to Execute() and see if it is a file that we can do something.
Execute will try to launch the file using createprocess and falls back on shellexecute. It calls a function called SearchForExecuteable() to find the full path name and looks in all the correct locations like PATH, curreent folder, windows folder. If it cant find it, just fails and prints out a message.
Some useful functions that are used a lot:
split() - splits a string into an array of string on spaces that arent inside quotes. which you need to call freep() on later t clean up.
IsValidPathName(), IsExistingFile(), IsExistingDirectory() - all do what you would expect.
PagePrompt() - ask them to hit a key to continue
FilePromptYN[A]() - ask them a yes or no question

View file

@ -0,0 +1,279 @@
/*
* REDIR.C - redirection handling.
*
*
* History:
*
* 12/15/95 (Tim Norman)
* started.
*
* 12 Jul 98 (Hans B Pufal)
* Rewrote to make more efficient and to conform to new command.c
* and batch.c processing.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* Added config.h include
*
* 22-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode safe!
* Added new error redirection "2>" and "2>>".
*
* 26-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added new error AND output redirection "&>" and "&>>".
*
* 24-Jun-2005 (Brandon Turner <turnerb7@msu.edu>)
* simple check to fix > and | bug with 'rem'
*/
#include <precomp.h>
#ifdef FEATURE_REDIRECTION
static BOOL
IsRedirection (TCHAR c)
{
return (c == _T('<')) || (c == _T('>')) || (c == _T('|'));
}
/*
* Gets the redirection info from the command line and copies the
* file names into ifn, ofn and efn removing them from the command
* line.
*
* Converts remaining command line into a series of null terminated
* strings defined by the pipe char '|'. Each string corresponds
* to a single executable command. A double null terminates the
* command strings.
*
* Return number of command strings found.
*
*/
INT GetRedirection (LPTSTR s, LPTSTR ifn, LPTSTR ofn, LPTSTR efn, LPINT lpnFlags)
{
INT num = 1;
LPTSTR dp = s;
LPTSTR sp = s;
#ifdef INCLUDE_CMD_REM
TCHAR * line = s;
while (_istspace (*line))
line++;
/*first thing first. check to see if this is "rem" and hope out*/
if(!_tcsncmp (line, _T("rem "), 4))
{
lpnFlags = 0;
*ifn=('\0');
*ofn=('\0');
*efn=_T('\0');
return 1;
}
#endif
/* find and remove all the redirections first */
while (*sp)
{
if (*sp == _T('^'))
{
*dp++ = *sp++;
*dp++ = *sp++;
continue;
}
if ((*sp == _T('"')) || (*sp == _T('\'')))
{
/* No redirects inside quotes */
TCHAR qc = *sp;
do
*dp++ = *sp++;
while (*sp && *sp != qc);
*dp++ = *sp++;
}
else if ((*sp == _T('<')) || (*sp == _T('>')) ||
(*sp == _T('1')) || (*sp == _T('2')) || (*sp == _T('&')))
{
/* MS-DOS ignores multiple redirection symbols and uses the last */
/* redirection, so we'll emulate that and not check */
if (*sp == _T('<'))
{
/* input redirection */
*lpnFlags |= INPUT_REDIRECTION;
do sp++;
while( _istspace (*sp) );
/* copy file name */
while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
*ifn++ = *sp++;
*ifn = _T('\0');
}
else if (*sp == _T('>'))
{
/* output redirection */
*lpnFlags |= OUTPUT_REDIRECTION;
sp++;
/* append request ? */
if (*sp == _T('>'))
{
*lpnFlags |= OUTPUT_APPEND;
sp++;
}
while (_istspace (*sp))
sp++;
/* copy file name */
while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
*ofn++ = *sp++;
*ofn = _T('\0');
}
else if (*sp == _T('1'))
{
/* output redirection */
sp++;
if (*sp == _T('>'))
{
/* output redirection */
*lpnFlags |= OUTPUT_REDIRECTION;
sp++;
/* append request ? */
if (*sp == _T('>'))
{
*lpnFlags |= OUTPUT_APPEND;
sp++;
}
}
else
{
/* no redirection!! copy the '1' character! */
sp--;
*dp++ = *sp++;
continue;
}
while (_istspace (*sp))
sp++;
/* copy file name */
while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
*ofn++ = *sp++;
*ofn = _T('\0');
}
else if (*sp == _T('2'))
{
/* error redirection */
sp++;
if (*sp == _T('>'))
{
*lpnFlags |= ERROR_REDIRECTION;
sp++;
/* append request ? */
if (*sp == _T('>'))
{
*lpnFlags |= ERROR_APPEND;
sp++;
}
}
else
{
/* no redirection!! copy the '2' character! */
sp--;
*dp++ = *sp++;
continue;
}
while (_istspace (*sp))
sp++;
/* copy file name */
while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
*efn++ = *sp++;
*efn = _T('\0');
}
else if (*sp == _T('&'))
{
/* output AND error redirection */
sp++;
if (*sp == _T('>'))
{
*lpnFlags |= (ERROR_REDIRECTION | OUTPUT_REDIRECTION);
sp++;
/* append request ? */
if (*sp == _T('>'))
{
*lpnFlags |= (ERROR_APPEND | OUTPUT_APPEND);
sp++;
}
}
else
{
/* no redirection!! copy the '&' character! */
sp--;
*dp++ = *sp++;
continue;
}
while (_istspace (*sp))
sp++;
/* copy file name */
while (*sp && !IsRedirection (*sp) && !_istspace (*sp))
*ofn++ = *efn++ = *sp++;
*ofn = *efn = _T('\0');
}
}
else
*dp++ = *sp++;
}
*dp++ = _T('\0');
*dp = _T('\0');
/* now go for the pipes */
sp = s;
while (*sp)
{
if (*sp == _T('^'))
{
sp++;
sp++;
continue;
}
else if ((*sp == _T('"')) || (*sp == _T('\'')))
{
TCHAR qc = *sp;
do
sp++;
while (*sp && *sp != qc);
sp++;
}
else if (*sp == _T('|'))
{
*sp++ = _T('\0');
num++;
}
else
sp++;
}
return num;
}
#endif /* FEATURE_REDIRECTION */

View file

@ -0,0 +1,268 @@
/*
* REN.C - rename internal command.
*
*
* History:
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 18-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>
* Added support for quoted long file names with spaces.
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>
* Unicode and redirection safe!
*
* 17-Oct-2001 (Eric Kohl <ekohl@rz.online.de>
* Implemented basic rename code.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_RENAME
enum
{
REN_ATTRIBUTES = 0x001, /* /A : not implemented */
REN_ERROR = 0x002, /* /E */
REN_NOTHING = 0x004, /* /N */
REN_PROMPT = 0x008, /* /P : not implemented */
REN_QUIET = 0x010, /* /Q */
REN_SUBDIR = 0x020, /* /S */
REN_TOTAL = 0x040, /* /T */
};
/*
* file rename internal command.
*
*/
INT cmd_rename (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
LPTSTR *arg = NULL;
INT args = 0;
INT nEvalArgs = 0; /* nunber of evaluated arguments */
DWORD dwFlags = 0;
DWORD dwFiles = 0; /* number of renamedd files */
INT i;
LPTSTR srcPattern = NULL;
LPTSTR dstPattern = NULL;
TCHAR dstFile[MAX_PATH];
BOOL bDstWildcard = FALSE;
LPTSTR p,q,r;
HANDLE hFile;
WIN32_FIND_DATA f;
if (!_tcsncmp(param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_REN_HELP1);
return 0;
}
nErrorLevel = 0;
/* split the argument list */
arg = split(param, &args, FALSE);
if (args < 2)
{
if (!(dwFlags & REN_ERROR))
error_req_param_missing();
freep(arg);
return 1;
}
/* read options */
for (i = 0; i < args; i++)
{
if (*arg[i] == _T('/'))
{
if (_tcslen(arg[i]) >= 2)
{
switch (_totupper(arg[i][1]))
{
case _T('E'):
dwFlags |= REN_ERROR;
break;
case _T('N'):
dwFlags |= REN_NOTHING;
break;
case _T('P'):
dwFlags |= REN_PROMPT;
break;
case _T('Q'):
dwFlags |= REN_QUIET;
break;
case _T('S'):
dwFlags |= REN_SUBDIR;
break;
case _T('T'):
dwFlags |= REN_TOTAL;
break;
}
}
nEvalArgs++;
}
}
/* keep quiet within batch files */
if (bc != NULL)
dwFlags |= REN_QUIET;
/* there are only options on the command line --> error!!! */
if (args < nEvalArgs + 2)
{
if (!(dwFlags & REN_ERROR))
error_req_param_missing();
freep(arg);
return 1;
}
/* get destination pattern */
for (i = 0; i < args; i++)
{
if (*arg[i] == _T('/'))
continue;
dstPattern = arg[i];
}
if (_tcschr(dstPattern, _T('*')) || _tcschr(dstPattern, _T('?')))
bDstWildcard = TRUE;
/* enumerate source patterns */
for (i = 0; i < args; i++)
{
if (*arg[i] == _T('/') || arg[i] == dstPattern)
continue;
srcPattern = arg[i];
#ifdef _DEBUG
ConErrPrintf(_T("\n\nSourcePattern: %s\n"), srcPattern);
ConErrPrintf(_T("DestinationPattern: %s\n"), dstPattern);
#endif
hFile = FindFirstFile(srcPattern, &f);
if (hFile == INVALID_HANDLE_VALUE)
{
if (!(dwFlags & REN_ERROR))
error_file_not_found();
continue;
}
do
{
/* ignore "." and ".." */
if (!_tcscmp (f.cFileName, _T(".")) ||
!_tcscmp (f.cFileName, _T("..")))
continue;
/* do not rename hidden or system files */
if (f.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM))
continue;
/* do not rename directories when the destination pattern contains
* wildcards, unless option /S is used */
if ((f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& bDstWildcard
&& !(dwFlags & REN_SUBDIR))
continue;
#ifdef _DEBUG
ConErrPrintf(_T("Found source name: %s\n"), f.cFileName);
#endif
/* build destination file name */
p = f.cFileName;
q = dstPattern;
r = dstFile;
while(*q != 0)
{
if (*q == '*')
{
q++;
while (*p != 0 && *p != *q)
{
*r = *p;
p++;
r++;
}
}
else if (*q == '?')
{
q++;
if (*p != 0)
{
*r = *p;
p++;
r++;
}
}
else
{
*r = *q;
if (*p != 0)
p++;
q++;
r++;
}
}
*r = 0;
#ifdef _DEBUG
ConErrPrintf(_T("DestinationFile: %s\n"), dstFile);
#endif
if (!(dwFlags & REN_QUIET) && !(dwFlags & REN_TOTAL))
ConOutPrintf(_T("%s -> %s\n"), f.cFileName, dstFile);
/* rename the file */
if (!(dwFlags & REN_NOTHING))
{
if (MoveFile(f.cFileName, dstFile))
{
dwFiles++;
}
else
{
if (!(dwFlags & REN_ERROR))
{
LoadString(CMD_ModuleHandle, STRING_REN_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, GetLastError());
}
}
}
}
while (FindNextFile(hFile, &f));
FindClose(hFile);
}
if (!(dwFlags & REN_QUIET))
{
if (dwFiles == 1)
LoadString( CMD_ModuleHandle, STRING_REN_HELP2, szMsg, RC_STRING_MAX_SIZE);
else
LoadString( CMD_ModuleHandle, STRING_REN_HELP3, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg,dwFiles);
}
freep(arg);
return 0;
}
#endif
/* EOF */

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View file

@ -0,0 +1,231 @@
#define RC_STRING_MAX_SIZE 3072
#define STRING_ERROR_PARAMETERF_ERROR 100
#define STRING_ERROR_INVALID_SWITCH 101
#define STRING_ERROR_TOO_MANY_PARAMETERS 102
#define STRING_ERROR_PATH_NOT_FOUND 103
#define STRING_ERROR_FILE_NOT_FOUND 104
#define STRING_ERROR_REQ_PARAM_MISSING 105
#define STRING_ERROR_INVALID_DRIVE 106
#define STRING_ERROR_INVALID_PARAM_FORMAT 107
#define STRING_ERROR_BADCOMMAND 108
#define STRING_ERROR_OUT_OF_MEMORY 109
#define STRING_ERROR_CANNOTPIPE 110
#define STRING_ERROR_D_PAUSEMSG 111
#define STRING_ERROR_DRIVER_NOT_READY 112
#define STRING_CHOICE_OPTION 200
#define STRING_COPY_OPTION 201
#define STRING_ALIAS_ERROR 300
#define STRING_BATCH_ERROR 301
#define STRING_CHCP_ERROR1 302
#define STRING_CHCP_ERROR4 305
#define STRING_CHOICE_ERROR 306
#define STRING_CHOICE_ERROR_TXT 307
#define STRING_CHOICE_ERROR_OPTION 308
#define STRING_CMD_ERROR1 309
#define STRING_CMD_ERROR2 310
#define STRING_CMD_ERROR3 311
#define STRING_CMD_ERROR4 312
#define STRING_CMD_ERROR5 313
#define STRING_COLOR_ERROR1 314
#define STRING_COLOR_ERROR2 315
#define STRING_COLOR_ERROR3 316
#define STRING_COLOR_ERROR4 317
#define STRING_CONSOLE_ERROR 318
#define STRING_COPY_ERROR1 319
#define STRING_COPY_ERROR2 320
#define STRING_COPY_ERROR3 321
#define STRING_COPY_ERROR4 322
#define STRING_DATE_ERROR 323
#define STRING_DEL_ERROR5 328
#define STRING_DEL_ERROR6 329
#define STRING_DEL_ERROR7 330
#define STRING_ERROR_ERROR1 332
#define STRING_ERROR_ERROR2 333
#define STRING_FOR_ERROR1 334
#define STRING_FOR_ERROR2 335
#define STRING_FOR_ERROR3 336
#define STRING_FOR_ERROR4 337
#define STRING_FREE_ERROR1 338
#define STRING_FREE_ERROR2 339
#define STRING_GOTO_ERROR1 340
#define STRING_GOTO_ERROR2 341
#define STRING_MOVE_ERROR1 342
#define STRING_MOVE_ERROR2 343
#define STRING_PATH_ERROR 345
#define STRING_REN_ERROR1 346
#define STRING_START_ERROR1 347
#define STRING_TIME_ERROR1 348
#define STRING_TYPE_ERROR1 349
#define STRING_WINDOW_ERROR1 350
#define STRING_ATTRIB_HELP 600
#define STRING_ALIAS_HELP 601
#define STRING_BEEP_HELP 602
#define STRING_CALL_HELP 603
#define STRING_CD_HELP 604
#define STRING_CHCP_HELP 605
#define STRING_CHOICE_HELP 606
#define STRING_CLS_HELP 607
#define STRING_CMD_HELP1 608
#define STRING_CMD_HELP2 609
#define STRING_CMD_HELP3 610
#define STRING_CMD_HELP4 611
#define STRING_CMD_HELP5 612
#define STRING_CMD_HELP6 613
#define STRING_CMD_HELP7 614
#define STRING_CMD_HELP8 615
#define STRING_CMD_SHELLINFO 624
#define STRING_COLOR_HELP1 625
#define STRING_COPY_HELP1 626
#define STRING_COPY_HELP2 627
#define STRING_DATE_HELP1 628
#define STRING_DATE_HELP2 629
#define STRING_DATE_HELP3 630
#define STRING_DATE_HELP4 631
#define STRING_DEL_HELP1 632
#define STRING_DEL_HELP2 633
#define STRING_DEL_HELP3 634
#define STRING_DEL_HELP4 635
#define STRING_DELAY_HELP 636
#define STRING_DIR_HELP1 637
#define STRING_DIR_HELP2 638
#define STRING_DIR_HELP3 639
#define STRING_DIR_HELP4 640
#define STRING_DIR_HELP5 641
#define STRING_DIR_HELP6 642
#define STRING_DIR_HELP7 643
#define STRING_DIR_HELP8 644
#define STRING_DIRSTACK_HELP1 645
#define STRING_DIRSTACK_HELP2 646
#define STRING_DIRSTACK_HELP3 647
#define STRING_DIRSTACK_HELP4 648
#define STRING_ECHO_HELP1 649
#define STRING_ECHO_HELP2 650
#define STRING_ECHO_HELP3 651
#define STRING_ECHO_HELP4 652
#define STRING_ECHO_HELP5 653
#define STRING_EXIT_HELP 654
#define STRING_FOR_HELP1 655
#define STRING_FREE_HELP1 656
#define STRING_FREE_HELP2 657
#define STRING_IF_HELP1 658
#define STRING_GOTO_HELP1 659
#define STRING_LABEL_HELP1 660
#define STRING_LABEL_HELP2 661
#define STRING_LABEL_HELP3 662
#define STRING_LABEL_HELP4 663
#define STRING_LABEL_HELP5 664
#define STRING_LOCALE_HELP1 665
#define STRING_MKDIR_HELP 666
#define STRING_MEMMORY_HELP1 667
#define STRING_MEMMORY_HELP2 668
#define STRING_MISC_HELP1 669
#define STRING_MOVE_HELP1 670
#define STRING_MOVE_HELP2 671
#define STRING_MSGBOX_HELP 672
#define STRING_PATH_HELP1 673
#define STRING_PAUSE_HELP1 674
#define STRING_PROMPT_HELP1 675
#define STRING_PROMPT_HELP2 676
#define STRING_PROMPT_HELP3 677
#define STRING_REM_HELP 678
#define STRING_REN_HELP1 679
#define STRING_REN_HELP2 680
#define STRING_REN_HELP3 681
#define STRING_RMDIR_HELP 682
#define STRING_SCREEN_HELP 683
#define STRING_SHIFT_HELP 684
#define STRING_SET_HELP 685
#define STRING_START_HELP1 686
#define STRING_TITLE_HELP 687
#define STRING_TIME_HELP1 688
#define STRING_TIME_HELP2 689
#define STRING_TIMER_HELP1 690
#define STRING_TIMER_HELP2 691
#define STRING_TIMER_HELP3 692
#define STRING_TYPE_HELP1 693
#define STRING_VERIFY_HELP1 694
#define STRING_VERIFY_HELP2 695
#define STRING_VERIFY_HELP3 696
#define STRING_VERSION_HELP1 697
#define STRING_VERSION_HELP2 698
#define STRING_VERSION_HELP3 699
#define STRING_VERSION_HELP4 700
#define STRING_VERSION_HELP5 701
#define STRING_VERSION_HELP6 702
#define STRING_VERSION_HELP7 703
#define STRING_VERSION_RUNVER 705
#define STRING_VOL_HELP1 706
#define STRING_VOL_HELP2 707
#define STRING_VOL_HELP3 708
#define STRING_VOL_HELP4 709
#define STRING_WINDOW_HELP1 710
#define STRING_WINDOW_HELP2 711
#define STRING_COPY_FILE 712
#define STRING_DELETE_WIPE 713
#define STRING_FOR_ERROR 714
#define STRING_SCREEN_COL 715
#define STRING_SCREEN_ROW 716
#define STRING_TIMER_TIME 717
#define STRING_HELP1 718
#define STRING_HELP2 719
#define STRING_INVALID_OPERAND 720
#define STRING_EXPECTED_CLOSE_PAREN 721
#define STRING_EXPECTED_NUMBER_OR_VARIABLE 722
#define STRING_SYNTAX_COMMAND_INCORRECT 723
#define STRING_RMDIR_HELP2 724
#define STRING_MD_ERROR 725
#define STRING_MD_ERROR2 726
/* These strings are language independent (cmd.rc) */
#define STRING_FREEDOS_DEV 800
#define STRING_REACTOS_DEV 801
/* EOF */

View file

@ -0,0 +1,104 @@
/*
* SCREEN.C - screen internal command.
*
* clone from 4nt msgbox command
*
* 30 Aug 1999
* started - Paolo Pantaleo <paolopan@freemail.it>
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_SCREEN
INT CommandScreen (LPTSTR cmd, LPTSTR param)
{
SHORT x,y;
BOOL bSkipText = FALSE;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_SCREEN_HELP);
return 0;
}
nErrorLevel = 0;
//get row
while(_istspace(*param))
param++;
if(!(*param))
{
error_req_param_missing ();
return 1;
}
y = _ttoi(param);
if (y<0 || y>(maxy-1))
{
ConOutResPuts(STRING_SCREEN_ROW);
return 1;
}
//get col
if(!(param = _tcschr(param,_T(' '))))
{
error_req_param_missing ();
return 1;
}
while(_istspace(*param))
param++;
if(!(*param))
{
error_req_param_missing ();
return 1;
}
x = _ttoi(param);
if (x<0 || x>(maxx-1))
{
ConErrResPuts(STRING_SCREEN_COL);
return 1;
}
//get text
if(!(param = _tcschr(param,_T(' '))))
{
bSkipText = TRUE;
}
else
{
while(_istspace(*param))
param++;
if(!(*param))
{
bSkipText = TRUE;
}
}
bIgnoreEcho = TRUE;
if(bSkipText)
x=0;
SetCursorXY(x,y);
if(!(bSkipText))
ConOutPuts(param);
return 0;
}
#endif /* INCLUDE_CMD_SCREEN */

View file

@ -0,0 +1,494 @@
/*
* SET.C - set internal command.
*
*
* History:
*
* 06/14/97 (Tim Norman)
* changed static var in set() to a malloc'd space to pass to putenv.
* need to find a better way to do this, since it seems it is wasting
* memory when variables are redefined.
*
* 07/08/1998 (John P. Price)
* removed call to show_environment in set command.
* moved test for syntax before allocating memory in set command.
* misc clean up and optimization.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 28-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added set_env function to set env. variable without needing set command
*
* 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
*
* 24-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed Win32 environment handling.
* Unicode and redirection safe!
*
* 25-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed little bug.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include <malloc.h>
#include <stdio.h>
#include "resource.h"
#ifdef INCLUDE_CMD_SET
/* initial size of environment variable buffer */
#define ENV_BUFFER_SIZE 1024
static BOOL
seta_eval ( LPCTSTR expr );
static LPCTSTR
skip_ws ( LPCTSTR p )
{
return p + _tcsspn ( p, _T(" \t") );
}
INT cmd_set (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
INT i;
LPTSTR p;
if ( !_tcsncmp (param, _T("/?"), 2) )
{
ConOutResPaging(TRUE,STRING_SET_HELP);
return 0;
}
/* remove escapes */
if ( param[0] ) for ( i = 0; param[i+1]; i++ )
{
if ( param[i] == _T('^') )
{
memmove ( &param[i], &param[i+1], _tcslen(&param[i]) * sizeof(TCHAR) );
}
}
/* if no parameters, show the environment */
if (param[0] == _T('\0'))
{
LPTSTR lpEnv;
LPTSTR lpOutput;
INT len;
lpEnv = (LPTSTR)GetEnvironmentStrings ();
if (lpEnv)
{
lpOutput = lpEnv;
while (*lpOutput)
{
len = _tcslen(lpOutput);
if (len)
{
if (*lpOutput != _T('='))
ConOutPuts (lpOutput);
lpOutput += (len + 1);
}
}
FreeEnvironmentStrings (lpEnv);
}
return 0;
}
/* the /A does *NOT* have to be followed by a whitespace */
if ( !_tcsnicmp (param, _T("/A"), 2) )
{
BOOL Success = seta_eval ( skip_ws(param+2) );
if(!Success)
{
/*might seem random but this is what windows xp does */
nErrorLevel = 9165;
}
/* TODO FIXME - what are we supposed to return? */
return Success;
}
p = _tcschr (param, _T('='));
if (p)
{
/* set or remove environment variable */
*p = _T('\0');
p++;
if (*p == _T('\0'))
{
p = NULL;
}
SetEnvironmentVariable (param, p);
}
else
{
/* display environment variable */
LPTSTR pszBuffer;
DWORD dwBuffer;
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
dwBuffer = GetEnvironmentVariable (param, pszBuffer, ENV_BUFFER_SIZE);
if (dwBuffer == 0)
{
LoadString(CMD_ModuleHandle, STRING_PATH_ERROR, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf (szMsg, param);
return 0;
}
else if (dwBuffer > ENV_BUFFER_SIZE)
{
pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
GetEnvironmentVariable (param, pszBuffer, dwBuffer);
}
ConOutPrintf (_T("%s\n"), pszBuffer);
free (pszBuffer);
return 0;
}
return 0;
}
static INT
ident_len ( LPCTSTR p )
{
LPCTSTR p2 = p;
if ( __iscsymf(*p) )
{
++p2;
while ( __iscsym(*p2) )
++p2;
}
return p2-p;
}
#define PARSE_IDENT(ident,identlen,p) \
identlen = ident_len(p); \
ident = (LPTSTR)alloca ( ( identlen + 1 ) * sizeof(TCHAR) ); \
memmove ( ident, p, identlen * sizeof(TCHAR) ); \
ident[identlen] = 0; \
p += identlen;
static BOOL
seta_identval ( LPCTSTR ident, INT* result )
{
LPCTSTR identVal = GetEnvVarOrSpecial ( ident );
if ( !identVal )
{
/* TODO FIXME - what to do upon failure? */
*result = 0;
return FALSE;
}
*result = _ttoi ( identVal );
return TRUE;
}
static BOOL
calc ( INT* lval, TCHAR op, INT rval )
{
switch ( op )
{
case '*':
*lval *= rval;
break;
case '/':
*lval /= rval;
break;
case '%':
*lval %= rval;
break;
case '+':
*lval += rval;
break;
case '-':
*lval -= rval;
break;
case '&':
*lval &= rval;
break;
case '^':
*lval ^= rval;
break;
case '|':
*lval |= rval;
break;
default:
ConErrResPuts ( STRING_INVALID_OPERAND );
return FALSE;
}
return TRUE;
}
static BOOL
seta_stmt ( LPCTSTR* p_, INT* result );
static BOOL
seta_unaryTerm ( LPCTSTR* p_, INT* result )
{
LPCTSTR p = *p_;
if ( *p == _T('(') )
{
INT rval;
p = skip_ws ( p + 1 );
if ( !seta_stmt ( &p, &rval ) )
return FALSE;
if ( *p != _T(')') )
{
ConErrResPuts ( STRING_EXPECTED_CLOSE_PAREN );
return FALSE;
}
*result = rval;
p = skip_ws ( p + 1 );
}
else if ( isdigit(*p) )
{
*result = _ttoi ( p );
p = skip_ws ( p + _tcsspn ( p, _T("1234567890") ) );
}
else if ( __iscsymf(*p) )
{
LPTSTR ident;
INT identlen;
PARSE_IDENT(ident,identlen,p);
if ( !seta_identval ( ident, result ) )
return FALSE;
}
else
{
ConErrResPuts ( STRING_EXPECTED_NUMBER_OR_VARIABLE );
return FALSE;
}
*p_ = p;
return TRUE;
}
static BOOL
seta_mulTerm ( LPCTSTR* p_, INT* result )
{
LPCTSTR p = *p_;
TCHAR op = 0;
INT rval;
if ( _tcschr(_T("!~-"),*p) )
{
op = *p;
p = skip_ws ( p + 1 );
}
if ( !seta_unaryTerm ( &p, &rval ) )
return FALSE;
switch ( op )
{
case '!':
rval = !rval;
break;
case '~':
rval = ~rval;
break;
case '-':
rval = -rval;
break;
}
*result = rval;
*p_ = p;
return TRUE;
}
static BOOL
seta_ltorTerm ( LPCTSTR* p_, INT* result, LPCTSTR ops, BOOL (*subTerm)(LPCTSTR*,INT*) )
{
LPCTSTR p = *p_;
INT lval;
if ( !subTerm ( &p, &lval ) )
return FALSE;
while ( *p && _tcschr(ops,*p) )
{
INT rval;
TCHAR op = *p;
p = skip_ws ( p+1 );
if ( !subTerm ( &p, &rval ) )
return FALSE;
if ( !calc ( &lval, op, rval ) )
return FALSE;
}
*result = lval;
*p_ = p;
return TRUE;
}
static BOOL
seta_addTerm ( LPCTSTR* p_, INT* result )
{
return seta_ltorTerm ( p_, result, _T("*/%"), seta_mulTerm );
}
static BOOL
seta_logShiftTerm ( LPCTSTR* p_, INT* result )
{
return seta_ltorTerm ( p_, result, _T("+-"), seta_addTerm );
}
static BOOL
seta_bitAndTerm ( LPCTSTR* p_, INT* result )
{
LPCTSTR p = *p_;
INT lval;
if ( !seta_logShiftTerm ( &p, &lval ) )
return FALSE;
while ( *p && _tcschr(_T("<>"),*p) && p[0] == p[1] )
{
INT rval;
TCHAR op = *p;
p = skip_ws ( p+2 );
if ( !seta_logShiftTerm ( &p, &rval ) )
return FALSE;
switch ( op )
{
case '<':
lval <<= rval;
break;
case '>':
lval >>= rval;
break;
default:
ConErrResPuts ( STRING_INVALID_OPERAND );
return FALSE;
}
}
*result = lval;
*p_ = p;
return TRUE;
}
static BOOL
seta_bitExclOrTerm ( LPCTSTR* p_, INT* result )
{
return seta_ltorTerm ( p_, result, _T("&"), seta_bitAndTerm );
}
static BOOL
seta_bitOrTerm ( LPCTSTR* p_, INT* result )
{
return seta_ltorTerm ( p_, result, _T("^"), seta_bitExclOrTerm );
}
static BOOL
seta_expr ( LPCTSTR* p_, INT* result )
{
return seta_ltorTerm ( p_, result, _T("|"), seta_bitOrTerm );
}
static BOOL
seta_assignment ( LPCTSTR* p_, INT* result )
{
LPCTSTR p = *p_;
LPTSTR ident;
TCHAR op = 0;
INT identlen, exprval;
PARSE_IDENT(ident,identlen,p);
if ( identlen )
{
if ( *p == _T('=') )
op = *p, p = skip_ws(p+1);
else if ( _tcschr ( _T("*/%+-&^|"), *p ) && p[1] == _T('=') )
op = *p, p = skip_ws(p+2);
else if ( _tcschr ( _T("<>"), *p ) && *p == p[1] && p[2] == _T('=') )
op = *p, p = skip_ws(p+3);
}
/* allow to chain multiple assignments, such as: a=b=1 */
if ( ident && op )
{
INT identval;
LPTSTR buf;
if ( !seta_assignment ( &p, &exprval ) )
return FALSE;
if ( !seta_identval ( ident, &identval ) )
identval = 0;
switch ( op )
{
case '=':
identval = exprval;
break;
case '<':
identval <<= exprval;
break;
case '>':
identval >>= exprval;
break;
default:
if ( !calc ( &identval, op, exprval ) )
return FALSE;
}
buf = (LPTSTR)alloca ( 32 * sizeof(TCHAR) );
_sntprintf ( buf, 32, _T("%i"), identval );
SetEnvironmentVariable ( ident, buf ); // TODO FIXME - check return value
exprval = identval;
}
else
{
/* restore p in case we found an ident but not an op */
p = *p_;
if ( !seta_expr ( &p, &exprval ) )
return FALSE;
}
*result = exprval;
*p_ = p;
return TRUE;
}
static BOOL
seta_stmt ( LPCTSTR* p_, INT* result )
{
LPCTSTR p = *p_;
INT rval;
if ( !seta_assignment ( &p, &rval ) )
return FALSE;
while ( *p == _T(',') )
{
p = skip_ws ( p+1 );
if ( !seta_assignment ( &p, &rval ) )
return FALSE;
}
*result = rval;
*p_ = p;
return TRUE;
}
static BOOL
seta_eval ( LPCTSTR p )
{
INT rval;
if ( !*p )
{
ConErrResPuts ( STRING_SYNTAX_COMMAND_INCORRECT );
return FALSE;
}
if ( !seta_stmt ( &p, &rval ) )
return FALSE;
ConOutPrintf ( _T("%i"), rval );
return TRUE;
}
#endif

View file

@ -0,0 +1,116 @@
@echo off
@rem the next line reexecutes the script without params if it was called with params, else we'll get false failures
@if not "%1"=="" seta_test.cmd
@rem the next two lines illustrate bug in existing if code
if not "=="=="==" goto failure
if "=="=="==" goto next1
goto failure
:next1
if "1"=="2" goto failure
if not "1"=="1" goto failure
set /a a=1
echo.
if not "%a%"=="1" goto failure
set /a b=a
echo.
if not "%b%"=="1" goto failure
set /a a=!5
echo.
if not "%a%"=="0" goto failure
set /a a=!a
echo.
if not "%a%"=="1" goto failure
set /a a=~5
echo.
if not "%a%"=="-6" goto failure
set /a a=5,a=-a
echo.
if not "%a%"=="-5" goto failure
set /a a=5*7
echo.
if not "%a%"=="35" goto failure
set /a a=2000/10
echo.
if not "%a%"=="200" goto failure
set /a a=42%%9
echo.
if not "%a%"=="6" goto failure
set /a a=5%2
echo.
if not "%a%"=="5" goto failure
set /a a=42^%13
echo.
if not "%a%"=="423" goto failure
set /a a=7+9
echo.
if not "%a%"=="16" goto failure
set /a a=9-7
echo.
if not "%a%"=="2" goto failure
set /a a=9^<^<2
echo.
if not "%a%"=="36" goto failure
set /a a=36^>^>2
echo.
if not "%a%"=="9" goto failure
set /a a=42^&9
echo.
if not "%a%"=="8" goto failure
set /a a=32^9
echo.
if not "%a%"=="329" goto failure
set /a a=32^^9
echo.
if not "%a%"=="41" goto failure
set /a a=10^|22
echo.
if not "%a%"=="30" goto failure
set /a a=2,a*=3
echo.
if not "%a%"=="6" goto failure
set /a a=11,a/=2
echo.
if not "%a%"=="5" goto failure
set /a a=42,a%%=9
echo.
if not "%a%"=="6" goto failure
set /a a=7,a+=9
echo.
if not "%a%"=="16" goto failure
set /a a=9,a-=7
echo.
if not "%a%"=="2" goto failure
set /a a=42,a^&=9
echo.
if not "%a%"=="8" goto failure
set /a a=32,a^^=9
echo.
if not "%a%"=="41" goto failure
set /a a=10,a^|=22
echo.
if not "%a%"=="30" goto failure
set /a a=9,a^<^<=2
echo.
if not "%a%"=="36" goto failure
set /a a=36,a^>^>=2
echo.
if not "%a%"=="9" goto failure
set /a a=1,2
echo.
if not "%a%"=="1" goto failure
set /a a=(a=1,a+2)
echo.
if "%a%"=="3" goto success
goto failure
:success
echo SUCCESS!
echo.
goto done
:failure
echo FAILURE! remove the echo off and see the last formula that executed before this line
echo.
:done

View file

@ -0,0 +1,73 @@
/*
* SHIFT.C - shift internal batch command
*
*
* History:
*
* 16 Jul 1998 (Hans B Pufal)
* started.
*
* 16 Jul 1998 (John P Price)
* Separated commands into individual files.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("shift /?") and cleaned up.
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
/*
* Perform the SHIFT command.
*
* Only valid inside batch files.
*
* FREEDOS extension : optional parameter DOWN to allow shifting
* parameters backwards.
*
*/
INT cmd_shift (LPTSTR cmd, LPTSTR param)
{
#ifdef _DEBUG
DebugPrintf (_T("cmd_shift: (\'%s\', \'%s\')\n"), cmd, param);
#endif
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_SHIFT_HELP);
return 0;
}
nErrorLevel = 0;
if (bc == NULL)
{
/* not in batch - error!! */
nErrorLevel = 1;
return 1;
}
if (!_tcsicmp (param, _T("down")))
{
if (bc->shiftlevel)
bc->shiftlevel--;
}
else /* shift up */
bc->shiftlevel++;
return 0;
}
/* EOF */

View file

@ -0,0 +1,279 @@
/*
* START.C - start internal command.
*
*
* History:
*
* 24-Jul-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Started.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_START
INT cmd_start (LPTSTR First, LPTSTR Rest)
{
TCHAR szFullName[CMDLINE_LENGTH];
TCHAR first[CMDLINE_LENGTH];
TCHAR *rest = NULL;
TCHAR *param = NULL;
INT size;
LPTSTR comspec;
BOOL bWait = FALSE;
BOOL bBat = FALSE;
BOOL bCreate = FALSE;
TCHAR szFullCmdLine [CMDLINE_LENGTH];
PROCESS_INFORMATION prci;
STARTUPINFO stui;
if (_tcsncmp (Rest, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_START_HELP1);
return 0;
}
/* get comspec */
comspec = malloc ( MAX_PATH * sizeof(TCHAR));
if (comspec == NULL)
{
error_out_of_memory();
return 1;
}
SetLastError(0);
size = GetEnvironmentVariable (_T("COMSPEC"), comspec, 512);
if(GetLastError() == ERROR_ENVVAR_NOT_FOUND)
{
Rest = _T("cmd");
}
else
{
if (size > MAX_PATH)
{
comspec = realloc(comspec,size * sizeof(TCHAR) );
if (comspec==NULL)
{
return 1;
}
size = GetEnvironmentVariable (_T("COMSPEC"), comspec, size);
}
}
nErrorLevel = 0;
if( !*Rest )
{
_tcscpy(Rest,_T("\""));
_tcscat(Rest,comspec);
_tcscat(Rest,_T("\""));
}
rest = malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR));
if (rest == NULL)
{
if(comspec != NULL)
free(comspec);
error_out_of_memory();
return 1;
}
param =malloc ( _tcslen(Rest) + 1 * sizeof(TCHAR));
if (rest == NULL)
{
if(comspec != NULL)
free(comspec);
free(rest);
error_out_of_memory();
return 1;
}
param[0] = _T('\0');
_tcscpy(rest,Rest);
/* Parsing the command that gets called by start, and it's parameters */
if(!_tcschr(rest,_T('\"')))
{
INT i = 0;
INT count = _tcslen(rest);
/* find the end of the command and start of the args */
for(i = 0; i < count; i++)
{
if(rest[i] == _T(' '))
{
_tcscpy(param,&rest[i]);
rest[i] = _T('\0');
break;
}
}
}
else
{
INT i = 0;
INT count = _tcslen(rest);
BOOL bInside = FALSE;
/* find the end of the command and put the arguments in param */
for(i = 0; i < count; i++)
{
if(rest[i] == _T('\"'))
bInside = !bInside;
if((rest[i] == _T(' ')) && !bInside)
{
_tcscpy(param,&rest[i]);
rest[i] = _T('\0');
break;
}
}
i = 0;
/* remove any slashes */
while(i < count)
{
if(rest[i] == _T('\"'))
memmove(&rest[i],&rest[i + 1], _tcslen(&rest[i]) * sizeof(TCHAR));
else
i++;
}
}
/* check for a drive change */
if (!_tcscmp (first + 1, _T(":")) && _istalpha (*first))
{
TCHAR szPath[CMDLINE_LENGTH];
_tcscpy (szPath, _T("A:"));
szPath[0] = _totupper (*first);
SetCurrentDirectory (szPath);
GetCurrentDirectory (CMDLINE_LENGTH, szPath);
if (szPath[0] != (TCHAR)_totupper (*first))
ConErrResPuts (STRING_FREE_ERROR1);
if (rest != NULL)
free(rest);
if (param != NULL)
free(param);
if (comspec != NULL)
free(comspec);
return 0;
}
/* get the PATH environment variable and parse it */
/* search the PATH environment variable for the binary */
if (!SearchForExecutable (rest, szFullName))
{
error_bad_command ();
if (rest != NULL)
free(rest);
if (param != NULL)
free(param);
if (comspec != NULL)
free(comspec);
return 1;
}
/* check if this is a .BAT or .CMD file */
if (!_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".bat")) ||
!_tcsicmp (_tcsrchr (szFullName, _T('.')), _T(".cmd")))
{
bBat = TRUE;
memset(szFullCmdLine,0,CMDLINE_LENGTH * sizeof(TCHAR));
_tcscpy(szFullCmdLine,comspec);
memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)],_T("\" /K \""), 6 * sizeof(TCHAR));
memcpy(&szFullCmdLine[_tcslen(szFullCmdLine)], szFullName, _tcslen(szFullName) * sizeof(TCHAR));
memcpy(&szFullCmdLine[1], &szFullCmdLine[0], _tcslen(szFullCmdLine) * sizeof(TCHAR));
szFullCmdLine[0] = _T('\"');
szFullCmdLine[_tcslen(szFullCmdLine)] = _T('\"');
}
#ifdef _DEBUG
DebugPrintf (_T("[BATCH: %s %s]\n"), szFullName, rest);
#endif
#ifdef _DEBUG
DebugPrintf (_T("[EXEC: %s %s]\n"), szFullName, rest);
#endif
/* build command line for CreateProcess() */
if (bBat == FALSE)
{
_tcscpy (szFullCmdLine, first);
if( param != NULL )
{
_tcscat(szFullCmdLine, _T(" ") );
_tcscat (szFullCmdLine, param);
}
}
/* fill startup info */
memset (&stui, 0, sizeof (STARTUPINFO));
stui.cb = sizeof (STARTUPINFO);
stui.dwFlags = STARTF_USESHOWWINDOW;
stui.wShowWindow = SW_SHOWDEFAULT;
if (bBat == TRUE)
{
bCreate = CreateProcess (NULL, szFullCmdLine, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci);
}
else
{
bCreate = CreateProcess (szFullName, szFullCmdLine, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &stui, &prci);
}
if (bCreate)
{
if (bWait)
{
DWORD dwExitCode;
WaitForSingleObject (prci.hProcess, INFINITE);
GetExitCodeProcess (prci.hProcess, &dwExitCode);
nErrorLevel = (INT)dwExitCode;
}
CloseHandle (prci.hThread);
CloseHandle (prci.hProcess);
/* Get New code page if it has change */
InputCodePage= GetConsoleCP();
OutputCodePage = GetConsoleOutputCP();
}
else
{
ErrorMessage(GetLastError (),
_T("Error executing CreateProcess()!!\n"));
}
if (rest != NULL)
free(rest);
if (param != NULL)
free(param);
if (comspec != NULL)
free(comspec);
return 0;
}
#endif
/* EOF */

View file

@ -0,0 +1,284 @@
/*
* STRTOCLR.C - read color (for color command and other)
*
*
* History:
*
* 07-Oct-1999 (Paolo Pantaleo)
* Started.
*
*
*/
/*only
BOOL StringToColor(LPWORD lpColor, LPTSTR*str)
is to be called
other are internal service functions*/
#include <precomp.h>
#define _B FOREGROUND_BLUE
#define _G FOREGROUND_GREEN
#define _R FOREGROUND_RED
#define _I FOREGROUND_INTENSITY
/*return values for chop_blank*/
#define CP_OK 0
#define CP_BLANK_NOT_FOUND 1
#define CP_END_OF_STRING 2
#define SC_HEX 0x0100
#define SC_TXT 0x0200
typedef struct _CLRTABLE
{
LPTSTR name;
WORD val;
} CLRTABLE;
CLRTABLE clrtable[] =
{
{_T("bla") ,0 },
{_T("blu") ,_B },
{_T("gre") ,_G },
{_T("cya") ,_B|_G },
{_T("red") ,_R },
{_T("mag") ,_B|_R },
{_T("yel") ,_R|_G },
{_T("whi") ,_R|_G|_B },
{_T("gra") ,_I },
{_T("0") ,0 },
{_T("2") ,_G },
{_T("3") ,_B|_G },
{_T("4") ,_R },
{_T("5") ,_B|_R },
{_T("6") ,_R|_G },
{_T("7") ,_R|_G|_B },
{_T("8") ,_I },
{_T("9") ,_I|_B },
{_T("10") ,_I|_G },
{_T("11") ,_I|_B|_G },
{_T("12") ,_I|_R },
{_T("13") ,_I|_B|_R },
{_T("14") ,_I|_R|_G },
{_T("15") ,_I|_R|_G|_B },
/* note that 1 is at the end of list
to avoid to confuse it with 10-15*/
{_T("1") ,_B },
/*cyan synonimous*/
{_T("aqu") ,_B|_G },
/*magenta synonimous*/
{_T("pur") ,_B|_R },
{_T("") ,0},
};
/*
move string pointer to next word (skip all spaces)
on erro retunr nonzero value
*/
static
INT chop_blank(LPTSTR *arg_str)
{
LPTSTR str;
str = _tcschr(*arg_str,_T(' '));
if(!str)
{
str = _tcschr (*arg_str, _T('\0'));
if(str != NULL)
*arg_str=str;
return CP_BLANK_NOT_FOUND;
}
while(_istspace(*str))
str++;
if (*str == _T('\0'))
{
*arg_str=str;
return CP_END_OF_STRING;
}
*arg_str = str;
return CP_OK;
}
/*
read a color value in hex (like win nt's cmd syntax)
if an error occurs return -1
*/
static
WORD hex_clr(LPTSTR str)
{
WORD ret= (WORD)-1;
TCHAR ch;
ch = str[1];
if(_istdigit(ch))
ret = ch-_T('0');
else
{
ch=_totupper(ch);
if( ch >= _T('A') && ch <= _T('F') )
ret = ch-_T('A')+10;
else
return (WORD)-1;
}
ch = str[0];
if(_istdigit(ch))
ret |= (ch-_T('0')) << 4;
else
{
ch=_totupper(ch);
if( ch >= _T('A') && ch <= _T('F') )
ret |= (ch-_T('A')+10) <<4;
else
return (WORD)-1;
}
return ret;
}
/*
read a color value from a string (like 4nt's syntax)
if an error occurs return -1
*/
static
WORD txt_clr(LPTSTR str)
{
INT i;
for(i = 0; *(clrtable[i].name); i++)
if (_tcsnicmp(str, clrtable[i].name, _tcslen(clrtable[i].name)) == 0)
return clrtable[i].val;
return (WORD)-1;
}
/*search for x on y*/
static
WORD str_to_color(LPTSTR* arg_str)
{
LPTSTR str;
BOOL bBri;
WORD tmp_clr,ret_clr;
str = *arg_str;
if (!(*str))
return (WORD)-1;
/*foreground*/
bBri = FALSE;
if (_tcsnicmp(str,_T("bri"),3) == 0)
{
bBri = TRUE;
if (chop_blank(&str))
return (WORD)-1;
}
if ((tmp_clr = txt_clr(str)) == (WORD)-1)
{
return (WORD)-1;
}
/*skip spaces and "on"*/
if (chop_blank(&str) || chop_blank(&str))
return (WORD)-1;
ret_clr = tmp_clr | (bBri << 3);
/*background*/
bBri = FALSE;
if(_tcsnicmp(str,_T("bri"),3) == 0 )
{
bBri = TRUE;
if(chop_blank(&str))
return (WORD)-1;
}
if( (tmp_clr = txt_clr(str)) == (WORD)-1 )
return (WORD)-1;
chop_blank(&str);
*arg_str = str;
return SC_HEX | ret_clr | tmp_clr << 4 | bBri << 7;
}
/****main function****/
/*
the only parameter is arg_str, a pointer to a string.
the string is modified so it will begin to first word after
color specification
(only the char* is moved, no chars in the string are modfied)
it returns the color in the l.o. byte, plus two flags in the
h.o. byte, they are:
SC_HEX win nt's cmd syntax (for exampl a0)
SC_TXT 4nt's syntax ( "bri gre on bla" or "10 on 0")
if succedes also move the LPTSTR to end of
string that specify color
*/
BOOL StringToColor(LPWORD lpColor, LPTSTR*str)
{
WORD wRet;
wRet = str_to_color (str);
if (wRet == (WORD)-1)
{
wRet=hex_clr (*str);
chop_blank (str);
if (wRet == (WORD)-1)
return FALSE;
}
*lpColor = wRet;
return TRUE;
}
/* EOF */

View file

@ -0,0 +1,15 @@
<module name="cmd_test" type="test">
<include base="rtshared">.</include>
<include base="ReactOS">include/wine</include>
<include base="cmd">.</include>
<define name="__USE_W32API" />
<define name="ANONYMOUSUNIONS" />
<define name="_WIN32_WINNT">0x0501</define>
<library>rtshared</library>
<library>regtests</library>
<library>cmd_base</library>
<library>pseh</library>
<library>ntdll</library>
<file>setup.c</file>
<xi:include href="stubs.xml" />
</module>

View file

@ -0,0 +1,23 @@
/*
* Copyright (C) 2005 Casper S. Hornstrup
*
* This program 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 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <windows.h>
#include "regtests.h"
_SetupOnce()
{
}

View file

@ -0,0 +1,84 @@
<component name="kernel32.dll">
<symbol>FindFirstFileA@8</symbol>
<symbol>GetLastError@0</symbol>
<symbol>FindNextFileA@8</symbol>
<symbol>FindClose@4</symbol>
<symbol>GetFileAttributesA@4</symbol>
<symbol>GetCurrentDirectoryA@8</symbol>
<symbol>GetFullPathNameA@16</symbol>
<symbol>CloseHandle@4</symbol>
<symbol>CreateFileA@28</symbol>
<symbol>Beep@8</symbol>
<symbol>LoadStringA@16</symbol>
<symbol>SetConsoleCP@4</symbol>
<symbol>SetConsoleOutputCP@4</symbol>
<symbol>WaitForSingleObject@8</symbol>
<symbol>ReadConsoleInputA@16</symbol>
<symbol>GetTickCount@0</symbol>
<symbol>GetConsoleScreenBufferInfo@8</symbol>
<symbol>FillConsoleOutputAttribute@20</symbol>
<symbol>FillConsoleOutputCharacterA@20</symbol>
<symbol>SetConsoleCursorPosition@8</symbol>
<symbol>LoadLibraryA@4</symbol>
<symbol>GetProcAddress@8</symbol>
<symbol>SetCurrentDirectoryA@4</symbol>
<symbol>SetConsoleMode@8</symbol>
<symbol>CreateProcessA@40</symbol>
<symbol>GetExitCodeProcess@8</symbol>
<symbol>GetConsoleOutputCP@0</symbol>
<symbol>GetTempPathA@8</symbol>
<symbol>GetTempFileNameA@16</symbol>
<symbol>GetCurrentProcess@0</symbol>
<symbol>DuplicateHandle@28</symbol>
<symbol>GetFileType@4</symbol>
<symbol>SetFilePointer@16</symbol>
<symbol>GetTimeFormatA@24</symbol>
<symbol>GetDateFormatA@24</symbol>
<symbol>GetEnvironmentVariableA@12</symbol>
<symbol>GenerateConsoleCtrlEvent@8</symbol>
<symbol>SetConsoleCtrlHandler@8</symbol>
<symbol>GetVersionExA@4</symbol>
<symbol>ExitProcess@4</symbol>
<symbol>GetModuleFileNameA@12</symbol>
<symbol>SetEnvironmentVariableA@8</symbol>
<symbol>SetConsoleTextAttribute@8</symbol>
<symbol>FlushConsoleInputBuffer@4</symbol>
<symbol>WriteFile@20</symbol>
<symbol>FormatMessageA@28</symbol>
<symbol>LocalFree@4</symbol>
<symbol>GetConsoleCP@0</symbol>
<symbol>GetStdHandle@4</symbol>
<symbol>FreeLibrary@4</symbol>
<symbol>SetLastError@4</symbol>
<symbol>SetStdHandle@8</symbol>
<symbol>DeleteFileA@4</symbol>
<symbol>FileTimeToLocalFileTime@8</symbol>
<symbol>GetVolumeInformationA@32</symbol>
<symbol>RemoveDirectoryA@4</symbol>
<symbol>CreateDirectoryA@8</symbol>
<symbol>GetLocaleInfoA@16</symbol>
<symbol>GlobalMemoryStatus@4</symbol>
<symbol>GetEnvironmentStrings@0</symbol>
<symbol>FreeEnvironmentStringsA@4</symbol>
<symbol>LocalFree</symbol>
<symbol>SetLocalTime@4</symbol>
<symbol>GetLocalTime@4</symbol>
<symbol>SetFileAttributesA@8</symbol>
<symbol>SetFileApisToOEM@0</symbol>
<symbol>GetConsoleMode@8</symbol>
<symbol>SetConsoleCursorInfo@8</symbol>
<symbol>ReadFile@20</symbol>
<symbol>SetFileTime@16</symbol>
<symbol>FileTimeToSystemTime@8</symbol>
<symbol>GetDiskFreeSpaceA@20</symbol>
<symbol>SetVolumeLabelA@8</symbol>
<symbol>SetConsoleTitleA@4</symbol>
<symbol>MoveFileExA@12</symbol>
<symbol>GetFileTime@16</symbol>
<symbol>Sleep@4</symbol>
<symbol>MoveFileA@8</symbol>
<symbol>CreateSemaphoreA@16</symbol>
<symbol>InterlockedIncrement@4</symbol>
<symbol>InterlockedDecrement@4</symbol>
<symbol>ReleaseSemaphore@12</symbol>
</component>

View file

@ -0,0 +1,215 @@
/*
* TIME.C - time internal command.
*
*
* History:
*
* 07/08/1998 (John P. Price)
* started.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added locale support.
*
* 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
* Added "/t" option.
*
* 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Fixed time input bug.
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc.
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_TIME
static BOOL ParseTime (LPTSTR s)
{
SYSTEMTIME t;
LPTSTR p = s;
if (!*s)
return TRUE;
GetLocalTime (&t);
t.wHour = 0;
t.wMinute = 0;
t.wSecond = 0;
t.wMilliseconds = 0;
// first get hour
if (_istdigit(*p))
{
while (_istdigit(*p))
{
t.wHour = t.wHour * 10 + *p - _T('0');
p++;
}
}
else
return FALSE;
// get time separator
if (*p != cTimeSeparator)
return FALSE;
p++;
// now get minutes
if (_istdigit(*p))
{
while (_istdigit(*p))
{
t.wMinute = t.wMinute * 10 + *p - _T('0');
p++;
}
}
else
return FALSE;
// get time separator
if (*p != cTimeSeparator)
return FALSE;
p++;
// now get seconds
if (_istdigit(*p))
{
while (_istdigit(*p))
{
t.wSecond = t.wSecond * 10 + *p - _T('0');
p++;
}
}
else
return FALSE;
// get decimal separator
if (*p == cDecimalSeparator)
{
p++;
// now get hundreths
if (_istdigit(*p))
{
while (_istdigit(*p))
{
// t.wMilliseconds = t.wMilliseconds * 10 + *p - _T('0');
p++;
}
// t.wMilliseconds *= 10;
}
}
/* special case: 12 hour format */
if (nTimeFormat == 0)
{
if (_totupper(*s) == _T('P'))
{
t.wHour += 12;
}
if ((_totupper(*s) == _T('A')) && (t.wHour == 12))
{
t.wHour = 0;
}
}
if (t.wHour > 23 || t.wMinute > 60 || t.wSecond > 60 || t.wMilliseconds > 999)
return FALSE;
SetLocalTime (&t);
return TRUE;
}
INT cmd_time (LPTSTR cmd, LPTSTR param)
{
LPTSTR *arg;
INT argc;
INT i;
BOOL bPrompt = TRUE;
INT nTimeString = -1;
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_TIME_HELP1);
return 0;
}
nErrorLevel = 0;
/* build parameter array */
arg = split (param, &argc, FALSE);
/* check for options */
for (i = 0; i < argc; i++)
{
if (_tcsicmp (arg[i], _T("/t")) == 0)
bPrompt = FALSE;
if ((*arg[i] != _T('/')) && (nTimeString == -1))
nTimeString = i;
}
if (nTimeString == -1)
PrintTime ();
if (!bPrompt)
{
freep (arg);
return 0;
}
while (1)
{
if (nTimeString == -1)
{
TCHAR s[40];
ConOutResPuts(STRING_TIME_HELP2);
ConInString (s, 40);
#ifdef _DEBUG
DebugPrintf (_T("\'%s\'\n"), s);
#endif
while (*s && s[_tcslen (s) - 1] < _T(' '))
s[_tcslen(s) - 1] = _T('\0');
if (ParseTime (s))
{
freep (arg);
return 0;
}
}
else
{
if (ParseTime (arg[nTimeString]))
{
freep (arg);
return 0;
}
/* force input the next time around. */
nTimeString = -1;
}
ConErrResPuts(STRING_TIME_ERROR1);
nErrorLevel = 1;
}
freep (arg);
return 0;
}
#endif

View file

@ -0,0 +1,233 @@
/*
* TIMER.C - timer internal command.
*
* clone from 4nt timer command
*
* 20 Aug 1999
* started - Paolo Pantaleo <paolopan@freemail.it>
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_TIMER
#define NCS_NOT_SPECIFIED -1
#define NCS_ON 1
#define NCS_OFF 0
//print timer value
#define PT(format) PrintElapsedTime(GetTickCount()-cT,format)
//current timer Time (at wich started to count)
#define cT clksT[clk_n]
//current timer status
#define cS clksS[clk_n]
static VOID
PrintElapsedTime (DWORD time,INT format)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
DWORD h,m,s,ms;
#ifdef _DEBUG
DebugPrintf(_T("PrintTime(%d,%d)"),time,format);
#endif
switch (format)
{
case 0:
LoadString(CMD_ModuleHandle, STRING_TIMER_HELP1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, time);
break;
case 1:
ms = time % 1000;
time /= 1000;
s = time % 60;
time /=60;
m = time % 60;
h = time / 60;
LoadString( CMD_ModuleHandle, STRING_TIMER_HELP2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg,
h, cTimeSeparator,
m, cTimeSeparator,
s, cDecimalSeparator, ms/10);
break;
}
}
INT CommandTimer (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
// all timers are kept
static DWORD clksT[10];
// timers status
// set all the clocks off by default
static BOOL clksS[10]={FALSE,FALSE,FALSE,FALSE,
FALSE,FALSE,FALSE,FALSE,FALSE,FALSE};
// TRUE if /S in command line
BOOL bS = FALSE;
// avoid to set clk_n more than once
BOOL bCanNSet = TRUE;
INT NewClkStatus = NCS_NOT_SPECIFIED;
// the clock number specified on the command line
// 1 by default
INT clk_n=1;
// output format
INT iFormat=1;
// command line parsing variables
INT argc;
LPTSTR *p;
INT i;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
LoadString(CMD_ModuleHandle, STRING_TIMER_HELP3, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, cTimeSeparator, cTimeSeparator, cDecimalSeparator);
return 0;
}
nErrorLevel = 0;
LoadString( CMD_ModuleHandle, STRING_TIMER_TIME, szMsg, RC_STRING_MAX_SIZE);
p = split (param, &argc, FALSE);
//read options
for (i = 0; i < argc; i++)
{
//set timer on
if (!(_tcsicmp(&p[i][0],_T("on"))) && NewClkStatus == NCS_NOT_SPECIFIED)
{
NewClkStatus = NCS_ON;
continue;
}
//set timer off
if (!(_tcsicmp(&p[i][0],_T("off"))) && NewClkStatus == NCS_NOT_SPECIFIED)
{
NewClkStatus = NCS_OFF;
continue;
}
// other options
if (p[i][0] == _T('/'))
{
// set timer number
if (_istdigit(p[i][1]) && bCanNSet)
{
clk_n = p[i][1] - _T('0');
bCanNSet = FALSE;
continue;
}
// set s(plit) option
if (_totupper(p[i][1]) == _T('S'))
{
bS = TRUE;
continue;
}
// specify format
if (_totupper(p[i][1]) == _T('F'))
{
iFormat = p[i][2] - _T('0');
continue;
}
}
}
// do stuff (start/stop/read timer)
if(NewClkStatus == NCS_ON)
{
cT=GetTickCount();
cS=TRUE;
ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
PrintTime();
freep(p);
return 0;
}
if(bS)
{
if(cS)
{
ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
PrintTime();
PrintElapsedTime(GetTickCount()-cT, iFormat);
freep(p);
return 0;
}
cT=GetTickCount();
cS=TRUE;
ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
PrintTime();
freep(p);
return 0;
}
if (NewClkStatus == NCS_NOT_SPECIFIED)
{
if (cS)
{
cS=FALSE;
ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
PrintTime();
PrintElapsedTime(GetTickCount()-cT, iFormat);
freep(p);
return 0;
}
cT=GetTickCount();
cS=TRUE;
ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
PrintTime();
freep(p);
return 0;
}
if (NewClkStatus == NCS_OFF)
{
if (cS)
{
cS=FALSE;
ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
PrintTime();
PrintElapsedTime(GetTickCount()-cT, iFormat);
freep(p);
return 0;
}
ConOutPrintf (szMsg,clk_n,cS?_T("ON"):_T("OFF"));
PrintTime();
freep(p);
return 0;
}
freep(p);
return 0;
}
#endif /* INCLUDE_CMD_TIMER */

View file

@ -0,0 +1,37 @@
/*
* title.c - title internal command.
*
*
* History:
* 1999-02-11 Emanuele Aliberti
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_TITLE
INT cmd_title (LPTSTR cmd, LPTSTR param)
{
/* Do nothing if no args */
if (*param == _T('\0'))
return 0;
/* Asking help? */
if (!_tcsncmp(param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_TITLE_HELP);
return 0;
}
return SetConsoleTitle (param);
}
#endif /* def INCLUDE_CMD_TITLE */
/* EOF */

View file

@ -0,0 +1,24 @@
Things to do
~~~~~~~~~~~~
*Implmenet Set /P
This is pretty straight forward. When doing this make sure to take into account the way MS handles "set /A /P foo=5" compared to "set /P /A foo=5".
*Compile as unicode
Not sure what is wrong with it, put probably more then just one thing blocking this. For sure pipes break when it is compiled as unicode.
*Move.c code clean up
It works, but it needs to be cleaned up, the code is long and overly complex for what it needs to do. Also, we can remove the hack to cover for MoveFileEx bug as it isnt a bug anymore.
*If rewrite
It works decent but looks _awful_. Very hard to maintain and/or understand what the hell is going on.
*Remove Hardcoded buffers
This is mostly done thanks to Greatlord(cmd.c is the hardest spot that is left). ANytime when you are handling a string that is taken from the commandline there should be no limit to the size.
*Implment & and &&
& runs two commands no matter what.
&& runs the 2nd command only if the first was a success
Not sure where to put this code even
*Reg Testing
We need more batch files like the one Royce made for "set /a". What out for if bugs when doing this... could lead to in the wrong direction when looking for a regression.

View file

@ -0,0 +1,136 @@
/*
* TYPE.C - type internal command.
*
* History:
*
* 07/08/1998 (John P. Price)
* started.
*
* 07/12/98 (Rob Lake)
* Changed error messages
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added support for quoted arguments (type "test file.dat").
* Cleaned up.
*
* 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection ready!
*
* 19-Jan-1999 (Paolo Pantaleo <paolopan@freemail.it>)
* Added multiple file support (copied from y.c)
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_TYPE
INT cmd_type (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR buff[256];
HANDLE hFile, hConsoleOut;
BOOL bRet;
INT argc,i;
LPTSTR *argv;
LPTSTR errmsg;
BOOL bPaging = FALSE;
BOOL bFirstTime = TRUE;
hConsoleOut=GetStdHandle (STD_OUTPUT_HANDLE);
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_TYPE_HELP1);
return 0;
}
if (!*param)
{
error_req_param_missing ();
return 1;
}
argv = split (param, &argc, TRUE);
for(i = 0; i < argc; i++)
{
if(*argv[i] == _T('/') && _tcslen(argv[i]) >= 2 && _totupper(argv[i][1]) == _T('P'))
{
bPaging = TRUE;
}
}
for (i = 0; i < argc; i++)
{
if (_T('/') == argv[i][0] && _totupper(argv[i][1]) != _T('P'))
{
LoadString(CMD_ModuleHandle, STRING_TYPE_ERROR1, szMsg, RC_STRING_MAX_SIZE);
ConErrPrintf(szMsg, argv[i] + 1);
continue;
}
nErrorLevel = 0;
hFile = CreateFile(argv[i],
GENERIC_READ,
FILE_SHARE_READ,NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &errmsg,
0,
NULL);
ConErrPrintf (_T("%s - %s"), argv[i], errmsg);
LocalFree (errmsg);
nErrorLevel = 1;
continue;
}
do
{
bRet = FileGetString (hFile, buff, sizeof(buff) / sizeof(TCHAR));
if(bPaging)
{
if(bRet)
{
if (ConOutPrintfPaging(bFirstTime, buff) == 1)
{
bCtrlBreak = FALSE;
return 0;
}
}
}
else
{
if(bRet)
ConOutPrintf(buff);
}
bFirstTime = FALSE;
} while(bRet);
CloseHandle(hFile);
}
freep (argv);
return 0;
}
#endif

View file

@ -0,0 +1,135 @@
/*
* VER.C - ver internal command.
*
*
* History:
*
* 06/30/98 (Rob Lake)
* rewrote ver command to accept switches, now ver alone prints
* copyright notice only.
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added text about where to send bug reports and get updates.
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection safe!
*
* 26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* New version info and some output changes.
*/
#include <precomp.h>
#include "resource.h"
#include <reactos/resource.h>
VOID ShortVersion (VOID)
{
OSVERSIONINFO VersionInfo;
unsigned RosVersionLen;
LPTSTR RosVersion;
TCHAR szMsg[RC_STRING_MAX_SIZE];
ConOutResPuts (STRING_CMD_SHELLINFO );
VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
ConOutPrintf(_T("Version %s %s"), _T(KERNEL_RELEASE_STR), _T(KERNEL_VERSION_BUILD_STR));
memset(VersionInfo.szCSDVersion, 0, sizeof(VersionInfo.szCSDVersion));
if (GetVersionEx(&VersionInfo))
{
RosVersion = VersionInfo.szCSDVersion + _tcslen(VersionInfo.szCSDVersion) + 1;
RosVersionLen = sizeof(VersionInfo.szCSDVersion) / sizeof(VersionInfo.szCSDVersion[0]) -
(RosVersion - VersionInfo.szCSDVersion);
if (7 <= RosVersionLen && 0 == _tcsnicmp(RosVersion, _T("ReactOS"), 7))
{
LoadString( CMD_ModuleHandle, STRING_VERSION_RUNVER, (LPTSTR) szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf (szMsg, RosVersion);
}
}
ConOutPuts (_T("\n"));
}
#ifdef INCLUDE_CMD_VER
/*
* display shell version info internal command.
*
*
*/
INT cmd_ver (LPTSTR cmd, LPTSTR param)
{
INT i;
nErrorLevel = 0;
if (_tcsstr (param, _T("/?")) != NULL)
{
ConOutResPaging(TRUE,STRING_VERSION_HELP1);
return 0;
}
ShortVersion();
ConOutPuts (_T("Copyright (C) 1994-1998 Tim Norman and others."));
ConOutPuts (_T(RES_STR_LEGAL_COPYRIGHT));
/* Basic copyright notice */
if (param[0] == _T('\0'))
{
ConOutResPuts (STRING_CMD_SHELLINFO );
ConOutResPuts(STRING_VERSION_HELP2);
}
else
{
for (i = 0; param[i]; i++)
{
/* skip spaces */
if (param[i] == _T(' '))
continue;
if (param[i] == _T('/'))
{
/* is this a lone '/' ? */
if (param[i + 1] == 0)
{
error_invalid_switch (_T(' '));
return 1;
}
continue;
}
if (_totupper (param[i]) == _T('W'))
{
/* Warranty notice */
ConOutResPuts(STRING_VERSION_HELP3);
}
else if (_totupper (param[i]) == _T('R'))
{
/* Redistribution notice */
ConOutResPuts(STRING_VERSION_HELP4);
}
else if (_totupper (param[i]) == _T('C'))
{
/* Developer listing */
ConOutResPuts(STRING_VERSION_HELP6);
ConOutResPuts(STRING_FREEDOS_DEV);
ConOutResPuts(STRING_VERSION_HELP7);
ConOutResPuts(STRING_REACTOS_DEV);
}
else
{
error_invalid_switch ((TCHAR)_totupper (param[i]));
return 1;
}
}
}
ConOutResPuts(STRING_VERSION_HELP5);
return 0;
}
#endif

View file

@ -0,0 +1,60 @@
/*
* VERIFY.C - verify internal command.
*
*
* History:
*
* 31 Jul 1998 (John P Price)
* started.
*
* 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* VERIFY is just a dummy under Win32; it only exists
* for compatibility!!!
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode and redirection ready!
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_VERIFY
/* global verify flag */
static BOOL bVerify = FALSE;
INT cmd_verify (LPTSTR cmd, LPTSTR param)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_VERIFY_HELP1);
return 0;
}
nErrorLevel = 0;
if (!*param)
{
LoadString(CMD_ModuleHandle, STRING_VERIFY_HELP2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, bVerify ? D_ON : D_OFF);
}
else if (_tcsicmp (param, D_OFF) == 0)
bVerify = FALSE;
else if (_tcsicmp (param, D_ON) == 0)
bVerify = TRUE;
else
{
ConOutResPuts(STRING_VERIFY_HELP3);
}
return 0;
}
#endif

View file

@ -0,0 +1,117 @@
/*
* VOL.C - vol internal command.
*
*
* History:
*
* 03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Replaced DOS calls by Win32 calls.
*
* 08-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added help text ("/?").
*
* 07-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Cleanup.
*
* 18-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Unicode ready!
*
* 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Redirection ready!
*/
#include <precomp.h>
#include "resource.h"
#ifdef INCLUDE_CMD_VOL
static INT
PrintVolumeHeader (LPTSTR pszRootPath)
{
TCHAR szMsg[RC_STRING_MAX_SIZE];
TCHAR szVolName[80];
DWORD dwSerialNr;
/* get the volume information of the drive */
if(!GetVolumeInformation (pszRootPath,
szVolName,
80,
&dwSerialNr,
NULL,
NULL,
NULL,
0))
{
ErrorMessage (GetLastError (), _T(""));
return 1;
}
/* print drive info */
if (szVolName[0] != '\0')
{
LoadString(CMD_ModuleHandle, STRING_VOL_HELP1, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, pszRootPath[0],szVolName);
}
else
{
LoadString(CMD_ModuleHandle, STRING_VOL_HELP2, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, pszRootPath[0]);
}
/* print the volume serial number */
LoadString(CMD_ModuleHandle, STRING_VOL_HELP3, szMsg, RC_STRING_MAX_SIZE);
ConOutPrintf(szMsg, HIWORD(dwSerialNr), LOWORD(dwSerialNr));
return 0;
}
INT cmd_vol (LPTSTR cmd, LPTSTR param)
{
TCHAR szRootPath[] = _T("A:\\");
TCHAR szPath[MAX_PATH];
if (!_tcsncmp (param, _T("/?"), 2))
{
ConOutResPaging(TRUE,STRING_VOL_HELP4);
return 0;
}
nErrorLevel = 0;
if (param[0] == _T('\0'))
{
GetCurrentDirectory (MAX_PATH, szPath);
szRootPath[0] = szPath[0];
}
else
{
_tcsupr (param);
if (param[1] == _T(':'))
szRootPath[0] = param[0];
else
{
error_invalid_drive ();
nErrorLevel = 1;
return 1;
}
}
if (!IsValidPathName (szRootPath))
{
error_invalid_drive ();
nErrorLevel = 1;
return 1;
}
/* print the header */
if (!PrintVolumeHeader (szRootPath))
{
nErrorLevel = 1;
return 1;
}
return 0;
}
#endif

View file

@ -0,0 +1,273 @@
/*
* WHERE.C - file search functions.
*
*
* History:
*
* 07/15/95 (Tim Norman)
* started.
*
* 08/08/95 (Matt Rains)
* i have cleaned up the source code. changes now bring this source
* into guidelines for recommended programming practice.
*
* 12/12/95 (Steffan Kaiser & Tim Norman)
* added some patches to fix some things and make more efficient
*
* 1/6/96 (Tim Norman)
* fixed a stupid pointer mistake...
* Thanks to everyone who noticed it!
*
* 8/1/96 (Tim Norman)
* fixed a bug when getenv returns NULL
*
* 8/7/96 (Steffan Kaiser and Tim Norman)
* speed improvements and bug fixes
*
* 8/27/96 (Tim Norman)
* changed code to use pointers directly into PATH environment
* variable rather than making our own copy. This saves some memory,
* but requires we write our own function to copy pathnames out of
* the variable.
*
* 12/23/96 (Aaron Kaufman)
* Fixed a bug in get_paths() that did not point to the first PATH
* in the environment variable.
*
* 7/12/97 (Tim Norman)
* Apparently, Aaron's bugfix got lost, so I fixed it again.
*
* 16 July 1998 (John P. Price)
* Added stand alone code.
*
* 17 July 1998 (John P. Price)
* Rewrote find_which to use searchpath function
*
* 24-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* fixed bug where didn't check all extensions when path was specified
*
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* added config.h include
*
* 30-Jul-1998 (John P Price <linux-guru@gcfl.net>)
* fixed so that it find_which returns NULL if filename is not
* executable (does not have .bat, .com, or .exe extention).
* Before command would to execute any file with any extension (opps!)
*
* 03-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Changed find_which().
*
* 07-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Added ".CMD" extension.
* Replaced numeric constant by _NR_OF_EXTENSIONS.
*
* 26-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Replaced find_which() by SearchForExecutable().
* Now files are searched using the right extension order.
*
* 20-Apr-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
* Some minor changes and improvements.
*
* 10-Jul-2004 (Jens Collin <jens.collin@lakhei.com>)
* Fixed searxhing for files with specific extensions in PATHEXT order..
*
*/
#include <precomp.h>
/* initial size of environment variable buffer */
#define ENV_BUFFER_SIZE 1024
/* searches for file using path info. */
BOOL
SearchForExecutableSingle (LPCTSTR pFileName, LPTSTR pFullName, LPTSTR pExtension)
{
TCHAR szPathBuffer[CMDLINE_LENGTH];
LPTSTR pszBuffer = NULL;
DWORD dwBuffer, len;
LPTSTR s,f;
/* initialize full name buffer */
*pFullName = _T('\0');
#ifdef _DEBUG
DebugPrintf (_T("SearchForExecutableSingle: \'%s\' with ext: \'%s\'\n"), pFileName, pExtension);
#endif
/* Check if valid directly on specified path */
if (_tcschr (pFileName, _T('\\')) != NULL)
{
LPTSTR pFilePart;
#ifdef _DEBUG
DebugPrintf (_T("Absolute or relative path is given.\n"));
#endif
if (GetFullPathName (pFileName,
CMDLINE_LENGTH,
szPathBuffer,
&pFilePart) ==0)
return FALSE;
if(pFilePart == 0)
return FALSE;
/* Add extension and test file: */
if (pExtension)
_tcscat(szPathBuffer, pExtension);
if (IsExistingFile (szPathBuffer))
{
#ifdef _DEBUG
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
return FALSE;
}
/* search in current directory */
len = GetCurrentDirectory (CMDLINE_LENGTH, szPathBuffer);
if (szPathBuffer[len - 1] != _T('\\'))
{
szPathBuffer[len] = _T('\\');
szPathBuffer[len + 1] = _T('\0');
}
_tcscat (szPathBuffer, pFileName);
if (pExtension)
_tcscat (szPathBuffer, pExtension);
if (IsExistingFile (szPathBuffer))
{
#ifdef _DEBUG
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
/* load environment varable PATH into buffer */
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
dwBuffer = GetEnvironmentVariable (_T("PATH"), pszBuffer, ENV_BUFFER_SIZE);
if (dwBuffer > ENV_BUFFER_SIZE)
{
pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
GetEnvironmentVariable (_T("PATH"), pszBuffer, dwBuffer);
}
/* search in PATH */
s = pszBuffer;
while (s && *s)
{
f = _tcschr (s, _T(';'));
if (f)
{
_tcsncpy (szPathBuffer, s, (size_t)(f-s));
szPathBuffer[f-s] = _T('\0');
s = f + 1;
}
else
{
_tcscpy (szPathBuffer, s);
s = NULL;
}
len = _tcslen(szPathBuffer);
if (szPathBuffer[len - 1] != _T('\\'))
{
szPathBuffer[len] = _T('\\');
szPathBuffer[len + 1] = _T('\0');
}
_tcscat (szPathBuffer, pFileName);
if (pExtension)
_tcscat (szPathBuffer, pExtension);
if (IsExistingFile (szPathBuffer))
{
#ifdef _DEBUG
DebugPrintf (_T("Found: \'%s\'\n"), szPathBuffer);
#endif
free (pszBuffer);
_tcscpy (pFullName, szPathBuffer);
return TRUE;
}
}
free (pszBuffer);
return FALSE;
}
BOOL
SearchForExecutable (LPCTSTR pFileName, LPTSTR pFullName)
{
static TCHAR pszDefaultPathExt[] = _T(".COM;.EXE;.BAT;.CMD");
LPTSTR pszBuffer = NULL;
LPTSTR pCh;
LPTSTR pExt;
DWORD dwBuffer;
#ifdef _DEBUG
DebugPrintf (_T("SearchForExecutable: \'%s\'\n"), pFileName);
#endif
/* load environment varable PATHEXT */
pszBuffer = (LPTSTR)malloc (ENV_BUFFER_SIZE * sizeof(TCHAR));
dwBuffer = GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, ENV_BUFFER_SIZE);
if (dwBuffer > ENV_BUFFER_SIZE)
{
pszBuffer = (LPTSTR)realloc (pszBuffer, dwBuffer * sizeof (TCHAR));
GetEnvironmentVariable (_T("PATHEXT"), pszBuffer, dwBuffer);
}
else if (0 == dwBuffer)
{
_tcscpy(pszBuffer, pszDefaultPathExt);
}
#ifdef _DEBUG
DebugPrintf (_T("SearchForExecutable(): Loaded PATHEXT: %s\n"), pszBuffer);
#endif
pExt = _tcsrchr(pFileName, _T('.'));
if (pExt != NULL)
{
LPTSTR pszBuffer2;
pszBuffer2 = _tcsdup(pszBuffer);
if (pszBuffer2)
{
pCh = _tcstok(pszBuffer2, _T(";"));
while (pCh)
{
if (0 == _tcsicmp(pCh, pExt))
{
free(pszBuffer);
free(pszBuffer2);
return SearchForExecutableSingle(pFileName, pFullName, NULL);
}
pCh = _tcstok(NULL, _T(";"));
}
free(pszBuffer2);
}
}
pCh = _tcstok(pszBuffer, _T(";"));
while (pCh)
{
if (SearchForExecutableSingle(pFileName, pFullName, pCh))
{
free(pszBuffer);
return TRUE;
}
pCh = _tcstok(NULL, _T(";"));
}
free(pszBuffer);
return FALSE;
}
/* EOF */

View file

@ -0,0 +1,231 @@
/* $Id$
*
* WINDOW.C - activate & window internal commands.
*
* clone from 4nt activate command
*
* 10 Sep 1999 (Paolo Pantaleo)
* started (window command in WINDOW.c)
*
* 29 Sep 1999 (Paolo Pantaleo)
* activate and window in a single file using mainly the same code
* (nice size optimization :)
*
* 30-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
* Remove all hardcode string to En.rc
*/
#include <precomp.h>
#include "resource.h"
#if ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) )
#define A_MIN 0x01
#define A_MAX 0x02
#define A_RESTORE 0x04
#define A_POS 0x08
#define A_SIZE 0x10
#define A_CLOSE 0x20
/*service funciton to perform actions on windows
param is a string to parse for options/actions
hWnd is the handle of window on wich perform actions
*/
static INT ServiceActivate (LPTSTR param, HWND hWnd)
{
LPTSTR *p = 0, p_tmp;
INT argc = 0, i;
INT iAction = 0;
LPTSTR title = 0;
WINDOWPLACEMENT wp;
RECT pos;
LPTSTR tmp;
if (*param)
p = split(param, &argc, FALSE);
for (i = 0; i < argc; i++)
{
p_tmp = p[i];
if (*p_tmp == _T('/'))
p_tmp++;
if (_tcsicmp(p_tmp, _T("min")) == 0)
{
iAction |= A_MIN;
continue;
}
if (_tcsicmp(p_tmp, _T("max")) == 0)
{
iAction |= A_MAX;
continue;
}
if (_tcsicmp(p_tmp, _T("restore")) == 0)
{
iAction |= A_RESTORE;
continue;
}
if (_tcsicmp(p_tmp, _T("close")) == 0)
{
iAction |= A_CLOSE;
continue;
}
if (_tcsnicmp(p_tmp, _T("pos"), 3) == 0)
{
iAction |= A_POS;
tmp = p_tmp+3;
if (*tmp == _T('='))
tmp++;
pos.left= _ttoi(tmp);
if(!(tmp=_tcschr(tmp, _T(','))))
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
pos.top = _ttoi (++tmp);
if(!(tmp=_tcschr(tmp, _T(','))))
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
pos.right = _ttoi(++tmp) + pos.left;
if (!(tmp = _tcschr(tmp, _T(','))))
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
pos.bottom = _ttoi(++tmp) + pos.top;
continue;
}
if (_tcsnicmp(p_tmp, _T("size"), 4)==0)
{
iAction |=A_SIZE;
continue;
}
/* none of them=window title */
if (title)
{
error_invalid_parameter_format(p[i]);
freep(p);
return 1;
}
if (p_tmp[0] == _T('"'))
{
title = (p_tmp + 1);
*_tcschr(p_tmp + 1, _T('"')) = 0;
continue;
}
title = p_tmp;
}
if (title)
SetWindowText(hWnd, title);
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
if (iAction & A_POS)
wp.rcNormalPosition = pos;
if (iAction & A_MIN)
wp.showCmd = SW_MINIMIZE;
if (iAction & A_MAX)
wp.showCmd = SW_SHOWMAXIMIZED;
/*if no actions are specified default is SW_RESTORE*/
if ((iAction & A_RESTORE) || (!iAction))
wp.showCmd = SW_RESTORE;
if (iAction & A_CLOSE)
{
#ifdef _DEBUG
ConErrPrintf(_T("!!!FIXME: CLOSE Not implemented!!!\n"));
#endif
}
wp.length = sizeof(WINDOWPLACEMENT);
SetWindowPlacement(hWnd, &wp);
if (p)
freep(p);
return 0;
}
INT CommandWindow (LPTSTR cmd, LPTSTR param)
{
HWND hwnd;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_WINDOW_HELP1);
return 0;
}
hwnd = GetConsoleWindow();
Sleep(0);
return ServiceActivate(param, hwnd);
}
INT CommandActivate (LPTSTR cmd, LPTSTR param)
{
HWND hwnd;
LPTSTR *arg;
INT argc;
if (_tcsncmp (param, _T("/?"), 2) == 0)
{
ConOutResPaging(TRUE,STRING_WINDOW_HELP2);
return 0;
}
if(!(*param))
return 1;
/*Split the user input into array*/
arg = split (param, &argc, FALSE);
if(argc < 2)
{
if(arg != NULL)
freep(arg);
}
hwnd = FindWindow(NULL, arg[0]);
if (hwnd == NULL)
{
if(arg != NULL)
freep(arg);
ConErrResPuts(STRING_WINDOW_ERROR1);
return 1;
}
if(arg != NULL)
freep(arg);
return ServiceActivate(param, hwnd);
}
#endif /* ( defined(INCLUDE_CMD_WINDOW) || defined(INCLUDE_CMD_ACTIVATE) ) */

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,60 @@
#
# Jamfile for Explorer to be used with Boost Build V2
#
# import rc ;
import rc-mingw ;
EXPAT_INC = [ modules.peek : EXPAT_INC ] ;
exe explorer :
explorer.cpp
explorer_intres.rc
shell/entries.cpp
shell/filechild.cpp
shell/mainframe.cpp
shell/pane.cpp
shell/shellbrowser.cpp
shell/shellfs.cpp
shell/unixfs.cpp
shell/winfs.cpp
shell/ntobjfs.cpp
shell/regfs.cpp
shell/fatfs.cpp
shell/webchild.cpp
services/startup.c
services/shellservices.cpp
taskbar/desktopbar.cpp
taskbar/quicklaunch.cpp
taskbar/startmenu.cpp
taskbar/taskbar.cpp
taskbar/traynotify.cpp
taskbar/favorites.cpp
desktop/desktop.cpp
# utility/splitpath.c
utility/dragdropimpl.cpp
utility/shellbrowserimpl.cpp
utility/shellclasses.cpp
utility/utility.cpp
utility/window.cpp
utility/xmlstorage.cpp
dialogs/searchprogram.cpp
dialogs/settings.cpp
i386-stub-win32.c
: <define>WIN32 <define>_WIN32_IE=0x0600 <define>_WIN32_WINNT=0x0501 <define>WINVER=0x0500
<include>. <include>$(EXPAT_INC)
# only for GCC: <cxxflags>-fexceptions <cxxflags>-Wall <cxxflags>-Wno-unused-value
<find-shared-library>gdi32
<find-shared-library>ole32
<find-shared-library>comctl32
<find-shared-library>uuid
<find-shared-library>wsock32
<find-shared-library>oleaut32
<find-shared-library>msimg32
# <find-shared-library>expat
<linkflags>notifyhook.dll
<linkflags>libexpat.dll
;

View file

@ -0,0 +1,92 @@
#
# ReactOS shell
#
# Makefile.PCH
#
# MinGW Makefile with precompiled header support
#
CC = gcc
CXX = g++
LINK = g++
CFLAGS = -DWIN32 -DROSSHELL -D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 -fexceptions -Wall -I. -I$(EXPAT_INC)
RCFLAGS = -DWIN32 -DROSSHELL -D__WINDRES__
LFLAGS = -Wl,--subsystem,windows
ifdef DEBUG
CFLAGS += -D_DEBUG -g
RCFLAGS += -D_DEBUG
LFLAGS += -g
else
CFLAGS += -DNDEBUG -Os #-march=pentium4
RCFLAGS += -DNDEBUG
LFLAGS += -s
endif
ifndef UNICODE
UNICODE = 1
endif
ifeq ($(UNICODE),1)
CFLAGS += -DUNICODE
# LFLAGS+= -Wl,--entry,_wWinMain@16
RCFLAGS += -DUNICODE
endif
CXXFLAGS = $(CFLAGS)
EXEC_SUFFIX = .exe
RES_SUFFIX = .coff
VPATH = shell utility taskbar desktop dialogs services
PROGRAM = rosshell
TARGET = $(PROGRAM)$(EXEC_SUFFIX)
OBJECTS = \
startup.o \
shellclasses.o \
utility.o \
window.o \
dragdropimpl.o \
shellbrowserimpl.o \
explorer.o \
entries.o \
winfs.o \
shellfs.o \
pane.o \
desktop.o \
desktopbar.o \
taskbar.o \
startmenu.o \
shellservices.o \
traynotify.o \
quicklaunch.o \
favorites.o \
searchprogram.o \
settings.o \
i386-stub-win32.o \
xmlstorage.o
LIBS = gdi32 comctl32 msimg32 ole32 uuid
DELAYIMPORTS = oleaut32 wsock32
all: precomp.h.gch $(TARGET)
precomp.h.gch: *.h utility/*.h shell/*.h desktop/*.h
$(CXX) $(CFLAGS) precomp.h
$(TARGET): $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) notifyhook.dll libexpat.dll
$(LINK) $(LFLAGS) -o $@ $^ $(addprefix -l,$(LIBS)) $(addprefix -l,$(DELAYIMPORTS))
$(PROGRAM)$(RES_SUFFIX): explorer_intres.rc res/*.bmp res/*.ico
windres $(RCFLAGS) -o $@ explorer_intres.rc
notifyhook.dll: notifyhook/notifyhook.c notifyhook/notifyhook.h
$(CC) -D_WIN32_IE=0x0600 -Wall -D_NOTIFYHOOK_IMPL -Os -s notifyhook/notifyhook.c -shared -o $@
clean:
rm -f $(TARGET) $(OBJECTS) $(PROGRAM)$(RES_SUFFIX) precomp.h.gch \
desktop/*.o dialogs/*.o shell/*.o taskbar/*.o utility/*.o

View file

@ -0,0 +1,68 @@
#
# ReactOS shell
#
# Makefile
#
PATH_TO_TOP := ../../..
TARGET_TYPE := program
TARGET_APPTYPE := windows
TARGET_NAME := rosshell
TARGET_INSTALLDIR := .
TARGET_CFLAGS := \
-D__USE_W32API -DWIN32 -D_ROS_ \
-D_WIN32_IE=0x0600 -D_WIN32_WINNT=0x0501 -DWINVER=0x0500 \
-DUNICODE -fexceptions -Wall -g \
-I../../../include/expat
TARGET_CPPFLAGS := $(TARGET_CFLAGS)
TARGET_RCFLAGS := -D__USE_W32API -DWIN32 -D_ROS_ -D__WINDRES__
TARGET_SDKLIBS := \
gdi32.a user32.a comctl32.a ole32.a oleaut32.a shell32.a expat.a \
notifyhook.a ws2_32.a msimg32.a
TARGET_GCCLIBS := stdc++ uuid
TARGET_OBJECTS := \
explorer.o \
i386-stub-win32.o \
desktop/desktop.o \
dialogs/searchprogram.o \
dialogs/settings.o \
shell/entries.o \
shell/shellfs.o \
shell/pane.o \
shell/winfs.o \
services/startup.o \
services/shellservices.o \
taskbar/desktopbar.o \
taskbar/taskbar.o \
taskbar/startmenu.o \
taskbar/traynotify.o \
taskbar/quicklaunch.o \
taskbar/favorites.o \
utility/shellclasses.o \
utility/utility.o \
utility/window.o \
utility/dragdropimpl.o \
utility/shellbrowserimpl.o \
utility/xmlstorage.o
TARGET_CPPAPP := yes
TARGET_PCH := precomp.h
SUBDIRS := notifyhook
DEP_OBJECTS := $(TARGET_OBJECTS)
include $(PATH_TO_TOP)/rules.mak
include $(TOOLS_PATH)/helper.mk
include $(TOOLS_PATH)/depend.mk

Some files were not shown because too many files have changed in this diff Show more