[comp.lang.c] Problems with TDS and MSDOS Turbo C

edlee@chinet.chi.il.us (Edward Lee) (02/10/91)

[What follows is a response to a message sent by dionj@netcom.uucp]

I received your message early today, on 9 Feb 1991.  I am currently in 
an out-of-state college, so I have not checked my email often.  You 
write:

 >Mr. Lee, thanks for TDS.
 >[....]
 >When I try tds on my DOS system, to remove carriage returns
 >from an editor file, it fails.  It removes, for example,
 >blanks just fine...but it cannot seem to remove the \h0d
 >characters.  I tried
 >  tds -d \h0d <foo >out
 >  tds -d\r < foo > out
 >
 >and a few other combinations.  Perhaps a bug?
 >If you can fix it, it would be worth $20 to me by return
 >mail.  Email me the code, and send your US mail address. thx.

You do not have to pay me anything for TDS.  It is my way of repaying 
the other program authors who have provided their creations for free 
and the administrators of Usenet who keep the network working.

You are obviously an above-average program user. :-)  I have 
considered using TDS for the (CR/LF -> LF) function you mention.  
Thank you for bringing to my attention the problem with this function 
on a MicroSoft DOS system.

What you are seeing is not a bug of TDS, but rather a bug, or a 
desirable feature, depending on your point of view, of Turbo C's or 
some other MSDOS C compiler's fread() and fwrite() functions.  What is 
happening is that fread() is automatically deleting input Carriage 
Returns, and fwrite() is automatically converting single LineFeeds 
into Carriage Return/LineFeed pairs in its output.  For example, if 
you invoke TDS at an MSDOS prompt in the following way:

     C:> tds <inputfile >outputfile

you then have a fast (*NIX text -> MSDOS text) converter(!).  When you 
do the following at a *NIX shell prompt:

     % tds -d \\r <inputfile >outputfile

what you have is the inverse, a fast (MSDOS text -> *NIX text) 
converter, as you may have originally intended.

If your intent is to convert an MSDOS text file into *NIX format, then 
I suggest that you:

     (1) Try to compile TDS with a different MSDOS C compiler
         such as MicroSoft C (I have already tried Turbo C++ v1.0), or

     (2) Perform (MSDOS -> *NIX text) conversion with TDS on a UNIX
         system:

         a.) Transfer tds.c to the target *NIX system as a binary file.

         b.) Convert tds.c to *NIX format:

              % tr -d \\015 <tds.c >temp;  mv temp tds.c
                ^^
                  Please note the "tr" as opposed to "tds".

         (Or, if your file transfer software is able to perform
         MSDOS to *NIX text conversion on the fly, you can skip steps 
         a & b and just upload tds.c as a text file.)

         c.) Compile tds.c:

              % cc -O -s tds.c -o tds

         Then perform any (MSDOS text -> *NIX text) conversions solely 
         on the *NIX system with TDS.  Or,

         (3) Bring this to the attention of Borland International.  I 
             suspect that fread() and fwrite() are not as ANSI 
             C-compatible as the Turbo C v2.0 and Turbo C++ v1.0 
             reference manuals may lead readers to believe.  
             Representatives are on Usenet, so I will repost this
             letter there.

In investigating this problem, I also discovered that MSDOS v2.11 will 
stop passing any characters down a pipeline except ASCII character 26 
once it sees such a CTRL-Z (^Z or (char)26) character.  While the 
source code for TDS is identical on both *NIX and MSDOS systems, TDS 
is crippled in its ability to correctly handle ASCII characters 13 and 
26 by Turbo C v2.0, Turbo C++ v1.0, and MSDOS v2.11 internals.  Null 
characters are correctly processed, however.



-Ed L

edlee@chinet.chi.il.us (Edward Lee) (02/11/91)

Thanks to the suggestion of Arthur Sybrandy, TDS now operates in
binary mode under MSDOS.  The "setmode(fileno(stream), O_BINARY);"
function is used to set stdin and stdout to binary mode.  This
change only affects the MSDOS executable.  The setmode() function
seems to have the desired affect when TDS is compiled under
Turbo C++ v1.0 but does not have the desired affect under Turbo C
v2.0 .


-Ed L