Sticky IBM C programming problems (summary of replies)

Charles Hannum CMH117 at psuvm.psu.edu
Sun Feb 25 06:25:24 AEST 1990


I seem to have missed your original posting, so I'll take this opportunity to
respond.


In article <498 at bilver.UUCP>, alex at bilver.UUCP (Alex Matulich) says:
>
>                      ...   the MSC manuals do NOT answer my questions, which
> is why I asked them; the Turbo C manuals do, however the ones I had
> were from version 1.5 or earlier and I didn't know it!
>
> I have been using primarily MSC.  Almost every single respondent is a
> Turbo C user, so many of the responses didn't apply to MSC -- I didn't
> realize Turbo C was so popular.  Anybody know anything about Lattice?

Probably because Turbo C is *fast*, the integrated environment in one *hell*
of a lot better than M*crosoft's, and the manuals are superb!


>COMMENT:  I was hoping to preserve portability in my programs by using
> cprintf() everywhere, and, in porting it to a non-IBM computer, using
> #define cprintf printf, but cprintf() doesn't translate the \n character
> properly, nor does it work with ANSI escape codes.  But I do have uses.
> cprintf() in Microsoft C is just as SLOW as printf()!  Turbo C is much
> faster, but the text doesn't inherit the current stdout text colors.
> As far as I can tell, _write() needs a file handle, and I don't know how
> to get a file handle to the video memory.

Lemme explain ...

cprintf(), et al., are specified to write directly to the CON: device (or
/dev/ttyxx, or whatever), rather than to stdout or stderr.  They are
*supposed* to do the same translations as printf() (et al.); I suspect this
is why the MSC library routines seem to offer no improvement in speed over
the normal printf() routines; this is not what they were meant for.

In Turbo C 1.0 (I've had it since the beginning!) the output was sent directly
to the MS-DOS console I/O functions (rather than the file I/O functions, which
are normally used).  However, this didn't follow the definition either, as they
could be redirected.

Starting with Turbo C 1.5, the console library has forced it to write directly
to the screen (literally!!!  B-), but it still doesn't do proper translations;
you still have to use "\n\r" rather than "\n".  <sigh>

If you just want to speed up output, and you're displaying line-by-line, use
setvbuf(stdout,... _IOLBF ...) (not exactly; fill in the missing arguments!).
I don't know about MSC, but this DRAMATICALLY improves performance in Turbo C.
(The reason, for those interested, is that Turbo C says "Hey!  It's a character
device!" and proceeds to write ONE STINKING CHARACTER at a time.  With MS-LOSS
this is horrendously slow.  By using _IOLBF, a whole line is output on each
MS-LOSS call.  [Note:  _IOFBF on an output file is the same in TC as _IOLBF.])


>COMMENT:  gettext(), etc. is only available on Turbo C.
> My current project is too big to convert to curses, but I'll look for
> it next time.

I have yet to see a decent (read: REASONABLY FAST) version of Curses! on the
PC.  If someone actually has a copy, I'd appreciate it, as I don't generally
make a habit of porting brain-dead software.


>COMMENT:  textbackground() and textcolor() aren't available with MSC.
> Escape sequences don't work with cputs(), cprintf(), etc. but it's not
> a real problem to use escape sequences with stdout functions when speed
> doesn't matter.

In your portability quest, you are not considering the problem of porting to
an entirely different *architecture*.  What if you're using a Tektronix
terminal on a *nix machine?  The escape sequences will be completely different!
Your best option, if you want total portability, is to use a *nix-like
"termcap" file.


>COMMENT:  Hmmm, that's right -- if I wait LONNNG enough, the critical error
> handler does indeed get invoked with a "device not ready" message.  From
> the responses I got, I gather that there's not really any good way to do
> this.  And how do I access "the print spooler"??  Is it a part of MS-DOS?

The "print spooler" is PRINT.COM.  It's documented in the MS-DOS manual.


>COMMENT:  Sure enough, there it is in the MSC manual!  The MSC index listed
> nothing useful under "directory", "directory control", "files", and other
> obvious headings.  _dos_findfirst(), indeed!  I never looked at that one
> long enough to realize what it was.  Also, implementation differences
> between these functions in Turbo C and MSC make for difficult porting.

These functions are not derived for any type of standard, and therefore cannot
be expected to be portable.  Tough.


>Look in argv[0], it contains the path of the program.  Then use fnsplit()
> and fnmerge() to manipulate the path.  Works under DOS 3.x.
>Use searchpath().
Note:  This was in reference to the statement below, which indicates that in
       DOS -3.00, argv[0] doesn't contain the complete path.
>In version 1.x and 2.x, your best bet is to search the current directory,
> and then the path, yourself, which is a pain.
Note:  Version 1.x doesn't use paths.  [B-)]


>[What books do you recommend?]
>The manuals that came with Turbo C
You'll get no argument on that one!  They're excellent!

(Herbert Schildt's?) "Turbo C Pocket Reference".  I'm not sure it's ever been
updated since version 1.5, but it's still an incredibly useful book.


>Many thanks to all the people who contributed (did I leave anyone out?):
>
> ...
>CMH117 at psuvm.psu.edu (Charles Hannum)

I'm at the bottom of the list!  <wimper>  B-)


Virtually,
- Charles Martin Hannum II       "Klein bottle for sale ... inquire within."
    (That's Charles to you!)     "To life immortal!"
  cmh117 at psuvm.{bitnet,psu.edu}  "No noozzzz izzz netzzzsnoozzzzz..."
  c9h at psuecl.{bitnet,psu.edu}    "Mem'ry, all alone in the moonlight ..."



More information about the Comp.lang.c mailing list