diff options
author | donbright <hugh.m.bright@gmail.com> | 2013-01-26 21:54:50 (GMT) |
---|---|---|
committer | donbright <hugh.m.bright@gmail.com> | 2013-01-26 21:54:50 (GMT) |
commit | d0856efe6da545693f9c50a8a2514a9f999ab5ef (patch) | |
tree | 44d07f540b2f9872a1f8eda855e39ac3740b6491 /src | |
parent | 2e65c6ddc5c73bfd3b76650c26268b5f54f7cd40 (diff) | |
parent | ddebb3991cc9fa183841d64ba43c3768e5be03a8 (diff) |
Merge pull request #251 from openscad/windows_console
Windows console. Marius gave approval for Merge in Issue discussion.
Diffstat (limited to 'src')
-rw-r--r-- | src/AboutDialog.html | 2 | ||||
-rw-r--r-- | src/winconsole.c | 84 |
2 files changed, 85 insertions, 1 deletions
diff --git a/src/AboutDialog.html b/src/AboutDialog.html index 34e8127..6203e83 100644 --- a/src/AboutDialog.html +++ b/src/AboutDialog.html @@ -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, 5263, Craig Trader, Miro HronĨok, ... and many others <p> <b>Hosting & resources</b> diff --git a/src/winconsole.c b/src/winconsole.c new file mode 100644 index 0000000..de8e682 --- /dev/null +++ b/src/winconsole.c @@ -0,0 +1,84 @@ +/* + Enable easy piping under Windows(TM) command line. + + We use the 'devenv'(TM) method, which means we have two binary files: + + openscad.com, with IMAGE_SUBSYSTEM_WINDOWS_CUI flag set + openscad.exe, with IMAGE_SUBSYSTEM_WINDOWS_GUI flag set + + The .com version is a 'wrapper' for the .exe version. If you call + 'openscad' with no extension from a script or shell, the .com version + is prioritized by the OS and feeds the GUI stdout to the console. We use + pure C to minimize binary size when cross-compiling (~10kbytes). See Also: + + 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://cournape.wordpress.com/2008/07/29/redirecting-stderrstdout-in-cmdexe/ + Open Group popen() documentation + inkscapec by Jos Hirth work at http://kaioa.com + Nop Head's OpenSCAD_cl at github.com + + TODO: + Work with unicode: http://www.i18nguy.com/unicode/c-unicode.html +*/ + + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#define MAXCMDLEN 64000 +#define BUFFSIZE 42 + +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; + + 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 + + cmd_stdout = _popen( cmd, "rt" ); + if ( cmd_stdout == NULL ) { + printf( "Error opening _popen for command: %s", cmd ); + perror( "Error message:" ); + return 1; + } + + 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 ); + } + } + + pclose_result = _pclose( cmd_stdout ); + if ( pclose_result < 0 ) { + perror("Error while closing stdout for command:"); + result = 1; + } + + return result; +} |