Search code examples
unixcommand-linecase-insensitivebsd

UNIX 'comm' utility allows for case insensitivity in BSD but not Linux (via -i flag). How can I get it in Linux?


I'm using the excellent UNIX 'comm' command line utility in an application which I developed on a BSD platform (OSX). When I deployed to my Linux production server I found out that sadly, Ubuntu Linux's 'comm' utility does not take the -i flag to indicate that the lines should be compared case-insensitive. Apparently the POSIX standard does not require the -i option.

So... I'm in a bind. I really need the -i option that works so well on BSD. I've gone so far to try to compile the BSD comm.c source code on the Linux box but I got:

http://svn.freebsd.org/viewvc/base/user/luigi/ipfw3-head/usr.bin/comm/comm.c?view=markup&pathrev=200559

me@host:~$ gcc comm.c 
comm.c: In function ‘getline’:
comm.c:195: warning: assignment makes pointer from integer without a cast
comm.c: In function ‘wcsicoll’:
comm.c:264: warning: assignment makes pointer from integer without a cast
comm.c:270: warning: assignment makes pointer from integer without a cast
/tmp/ccrvPbfz.o: In function `getline':
comm.c:(.text+0x421): undefined reference to `reallocf'
/tmp/ccrvPbfz.o: In function `wcsicoll':
comm.c:(.text+0x691): undefined reference to `reallocf'
comm.c:(.text+0x6ef): undefined reference to `reallocf'
collect2: ld returned 1 exit status

Does anyone have any suggestions as to how to get a version of comm on Linux that supports 'comm -i'?

Thanks!


Solution

  • You can add the following in comm.c:

    void *reallocf(void *ptr, size_t size)
    {
        void *ret = realloc(ptr, size);
        if (ret == NULL) {
            free(ptr);
        }
        return ret;
    }
    

    You should be able to compile it then. Make sure comm.c has #include <stdlib.h> in it (it probably does that already).

    The reason your compilation fails is because BSD comm.c uses reallocf() which is not a standard C function. But it is easy to write.