summaryrefslogtreecommitdiffstats
path: root/newlib/libc/string/swab.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/string/swab.c')
-rw-r--r--newlib/libc/string/swab.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/newlib/libc/string/swab.c b/newlib/libc/string/swab.c
new file mode 100644
index 000000000..710ec5161
--- /dev/null
+++ b/newlib/libc/string/swab.c
@@ -0,0 +1,44 @@
+/*
+FUNCTION
+ <<swab>>---swap adjacent bytes
+
+ANSI_SYNOPSIS
+ #include <string.h>
+ void swab(const void *<[in]>, void *<[out]>, size_t <[n]>);
+
+TRAD_SYNOPSIS
+ void swab(<[in]>, <[out]>, <[n]>
+ void *<[in]>;
+ void *<[out]>;
+ size_t <[n]>;
+
+DESCRIPTION
+ This function copies <[n]> bytes from the memory region
+ pointed to by <[in]> to the memory region pointed to by
+ <[out]>, exchanging adjacent even and odd bytes.
+
+PORTABILITY
+<<swab>> requires no supporting OS subroutines.
+*/
+
+#include <string.h>
+
+void
+_DEFUN (swab, (b1, b2, length),
+ _CONST void *b1 _AND
+ void *b2 _AND
+ ssize_t length)
+{
+ const char *from = b1;
+ char *to = b2;
+ ssize_t ptr;
+ for (ptr = 1; ptr < length; ptr += 2)
+ {
+ char p = from[ptr];
+ char q = from[ptr-1];
+ to[ptr-1] = p;
+ to[ptr ] = q;
+ }
+ if (ptr == length) /* I.e., if length is odd, */
+ to[ptr-1] = 0; /* then pad with a NUL. */
+}