Dear tech@ readers,

On 11/21/15 13:20, Alessandro DE LAURENZIS wrote:
> Dear tech@,
> 
> This is an attempt to solve a problem I previously reported [1] to
> misc@ (without receiving any feedback, so far).
[...]
> [1] http://marc.info/?l=openbsd-misc&m=144800414402238&w=2
> 

my second attempt... I understand that the previous patch was wrong.

After digging into terminfo(5) man page, I think the problem could be
related to the if...then...else structures (%?...%t...%e...%t...%;)
Probably we should reset the parameter counter each time we change the
branch, proceeding "row by row" as per "infocmp -f" output.

The following patch could be a step forward in this direction, although
some corner cases might be uncovered:

--- /usr/src/usr.bin/tput/tput.c.orig   Fri Jan 16 07:40:13 2015
+++ /usr/src/usr.bin/tput/tput.c        Thu Dec 24 15:12:28 2015
@@ -190,10 +190,12 @@
 process(char *cap, char *str, char **argv)
 {
        char *cp, *s, *nargv[9];
-       int arg_need, popcount, i;
+       int arg_need, arg_need_p, popcount, popcount_p, i;
 
        /* Count how many values we need for this capability. */
-       for (cp = str, arg_need = popcount = 0; *cp != '\0'; cp++) {
+       for (cp = str,
+           arg_need = arg_need_p = popcount = popcount_p = 0;
+           *cp != '\0'; cp++) {
                if (*cp == '%') {
                        switch (*++cp) {
                        case '%':
@@ -224,6 +226,17 @@
                        case '.':
                        case '+':
                                arg_need++;
+                               break;
+                       case '?':
+                       case 'e':
+                               arg_need_p = MAXIMUM(arg_need_p, arg_need);
+                               arg_need=0;
+                               popcount_p = MAXIMUM(popcount_p, popcount);
+                               popcount=0;
+                               break;
+                       case ';':
+                               arg_need = MAXIMUM(arg_need_p, arg_need);
+                               popcount = MAXIMUM(popcount_p, popcount);
                                break;
                        default:
                                break;

I played a bit with it and I didn't observe any regression with TERM set to
"xterm", "xterm-color", "xterm-256color", "screen", "screen-256color" and
"wsvt25"; of course, both "tput setaf" and "tput setab" now work as expected.

Just let me know your view.

All the best

-- 
Alessandro DE LAURENZIS
[mailto:just22....@gmail.com]
LinkedIn: http://it.linkedin.com/in/delaurenzis

Reply via email to