home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 5 Edit
/
05-Edit.zip
/
fed0217s.zip
/
source
/
clip.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2000-11-16
|
7KB
|
332 lines
/*
** Module :CLIP.CPP
** Abstract :Clipboard command line utility
**
** Public domain by Sergey I. Yevtushenko
**
** Log: Tue 15/02/2000 Created
**
*/
#define INCL_DOS
#define INCL_WIN
#include <os2.h>
#include <stdio.h>
#include <string.h>
#define MODE_NONE 0
#define MODE_IN 0x0001
#define MODE_OUT 0x0002
struct Chunk
{
Chunk *next;
int sz;
char data[2048];
Chunk():next(0), sz(0) {}
};
BOOL (APIENTRY *_inCloseClipbrd)(HAB);
HMQ (APIENTRY *_inCreateMsgQueue)(HAB, LONG);
BOOL (APIENTRY *_inDestroyMsgQueue)(HMQ);
BOOL (APIENTRY *_inEmptyClipbrd)(HAB);
HAB (APIENTRY *_inInitialize)(ULONG);
BOOL (APIENTRY *_inOpenClipbrd)(HAB);
ULONG(APIENTRY *_inQueryClipbrdData)(HAB, ULONG);
BOOL (APIENTRY *_inQueryClipbrdFmtInfo)(HAB, ULONG, PULONG);
BOOL (APIENTRY *_inSetClipbrdData)(HAB, ULONG, ULONG, ULONG);
BOOL (APIENTRY *_inTerminate)(HAB);
HAB hab;
HMQ hmq;
//---------------------------------------------------------------
// STDIN Stuff
//---------------------------------------------------------------
char *ReadPipe(int iPipe)
{
APIRET rc;
ULONG ulTotal = 0;
ULONG ulBytesRead = 0;
Chunk* pHead = new Chunk;
Chunk* pCurr = pHead;
do
{
ulBytesRead = 0;
rc = DosRead(0, pCurr->data, sizeof(pCurr->data), &ulBytesRead);
pCurr->sz = ulBytesRead;
ulTotal += ulBytesRead;
if(ulBytesRead)
{
pCurr->next = new Chunk;
pCurr = pCurr->next;
}
}
while(!rc && ulBytesRead);
char *str = 0;
if(ulTotal)
{
str = new char[ulTotal+1];
char *ptr = str;
for(pCurr = pHead; pCurr; pCurr = pCurr->next)
{
if(!pCurr->sz)
continue;
memcpy(ptr, pCurr->data, pCurr->sz);
ptr += pCurr->sz;
}
*ptr = 0;
}
//Free memory
for(pCurr = pHead; pCurr; )
{
Chunk* pTmp = pCurr;
pCurr = pCurr->next;
delete pTmp;
}
return str;
}
//---------------------------------------------------------------
// PM Stuff
//---------------------------------------------------------------
int init_pm(void)
{
PPIB pib;
PTIB tib;
APIRET rc;
HMODULE hMte = 0;
char loadErr[256];
if(hab || hmq)
return 0;
rc = DosGetInfoBlocks(&tib, &pib);
rc = DosQueryModuleHandle((PCH)"PMWIN", &hMte);
if(rc)
return 1;
pib->pib_ultype = 3;
rc = DosLoadModule((PCH)loadErr, sizeof(loadErr), (PCH)"PMWIN", &hMte);
if(rc)
return 1;
rc = DosQueryProcAddr(hMte, 707, 0, (PFN*)&_inCloseClipbrd);
rc = DosQueryProcAddr(hMte, 716, 0, (PFN*)&_inCreateMsgQueue);
rc = DosQueryProcAddr(hMte, 726, 0, (PFN*)&_inDestroyMsgQueue);
rc = DosQueryProcAddr(hMte, 733, 0, (PFN*)&_inEmptyClipbrd);
rc = DosQueryProcAddr(hMte, 763, 0, (PFN*)&_inInitialize);
rc = DosQueryProcAddr(hMte, 793, 0, (PFN*)&_inOpenClipbrd);
rc = DosQueryProcAddr(hMte, 806, 0, (PFN*)&_inQueryClipbrdData);
rc = DosQueryProcAddr(hMte, 807, 0, (PFN*)&_inQueryClipbrdFmtInfo);
rc = DosQueryProcAddr(hMte, 854, 0, (PFN*)&_inSetClipbrdData);
rc = DosQueryProcAddr(hMte, 888, 0, (PFN*)&_inTerminate);
hab = _inInitialize(0);
hmq = _inCreateMsgQueue(hab, 0);
return 0;
}
void done_pm(void)
{
if(hmq)
_inDestroyMsgQueue(hmq);
if(hab)
_inTerminate(hab);
hab = 0;
hmq = 0;
}
void set_clip(char *text)
{
if(!hab || !text)
return;
char *pByte = 0;
//Calculate size of buffer
int sz = strlen(text) + 1;
int i;
_inOpenClipbrd(hab);
_inEmptyClipbrd(hab);
if (!DosAllocSharedMem((PPVOID)&pByte, 0, sz,
PAG_WRITE | PAG_COMMIT | OBJ_GIVEABLE | OBJ_GETTABLE))
{
memcpy(pByte, text, sz);
_inSetClipbrdData(hab, (ULONG) pByte, CF_TEXT, CFI_POINTER);
}
_inCloseClipbrd(hab);
}
char* get_clip(void)
{
if(!hab)
return 0;
char *ClipData;
ULONG ulFormat;
_inQueryClipbrdFmtInfo(hab, CF_TEXT, &ulFormat);
if(ulFormat != CFI_POINTER)
return 0;
_inOpenClipbrd(hab);
ClipData = (char *)_inQueryClipbrdData(hab, CF_TEXT);
if(!ClipData)
return 0;
int sz = strlen(ClipData) + 1;
char *str = new char[sz];
memcpy(str, ClipData, sz);
_inCloseClipbrd(hab);
return str;
}
char cUsage[] = "CLIP V0.1 Command line clipboard handler.\r\n"
"Public domain by Sergey I. Yevtushenko.\r\n"
"\r\n"
"Usage: CLIP [-o[-]] [-i[-]] [-{h|?}]\r\n"
;
void usage(void)
{
ULONG ulWrote = 0;
DosWrite(1, cUsage, sizeof(cUsage) - 1, &ulWrote);
}
int main(int argc, char **argv)
{
ULONG ulType = 0;
ULONG ulAttr = 0;
APIRET rc;
int i;
int iMode = MODE_NONE;
rc = DosQueryHType(0, &ulType, &ulAttr); //STDIN
//printf("rc = %d, type = %08x, attr = %08x\n", rc, ulType, ulAttr);
if(!rc)
{
ulType &= 0xFF;
if(ulType == 0 || ulType == 2) //file or pipe
iMode |= MODE_IN;
}
rc = DosQueryHType(1, &ulType, &ulAttr); //STDOUT
//printf("rc = %d, type = %08x, attr = %08x\n", rc, ulType, ulAttr);
if(!rc)
{
ulType &= 0xFF;
if(ulType == 0 || ulType == 2) //file or pipe
iMode |= MODE_OUT;
}
for(i = 1; i < argc; i++)
{
if(argv[i][0] == '-' || argv[i][0] == '/')
{
switch(argv[i][1])
{
case 'I':
case 'i':
if(argv[i][2] == '-')
iMode &= ~MODE_IN;
else
iMode |= MODE_IN;
break;
case 'o':
case 'O':
if(argv[i][2] == '-')
iMode &= ~MODE_OUT;
else
iMode |= MODE_OUT;
break;
case 'h':
case 'H':
case '?':
usage();
return 0;
}
}
}
if(!iMode)
{
usage();
return 0;
}
rc = init_pm();
if(rc)
return -1;
if(iMode & MODE_IN)
{
char *str = ReadPipe(0);
if(str)
set_clip(str);
delete str;
}
if(iMode & MODE_OUT)
{
char *str = get_clip();
if(str)
{
ULONG ulWrote = 0;
rc = DosWrite(1, str, strlen(str), &ulWrote);
}
}
done_pm();
return rc;
}