mirror of https://github.com/vitalif/openscad
rewrite wrapper using popen. add 1 name to abt dialog
parent
1af090c7b3
commit
bc395c95f6
|
@ -115,7 +115,7 @@ Brett Sutton, hmnapier, Eero af Heurlin, caliston, 5263, ghost, 42loop,
|
|||
uniqx, Michael Thomson, Michael Ivko, Pierre Doucet, myglc2, Alan Cox,
|
||||
Peter Falke, Michael Ambrus, Gordon Wrigley, Ed Nisley, Stony Smith,
|
||||
Pasca Andrei, David Goodenough, William A Adams, mrrobinson, 1i7,
|
||||
benhowes ... and many others
|
||||
benhowes, Craig Trader, Miro Hrončok, ... and many others
|
||||
|
||||
<p>
|
||||
<b>Hosting & resources</b>
|
||||
|
|
195
src/winconsole.c
195
src/winconsole.c
|
@ -1,146 +1,71 @@
|
|||
// enable easy piping under windows command line, using the 'devenv' method
|
||||
// http://stackoverflow.com/questions/493536/can-one-executable-be-both-a-console-and-gui-app
|
||||
// http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx
|
||||
// http://blogs.msdn.com/b/junfeng/archive/2004/02/06/68531.aspx
|
||||
// http://www.i18nguy.com/unicode/c-unicode.html
|
||||
|
||||
/*
|
||||
|
||||
Based on inkscapec by Jos Hirth work at http://kaioa.com
|
||||
and Nop Head's OpenSCAD_cl at github.com
|
||||
|
||||
Zero-clause BSD-style license (DGAF)
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
enable easy piping under windows command line, using the 'devenv' method
|
||||
http://stackoverflow.com/questions/493536/can-one-executable-be-both-a-console-and-gui-app
|
||||
http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx
|
||||
http://blogs.msdn.com/b/junfeng/archive/2004/02/06/68531.aspx
|
||||
http://msdn.microsoft.com/en-us/library/aa298534%28v=vs.60%29.aspx
|
||||
http://www.i18nguy.com/unicode/c-unicode.html
|
||||
http://cournape.wordpress.com/2008/07/29/redirecting-stderrstdout-in-cmdexe/
|
||||
Open Group popen() documentation
|
||||
See Also: inkscapec by Jos Hirth work at http://kaioa.com
|
||||
and Nop Head's OpenSCAD_cl at github.com
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <tchar.h>
|
||||
void HandleOutput(HANDLE hPipeRead);
|
||||
DWORD WINAPI RedirThread(LPVOID lpvThreadParam);
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#define MAXCMDLEN 64000
|
||||
#define BUFFSIZE 42
|
||||
|
||||
HANDLE hChildProcess=NULL;
|
||||
HANDLE hStdIn=NULL;
|
||||
BOOL bRunThread=TRUE;
|
||||
int main( int argc, char * argv[] )
|
||||
{
|
||||
FILE *cmd_stdout;
|
||||
char cmd[MAXCMDLEN];
|
||||
char buffer[BUFFSIZE];
|
||||
char *fgets_result;
|
||||
int eof = 0;
|
||||
int pclose_result;
|
||||
int i;
|
||||
int result = 0;
|
||||
|
||||
int main(int argc,char *argv[]){
|
||||
HANDLE hOutputReadTemp,hOutputRead,hOutputWrite;
|
||||
HANDLE hInputWriteTemp,hInputRead,hInputWrite;
|
||||
HANDLE hErrorWrite;
|
||||
HANDLE hThread;
|
||||
DWORD ThreadId;
|
||||
SECURITY_ATTRIBUTES sa;
|
||||
strcat( cmd, "\0" );
|
||||
strcat( cmd, "openscad.exe" );
|
||||
for ( i = 1 ; i < argc ; ++i ) {
|
||||
strcat( cmd, " " );
|
||||
strcat( cmd, argv[i] );
|
||||
}
|
||||
strcat( cmd, " ");
|
||||
strcat( cmd, " 2>&1"); // capture stderr and stdout
|
||||
|
||||
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
|
||||
sa.lpSecurityDescriptor=NULL;
|
||||
sa.bInheritHandle=TRUE;
|
||||
cmd_stdout = _popen( cmd, "rt" );
|
||||
if ( cmd_stdout == NULL ) {
|
||||
printf( "Error opening _popen for command: %s", cmd );
|
||||
perror( "Error message:" );
|
||||
return 1;
|
||||
}
|
||||
|
||||
int i;
|
||||
wchar_t cmd[32000];
|
||||
wcscat( cmd,L"\0" );
|
||||
wcscat( cmd,L"openscad.exe" );
|
||||
int wargc;
|
||||
LPWSTR *wargv;
|
||||
wargv = CommandLineToArgvW(GetCommandLineW(), &wargc);
|
||||
if ( !wargv ) {
|
||||
printf(" error in CommandLineToArgvW\n");
|
||||
return 1;
|
||||
}
|
||||
for(i=1;i<argc;i++){
|
||||
wcscat( cmd, L" " );
|
||||
wcscat( cmd, wargv[i] );
|
||||
}
|
||||
LocalFree( wargv );
|
||||
while ( !eof )
|
||||
{
|
||||
fgets_result = fgets( buffer, BUFFSIZE, cmd_stdout );
|
||||
if ( fgets_result == NULL ) {
|
||||
if ( ferror( cmd_stdout ) ) {
|
||||
printf("Error reading from stdout of %s\n", cmd);
|
||||
result = 1;
|
||||
}
|
||||
if ( feof( cmd_stdout ) ) {
|
||||
eof = 1;
|
||||
}
|
||||
} else {
|
||||
fprintf( stdout, "%s", buffer );
|
||||
}
|
||||
}
|
||||
|
||||
CreatePipe(&hOutputReadTemp,&hOutputWrite,&sa,0);
|
||||
DuplicateHandle(GetCurrentProcess(),hOutputWrite,GetCurrentProcess(),&hErrorWrite,0,TRUE,DUPLICATE_SAME_ACCESS);
|
||||
CreatePipe(&hInputRead,&hInputWriteTemp,&sa,0);
|
||||
DuplicateHandle(GetCurrentProcess(),hOutputReadTemp,GetCurrentProcess(),&hOutputRead,0,FALSE,DUPLICATE_SAME_ACCESS);
|
||||
DuplicateHandle(GetCurrentProcess(),hInputWriteTemp,GetCurrentProcess(),&hInputWrite,0,FALSE,DUPLICATE_SAME_ACCESS);
|
||||
CloseHandle(hOutputReadTemp);
|
||||
CloseHandle(hInputWriteTemp);
|
||||
pclose_result = _pclose( cmd_stdout );
|
||||
if ( pclose_result < 0 ) {
|
||||
perror("Error while closing stdout for command:");
|
||||
result = 1;
|
||||
}
|
||||
|
||||
hStdIn=GetStdHandle(STD_INPUT_HANDLE);
|
||||
|
||||
//-
|
||||
PROCESS_INFORMATION pi;
|
||||
STARTUPINFO si;
|
||||
|
||||
ZeroMemory(&si,sizeof(STARTUPINFO));
|
||||
si.cb=sizeof(STARTUPINFO);
|
||||
si.dwFlags=STARTF_USESTDHANDLES;
|
||||
si.hStdOutput=hOutputWrite;
|
||||
si.hStdInput=hInputRead;
|
||||
si.hStdError=hErrorWrite;
|
||||
|
||||
CreateProcess(NULL,cmd,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
|
||||
|
||||
hChildProcess=pi.hProcess;
|
||||
|
||||
CloseHandle(pi.hThread);
|
||||
//-
|
||||
|
||||
CloseHandle(hOutputWrite);
|
||||
CloseHandle(hInputRead);
|
||||
CloseHandle(hErrorWrite);
|
||||
|
||||
hThread=CreateThread(NULL,0,RedirThread,(LPVOID)hInputWrite,0,&ThreadId);
|
||||
|
||||
HandleOutput(hOutputRead);
|
||||
|
||||
CloseHandle(hStdIn);
|
||||
|
||||
bRunThread=FALSE;
|
||||
|
||||
WaitForSingleObject(hThread,INFINITE);
|
||||
CloseHandle(hOutputRead);
|
||||
CloseHandle(hInputWrite);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void HandleOutput(HANDLE hPipeRead){
|
||||
CHAR lpBuffer[256];
|
||||
DWORD nRead;
|
||||
DWORD nWrote;
|
||||
|
||||
while(TRUE){
|
||||
if(!ReadFile(hPipeRead,lpBuffer,sizeof(lpBuffer),&nRead,NULL)||!nRead)
|
||||
if(GetLastError()==ERROR_BROKEN_PIPE)
|
||||
break;
|
||||
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE),lpBuffer,nRead,&nWrote,NULL);
|
||||
}
|
||||
}
|
||||
|
||||
DWORD WINAPI RedirThread(LPVOID lpvThreadParam){
|
||||
CHAR buff[256];
|
||||
DWORD nRead,nWrote;
|
||||
HANDLE hPipeWrite=(HANDLE)lpvThreadParam;
|
||||
|
||||
while(bRunThread){
|
||||
ReadConsole(hStdIn,buff,1,&nRead,NULL);
|
||||
|
||||
buff[nRead]='\0';
|
||||
|
||||
if(!WriteFile(hPipeWrite,buff,nRead,&nWrote,NULL)){
|
||||
if(GetLastError()==ERROR_NO_DATA)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue