From ef4bb26f937b6628306742c417305b813d8f2913 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 4 Jun 2007 12:21:53 +0000 Subject: [PATCH] diff: stop using data/bss function old new delta do_diff 385 436 +51 diff_main 850 895 +45 dump_unified_vec 437 457 +20 prepare 335 334 -1 anychange 1 - -1 suff 4 - -4 status 135 131 -4 static.max_context 4 - -4 start 12 8 -4 pref 4 - -4 member 4 - -4 label2 4 - -4 label1 4 - -4 klist 4 - -4 ixold 4 - -4 ixnew 4 - -4 dl_count 4 - -4 dl 4 - -4 context_vec_start 4 - -4 context_vec_ptr 4 - -4 context_vec_end 4 - -4 context 4 - -4 clistlen 4 - -4 clist 4 - -4 clen 4 - -4 class 4 - -4 J 4 - -4 add_to_dirlist 71 64 -7 slen 8 - -8 sfile 8 - -8 len 8 - -8 file 8 - -8 get_dir 196 185 -11 newcand 97 85 -12 change 351 331 -20 stb2 96 - -96 stb1 96 - -96 diffreg 2835 2717 -118 ------------------------------------------------------------------------------ (add/remove: 0/27 grow/shrink: 3/8 up/down: 116/-482) Total: -366 bytes # size */*/diff.o text data bss dec hex filename 7055 8 305 7368 1cc8 busybox.t2/coreutils/diff.o 7002 0 0 7002 1b5a busybox.t3/coreutils/diff.o --- coreutils/diff.c | 120 ++++++++++++++++++++++++++++----------------- miscutils/nmeter.c | 9 ++-- 2 files changed, 79 insertions(+), 50 deletions(-) diff --git a/coreutils/diff.c b/coreutils/diff.c index f6b045b2d..faab287f8 100644 --- a/coreutils/diff.c +++ b/coreutils/diff.c @@ -65,36 +65,16 @@ #define FLAG_U (1<<12) #define FLAG_w (1<<13) -/* The following variables should be static, but gcc currently - * creates a much bigger object if we do this. [which version of gcc? --vda] */ -/* 4.x, IIRC also 3.x --bernhard */ -/* Works for gcc 3.4.3. Sizes without and with "static": - # size busybox.t[34]/coreutils/diff.o - text data bss dec hex filename - 6969 8 305 7282 1c72 busybox.t3/coreutils/diff.o - 6969 8 305 7282 1c72 busybox.t4/coreutils/diff.o - --vda - */ -/* This is the default number of lines of context. */ -static int context = 3; -static int status; -static char *start; -static const char *label1; -static const char *label2; -static struct stat stb1, stb2; -USE_FEATURE_DIFF_DIR(static char **dl;) -USE_FEATURE_DIFF_DIR(static int dl_count;) - struct cand { int x; int y; int pred; }; -static struct line { +struct line { int serial; int value; -} *file[2]; +}; /* * The following struct is used to record change information @@ -102,29 +82,79 @@ static struct line { * understand the highly mnemonic field names) */ struct context_vec { - int a; /* start line in old file */ - int b; /* end line in old file */ - int c; /* start line in new file */ - int d; /* end line in new file */ + int a; /* start line in old file */ + int b; /* end line in old file */ + int c; /* start line in new file */ + int d; /* end line in new file */ +}; + +struct globals { + USE_FEATURE_DIFF_DIR(char **dl;) + USE_FEATURE_DIFF_DIR(int dl_count;) + /* This is the default number of lines of context. */ + int context; + size_t max_context; + int status; + char *start; + const char *label1; + const char *label2; + struct line *file[2]; + int *J; /* will be overlaid on class */ + int *class; /* will be overlaid on file[0] */ + int *klist; /* will be overlaid on file[0] after class */ + int *member; /* will be overlaid on file[1] */ + int clen; + int len[2]; + int pref, suff; /* length of prefix and suffix */ + int slen[2]; + bool anychange; + long *ixnew; /* will be overlaid on file[1] */ + long *ixold; /* will be overlaid on klist */ + struct cand *clist; /* merely a free storage pot for candidates */ + int clistlen; /* the length of clist */ + struct line *sfile[2]; /* shortened by pruning common prefix/suffix */ + struct context_vec *context_vec_start; + struct context_vec *context_vec_end; + struct context_vec *context_vec_ptr; + struct stat stb1, stb2; }; +#define G (*ptr_to_globals) +#define dl (G.dl ) +#define dl_count (G.dl_count ) +#define context (G.context ) +#define max_context (G.max_context ) +#define status (G.status ) +#define start (G.start ) +#define label1 (G.label1 ) +#define label2 (G.label2 ) +#define file (G.file ) +#define J (G.J ) +#define class (G.class ) +#define klist (G.klist ) +#define member (G.member ) +#define clen (G.clen ) +#define len (G.len ) +#define pref (G.pref ) +#define suff (G.suff ) +#define slen (G.slen ) +#define anychange (G.anychange ) +#define ixnew (G.ixnew ) +#define ixold (G.ixold ) +#define clist (G.clist ) +#define clistlen (G.clistlen ) +#define sfile (G.sfile ) +#define context_vec_start (G.context_vec_start ) +#define context_vec_end (G.context_vec_end ) +#define context_vec_ptr (G.context_vec_ptr ) +#define stb1 (G.stb1 ) +#define stb2 (G.stb2 ) +#define INIT_G() do { \ + PTR_TO_GLOBALS = xzalloc(sizeof(G)); \ + context = 3; \ + max_context = 64; \ +} while (0) + -static int *J; /* will be overlaid on class */ -static int *class; /* will be overlaid on file[0] */ -static int *klist; /* will be overlaid on file[0] after class */ -static int *member; /* will be overlaid on file[1] */ -static int clen; -static int len[2]; -static int pref, suff; /* length of prefix and suffix */ -static int slen[2]; -static bool anychange; -static long *ixnew; /* will be overlaid on file[1] */ -static long *ixold; /* will be overlaid on klist */ -static struct cand *clist; /* merely a free storage pot for candidates */ -static int clistlen; /* the length of clist */ -static struct line *sfile[2]; /* shortened by pruning common prefix/suffix */ -static struct context_vec *context_vec_start; -static struct context_vec *context_vec_end; -static struct context_vec *context_vec_ptr; static void print_only(const char *path, size_t dirlen, const char *entry) @@ -761,8 +791,6 @@ static void print_header(const char *file1, const char *file2) static void change(char *file1, FILE * f1, char *file2, FILE * f2, int a, int b, int c, int d) { - static size_t max_context = 64; - if ((a > b && c > d) || (option_mask32 & FLAG_q)) { anychange = 1; return; @@ -1170,6 +1198,8 @@ int diff_main(int argc, char **argv) char *f1, *f2; llist_t *L_arg = NULL; + INIT_G(); + /* exactly 2 params; collect multiple -L