sbase

suckless unix tools
git clone git://git.2f30.org/sbase.git
Log | Files | Refs | README | LICENSE

commit b8fbaa9b0d95c3f7270a7e633fc429fe1c0ea7b3
parent 19fb7f115d4aa49c01cb4419af6f7001d4a3eea0
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri Feb 20 14:38:52 +0100

Remove bit fields

Before removing bit fields:

$ size find

   text	   data	    bss	    dec	    hex	filename

  16751	    968	     48	  17767	   4567	find

After removing bit fields:
$ size find
   text    data     bss     dec     hex filename
  16527     968      68   17563    449b find

This is an example where bit fields uses more memory
than integers or char. There is going to be only one
gflags struct, so the waste in instructions is bigger
than the space saved by bit fields. In the case of Permarg,
Sizearg, Execarg there is only one bit field, so at least
one unsigned is used, so there is no any gain.

Diffstat:
find.c | 18+++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/find.c b/find.c @@ -64,7 +64,7 @@ struct Tok { /* structures used for Arg.extra.p and Tok.extra.p */ typedef struct { mode_t mode; - unsigned int exact:1; + unsigned char exact; } Permarg; typedef struct { @@ -83,7 +83,7 @@ typedef struct { typedef struct { Narg n; - unsigned int bytes:1; /* size is in bytes, not 512 byte sectors */ + unsigned char bytes; /* size is in bytes, not 512 byte sectors */ } Sizearg; typedef struct { @@ -100,7 +100,7 @@ typedef struct { } p; /* plus */ } u; char **argv; /* NULL terminated list of arguments (allocated if isplus) */ - unsigned int isplus:1; /* -exec + instead of -exec ; */ + unsigned char isplus; /* -exec + instead of -exec ; */ } Execarg; /* used to find loops while recursing through directory structure */ @@ -221,14 +221,14 @@ size_t envlen; /* number of bytes in environ, used to calculate against ARG_MAX size_t argmax; /* value of ARG_MAX retrieved using sysconf(3p) */ struct { - unsigned ret :1; /* return value from main */ - unsigned depth:1; /* -depth, directory contents before directory itself */ - unsigned h :1; /* -H, follow symlinks on command line */ - unsigned l :1; /* -L, follow all symlinks (command line and search) */ - unsigned prune:1; /* hit -prune, eval should return STW_PRUNE (return values + unsigned ret ; /* return value from main */ + unsigned depth; /* -depth, directory contents before directory itself */ + unsigned h ; /* -H, follow symlinks on command line */ + unsigned l ; /* -L, follow all symlinks (command line and search) */ + unsigned prune; /* hit -prune, eval should return STW_PRUNE (return values traversing expression tree are boolean so we can't easily return this. instead set a global flag) */ - unsigned xdev :1; /* -xdev, prune directories on different devices */ + unsigned xdev ; /* -xdev, prune directories on different devices */ } gflags; /*