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 <smujohn...@gmail.com> 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 <carozodequil...@gmail.com> > 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 (d...@delorie.com) > Modified 1999 by Mumit Khan <k...@xraylith.wisc.edu> > > 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 > (d...@delorie.com)\n"); > fprintf(stderr, "Modified 1999 for Mingw32 by Mumit Khan > <k...@xraylith.wisc.edu>\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) > Harbour@harbour-project.org > http://lists.harbour-project.org/mailman/listinfo/harbour > > > > > -- > smu johnson <smujohn...@gmail.com> > > > _______________________________________________ > Harbour mailing list (attachment size limit: 40KB) > Harbour@harbour-project.org > http://lists.harbour-project.org/mailman/listinfo/harbour > > > _______________________________________________ > Harbour mailing list (attachment size limit: 40KB) > Harbour@harbour-project.org > http://lists.harbour-project.org/mailman/listinfo/harbour _______________________________________________ Harbour mailing list (attachment size limit: 40KB) Harbour@harbour-project.org http://lists.harbour-project.org/mailman/listinfo/harbour