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);
 }

Reply via email to