tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] how to get Unix style line endings for output (just \


From: Roy Tam
Subject: Re: [Tinycc-devel] how to get Unix style line endings for output (just \n not \r\n) --- works when writing to a file, not when redirecting stdout on command line
Date: Tue, 5 Mar 2013 07:58:07 +0800

Hi,

2013/3/5 John Refling <address@hidden>:
> I’m writing binary data to a file.  The data may contain 0xa ( = \n, NL, ^J
> ).
>
> When I open the output file within the program with ` fopen("file", "wb");’
> the data is
>
> written correctly.  Of course using “w” without the “b” causes hex 0xa to be
> pre-pended
>
> with 0xd ( = \r, CR, ^M) corrupting the data, as expected, so must use “wb”.
> That’s fine.
>
> However, if within the program I write the data to stdout, and then on
> command line
>
> redirect stdout to my file, the file seems to always contain the undesired
> 0xd (^M) characters.
>
> e.g.: .\example > file
>
> I’ve tried a few things from standard Unix like freopen() fdopen() but
> nothing seemed to help.
>
> Is there some way to redirect purely binary (raw) data to stdout without
> having extra bytes
>
> inserted into the output stream?

Try adding:
   setmode(STDIN_FILENO, O_BINARY);
   setmode(STDOUT_FILENO, O_BINARY);
in the beginning in your main()

>
> What is __imp__fmode hook in tinycc?  Maybe that would help?
>
> John Refling
>
> PS: Using cygwin bash shell but also same output under cmd.exe
>
> EXAMPLE.C FOLLOWS:
>
> // includes and prototypes
>
> #include <stdio.h>
>
> #include <stdlib.h>
>
> #include <sys/unistd.h>
>
> #include <string.h>
>
> #include <errno.h>
>
> #include <sys/stat.h>
>
> #include <sys/fcntl.h>
>
> #include <ctype.h>
>
> #include <fcntl.h>
>
> // is there a way to use this to change output mode???
>
> extern unsigned int * __imp__fmode;
>
> int main(int argc, char **argv) {
>
> //      *__imp__fmode = 3;                      // ????
>
>         char *buffer_nl = "test\n";
>
>         char *buffer_xx = "test";
>
> //      // ^M tacked onto lines in file `file' (as expected)
>
> //      FILE *F = fopen("file", "w");
>
> //      fprintf(F, buffer_nl);
>
>
>
> //      // no ^M tacked onto lines in file `file' (as expected)
>
> //      FILE *F = fopen("file", "wb");
>
> //      fprintf(F, buffer_nl);
>
>
>
>         // i want output to redirect stdout from here on...
>
>         // this is where ^M seems to be ALWAYS added
>
> //      // .\example.exe > redir, `redir' has ^M tacked onto lines
>
> //      fprintf(stdout, buffer_nl);
>
> //      // .\example.exe > redir, `redir' no newline in buffer, no ^M tacked
>
> //      fprintf(stdout, buffer_xx);
>
>         // some segfault under tcc, not under gcc
>
> //      FILE *F = freopen("nul:", "wb", stdout);                // nothing
> in file
>
> //      FILE *F = freopen("tty:", "wb", stdout);                // segfault
>
> //      FILE *F = freopen(NULL, "wb", stdout);          // segfault
>
> //      FILE *F = freopen("", "wb", stdout);            // segfault
>
> //      FILE *F = freopen("con:", "wb", stdout);                // can't
> redirect this
>
> //      fprintf(F, buffer_nl);
>
>
>
> //      // .\example.exe > redir, `redir' has ^M tacked onto lines
>
> //      FILE *F = fdopen(1, "wb");
>
>         FILE *F = fdopen(1, "wt");
>
>         fprintf(F, buffer_nl);
>
>         return 0;
>
> }
>
>
> _______________________________________________
> Tinycc-devel mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/tinycc-devel
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]