git-compat-util.hon commit Merge fixes up to GIT 1.0.4 (2414721)
   1#ifndef GIT_COMPAT_UTIL_H
   2#define GIT_COMPAT_UTIL_H
   3
   4#include <unistd.h>
   5#include <stdio.h>
   6#include <sys/stat.h>
   7#include <fcntl.h>
   8#include <stddef.h>
   9#include <stdlib.h>
  10#include <stdarg.h>
  11#include <string.h>
  12#include <errno.h>
  13#include <limits.h>
  14#include <sys/param.h>
  15#include <netinet/in.h>
  16#include <sys/types.h>
  17#include <dirent.h>
  18
  19#ifdef __GNUC__
  20#define NORETURN __attribute__((__noreturn__))
  21#else
  22#define NORETURN
  23#ifndef __attribute__
  24#define __attribute__(x)
  25#endif
  26#endif
  27
  28/* General helper functions */
  29extern void usage(const char *err) NORETURN;
  30extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
  31extern int error(const char *err, ...) __attribute__((format (printf, 1, 2)));
  32
  33#ifdef NO_MMAP
  34
  35#ifndef PROT_READ
  36#define PROT_READ 1
  37#define PROT_WRITE 2
  38#define MAP_PRIVATE 1
  39#define MAP_FAILED ((void*)-1)
  40#endif
  41
  42#define mmap gitfakemmap
  43#define munmap gitfakemunmap
  44extern void *gitfakemmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
  45extern int gitfakemunmap(void *start, size_t length);
  46
  47#else /* NO_MMAP */
  48
  49#include <sys/mman.h>
  50
  51#endif /* NO_MMAP */
  52
  53#ifdef NO_SETENV
  54#define setenv gitsetenv
  55extern int gitsetenv(const char *, const char *, int);
  56#endif
  57
  58#ifdef NO_STRCASESTR
  59#define strcasestr gitstrcasestr
  60extern char *gitstrcasestr(const char *haystack, const char *needle);
  61#endif
  62
  63static inline void *xmalloc(size_t size)
  64{
  65        void *ret = malloc(size);
  66        if (!ret)
  67                die("Out of memory, malloc failed");
  68        return ret;
  69}
  70
  71static inline void *xrealloc(void *ptr, size_t size)
  72{
  73        void *ret = realloc(ptr, size);
  74        if (!ret)
  75                die("Out of memory, realloc failed");
  76        return ret;
  77}
  78
  79static inline void *xcalloc(size_t nmemb, size_t size)
  80{
  81        void *ret = calloc(nmemb, size);
  82        if (!ret)
  83                die("Out of memory, calloc failed");
  84        return ret;
  85}
  86
  87static inline ssize_t xread(int fd, void *buf, size_t len)
  88{
  89        ssize_t nr;
  90        while (1) {
  91                nr = read(fd, buf, len);
  92                if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
  93                        continue;
  94                return nr;
  95        }
  96}
  97
  98static inline ssize_t xwrite(int fd, const void *buf, size_t len)
  99{
 100        ssize_t nr;
 101        while (1) {
 102                nr = write(fd, buf, len);
 103                if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
 104                        continue;
 105                return nr;
 106        }
 107}
 108
 109/* Sane ctype - no locale, and works with signed chars */
 110#undef isspace
 111#undef isdigit
 112#undef isalpha
 113#undef isalnum
 114#undef tolower
 115#undef toupper
 116extern unsigned char sane_ctype[256];
 117#define GIT_SPACE 0x01
 118#define GIT_DIGIT 0x02
 119#define GIT_ALPHA 0x04
 120#define sane_istest(x,mask) ((sane_ctype[(unsigned char)(x)] & (mask)) != 0)
 121#define isspace(x) sane_istest(x,GIT_SPACE)
 122#define isdigit(x) sane_istest(x,GIT_DIGIT)
 123#define isalpha(x) sane_istest(x,GIT_ALPHA)
 124#define isalnum(x) sane_istest(x,GIT_ALPHA | GIT_DIGIT)
 125#define tolower(x) sane_case((unsigned char)(x), 0x20)
 126#define toupper(x) sane_case((unsigned char)(x), 0)
 127
 128static inline int sane_case(int x, int high)
 129{
 130        if (sane_istest(x, GIT_ALPHA))
 131                x = (x & ~0x20) | high;
 132        return x;
 133}
 134
 135#ifndef MAXPATHLEN
 136#define MAXPATHLEN 256
 137#endif
 138#endif