Subject: Re: A solution for termcap lossage?
To: None <tech-userlevel@netbsd.org>
From: Christos Zoulas <christos@zoulas.com>
List: tech-userlevel
Date: 04/21/1999 14:19:49
In article <199904211318.WAA05311@mallee.awadi> blymn@baea.com.au (Brett Lymn) writes:
>
>Folks,
>        Myself and Julian Coleman have been doing some work on
>upgrading the NetBSD curses library, hopefully to full POSIX
>compliance (no guarentee on when/if that will occur though).  One
>thing we have discussed is how to exceed the 1023 character limit
>imposed by the tgetent call as it is clear to us that this limit will
>cause us grief.  One approach is to create a new call that is
>functionally similar to tgetent but does not truncate the termcap
>entry but, rather, returns an malloc'ed buffer containing the complete
>entry - this is very easy to implement, I have already done so (the
>patch for libterm is available on request).
>

If you are going to fix the api, then fix all of it:

struct tinfo_t;	/* Opaque */

OLD:    int tgetent(char *bp, char *name);
NEW:	const tinfo_t *t_getent(const char *name);

OLD:	int tgetnum(char *id);
NEW:	int t_getnum(const tinfo_t *t, int *);

OLD:    int tgetflag(char *id);
NEW:    int t_getflag(const tinfo_t *t, const char *id);

OLD:    char *tgetstr(char *id, char **area);
NEW:	int t_getstr(const tinfo_t *t, const char *id, char *buf, size_t bufsz);

OLD:    char *tgoto(char *cm, int destcol, int destline);
NEW:	int t_goto(const tinfo_t *t, const char *cm, int destcol, int destline,
		   char *buf, size_t bufsz);

OLD:    void tputs(char *cp, int affcnt, void (*outc)(int));
NEW:	int t_puts(const tinfo_t *t, const char *cp, int affcnt, 
		   int (*outc)(void *arg), void *outcarg);

NEW:	void t_freeent(const tinfo_t *t);

So that everything is re-entrant does not depend on global variables,
the interface can be used with more than one terminal at a time, and
all errors can be caught.

christos