Re: Cursing the tput utility - the penguin strikes again
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.