Merge branch 'es/st-add4-gcc-4.2-workaround' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 21 Mar 2016 16:19:27 +0000 (09:19 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 21 Mar 2016 16:19:27 +0000 (09:19 -0700)
* es/st-add4-gcc-4.2-workaround:
git-compat-util: st_add4: work around gcc 4.2.x compiler crash

1  2 
git-compat-util.h
diff --combined git-compat-util.h
index c07e0c177890639cf016eac9766d04f235dbfbcf,6d304613ff1faa8b65567438227376ad383ead30..474395471f623d6a02de9814a5490f3b1df3a0f1
  #elif defined(_MSC_VER)
  #include "compat/msvc.h"
  #else
 +#include <sys/utsname.h>
  #include <sys/wait.h>
  #include <sys/resource.h>
  #include <sys/socket.h>
@@@ -237,7 -236,7 +237,7 @@@ typedef unsigned long uintptr_t
  #else
  #define precompose_str(in,i_nfd2nfc)
  #define precompose_argv(c,v)
 -#define probe_utf8_pathname_composition(a,b)
 +#define probe_utf8_pathname_composition()
  #endif
  
  #ifdef MKDIR_WO_TRAILING_SLASH
@@@ -261,8 -260,6 +261,8 @@@ struct itimerval 
  #else
  #define basename gitbasename
  extern char *gitbasename(char *);
 +#define dirname gitdirname
 +extern char *gitdirname(char *);
  #endif
  
  #ifndef NO_ICONV
  #define PRIuMAX "llu"
  #endif
  
 +#ifndef SCNuMAX
 +#define SCNuMAX PRIuMAX
 +#endif
 +
  #ifndef PRIu32
  #define PRIu32 "u"
  #endif
  #define _PATH_DEFPATH "/usr/local/bin:/usr/bin:/bin"
  #endif
  
 -#ifndef STRIP_EXTENSION
 -#define STRIP_EXTENSION ""
 -#endif
 -
  #ifndef has_dos_drive_prefix
  static inline int git_has_dos_drive_prefix(const char *path)
  {
  #define has_dos_drive_prefix git_has_dos_drive_prefix
  #endif
  
 +#ifndef skip_dos_drive_prefix
 +static inline int git_skip_dos_drive_prefix(char **path)
 +{
 +      return 0;
 +}
 +#define skip_dos_drive_prefix git_skip_dos_drive_prefix
 +#endif
 +
  #ifndef is_dir_sep
  static inline int git_is_dir_sep(int c)
  {
@@@ -407,6 -396,7 +407,6 @@@ struct strbuf
  
  /* General helper functions */
  extern void vreportf(const char *prefix, const char *err, va_list params);
 -extern void vwritef(int fd, const char *prefix, const char *err, va_list params);
  extern NORETURN void usage(const char *err);
  extern NORETURN void usagef(const char *err, ...) __attribute__((format (printf, 1, 2)));
  extern NORETURN void die(const char *err, ...) __attribute__((format (printf, 1, 2)));
@@@ -442,7 -432,6 +442,7 @@@ static inline int const_error(void
  extern void set_die_routine(NORETURN_PTR void (*routine)(const char *err, va_list params));
  extern void set_error_routine(void (*routine)(const char *err, va_list params));
  extern void set_die_is_recursing_routine(int (*routine)(void));
 +extern void set_error_handle(FILE *);
  
  extern int starts_with(const char *str, const char *prefix);
  
@@@ -586,7 -575,7 +586,7 @@@ extern int git_lstat(const char *, stru
  #endif
  
  #define DEFAULT_PACKED_GIT_LIMIT \
 -      ((1024L * 1024L) * (sizeof(void*) >= 8 ? 8192 : 256))
 +      ((1024L * 1024L) * (size_t)(sizeof(void*) >= 8 ? 8192 : 256))
  
  #ifdef NO_PREAD
  #define pread git_pread
@@@ -677,6 -666,7 +677,6 @@@ extern int git_vsnprintf(char *str, siz
  #ifdef __GLIBC_PREREQ
  #if __GLIBC_PREREQ(2, 1)
  #define HAVE_STRCHRNUL
 -#define HAVE_MEMPCPY
  #endif
  #endif
  
@@@ -690,6 -680,14 +690,6 @@@ static inline char *gitstrchrnul(const 
  }
  #endif
  
 -#ifndef HAVE_MEMPCPY
 -#define mempcpy gitmempcpy
 -static inline void *gitmempcpy(void *dest, const void *src, size_t n)
 -{
 -      return (char *)memcpy(dest, src, n) + n;
 -}
 -#endif
 -
  #ifdef NO_INET_PTON
  int inet_pton(int af, const char *src, void *dst);
  #endif
@@@ -715,8 -713,8 +715,8 @@@ static inline size_t st_add(size_t a, s
                    (uintmax_t)a, (uintmax_t)b);
        return a + b;
  }
- #define st_add3(a,b,c)   st_add((a),st_add((b),(c)))
- #define st_add4(a,b,c,d) st_add((a),st_add3((b),(c),(d)))
+ #define st_add3(a,b,c)   st_add(st_add((a),(b)),(c))
+ #define st_add4(a,b,c,d) st_add(st_add3((a),(b),(c)),(d))
  
  static inline size_t st_mult(size_t a, size_t b)
  {
@@@ -752,84 -750,18 +752,84 @@@ extern void *xrealloc(void *ptr, size_
  extern void *xcalloc(size_t nmemb, size_t size);
  extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
  extern void *xmmap_gently(void *start, size_t length, int prot, int flags, int fd, off_t offset);
 +extern int xopen(const char *path, int flags, ...);
  extern ssize_t xread(int fd, void *buf, size_t len);
  extern ssize_t xwrite(int fd, const void *buf, size_t len);
  extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
  extern int xdup(int fd);
 +extern FILE *xfopen(const char *path, const char *mode);
  extern FILE *xfdopen(int fd, const char *mode);
  extern int xmkstemp(char *template);
  extern int xmkstemp_mode(char *template, int mode);
  extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
  extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
  extern char *xgetcwd(void);
 +extern FILE *fopen_for_writing(const char *path);
  
 -#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), (alloc) * sizeof(*(x)))
 +#define ALLOC_ARRAY(x, alloc) (x) = xmalloc(st_mult(sizeof(*(x)), (alloc)))
 +#define REALLOC_ARRAY(x, alloc) (x) = xrealloc((x), st_mult(sizeof(*(x)), (alloc)))
 +
 +/*
 + * These functions help you allocate structs with flex arrays, and copy
 + * the data directly into the array. For example, if you had:
 + *
 + *   struct foo {
 + *     int bar;
 + *     char name[FLEX_ARRAY];
 + *   };
 + *
 + * you can do:
 + *
 + *   struct foo *f;
 + *   FLEX_ALLOC_MEM(f, name, src, len);
 + *
 + * to allocate a "foo" with the contents of "src" in the "name" field.
 + * The resulting struct is automatically zero'd, and the flex-array field
 + * is NUL-terminated (whether the incoming src buffer was or not).
 + *
 + * The FLEXPTR_* variants operate on structs that don't use flex-arrays,
 + * but do want to store a pointer to some extra data in the same allocated
 + * block. For example, if you have:
 + *
 + *   struct foo {
 + *     char *name;
 + *     int bar;
 + *   };
 + *
 + * you can do:
 + *
 + *   struct foo *f;
 + *   FLEX_ALLOC_STR(f, name, src);
 + *
 + * and "name" will point to a block of memory after the struct, which will be
 + * freed along with the struct (but the pointer can be repointed anywhere).
 + *
 + * The *_STR variants accept a string parameter rather than a ptr/len
 + * combination.
 + *
 + * Note that these macros will evaluate the first parameter multiple
 + * times, and it must be assignable as an lvalue.
 + */
 +#define FLEX_ALLOC_MEM(x, flexname, buf, len) do { \
 +      (x) = NULL; /* silence -Wuninitialized for offset calculation */ \
 +      (x) = xalloc_flex(sizeof(*(x)), (char *)(&((x)->flexname)) - (char *)(x), (buf), (len)); \
 +} while (0)
 +#define FLEXPTR_ALLOC_MEM(x, ptrname, buf, len) do { \
 +      (x) = xalloc_flex(sizeof(*(x)), sizeof(*(x)), (buf), (len)); \
 +      (x)->ptrname = (void *)((x)+1); \
 +} while(0)
 +#define FLEX_ALLOC_STR(x, flexname, str) \
 +      FLEX_ALLOC_MEM((x), flexname, (str), strlen(str))
 +#define FLEXPTR_ALLOC_STR(x, ptrname, str) \
 +      FLEXPTR_ALLOC_MEM((x), ptrname, (str), strlen(str))
 +
 +static inline void *xalloc_flex(size_t base_len, size_t offset,
 +                              const void *src, size_t src_len)
 +{
 +      unsigned char *ret = xcalloc(1, st_add3(base_len, src_len, 1));
 +      memcpy(ret + offset, src, src_len);
 +      return ret;
 +}
  
  static inline char *xstrdup_or_null(const char *str)
  {
@@@ -843,9 -775,6 +843,9 @@@ static inline size_t xsize_t(off_t len
        return (size_t)len;
  }
  
 +__attribute__((format (printf, 3, 4)))
 +extern int xsnprintf(char *dst, size_t max, const char *fmt, ...);
 +
  /* in ctype.c, for kwset users */
  extern const unsigned char tolower_trans_tbl[256];
  
@@@ -916,9 -845,6 +916,9 @@@ static inline int strtoul_ui(char cons
        char *p;
  
        errno = 0;
 +      /* negative values would be accepted by strtoul */
 +      if (strchr(s, '-'))
 +              return -1;
        ul = strtoul(s, &p, base);
        if (errno || *p || p == s || (unsigned int) ul != ul)
                return -1;
@@@ -1024,6 -950,9 +1024,6 @@@ int access_or_die(const char *path, in
  /* Warn on an inaccessible file that ought to be accessible */
  void warn_on_inaccessible(const char *path);
  
 -/* Get the passwd entry for the UID of the current process. */
 -struct passwd *xgetpwuid_self(void);
 -
  #ifdef GMTIME_UNRELIABLE_ERRORS
  struct tm *git_gmtime(const time_t *);
  struct tm *git_gmtime_r(const time_t *, struct tm *);
  # define SHELL_PATH "/bin/sh"
  #endif
  
 +#ifndef _POSIX_THREAD_SAFE_FUNCTIONS
 +#define flockfile(fh)
 +#define funlockfile(fh)
 +#define getc_unlocked(fh) getc(fh)
 +#endif
 +
  #endif