Browse Source

Clean up compatibility definitions.

This attempts to clean up the way various compatibility
functions are defined and used.

 - A new header file, git-compat-util.h, is introduced.  This
   looks at various NO_XXX and does necessary function name
   replacements, equivalent of -Dstrcasestr=gitstrcasestr in the
   Makefile.

 - Those function name replacements are removed from the Makefile.

 - Common features such as usage(), die(), xmalloc() are moved
   from cache.h to git-compat-util.h; cache.h includes
   git-compat-util.h itself.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 19 years ago
parent
commit
4050c0df8e
  1. 12
      Makefile
  2. 96
      cache.h
  3. 2
      compat/mmap.c
  4. 3
      compat/strcasestr.c
  5. 113
      git-compat-util.h
  6. 15
      git.c
  7. 4
      mailinfo.c
  8. 2
      usage.c

12
Makefile

@ -162,7 +162,7 @@ LIB_FILE=libgit.a @@ -162,7 +162,7 @@ LIB_FILE=libgit.a
LIB_H = \
blob.h cache.h commit.h count-delta.h csum-file.h delta.h \
diff.h epoch.h object.h pack.h pkt-line.h quote.h refs.h \
run-command.h strbuf.h tag.h tree.h
run-command.h strbuf.h tag.h tree.h git-compat-util.h

DIFF_OBJS = \
diff.o diffcore-break.o diffcore-order.o diffcore-pathspec.o \
@ -320,15 +320,15 @@ ifdef NEEDS_NSL @@ -320,15 +320,15 @@ ifdef NEEDS_NSL
SIMPLE_LIB += -lnsl
endif
ifdef NO_STRCASESTR
COMPAT_CFLAGS += -Dstrcasestr=gitstrcasestr -DNO_STRCASESTR=1
COMPAT_CFLAGS += -DNO_STRCASESTR
COMPAT_OBJS += compat/strcasestr.o
endif
ifdef NO_SETENV
COMPAT_CFLAGS += -Dsetenv=gitsetenv -DNO_SETENV=1
COMPAT_CFLAGS += -DNO_SETENV
COMPAT_OBJS += compat/setenv.o
endif
ifdef NO_MMAP
COMPAT_CFLAGS += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP
COMPAT_CFLAGS += -DNO_MMAP
COMPAT_OBJS += compat/mmap.o
endif
ifdef NO_IPV6
@ -363,9 +363,9 @@ all: $(ALL_PROGRAMS) @@ -363,9 +363,9 @@ all: $(ALL_PROGRAMS)
all:
$(MAKE) -C templates

git$(X): git.c $(COMPAT_OBJS) Makefile
git$X: git.c $(LIB_FILE) Makefile
$(CC) -DGIT_EXEC_PATH='"$(bindir)"' -DGIT_VERSION='"$(GIT_VERSION)"' \
$(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(filter %.o,$^)
$(CFLAGS) $(COMPAT_CFLAGS) -o $@ $(filter %.c,$^) $(LIB_FILE)

$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
rm -f $@

96
cache.h

@ -1,23 +1,7 @@ @@ -1,23 +1,7 @@
#ifndef CACHE_H
#define CACHE_H

#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#ifndef NO_MMAP
#include <sys/mman.h>
#endif
#include <sys/param.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <dirent.h>
#include "git-compat-util.h"

#include SHA1_HEADER
#include <zlib.h>
@ -36,15 +20,6 @@ @@ -36,15 +20,6 @@
#define DTYPE(de) DT_UNKNOWN
#endif

#ifdef __GNUC__
#define NORETURN __attribute__((__noreturn__))
#else
#define NORETURN
#ifndef __attribute__
#define __attribute__(x)
#endif
#endif

/*
* Intensive research over the course of many years has shown that
* port 9418 is totally unused by anything else. Or
@ -250,11 +225,6 @@ extern const char *resolve_ref(const char *path, unsigned char *sha1, int); @@ -250,11 +225,6 @@ extern const char *resolve_ref(const char *path, unsigned char *sha1, int);
extern int create_symref(const char *git_HEAD, const char *refs_heads_master);
extern int validate_symref(const char *git_HEAD);

/* General helper functions */
extern void usage(const char *err) NORETURN;
extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));

