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>
This commit is contained in:
12
Makefile
12
Makefile
@ -162,7 +162,7 @@ LIB_FILE=libgit.a
|
|||||||
LIB_H = \
|
LIB_H = \
|
||||||
blob.h cache.h commit.h count-delta.h csum-file.h delta.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 \
|
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_OBJS = \
|
||||||
diff.o diffcore-break.o diffcore-order.o diffcore-pathspec.o \
|
diff.o diffcore-break.o diffcore-order.o diffcore-pathspec.o \
|
||||||
@ -320,15 +320,15 @@ ifdef NEEDS_NSL
|
|||||||
SIMPLE_LIB += -lnsl
|
SIMPLE_LIB += -lnsl
|
||||||
endif
|
endif
|
||||||
ifdef NO_STRCASESTR
|
ifdef NO_STRCASESTR
|
||||||
COMPAT_CFLAGS += -Dstrcasestr=gitstrcasestr -DNO_STRCASESTR=1
|
COMPAT_CFLAGS += -DNO_STRCASESTR
|
||||||
COMPAT_OBJS += compat/strcasestr.o
|
COMPAT_OBJS += compat/strcasestr.o
|
||||||
endif
|
endif
|
||||||
ifdef NO_SETENV
|
ifdef NO_SETENV
|
||||||
COMPAT_CFLAGS += -Dsetenv=gitsetenv -DNO_SETENV=1
|
COMPAT_CFLAGS += -DNO_SETENV
|
||||||
COMPAT_OBJS += compat/setenv.o
|
COMPAT_OBJS += compat/setenv.o
|
||||||
endif
|
endif
|
||||||
ifdef NO_MMAP
|
ifdef NO_MMAP
|
||||||
COMPAT_CFLAGS += -Dmmap=gitfakemmap -Dmunmap=gitfakemunmap -DNO_MMAP
|
COMPAT_CFLAGS += -DNO_MMAP
|
||||||
COMPAT_OBJS += compat/mmap.o
|
COMPAT_OBJS += compat/mmap.o
|
||||||
endif
|
endif
|
||||||
ifdef NO_IPV6
|
ifdef NO_IPV6
|
||||||
@ -363,9 +363,9 @@ all: $(ALL_PROGRAMS)
|
|||||||
all:
|
all:
|
||||||
$(MAKE) -C templates
|
$(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)"' \
|
$(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
|
$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
|
||||||
rm -f $@
|
rm -f $@
|
||||||
|
96
cache.h
96
cache.h
@ -1,23 +1,7 @@
|
|||||||
#ifndef CACHE_H
|
#ifndef CACHE_H
|
||||||
#define CACHE_H
|
#define CACHE_H
|
||||||
|
|
||||||
#include <unistd.h>
|
#include "git-compat-util.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 SHA1_HEADER
|
#include SHA1_HEADER
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
@ -36,15 +20,6 @@
|
|||||||
#define DTYPE(de) DT_UNKNOWN
|
#define DTYPE(de) DT_UNKNOWN
|
||||||
#endif
|
#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
|
* Intensive research over the course of many years has shown that
|
||||||
* port 9418 is totally unused by anything else. Or
|
* 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);
|
|||||||
extern int create_symref(const char *git_HEAD, const char *refs_heads_master);
|
extern int create_symref(const char *git_HEAD, const char *refs_heads_master);
|
||||||
extern int validate_symref(const char *git_HEAD);
|
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 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);
|
extern int cache_name_compare(const char *name1, int len1, const char *name2, int len2);
|
||||||
|
|
||||||
@ -272,30 +242,6 @@ extern int setup_ident(void);
|
|||||||
extern const char *git_author_info(void);
|
extern const char *git_author_info(void);
|
||||||
extern const char *git_committer_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 {
|
struct checkout {
|
||||||
const char *base_dir;
|
const char *base_dir;
|
||||||
int base_dir_len;
|
int base_dir_len;
|
||||||
@ -373,20 +319,6 @@ extern void packed_object_info_detail(struct pack_entry *, char *, unsigned long
|
|||||||
/* Dumb servers support */
|
/* Dumb servers support */
|
||||||
extern int update_server_info(int);
|
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 *);
|
typedef int (*config_fn_t)(const char *, const char *);
|
||||||
extern int git_default_config(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 *);
|
extern int git_config_from_file(config_fn_t fn, const char *);
|
||||||
@ -404,31 +336,5 @@ extern char git_default_name[MAX_GITNAME];
|
|||||||
#define MAX_ENCODING_LENGTH 64
|
#define MAX_ENCODING_LENGTH 64
|
||||||
extern char git_commit_encoding[MAX_ENCODING_LENGTH];
|
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);
|
extern int copy_fd(int ifd, int ofd);
|
||||||
#endif /* CACHE_H */
|
#endif /* CACHE_H */
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.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)
|
void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset)
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#include <string.h>
|
#include "../git-compat-util.h"
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
char *gitstrcasestr(const char *haystack, const char *needle)
|
char *gitstrcasestr(const char *haystack, const char *needle)
|
||||||
{
|
{
|
||||||
|
113
git-compat-util.h
Normal file
113
git-compat-util.h
Normal file
@ -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
15
git.c
@ -8,15 +8,12 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include "git-compat-util.h"
|
||||||
|
|
||||||
#ifndef PATH_MAX
|
#ifndef PATH_MAX
|
||||||
# define PATH_MAX 4096
|
# define PATH_MAX 4096
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NO_SETENV
|
|
||||||
extern int gitsetenv(const char *, const char *, int);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static const char git_usage[] =
|
static const char git_usage[] =
|
||||||
"Usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--help] COMMAND [ ARGS ]";
|
"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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#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__));
|
__attribute__((__format__(__printf__, 2, 3), __noreturn__));
|
||||||
#endif
|
#endif
|
||||||
static void usage(const char *exec_path, const char *fmt, ...)
|
static void cmd_usage(const char *exec_path, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
if (fmt) {
|
if (fmt) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -254,12 +251,12 @@ int main(int argc, char **argv, char **envp)
|
|||||||
else if (!strcmp(arg, "help"))
|
else if (!strcmp(arg, "help"))
|
||||||
show_help = 1;
|
show_help = 1;
|
||||||
else if (!show_help)
|
else if (!show_help)
|
||||||
usage(NULL, NULL);
|
cmd_usage(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i >= argc || show_help) {
|
if (i >= argc || show_help) {
|
||||||
if (i >= argc)
|
if (i >= argc)
|
||||||
usage(exec_path, NULL);
|
cmd_usage(exec_path, NULL);
|
||||||
|
|
||||||
show_man_page(argv[i]);
|
show_man_page(argv[i]);
|
||||||
}
|
}
|
||||||
@ -297,7 +294,7 @@ int main(int argc, char **argv, char **envp)
|
|||||||
execve(git_command, &argv[i], envp);
|
execve(git_command, &argv[i], envp);
|
||||||
|
|
||||||
if (errno == ENOENT)
|
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",
|
fprintf(stderr, "Failed to run command '%s': %s\n",
|
||||||
git_command, strerror(errno));
|
git_command, strerror(errno));
|
||||||
|
@ -10,10 +10,6 @@
|
|||||||
#include <iconv.h>
|
#include <iconv.h>
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
|
||||||
#ifdef NO_STRCASESTR
|
|
||||||
extern char *gitstrcasestr(const char *haystack, const char *needle);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static FILE *cmitmsg, *patchfile;
|
static FILE *cmitmsg, *patchfile;
|
||||||
|
|
||||||
static int keep_subject = 0;
|
static int keep_subject = 0;
|
||||||
|
2
usage.c
2
usage.c
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (C) Linus Torvalds, 2005
|
* 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)
|
static void report(const char *prefix, const char *err, va_list params)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user