Re: Cursing the tput utility - the penguin strikes again

From: Frank Leonhardt <freebsd-doc_at_fjl.co.uk>
Date: Thu, 23 Feb 2023 21:20:10 UTC
On 23/02/2023 20:26, Thomas Dickey wrote:
> On Thu, Feb 23, 2023 at 03:14:16PM -0500, Kurt Hackenberg wrote:
>> On Thu, Feb 23, 2023 at 04:45:21PM +0000, Frank Leonhardt wrote:
>>
>>> So there's a tput utility for controlling the terminal in BSD.
>> ...
>>> Well use the tcap utility on non-BSD platforms and it suddenly doesn't
>>> work. It turns out that the penguinistas thought using the "Cap Name"
>>> instead of the "TCap Code" was a good idea. Some of the codes are the
>>> same, some are not. In fact most are not.
>> The trouble is those are two different mechanisms, based on two different
>> file formats, that do the same thing.
>>
>> The two file formats are "termcap" and "terminfo", both from the default
>> names of the system files that use them. Manual section 5 has pages about
>> both. They're similar, but different enough to be incompatible.
>>
>> The "TCap codes" are the names used in termcap format; the "Capnames" are
>> the names used in terminfo format. (A "cap" is a terminal "capability".)
>>
>> I think termcap came first, and then somebody invented terminfo as an
>> improvement or a reimplementation of the same idea. I think termcap came
>> from Berkeley Unix -- maybe invented for vi -- so FreeBSD more or less
>> stayed with it. Maybe terminfo came from Bell Labs; I think Linux prefers
>> it.
> most do (FreeBSD's userland is an exception)
>
> It's actually ncurses (and terminfo) underneath the facade.
>
> related -
>
> https://invisible-island.net/ncurses/tctest.html
>> This is pointlessly incompatible, the result of haphazard evolution, and
>> kind of a mess. It's all about 40 years old.
>>
>> The library functions that use those terminal descriptions were in the
>> library "curses" (from "cursor"), long ago superseded by "ncurses" (new
>> curses). Probably the program tput uses the library ncurses. You 
>> might want
>> to look at that library; maybe there's a compatibility layer. Or, as 
>> Daniel
>> Tameling suggested, maybe there are two different version of ncurses.
> just one -
>
> https://invisible-island.net/ncurses/ncurses.faq.html#platform-portable
>
> (but reading the FreeBSD sources would tell more)

The info you and Kurt have posted chimes with what I believe too. I 
started with System V ;-)

It's pretty clear that BSD has stuck with termcap where tput is 
concerned. Linux has broken this by using terminfo names instead. BSD 
presumably didn't, for compatibility.  I accept no excuses for breaking 
things unless it's absolutely necessary - so anyone reading this has 
been warned!

I'm pretty sure (but don't quote me) that termcap came from the BSD side 
(I don't remember it on other Unix systems); terminfo was supposed to 
include printer control codes as well, and I think it was there on SunOS 
(also BSD. Hmm)

Unless anything comes up I can see two solutions - a compatibility 
wrapper for shell scripts or, perhaps, modifying BSD tput to accept both 
versions of the attribute name. Something to think about...

Thanks, Frank.