44# Author: Luuk van Baal
55
66diff --git a/src/nnn.c b/src/nnn.c
7- index f8a2c58..9802a1f 100644
7+ index 19ebc2cf..42a0a6b0 100644
88--- a/src/nnn.c
99+++ b/src/nnn.c
10- @@ -394 ,6 +394 ,10 @@ typedef struct {
10+ @@ -430 ,6 +430 ,10 @@ typedef struct {
1111 } session_header_t;
1212 #endif
1313
@@ -18,11 +18,12 @@ index f8a2c58..9802a1f 100644
1818 /* GLOBALS */
1919
2020 /* Configuration, contexts */
21- @@ -1070 ,10 +1074,12 @@ static char *getpwname(uid_t uid)
21+ @@ -1175 ,10 +1179,13 @@ static char *getpwname(uid_t uid)
2222 static char *namecache;
2323
2424 if (uidcache != uid) {
25- + if (dtls.maxuidln && !dtls.printguid) dtls.printguid = 1;
25+ + if (dtls.maxuidln && !dtls.printguid)
26+ + dtls.printguid = 1;
2627 struct passwd *pw = getpwuid(uid);
2728
2829 uidcache = uid;
@@ -31,11 +32,12 @@ index f8a2c58..9802a1f 100644
3132 }
3233
3334 return namecache ? namecache : xitoa(uid);
34- @@ -1085 ,10 +1091,12 @@ static char *getgrname(gid_t gid)
35+ @@ -1190 ,10 +1197,13 @@ static char *getgrname(gid_t gid)
3536 static char *grpcache;
3637
3738 if (gidcache != gid) {
38- + if (dtls.maxgidln && !dtls.printguid) dtls.printguid = 1;
39+ + if (dtls.maxgidln && !dtls.printguid)
40+ + dtls.printguid = 1;
3941 struct group *gr = getgrgid(gid);
4042
4143 gidcache = gid;
@@ -44,7 +46,7 @@ index f8a2c58..9802a1f 100644
4446 }
4547
4648 return grpcache ? grpcache : xitoa(gid);
47- @@ -3834 ,14 +3842 ,13 @@ static void resetdircolor(int flags)
49+ @@ -4346 ,14 +4356 ,13 @@ static void resetdircolor(int flags)
4850 * Max supported str length: NAME_MAX;
4951 */
5052 #ifdef NOLC
@@ -62,7 +64,7 @@ index f8a2c58..9802a1f 100644
6264 {
6365 wchar_t * const wbuf = (wchar_t *)g_buf;
6466 wchar_t *buf = wbuf;
65- @@ -3866 ,7 +3873 ,7 @@ static wchar_t *unescape(const char *str, uint_t maxcols)
67+ @@ -4378 ,7 +4387 ,7 @@ static wchar_t *unescape(const char *str, uint_t maxcols)
6668 ++buf;
6769 }
6870
@@ -71,7 +73,107 @@ index f8a2c58..9802a1f 100644
7173 }
7274
7375 static off_t get_size(off_t size, off_t *pval, int comp)
74- @@ -4228,38 +4235,13 @@ static void printent(int pdents_index, uint_t namecols, bool sel)
76+ @@ -4627,9 +4636,10 @@ static uchar_t get_color_pair_name_ind(const struct entry *ent, char *pind, int
77+ }
78+
79+ #ifndef NOHIGHLIGHT_FILTER
80+ - static void printent_name(const struct entry *ent, uint_t namecols, bool sel)
81+ + static size_t printent_name(const struct entry *ent, uint_t namecols, bool sel)
82+ {
83+ char * const fltr = g_ctx[cfg.curctx].c_fltr;
84+ + size_t namelen;
85+
86+ /* If there's a filter string, highlight matches */
87+ if (fltr[1]) {
88+ @@ -4644,15 +4654,18 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel)
89+ if (cfg.regex) {
90+ /* For regex, we don't highlight - just print normally */
91+ #ifndef NOLC
92+ - addwstr(unescape(ent->name, namecols));
93+ + namelen = unescape(ent->name, namecols);
94+ + addwstr((wchar_t *)g_buf);
95+ #else
96+ - addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1));
97+ + namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1);
98+ + addstr((char *)g_buf);
99+ #endif
100+ } else if (cfg.fuzzy) {
101+ /* Get fuzzy match positions */
102+ fuzzy_match_positions(fltr + 1, ent->name, matched);
103+ #ifndef NOLC
104+ - wchar_t * const wbuf = unescape(ent->name, namecols);
105+ + namelen = unescape(ent->name, namecols);
106+ + wchar_t * const wbuf = (wchar_t *)g_buf;
107+ uint_t col = 0;
108+ for (wchar_t *p = wbuf; *p && col < namecols; ++p, ++col) {
109+ if (matched[col]) {
110+ @@ -4665,7 +4678,8 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel)
111+ }
112+ #else
113+ /* Non-wide character version for fuzzy highlighting */
114+ - const char *name = unescape(ent->name, MIN(namecols, ent->nlen) + 1);
115+ + namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1);
116+ + const char *name = (char *)g_buf;
117+ for (uint_t i = 0; (i < namecols) && name[i]; ++i) {
118+ if (matched[i]) {
119+ attron(match_attrs);
120+ @@ -4680,7 +4694,8 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel)
121+ /* String match - highlight the substring */
122+ string_match_positions(fltr + 1, ent->name, matched);
123+ #ifndef NOLC
124+ - wchar_t * const wbuf = unescape(ent->name, namecols);
125+ + namelen = unescape(ent->name, namecols);
126+ + wchar_t * const wbuf = (wchar_t *)g_buf;
127+ uint_t col = 0;
128+ for (wchar_t *p = wbuf; *p && col < namecols; ++p, ++col) {
129+ if (matched[col]) {
130+ @@ -4693,7 +4708,8 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel)
131+ }
132+ #else
133+ /* Non-wide character version for string highlighting */
134+ - const char *name = unescape(ent->name, MIN(namecols, ent->nlen) + 1);
135+ + namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1);
136+ + const char *name = (char *)g_buf;
137+ for (uint_t i = 0; (i < namecols) && name[i]; ++i) {
138+ if (matched[i]) {
139+ attron(match_attrs);
140+ @@ -4708,22 +4724,30 @@ static void printent_name(const struct entry *ent, uint_t namecols, bool sel)
141+ } else {
142+ /* No filter or filter not active - print normally */
143+ #ifndef NOLC
144+ - addwstr(unescape(ent->name, namecols));
145+ + namelen = unescape(ent->name, namecols);
146+ + addwstr((wchar_t *)g_buf);
147+ #else
148+ - addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1));
149+ + namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1);
150+ + addstr((char *)g_buf);
151+ #endif
152+ }
153+ +
154+ + return namelen;
155+ }
156+ #else
157+ /* Without highlight support, just print the name normally */
158+ - static inline void printent_name(const struct entry *ent, uint_t namecols, bool sel)
159+ + static inline size_t printent_name(const struct entry *ent, uint_t namecols, bool sel)
160+ {
161+ (void)sel; /* Suppress unused parameter warning */
162+ #ifndef NOLC
163+ - addwstr(unescape(ent->name, namecols));
164+ + size_t namelen = unescape(ent->name, namecols);
165+ + addwstr((wchar_t *)g_buf);
166+ #else
167+ - addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1));
168+ + size_t namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1);
169+ + addstr((char *)g_buf);
170+ #endif
171+ +
172+ + return namelen;
173+ }
174+ #endif
175+
176+ @@ -4731,38 +4755,14 @@ static void printent(int pdents_index, uint_t namecols, bool sel)
75177 {
76178 const struct entry *ent = &pdents[pdents_index];
77179 char ind = '\0';
@@ -99,7 +201,8 @@ index f8a2c58..9802a1f 100644
99201- if (attrs)
100202- attroff(attrs);
101203- }
102- + int attrs = 0, namelen;
204+ + int attrs = 0;
205+ + size_t namelen;
103206
104207 if (g_state.showlines) {
105208 ptrdiff_t rel_num = pdents_index - cur;
@@ -111,16 +214,12 @@ index f8a2c58..9802a1f 100644
111214 uchar_t color_pair = get_color_pair_name_ind(ent, &ind, &attrs);
112215
113216 addch((ent->flags & FILE_SELECTED) ? '+' | A_REVERSE | A_BOLD : ' ');
114- @@ -4284,15 +4266,40 @@ static void printent(int pdents_index, uint_t namecols, bool sel)
217+ @@ -4786,12 +4786,44 @@ static void printent(int pdents_index, uint_t namecols, bool sel)
218+ if (!ind)
115219 ++namecols;
116220
117- #ifndef NOLC
118- - addwstr(unescape(ent->name, namecols));
119- + addwstr((namelen = unescape(ent->name, namecols), (wchar_t *)g_buf));
120- #else
121- - addstr(unescape(ent->name, MIN(namecols, ent->nlen) + 1));
122- + addstr((namelen = unescape(ent->name, MIN(namecols, ent->nlen) + 1), (char *)g_buf));
123- #endif
221+ - printent_name(ent, namecols, sel);
222+ + namelen = printent_name(ent, namecols, sel);
124223
125224- if (attrs)
126225+ if (!sel && attrs)
@@ -137,9 +236,16 @@ index f8a2c58..9802a1f 100644
137236+ attron(attrs);
138237+ if (!g_state.oldcolor && (type == S_IFDIR || (type == S_IFLNK && ent->flags & DIR_OR_DIRLNK)))
139238+ attroff(A_BOLD);
140- + int sizelen = (type == S_IFREG || type == S_IFDIR) ? xstrlen(size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size)) : 1;
141- + printw("%*c%*s%s%s", 1 + MIN(namecols, dtls.maxnameln + (uint_t)(ind ? 0 : 1)) - namelen, ' ',
142- + dtls.maxsizeln - sizelen, "", size ? size : (type = (uchar_t)get_detail_ind(ent->mode), (char *)&type), " ");
239+ + int sizelen;
240+ + if (type == S_IFREG || type == S_IFDIR) {
241+ + size = coolsize(cfg.blkorder ? ent->blocks << blk_shift : ent->size);
242+ + sizelen = xstrlen(size);
243+ + } else
244+ + sizelen = 1;
245+ + printw("%*c%*s%s%s",
246+ + 1 + MIN(namecols, dtls.maxnameln + (uint_t)(ind ? 0 : 1)) - (int)namelen, ' ',
247+ + dtls.maxsizeln - sizelen, "", size ? size
248+ + : (type = (uchar_t)get_detail_ind(ent->mode), (char *)&type), " ");
143249+ #ifndef NOUG
144250+ if (g_state.uidgid && dtls.printguid) {
145251+ addstr(getpwname(ent->uid));
@@ -155,7 +261,7 @@ index f8a2c58..9802a1f 100644
155261 }
156262
157263 /**
158- @@ -6527 ,26 +6534 ,19 @@ static void statusbar(char *path)
264+ @@ -7670 ,26 +7702 ,19 @@ static void statusbar(char *path)
159265 tocursor();
160266 }
161267
@@ -185,7 +291,7 @@ index f8a2c58..9802a1f 100644
185291 }
186292
187293 /* 2 columns for preceding space and indicator */
188- @@ -6412 ,8 +6411 ,6 @@ static void draw_line(int ncols)
294+ @@ -7728 ,8 +7753 ,6 @@ static void draw_line(int ncols)
189295 /* Must reset e.g. no files in dir */
190296 if (dir)
191297 attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
@@ -194,29 +300,34 @@ index f8a2c58..9802a1f 100644
194300 }
195301
196302 static void redraw(char *path)
197- @@ -6521 ,6 +6518,21 @@ static void redraw(char *path)
198-
199- onscreen = MIN(onscreen + curscroll, ndents );
303+ @@ -7837 ,6 +7860,26 @@ static void redraw(char *path)
304+ int onscreen = MIN(ONSCREEN + curscroll, ndents);
305+ int len = scanselforpath(path, FALSE );
200306
201307+ if (cfg.showdetail) {
202308+ ushort_t lenbuf = dtls.maxnameln = dtls.maxsizeln = dtls.maxuidln = dtls.maxgidln = dtls.printguid = 0;
203309+ for (i = curscroll; i < onscreen; ++i) {
204- + if ((lenbuf = pdents[i].nlen - 1) > dtls.maxnameln) dtls.maxnameln = lenbuf;
205- + if ((lenbuf = xstrlen(coolsize(cfg.blkorder ? pdents[i].blocks << blk_shift : pdents[i].size))) > dtls.maxsizeln) dtls.maxsizeln = lenbuf;
310+ + if ((lenbuf = pdents[i].nlen - 1) > dtls.maxnameln)
311+ + dtls.maxnameln = lenbuf;
312+ + if ((lenbuf = xstrlen(coolsize(cfg.blkorder ? pdents[i].blocks << blk_shift : pdents[i].size))) > dtls.maxsizeln)
313+ + dtls.maxsizeln = lenbuf;
206314+ #ifndef NOUG
207315+ if (g_state.uidgid) {
208- + if ((getpwname(pdents[i].uid), dtls.uidln) > dtls.maxuidln) dtls.maxuidln = dtls.uidln;
209- + if ((getgrname(pdents[i].gid), dtls.gidln) > dtls.maxgidln) dtls.maxgidln = dtls.gidln;
316+ + if ((getpwname(pdents[i].uid), dtls.uidln) > dtls.maxuidln)
317+ + dtls.maxuidln = dtls.uidln;
318+ + if ((getgrname(pdents[i].gid), dtls.gidln) > dtls.maxgidln)
319+ + dtls.maxgidln = dtls.gidln;
210320+ }
211321+ #endif
212322+ }
213- + dtls.maxentln = dtls.maxnameln + dtls.maxsizeln + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 29) : 26);
323+ + dtls.maxentln = dtls.maxnameln + dtls.maxsizeln
324+ + + (dtls.printguid ? (dtls.maxuidln + dtls.maxgidln + 29) : 26);
214325+ }
215326+
216327 ncols = adjust_cols(ncols);
217328
218- int len = scanselforpath(path, FALSE);
219- @@ -6551 ,7 +6563 ,7 @@ static void redraw(char *path)
329+ /* Print listing */
330+ @@ -7865 ,7 +7908 ,7 @@ static void redraw(char *path)
220331 #endif
221332 }
222333
0 commit comments