@@ -174,6 +174,37 @@ static inline char* stpcpyWithNewlineConversion(char* dstStr, const char* srcStr
174174 return dstStr ;
175175}
176176
177+ static size_t matchesDistPrefix (const char * str , const Settings * settings ) {
178+ if (settings -> distPathPrefixes && settings -> distPathPrefixes [0 ] != '\0' ) {
179+ char * list = xStrdup (settings -> distPathPrefixes );
180+ char * saveptr ;
181+ char * token = strtok_r (list , ":" , & saveptr );
182+ size_t matched = 0 ;
183+ while (token ) {
184+ if (String_startsWith (str , token )) {
185+ matched = strlen (token );
186+ break ;
187+ }
188+ token = strtok_r (NULL , ":" , & saveptr );
189+ }
190+ free (list );
191+ return matched ;
192+ }
193+
194+ static const char * const prefixes [] = {
195+ "/bin/" , "/sbin/" , "/lib/" , "/lib32/" , "/lib64/" , "/libx32/" ,
196+ "/usr/bin/" , "/usr/sbin/" , "/usr/lib/" , "/usr/lib32/" , "/usr/lib64/" ,
197+ "/usr/libx32/" , "/usr/libexec/" , "/usr/local/bin/" , "/usr/local/lib/" ,
198+ "/usr/local/sbin/" , "/nix/store/" , "/run/current-system/" ,
199+ NULL
200+ };
201+ for (size_t i = 0 ; prefixes [i ]; i ++ ) {
202+ if (String_startsWith (str , prefixes [i ]))
203+ return strlen (prefixes [i ]);
204+ }
205+ return 0 ;
206+ }
207+
177208/*
178209 * This function makes the merged Command string. It also stores the offsets of the
179210 * basename, comm w.r.t the merged Command string - these offsets will be used by
@@ -256,51 +287,10 @@ void Process_makeCommandStr(Process* this, const Settings* settings) {
256287
257288 #define CHECK_AND_MARK_DIST_PATH_PREFIXES (str_ ) \
258289 do { \
259- if ((str_)[0] != '/') { \
260- break; \
261- } \
262- switch ((str_)[1]) { \
263- case 'b': \
264- CHECK_AND_MARK(str_, "/bin/"); \
265- break; \
266- case 'l': \
267- CHECK_AND_MARK(str_, "/lib/"); \
268- CHECK_AND_MARK(str_, "/lib32/"); \
269- CHECK_AND_MARK(str_, "/lib64/"); \
270- CHECK_AND_MARK(str_, "/libx32/"); \
271- break; \
272- case 's': \
273- CHECK_AND_MARK(str_, "/sbin/"); \
274- break; \
275- case 'u': \
276- if (String_startsWith(str_, "/usr/")) { \
277- switch ((str_)[5]) { \
278- case 'b': \
279- CHECK_AND_MARK(str_, "/usr/bin/"); \
280- break; \
281- case 'l': \
282- CHECK_AND_MARK(str_, "/usr/libexec/"); \
283- CHECK_AND_MARK(str_, "/usr/lib/"); \
284- CHECK_AND_MARK(str_, "/usr/lib32/"); \
285- CHECK_AND_MARK(str_, "/usr/lib64/"); \
286- CHECK_AND_MARK(str_, "/usr/libx32/"); \
287- \
288- CHECK_AND_MARK(str_, "/usr/local/bin/"); \
289- CHECK_AND_MARK(str_, "/usr/local/lib/"); \
290- CHECK_AND_MARK(str_, "/usr/local/sbin/"); \
291- break; \
292- case 's': \
293- CHECK_AND_MARK(str_, "/usr/sbin/"); \
294- break; \
295- } \
296- } \
297- break; \
298- case 'n': \
299- CHECK_AND_MARK(str_, "/nix/store/"); \
300- break; \
301- case 'r': \
302- CHECK_AND_MARK(str_, "/run/current-system/"); \
303- break; \
290+ size_t _plen = matchesDistPrefix(str_, settings); \
291+ if (_plen > 0) { \
292+ WRITE_HIGHLIGHT(0, _plen, CRT_colors[PROCESS_SHADOW], \
293+ CMDLINE_HIGHLIGHT_FLAG_PREFIXDIR); \
304294 } \
305295 } while (0)
306296
0 commit comments