diff options
Diffstat (limited to 'Src/Zle/zle_tricky.c')
-rw-r--r-- | Src/Zle/zle_tricky.c | 188 |
1 files changed, 97 insertions, 91 deletions
diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 9756189d4..c82205cfb 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -8817,14 +8817,14 @@ calclist(void) } if (isset(LISTPACKED)) { char **pp; - int *ws, j, k, cl, ml, mm; + int *ws, tlines, tline, tcols, maxlen, nth, width; for (g = amatches; g; g = g->next) { ws = g->widths = (int *) zalloc(columns * sizeof(int)); memset(ws, 0, columns * sizeof(int)); - i = g->lins; - mm = g->cols; - cl = 0; + tlines = g->lins; + tcols = g->cols; + width = 0; if ((pp = g->ylist)) { if (!(g->flags & CGF_LINES)) { @@ -8835,139 +8835,145 @@ calclist(void) ylens[i] = strlen(*pp) + add; if (isset(LISTROWSFIRST)) { - int x, l = 0, v; - - for (mm = columns / g->shortest; mm > g->cols; mm--) { - for (j = i = ml = cl = l = v = x = 0, - k = g->dcount; - k > 0; k--) { - if (ylens[j] > ml) - ml = ylens[j]; - j += mm; - v++; - if (j >= g->dcount) { - if ((cl += ml) >= columns) + int count, tcol, first, maxlines = 0, llines; + + for (tcols = columns / g->shortest; tcols > g->cols; + tcols--) { + for (nth = first = maxlen = width = maxlines = + llines = tcol = 0, + count = g->dcount; + count > 0; count--) { + if (ylens[nth] > maxlen) + maxlen = ylens[nth]; + nth += tcols; + tlines++; + if (nth >= g->dcount) { + if ((width += maxlen) >= columns) break; - ws[x++] = ml; - ml = 0; - j = ++i; - if (v > l) - l = v; - v = 0; + ws[tcol++] = maxlen; + maxlen = 0; + nth = ++first; + if (llines > maxlines) + maxlines = llines; + llines = 0; } } - if (j < yl) { - ws[x++] = ml; - cl += ml; + if (nth < yl) { + ws[tcol++] = maxlen; + width += maxlen; } - if (!k && cl < columns) + if (!count && width < columns) break; } - if (mm > g->cols) - i = l; + if (tcols > g->cols) + tlines = maxlines; } else { - for (i = ((g->totl + columns) / columns); - i < g->lins; i++) { - for (pp = g->ylist, j = k = cl = ml = mm; - *pp; j++, pp++) { - if (ylens[j] > ml) - ml = ylens[j]; - if (++k == i) { - if ((cl += ml) >= columns) + for (tlines = ((g->totl + columns) / columns); + tlines < g->lins; tlines++) { + for (pp = g->ylist, nth = tline = width = + maxlen = tcols = 0; + *pp; nth++, pp++) { + if (ylens[nth] > maxlen) + maxlen = ylens[nth]; + if (++tline == tlines) { + if ((width += maxlen) >= columns) break; - ws[mm++] = ml; - ml = k = 0; + ws[tcols++] = maxlen; + maxlen = tline = 0; } } - if (k) { - ws[mm++] = ml; - cl += ml; + if (tline) { + ws[tcols++] = maxlen; + width += maxlen; } - if (j == yl && cl < columns) + if (nth == yl && width < columns) break; } } } } else if (g->width) { if (isset(LISTROWSFIRST)) { - int x, l = 0, v, al; - Cmatch *q; - - for (mm = columns / g->shortest; mm > g->cols; mm--) { - p = q = skipnolist(g->matches); - for (i = ml = cl = l = v = x = 0, k = g->dcount; - k > 0; k--) { + int addlen, count, tcol, maxlines = 0, llines, i; + Cmatch *first; + + for (tcols = columns / g->shortest; tcols > g->cols; + tcols--) { + p = first = skipnolist(g->matches); + for (maxlen = width = maxlines = llines = tcol = 0, + count = g->dcount; + count > 0; count--) { m = *p; - al = mlens[m->gnum] + add; - if (al > ml) - ml = al; - for (j = mm; j && *p; j--) + addlen = mlens[m->gnum] + add; + if (addlen > maxlen) + maxlen = addlen; + for (i = tcols; i && *p; i--) p = skipnolist(p + 1); - v++; + llines++; if (!*p) { - if (v > l) - l = v; - v = 0; + if (llines > maxlines) + maxlines = llines; + llines = 0; - if ((cl += ml) >= columns) + if ((width += maxlen) >= columns) break; - ws[x++] = ml; - ml = 0; + ws[tcol++] = maxlen; + maxlen = 0; - p = q = skipnolist(q + 1); + p = first = skipnolist(first + 1); } } - if (v) { - ws[x++] = ml; - cl += ml; + if (tlines) { + ws[tcol++] = maxlen; + width += maxlen; } - if (!k && cl < columns) + if (!count && width < columns) break; } - if (mm > g->cols) - i = l; + if (tcols > g->cols) + tlines = maxlines; } else { - int al; + int addlen; - for (i = ((g->totl + columns) / columns); - i < g->lins; i++) { - for (p = g->matches, j = k = cl = ml = mm = 0; - (m = *p); p++, j++) { + for (tlines = ((g->totl + columns) / columns); + tlines < g->lins; tlines++) { + for (p = g->matches, nth = tline = width = + maxlen = tcols = 0; + (m = *p); p++, nth++) { if (!(m->flags & (m->disp ? (CMF_DISPLINE | CMF_HIDE) : (CMF_NOLIST | CMF_HIDE)))) { - al = mlens[m->gnum] + add; - if (al > ml) - ml = al; - if (++k == i) { - if ((cl += ml) >= columns) + addlen = mlens[m->gnum] + add; + if (addlen > maxlen) + maxlen = addlen; + if (++tline == tlines) { + if ((width += maxlen) >= columns) break; - ws[mm++] = ml; - ml = k = 0; + ws[tcols++] = maxlen; + maxlen = tline = 0; } } } - if (k) { - ws[mm++] = ml; - cl += ml; + if (tline) { + ws[tcols++] = maxlen; + width += maxlen; } - if (j == g->dcount && cl < columns) + if (nth == g->dcount && width < columns) break; } } } - if (i == g->lins) { + if (tlines == g->lins) { zfree(ws, columns * sizeof(int)); g->widths = NULL; } else { - nlines += i - g->lins; - g->lins = i; - g->cols = mm; - g->totl = cl; - cl -= add; - if (cl > max) - max = cl; + nlines += tlines - g->lins; + g->lins = tlines; + g->cols = tcols; + g->totl = width; + width -= add; + if (width > max) + max = width; } } for (g = amatches; g; g = g->next) { |