extern int base_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);
extern int cache_name_compare(const char *name1, int len1, const char *name2, int len2);

@ -272,30 +242,6 @@ extern int setup_ident(void); @@ -272,30 +242,6 @@ extern int setup_ident(void);
extern const char *git_author_info(void);
extern const char *git_committer_info(void);

static inline void *xmalloc(size_t size)
{
void *ret = malloc(size);
if (!ret)
die("Out of memory, malloc failed");
return ret;
}

static inline void *xrealloc(void *ptr, size_t size)
{
void *ret = realloc(ptr, size);
if (!ret)
die("Out of memory, realloc failed");
return ret;
}

static inline void *xcalloc(size_t nmemb, size_t size)
{
void *ret = calloc(nmemb, size);
if (!ret)
die("Out of memory, calloc failed");
return ret;
}

struct checkout {
const char *base_dir;
int base_dir_len;
@ -373,20 +319,6 @@ extern void packed_object_info_detail(struct pack_entry *, char *, unsigned long @@ -373,20 +319,6 @@ extern void packed_object_info_detail(struct pack_entry *, char *, unsigned long
/* Dumb servers support */
extern int update_server_info(int);

#ifdef NO_MMAP

#ifndef PROT_READ
#define PROT_READ 1
#define PROT_WRITE 2
#define MAP_PRIVATE 1
#define MAP_FAILED ((void*)-1)
#endif

extern void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
extern int gitfakemunmap(void *start, size_t length);

#endif

typedef int (*config_fn_t)(const char *, const char *);
extern int git_default_config(const char *, const char *);
extern int git_config_from_file(config_fn_t fn, const char *);
@ -404,31 +336,5 @@ extern char git_default_name[MAX_GITNAME]; @@ -404,31 +336,5 @@ extern char git_default_name[MAX_GITNAME];
#define MAX_ENCODING_LENGTH 64
extern char git_commit_encoding[MAX_ENCODING_LENGTH];

/* Sane ctype - no locale, and works with signed chars */
#undef isspace
#undef isdigit
#undef isalpha
#undef isalnum
#undef tolower
#undef toupper
extern unsigned char sane_ctype[256];
#define GIT_SPACE 0x01
#define GIT_DIGIT 0x02
#define GIT_ALPHA 0x04
#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
#define isspace(x) sane_istest(x,GIT_SPACE)
#define isdigit(x) sane_istest(x,GIT_DIGIT)
#define isalpha(x) sane_istest(x,GIT_ALPHA)
#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
#define tolower(x) sane_case((unsigned char)(x), 0x20)
#define toupper(x) sane_case((unsigned char)(x), 0)

static inline int sane_case(int x, int high)
{
if (sane_istest(x, GIT_ALPHA))
x = (x & ~0x20) | high;
return x;
}

extern int copy_fd(int ifd, int ofd);
#endif /* CACHE_H */

2
compat/mmap.c

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include "../cache.h"
#include "../git-compat-util.h"

void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
{

3
compat/strcasestr.c

@ -1,5 +1,4 @@ @@ -1,5 +1,4 @@
#include <string.h>
#include <ctype.h>
#include "../git-compat-util.h"

char *gitstrcasestr(const char *haystack, const char *needle)
{

113
git-compat-util.h

@ -0,0 +1,113 @@ @@ -0,0 +1,113 @@
#ifndef GIT_COMPAT_UTIL_H
#define GIT_COMPAT_UTIL_H

#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <sys/param.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <dirent.h>

#ifdef __GNUC__
#define NORETURN __attribute__((__noreturn__))
#else
#define NORETURN
#ifndef __attribute__
#define __attribute__(x)
#endif
#endif

/* General helper functions */
extern void usage(const char *err) NORETURN;
extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));

#ifdef NO_MMAP

#ifndef PROT_READ
#define PROT_READ 1
#define PROT_WRITE 2
#define MAP_PRIVATE 1
#define MAP_FAILED ((void*)-1)
#endif

#define mmap gitfakemmap
#define munmap gitfakemunmap
extern void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
extern int gitfakemunmap(void *start, size_t length);

#else /* NO_MMAP */

#include <sys/mman.h>

#endif /* NO_MMAP */

#ifdef NO_SETENV
#define setenv gitsetenv
extern int gitsetenv(const char *, const char *, int);
#endif

#ifdef NO_STRCASESTR
#define strcasestr gitstrcasestr
extern char *gitstrcasestr(const char *haystack, const char *needle);
#endif

static inline void *xmalloc(size_t size)
{
void *ret = malloc(size);
if (!ret)
die("Out of memory, malloc failed");
return ret;
}

static inline void *xrealloc(void *ptr, size_t size)
{
void *ret = realloc(ptr, size);
if (!ret)
die("Out of memory, realloc failed");
return ret;
}

static inline void *xcalloc(size_t nmemb, size_t size)
{
void *ret = calloc(nmemb, size);
if (!ret)
die("Out of memory, calloc failed");
return ret;
}

/* Sane ctype - no locale, and works with signed chars */
#undef isspace
#undef isdigit
#undef isalpha
#undef isalnum
#undef tolower
#undef toupper
extern unsigned char sane_ctype[256];
#define GIT_SPACE 0x01
#define GIT_DIGIT 0x02
#define GIT_ALPHA 0x04
#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
#define isspace(x) sane_istest(x,GIT_SPACE)
#define isdigit(x) sane_istest(x,GIT_DIGIT)
#define isalpha(x) sane_istest(x,GIT_ALPHA)
#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
#define tolower(x) sane_case((unsigned char)(x), 0x20)
#define toupper(x) sane_case((unsigned char)(x), 0)

static inline int sane_case(int x, int high)
{
if (sane_istest(x, GIT_ALPHA))
x = (x & ~0x20) | high;
return x;
}

#endif

15
git.c

@ -8,15 +8,12 @@ @@ -8,15 +8,12 @@
#include <errno.h>
#include <limits.h>
#include <stdarg.h>
#include "git-compat-util.h"

#ifndef PATH_MAX
# define PATH_MAX 4096
#endif

#ifdef NO_SETENV
extern int gitsetenv(const char *, const char *, int);
#endif

static const char git_usage[] =
"Usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ ARGS ]";

@ -156,10 +153,10 @@ static void list_commands(const char *exec_path, const char *pattern) @@ -156,10 +153,10 @@ static void list_commands(const char *exec_path, const char *pattern)
}

#ifdef __GNUC__
static void usage(const char *exec_path, const char *fmt, ...)
static void cmd_usage(const char *exec_path, const char *fmt, ...)
__attribute__((__format__(__printf__, 2, 3), __noreturn__));
#endif
static void usage(const char *exec_path, const char *fmt, ...)
static void cmd_usage(const char *exec_path, const char *fmt, ...)
{
if (fmt) {
va_list ap;
@ -254,12 +251,12 @@ int main(int argc, char **argv, char **envp) @@ -254,12 +251,12 @@ int main(int argc, char **argv, char **envp)
else if (!strcmp(arg, "help"))
show_help = 1;
else if (!show_help)
usage(NULL, NULL);
cmd_usage(NULL, NULL);
}

if (i >= argc || show_help) {
if (i >= argc)
usage(exec_path, NULL);
cmd_usage(exec_path, NULL);

show_man_page(argv[i]);
}
@ -297,7 +294,7 @@ int main(int argc, char **argv, char **envp) @@ -297,7 +294,7 @@ int main(int argc, char **argv, char **envp)
execve(git_command, &argv[i], envp);

if (errno == ENOENT)
usage(exec_path, "'%s' is not a git-command", argv[i]);
cmd_usage(exec_path, "'%s' is not a git-command", argv[i]);

fprintf(stderr, "Failed to run command '%s': %s\n",
git_command, strerror(errno));

4
mailinfo.c

@ -10,10 +10,6 @@ @@ -10,10 +10,6 @@
#include <iconv.h>
#include "cache.h"

#ifdef NO_STRCASESTR
extern char *gitstrcasestr(const char *haystack, const char *needle);
#endif

static FILE *cmitmsg, *patchfile;

static int keep_subject = 0;

2
usage.c

@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
*
* Copyright (C) Linus Torvalds, 2005
*/
#include "cache.h"
#include "git-compat-util.h"

static void report(const char *prefix, const char *err, va_list params)
{

Loading…
Cancel
Save