home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1996 February
/
VPR9602A.ISO
/
fwindows
/
tmedt090
/
toold101
/
ls.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-11-19
|
8KB
|
305 lines
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "comwin.h"
#define DLLNAME "cwtools.dll"
#define APINAME "CallCommand"
typedef int INT;
char gszNullStr[] = "";
char *cwStrrchr(char *s, int c)
{
unsigned char *p;
unsigned char *pr;
pr = NULL;
for (p = s; *p != '\0'; p++) {
/* for DBCS */
if (IsDBCSLeadByte(*p) == TRUE) {
p++;
if (*p == '\0') {
break;
}
continue;
}
if (*p == c) {
pr = p;
}
}
return pr;
}
INT GetCommandName(LPSTR lpCmd, INT nSize)
{
char szModule[MAX_PATH];
char szAlias[MAX_PATH];
LPSTR lpS, lpP;
GetModuleFileName(NULL, szModule, sizeof(szModule));
lpS = cwStrrchr(szModule, '\\');
lpS = (lpS == NULL) ? szModule : lpS + 1;
lstrcpyn(lpCmd, lpS, nSize);
lpP = cwStrrchr(lpCmd, '.');
if (lpP != NULL) *lpP = '\0';
lstrcpy(lpS, "cwtools.ini");
GetPrivateProfileString("alias", lpCmd, lpCmd,
szAlias, sizeof(szAlias), szModule);
lstrcpyn(lpCmd, szAlias, nSize);
return 0;
}
#ifdef COMWIN
BOOL GetConsoleInfo(LP_CW_S_CONSOLE_INFO lpci)
{
return GetComWinLong(CW_GETMSG, (LONG)lpci);
}
LONG FAR PASCAL StubPuts(LPSTR lpStr)
{
return Puts(lpStr);
}
LPSTR FAR PASCAL StubGets(LPSTR lpStr)
{
return Gets(lpStr);
}
LONG FAR PASCAL StubFputs(LPSTR lpStr, LPSTR lpFile)
{
return Fputs(lpStr, lpFile);
}
LPSTR FAR PASCAL StubFgets(LPSTR lpStr, LONG lSize, LPSTR lpFile)
{
return Fgets(lpStr, lSize, lpFile);
}
LONG FAR PASCAL StubSystem(LPSTR lpStr)
{
return System(lpStr);
}
BOOL FAR PASCAL StubCallConsole(FARPROC FAR *lpfnIO,
LPSTR lpszCmdLine,
LPLONG lpInfo)
{
LP_CW_S_CONSOLE_INFO lpci;
switch (*lpInfo) {
case CW_M_CONSOLE_INFO:
lpci = (LP_CW_S_CONSOLE_INFO)lpInfo;
switch (lpci->lMode) {
case CW_MODE_GET:
return GetConsoleInfo(lpci);
}
}
return FALSE;
}
LONG FAR PASCAL StubGetch(void)
{
return Getch();
}
LONG FAR PASCAL StubInkey(void)
{
return Inkey();
}
INT PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
INT nCmdShow)
{
FARPROC lpfnIO[8];
BOOL (FAR PASCAL *CallCommand)(FARPROC FAR *, LPSTR, LPLONG);
HINSTANCE hInstDLL;
LONG lReturn;
char szCmdLine[512];
char szCmd[512];
CW_S_CONSOLE_INFO ci;
lpfnIO[0] = MakeProcInstance((FARPROC)StubPuts, hInstance);
lpfnIO[1] = MakeProcInstance((FARPROC)StubGets, hInstance);
lpfnIO[2] = MakeProcInstance((FARPROC)StubFputs, hInstance);
lpfnIO[3] = MakeProcInstance((FARPROC)StubFgets, hInstance);
lpfnIO[4] = MakeProcInstance((FARPROC)StubSystem, hInstance);
lpfnIO[5] = MakeProcInstance((FARPROC)StubCallConsole, hInstance);
lpfnIO[6] = MakeProcInstance((FARPROC)StubGetch, hInstance);
lpfnIO[7] = MakeProcInstance((FARPROC)StubInkey, hInstance);
GetCommandName(szCmd, sizeof(szCmd));
lstrcpy(szCmdLine, szCmd);
lstrcat(szCmdLine, " ");
lstrcat(szCmdLine, lpszCmdParam);
hInstDLL = LoadLibrary(DLLNAME);
if (hInstDLL == NULL) {
return -1;
}
(FARPROC)CallCommand = GetProcAddress(hInstDLL, APINAME);
memset(&ci, 0, sizeof(ci));
ci.lMessage = CW_M_CONSOLE_INFO;
ci.lSize = sizeof(ci);
ci.lMode = CW_MODE_GET;
GetConsoleInfo(&ci);
ci.lMode = CW_MODE_INIT;
ci.lFuncMax = 8;
CallCommand(lpfnIO, gszNullStr, (LPLONG)&ci);
lReturn = CW_M_EXEC;
CallCommand(lpfnIO, szCmdLine, &lReturn);
ci.lMode = CW_MODE_CLEAR;
CallCommand(lpfnIO, gszNullStr, (LPLONG)&ci);
FreeLibrary(hInstDLL);
return (INT)lReturn;
}
#else
BOOL GetConsoleInfo(LP_CW_S_CONSOLE_INFO lpci)
{
HANDLE hCon;
CONSOLE_SCREEN_BUFFER_INFO csbi;
char szTitle[80];
HWND hwnd;
RECT rc;
COORD co;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hCon, &csbi);
lpci->lColumns = csbi.srWindow.Right - csbi.srWindow.Left;
lpci->lLines = csbi.srWindow.Bottom - csbi.srWindow.Top;
co = GetLargestConsoleWindowSize(hCon);
lpci->lBufMax = co.X;
GetConsoleTitle(szTitle, sizeof(szTitle));
hwnd = FindWindow(NULL, szTitle);
lpci->hwnd = (DWORD)hwnd;
GetClientRect(hwnd, &rc);
lpci->lWidth = rc.right;
lpci->lHeight = rc.bottom;
if (IsIconic(hwnd) == TRUE) {
lpci->lColumns = 80;
lpci->lLines = 25;
lpci->lBufMax = 80;
}
return TRUE;
}
LONG FAR PASCAL StubPuts(LPSTR lpStr)
{
return puts(lpStr);
}
LPSTR FAR PASCAL StubGets(LPSTR lpStr)
{
return gets(lpStr);
}
LONG FAR PASCAL StubFputs(LPSTR lpStr, LPSTR lpFile)
{
return fputs(lpStr, (lpFile != (LPSTR)-1) ? stdout : stderr);
}
LPSTR FAR PASCAL StubFgets(LPSTR lpStr, LONG lSize, LPSTR lpFile)
{
return fgets(lpStr, lSize, stdin);
}
LONG FAR PASCAL StubSystem(LPSTR lpStr)
{
return system(lpStr);
}
BOOL FAR PASCAL StubCallConsole(FARPROC FAR *lpfnIO,
LPSTR lpszCmdLine,
LPLONG lpInfo)
{
LP_CW_S_CONSOLE_INFO lpci;
switch (*lpInfo) {
case CW_M_CONSOLE_INFO:
lpci = (LP_CW_S_CONSOLE_INFO)lpInfo;
switch (lpci->lMode) {
case CW_MODE_GET:
return GetConsoleInfo(lpci);
}
}
return FALSE;
}
LONG FAR PASCAL StubGetch(void)
{
return getch();
}
LONG FAR PASCAL StubInkey(void)
{
return (kbhit() == 0) ? 0 : getch();
}
int main(int argc, char **argv)
{
FARPROC lpfnIO[8];
BOOL (FAR PASCAL *CallCommand)(FARPROC FAR *, LPSTR, LPLONG);
HINSTANCE hInstDLL;
LONG lReturn;
char szCmdLine[512];
char szCmd[512];
CW_S_CONSOLE_INFO ci;
lpfnIO[0] = MakeProcInstance((FARPROC)StubPuts, hInstance);
lpfnIO[1] = MakeProcInstance((FARPROC)StubGets, hInstance);
lpfnIO[2] = MakeProcInstance((FARPROC)StubFputs, hInstance);
lpfnIO[3] = MakeProcInstance((FARPROC)StubFgets, hInstance);
lpfnIO[4] = MakeProcInstance((FARPROC)StubSystem, hInstance);
lpfnIO[5] = MakeProcInstance((FARPROC)StubCallConsole, hInstance);
lpfnIO[6] = MakeProcInstance((FARPROC)StubGetch, hInstance);
lpfnIO[7] = MakeProcInstance((FARPROC)StubInkey, hInstance);
GetCommandName(szCmd, sizeof(szCmd));
lstrcpy(szCmdLine, szCmd);
lstrcat(szCmdLine, " ");
lstrcat(szCmdLine, (argc == 1) ? "" : strchr(GetCommandLine(), ' ') + 1);
hInstDLL = LoadLibrary(DLLNAME);
if (hInstDLL == NULL) {
return -1;
}
(FARPROC)CallCommand = GetProcAddress(hInstDLL, APINAME);
memset(&ci, 0, sizeof(ci));
ci.lMessage = CW_M_CONSOLE_INFO;
ci.lSize = sizeof(ci);
ci.lMode = CW_MODE_GET;
GetConsoleInfo(&ci);
ci.lMode = CW_MODE_INIT;
ci.lFuncMax = 8;
CallCommand(lpfnIO, gszNullStr, (LPLONG)&ci);
lReturn = CW_M_EXEC;
CallCommand(lpfnIO, szCmdLine, &lReturn);
ci.lMode = CW_MODE_CLEAR;
CallCommand(lpfnIO, gszNullStr, (LPLONG)&ci);
FreeLibrary(hInstDLL);
return (INT)lReturn;
}
#endif