* Copyright (C) 2008 Sebastian Freundt
* Copyright (C) 1985, 1993, 1994 Free Software Foundation, Inc.
*
- *
+ *
* This file is part of SXEmacs
- *
+ *
* SXEmacs is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
- *
+ *
* SXEmacs is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
void stop_interrupts(void);
void start_interrupts(void);
+void stop_async_timeouts(void);
+void start_async_timeouts(void);
void slow_down_interrupts(void);
void speed_up_interrupts(void);
void init_poll_for_quit(void);
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);
-\f
-/* str funs */
-/* thought these were defined already :O */
-#define xstrlen strlen
-#define xstrcmp strcmp
-#define xstrcat strcat
-#define xstrncmp strncmp
-#define xstrncpy strncpy
-#define xstrncat strncat
-#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;
- strncpy(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;
- }
-}
-
\f
/* big dirname magic, some of it stolen from dirname.c from coreutils 6.9 */
/* POSIX says:
#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)
{
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);