diff options
Diffstat (limited to 'newlib/libc/string/swab.c')
-rw-r--r-- | newlib/libc/string/swab.c | 44 |
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. */ +} |