Skip to content

Commit

Permalink
Clean up compatibility definitions.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Dec 5, 2005
1 parent cd8c458 commit 4050c0d
Show file tree
Hide file tree
Showing 8 changed files with 129 additions and 118 deletions.
12 changes: 6 additions & 6 deletions Makefile
Expand Up @@ -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 \
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 $@
Expand Down
96 changes: 1 addition & 95 deletions cache.h
@@ -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>
Expand All @@ -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
Expand Down Expand Up @@ -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);

Expand All @@ -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;
Expand Down Expand Up @@ -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 *);
Expand All @@ -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 changes: 1 addition & 1 deletion compat/mmap.c
Expand Up @@ -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)
{
Expand Down
3 changes: 1 addition & 2 deletions compat/strcasestr.c
@@ -1,5 +1,4 @@
#include <string.h>
#include <ctype.h>
#include "../git-compat-util.h"

char *gitstrcasestr(const char *haystack, const char *needle)
{
Expand Down
113 changes: 113 additions & 0 deletions git-compat-util.h
@@ -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 changes: 6 additions & 9 deletions git.c
Expand Up @@ -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 ]";

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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]);
}
Expand Down Expand Up @@ -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));
Expand Down
4 changes: 0 additions & 4 deletions mailinfo.c
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion usage.c
Expand Up @@ -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)
{
Expand Down

0 comments on commit 4050c0d

Please sign in to comment.