On Wed, Jun 21, 2017 at 09:50:39PM +0200, Anton Lindqvist wrote: > Hi, > Here's a pattern I haven't seen before. This macro is especially hideous > since it make use of the local variable numitems as opposed of items > which is passed as an argument.
The previous diff was too aggressive. How about moving the macro into free_items()? Index: file.c =================================================================== RCS file: /cvs/src/bin/csh/file.c,v retrieving revision 1.26 diff -u -p -r1.26 file.c --- file.c 21 Jun 2017 19:36:23 -0000 1.26 +++ file.c 21 Jun 2017 20:16:24 -0000 @@ -566,21 +566,18 @@ getentry(DIR *dir_fd, int looking_for_lo static void free_items(Char **items, int numitems) { + sigset_t sigset, osigset; int i; + sigemptyset(&sigset); + sigaddset(&sigset, SIGINT); + sigprocmask(SIG_BLOCK, &sigset, &osigset); + for (i = 0; i < numitems; i++) free(items[i]); free(items); -} -#define FREE_ITEMS(items) { \ - sigset_t sigset, osigset;\ -\ - sigemptyset(&sigset);\ - sigaddset(&sigset, SIGINT);\ - sigprocmask(SIG_BLOCK, &sigset, &osigset);\ - free_items(items, numitems);\ - sigprocmask(SIG_SETMASK, &osigset, NULL);\ + sigprocmask(SIG_SETMASK, &osigset, NULL); } /* @@ -671,7 +668,7 @@ again: /* search for matches */ print_by_column(looking_for_lognames ? NULL : tilded_dir, items, numitems); if (items != NULL) - FREE_ITEMS(items); + free_items(items, numitems); } return (0); }