X-Git-Url: http://cgit.sxemacs.org/?a=blobdiff_plain;f=src%2Fsysdep.h;h=f34b9446d37fa5ad69f3e1568a4aecf993ce83c8;hb=56c8b099ccef8240d76c6f88c3f31d86ae22cfba;hp=7b8fd87a1856a89ddb3742afc05f22877bdd6df5;hpb=bd9104762599054a720f693071729923747f669c;p=sxemacs diff --git a/src/sysdep.h b/src/sysdep.h index 7b8fd87..f34b944 100644 --- a/src/sysdep.h +++ b/src/sysdep.h @@ -177,73 +177,10 @@ extern int h_errno; char *xrealpath(const char *path, char restrict resolved_path[]); #endif -extern_inline size_t xmin_size_t(size_t a, size_t b); extern_inline void x__dirname(char *restrict res, const char *file, size_t len); extern_inline size_t x__dirlen(const char *file, size_t len); extern_inline char *xdirname(const char *file); - -/* str funs */ -/* thought these were defined already :O */ -#define xstrlen strlen -#define xstrcmp strcmp -#define xstrcat strcat -#define xstrncmp strncmp -#define xstrncat strncat - -extern_inline char* -xstrncpy(char* target, const char*source, size_t len) -{ - *target ='\0'; - strncat(target,source,len-1); -} - -#if defined HAVE_STPCPY -# define xstpcpy stpcpy -#else -extern_inline char* -xstpcpy(char *target, const char *source) - __attribute__((always_inline)); -extern_inline char* -xstpcpy(char *target, const char *source) -{ - char *p = target; - size_t len = xstrlen(source); - - strcpy(target, source); - p += len; - return p; -} -#endif /* !HAVE_STPCPY */ -#if defined HAVE_STPNCPY -# define xstpncpy stpncpy -#else -extern_inline char* -xstpncpy(char *target, const char *source, size_t len) - __attribute__((always_inline)); -extern_inline char* -xstpncpy(char *target, const char *source, size_t len) -{ - char *p = target; - xstrncpy(target, source, len); - p += len; - return p; -} -#endif /* !HAVE_STPNCPY */ - -#define xmemcmp memcmp -#define xmemcpy memcpy - -extern_inline size_t -xmin_size_t(size_t a, size_t b) -{ - if (a < b) { - return a; - } else { - return b; - } -} - /* big dirname magic, some of it stolen from dirname.c from coreutils 6.9 */ /* POSIX says: @@ -264,6 +201,9 @@ xmin_size_t(size_t a, size_t b) #define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) #endif +extern_inline size_t +x__dirlen(const char *file, size_t len) + __attribute__((always_inline)); extern_inline size_t x__dirlen(const char *file, size_t len) { @@ -280,42 +220,37 @@ x__dirlen(const char *file, size_t len) return len; } -#if defined(HAVE_DIRNAME) && defined(DIRNAME_SIDE_EFFECT) extern_inline void x__dirname(char *restrict res, const char *file, size_t len) -{ - /* assumes res is malloc'd of size LEN */ - xstrncpy(res, file, len); - dirname(res); - return; -} -#elif defined(HAVE_DIRNAME) && !defined(DIRNAME_ACCEPTS_PROTMEM) -extern_inline void -x__dirname(char *restrict res, const char *file, size_t len) -{ - /* assumes res is malloc'd of size LEN */ - char *result; - xstrncpy(res, file, len); - /* if we were using side effects we woulda matched the above cond */ - result = dirname(res); - xstrncpy(res, result, xmin_size_t(len, xstrlen(result))); - return; -} -#elif defined(HAVE_DIRNAME) + __attribute__((always_inline)); +#if defined(HAVE_DIRNAME) extern_inline void x__dirname(char *restrict res, const char *file, size_t len) { - /* assumes res is malloc'd of size LEN */ - char *result = dirname(res); - xstrncpy(res, result, xmin_size_t(len, xstrlen(result))); - return; + /* assumes res is malloc'd of size LEN */ + char *result; + xstrncpy(res, file, len); + result = dirname(res); + if (res == result) { + return; + } + if (result < res || result >= (res+len)) { + xstrncpy(res, result, len); + } else { + /* Use memmove if result overlaps res */ + memmove(res, result, strlen(result)+1); + } + return; } #endif +extern_inline char* +xdirname(const char *file) + __attribute__((always_inline)); extern_inline char* xdirname(const char *file) { - size_t len = xstrlen(file); + size_t len = xstrlen(file)+1; char *res = xmalloc_atomic(len); x__dirname(res, file, len);