path: root/mcon/U/d_mempcpy.U
diff options
Diffstat (limited to 'mcon/U/d_mempcpy.U')
1 files changed, 51 insertions, 0 deletions
diff --git a/mcon/U/d_mempcpy.U b/mcon/U/d_mempcpy.U
new file mode 100644
index 0000000..63ccf51
--- /dev/null
+++ b/mcon/U/d_mempcpy.U
@@ -0,0 +1,51 @@
+?RCS: Copyright (c) 2012 Raphael Manfredi
+?RCS: You may redistribute only under the terms of the Artistic License,
+?RCS: as specified in the README file that comes with the distribution.
+?RCS: You may reuse parts of this distribution only within the terms of
+?RCS: that same Artistic License; a copy of which may be found at the root
+?RCS: of the source tree for dist 4.0.
+?MAKE:d_mempcpy: Trylink cat
+?MAKE: -pick add $@ %<
+?S: This variable conditionally defines the HAS_MEMPCPY symbol, which
+?S: indicates to the C program that the mempcpy() routine is available
+?S: to copy blocks of memory and returns a pointer past the last written
+?S: byte.
+?C: This symbol, if defined, indicates that the mempcpy routine is available
+?C: to copy blocks of memory, returning a pointer past the last written byte.
+?H:#$d_mempcpy HAS_MEMPCPY /**/
+?LINT:set d_mempcpy
+: see if mempcpy exists
+?X: Need some extra code convolutions to avoid gcc's optimizing the mempcpy()
+?X: call with its built-in implementation.
+$cat >try.c <<EOC
+#include <string.h>
+void *copy(void *d, const void *s, unsigned n)
+ char *q = d;
+ const char *r = s;
+ return mempcpy(q + 4, r + 2, n - 1);
+int main(void)
+ static char src, dst;
+ void *p;
+ p = copy(&dst, &src, sizeof(dst));
+ return p ? 0 : 1;
+set d_mempcpy
+eval $trylink