Hi,
This has been asked and answered a few days ago:
http://lists.harbour-project.org/pipermail/harbour/2010-March/033534.html
Anyway it belongs to user's list.
Brgds,
Viktor
On 2010 Mar 13, at 14:02, CarozoDeQuilmes wrote:
> Hi smu, many thanks for your help but it don't respond my question. I will
> make a pure Harbour sample and I will send my question again.
>
> Thanks and regards
> CdQ
>
> On Wed, Mar 10, 2010 at 5:07 PM, smu johnson <[email protected]> wrote:
> Take a look at this example that is working
>
> #include "Fileio.ch
>
> IF (nHandle := FCREATE(VERSION_FILE, FC_NORMAL)) == -1
> ? VERSION_FILE + " cannot be created:", FERROR()
> BREAK
> ELSE
> cString := "// " + cBm_now + CRLF
> cString += "func BM_Versio()" + CRLF
> cString += " return " + DOUBLE_QUOTE + cBm_now + DOUBLE_QUOTE + CRLF
>
> FWRITE(nHandle, cString)
> FCLOSE(nHandle)
> ? "Wrote to: " + VERSION_FILE
> ENDIF
>
>
>
> On Wed, Mar 10, 2010 at 12:03 PM, CarozoDeQuilmes <[email protected]>
> wrote:
> Hi, in an old project, I have a little C ansi program (found in Internet or
> in the MiniGUI, I don't remmeber) that execute and executable file and
> redirect the standard output to file.
>
> The C program run fine and trap Standard Output from another C program that
> made:
>
> fprintf( stdout , 'hello' );
>
> but I can't redirect (or trap) the "?" (or QOUT) command from a Harbour
> program.
>
> Is this true or I'm wrong ???
>
> Thanks in advance and sorry by my bad english
>
> CdQ
>
> Program C:
>
> /* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
> /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
> /*
>
> Redir 2.0 Copyright (C) 1995-1998 DJ Delorie ([email protected])
> Modified 1999 by Mumit Khan <[email protected]>
>
> Redir 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, or (at your option)
> any later version.
>
> Redir 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.
>
> */
>
> #include <ctype.h>
> #include <errno.h>
> #include <fcntl.h>
> #include <process.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include "US_Log.h"
>
> /* Here's the deal. We need to pass the command-line arguments to the
> child program *exactly* as we got them. This means we cannot allow
> any wildcard expansion, we need to retain any quote characters, and
> we need to disable response files processing. That's why we must
> link with CRT_noglob.o! */
>
> void xmalloc_failed(size_t size)
> {
> fprintf(stderr, "Out of memory allocating %lu bytes\n", (unsigned long)
> size);
> exit(1);
> }
>
> void *xmalloc (size_t size)
> {
> void *newmem;
>
> if (size == 0)
> size = 1;
> newmem = malloc (size);
> if (!newmem)
> xmalloc_failed (size);
>
> return (newmem);
> }
>
> void *xrealloc(void *oldmem, size_t size)
> {
> void *newmem;
>
> if (size == 0)
> size = 1;
> if (!oldmem)
> newmem = malloc (size);
> else
> newmem = realloc (oldmem, size);
> if (!newmem)
> xmalloc_failed (size);
>
> return (newmem);
> }
>
> int display_exit_code=0;
> int std_err_fid;
> FILE *std_err;
> int rv;
>
> static void
> usage(void)
> {
> /*
> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
> */
> fprintf(stderr, "Redir 2.0 Copyright (C) 1995 - 1998 DJ Delorie
> ([email protected])\n");
> fprintf(stderr, "Modified 1999 for Mingw32 by Mumit Khan
> <[email protected]>\n");
> fprintf(stderr, "Distribute freely. There is NO WARRANTY.\n");
> fprintf(stderr, "This program is protected by the GNU General Public
> License.\n\n");
> fprintf(stderr, "Usage: redir [-i file] [-o file] [-oa file] [-e file] [-ea
> file]\n");
> fprintf(stderr, " [-eo] [-oe] [-x] command [args . .
> .]\n\n");
> fprintf(stderr, " -i file redirect stdandard input from file\n");
> fprintf(stderr, " -o file redirect standard output to file\n");
> fprintf(stderr, " -oa file append standard output to file\n");
> fprintf(stderr, " -e file redirect standard error to file\n");
> fprintf(stderr, " -ea file append standard error to file\n");
> fprintf(stderr, " -eo redirect standard error to standard output\n");
> fprintf(stderr, " -oe redirect standard output to standard error\n");
> fprintf(stderr, " -x print exit code\n");
> fprintf(stderr, " command the program you want to run, with
> arguments\n\n");
> fprintf(stderr, "Options are processed in the order they are
> encountered.\n\n");
> exit(1);
> }
>
> static void
> fatal(const char *msg, const char *fn)
> {
> fprintf(std_err, msg, fn);
> fprintf(std_err, "\nThe error was: %s\n", strerror(errno));
> exit(1);
> }
>
> static void
> unquote(const char *src, char *dst)
> {
> int quote=0;
>
> while ((quote || !isspace(*src)) && *src)
> {
> if (quote && *src == quote)
> {
> quote = 0;
> src++;
> }
> else if (!quote && (*src == '\'' || *src == '"'))
> {
> quote = *src;
> src++;
> }
> else if (*src == '\\' && strchr("'\"", src[1]) && src[1])
> {
> src++;
> *dst++ = *src++;
> }
> else
> {
> *dst++ = *src++;
> }
> }
> *dst = '\0';
> }
>
> static char *
> unquoted_argv(int argc, char *argv[], char *reuse)
> {
> char *new_arg;
>
> if (reuse)
> new_arg = (char *)xrealloc(reuse, strlen(argv[argc]) + 1);
> else
> new_arg = (char *)xmalloc(strlen(argv[argc]) + 1);
> unquote(argv[argc], new_arg);
> return new_arg;
> }
>
> static int
> run_program(int argc, char *argv[])
> {
> return spawnvp (P_WAIT, argv[1], argv+1);
> }
>
> int
> main(int argc, char **argv)
> {
> char *arg1 = NULL, *arg2 = NULL;
>
> if (argc < 2)
> usage();
>
> std_err_fid = dup(1);
> std_err = fdopen(std_err_fid, "w");
>
> /* US_log( "US_Redir by CdQ" ); */
>
> /* We requested that the startup code retains any quote characters
> in the argv[] elements. So we need to unquote those that we
> process as we go. */
> while (argc > 1 && (arg1 = unquoted_argv(1, argv, arg2))[0] == '-')
> {
> int temp;
> if (strcmp(arg1, "-i")==0 && argc > 2)
> {
> if ((temp = open(arg2 = unquoted_argv(2, argv, arg1),
> O_RDONLY, 0666)) < 0
> || dup2(temp, 0) == -1)
> fatal("redir: attempt to redirect stdin from %s failed", arg2);
> close(temp);
> argc--;
> argv++;
> }
> else if (strcmp(arg1, "-o")==0 && argc > 2)
> {
> if ((temp = open(arg2 = unquoted_argv(2, argv, arg1),
> O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0
> || dup2(temp, 1) == -1)
> fatal("redir: attempt to redirect stdout to %s failed", arg2);
> close(temp);
> argc--;
> argv++;
> }
> else if (strcmp(arg1, "-oa")==0 && argc > 2)
> {
> if ((temp = open(arg2 = unquoted_argv(2, argv, arg1),
> O_WRONLY|O_APPEND|O_CREAT, 0666)) < 0
> || dup2(temp, 1) == -1)
> fatal("redir: attempt to append stdout to %s failed", arg2);
> close(temp);
> argc--;
> argv++;
> }
> else if (strcmp(arg1, "-e")==0 && argc > 2)
> {
> if ((temp = open(arg2 = unquoted_argv(2, argv, arg1),
> O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0
> || dup2(temp, 2) == -1)
> fatal("redir: attempt to redirect stderr to %s failed", arg2);
> close(temp);
> argc--;
> argv++;
> }
> else if (strcmp(arg1, "-ea")==0 && argc > 2)
> {
> if ((temp = open(arg2 = unquoted_argv(2, argv, arg1),
> O_WRONLY|O_APPEND|O_CREAT, 0666)) < 0
> || dup2(temp, 2) == -1)
> fatal("redir: attempt to append stderr to %s failed", arg2);
> close(temp);
> argc--;
> argv++;
> }
> else if (strcmp(arg1, "-eo")==0)
> {
> if (dup2(1,2) == -1)
> fatal("redir: attempt to redirect stderr to stdout failed", 0);
> }
> else if (strcmp(arg1, "-oe")==0)
> {
> if (dup2(2,1) == -1)
> fatal("redir: attempt to redirect stdout to stderr failed", 0);
> }
> else if (strcmp(arg1, "-x")==0)
> {
> display_exit_code = 1;
> }
> else
> usage();
> argc--;
> argv++;
> }
>
> if (argc <= 1)
> {
> errno = EINVAL;
> fatal("Missing program name; aborting", "");
> }
>
> rv = run_program(argc, argv);
>
> if (rv < 0)
> fatal("Error attempting to run program %s", argv[1]);
>
> if (display_exit_code)
> {
> fprintf(std_err, "Exit code: %d\n", rv);
> }
>
> return rv;
> }
>
>
> ==============================================================
> END PROGRAM
>
> _______________________________________________
> Harbour mailing list (attachment size limit: 40KB)
> [email protected]
> http://lists.harbour-project.org/mailman/listinfo/harbour
>
>
>
>
> --
> smu johnson <[email protected]>
>
>
> _______________________________________________
> Harbour mailing list (attachment size limit: 40KB)
> [email protected]
> http://lists.harbour-project.org/mailman/listinfo/harbour
>
>
> _______________________________________________
> Harbour mailing list (attachment size limit: 40KB)
> [email protected]
> http://lists.harbour-project.org/mailman/listinfo/harbour
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
[email protected]
http://lists.harbour-project.org/mailman/listinfo/harbour