summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortedu <>2014-12-11 23:05:38 +0000
committertedu <>2014-12-11 23:05:38 +0000
commita810d50157a5aade6b309b589d822250908867fd (patch)
tree65e0c01132a1950f3bf1ea49a4acf01d3479646a /src
parent47eb97a22f4397f7e4d7b37419d4c88e805cf71b (diff)
downloadopenbsd-a810d50157a5aade6b309b589d822250908867fd.tar.gz
openbsd-a810d50157a5aade6b309b589d822250908867fd.tar.bz2
openbsd-a810d50157a5aade6b309b589d822250908867fd.zip
update swab() to match the current posix definition. "rationale: none."
rewrite the function to be simpler as well. the compiler can unroll the loop for us if necessary. ok schwarze
Diffstat (limited to 'src')
-rw-r--r--src/lib/libc/string/swab.c74
1 files changed, 24 insertions, 50 deletions
diff --git a/src/lib/libc/string/swab.c b/src/lib/libc/string/swab.c
index b74db7e62a..c7d7d72ce0 100644
--- a/src/lib/libc/string/swab.c
+++ b/src/lib/libc/string/swab.c
@@ -1,61 +1,35 @@
1/* $OpenBSD: swab.c,v 1.8 2008/03/15 21:54:09 ray Exp $ */ 1/* $OpenBSD: swab.c,v 1.9 2014/12/11 23:05:38 tedu Exp $ */
2/* 2/*
3 * Copyright (c) 1988 Regents of the University of California. 3 * Copyright (c) 2014 Ted Unangst <tedu@openbsd.org>
4 * All rights reserved.
5 * 4 *
6 * This code is derived from software contributed to Berkeley by 5 * Permission to use, copy, modify, and distribute this software for any
7 * Jeffrey Mogul. 6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 * 8 *
9 * Redistribution and use in source and binary forms, with or without 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * modification, are permitted provided that the following conditions 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * are met: 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * 1. Redistributions of source code must retain the above copyright 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * notice, this list of conditions and the following disclaimer. 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * 2. Redistributions in binary form must reproduce the above copyright 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * notice, this list of conditions and the following disclaimer in the 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */ 16 */
33
34#include <unistd.h> 17#include <unistd.h>
35 18
36void 19void
37swab(const void *from, void *to, size_t len) 20swab(const void *__restrict from, void *__restrict to, ssize_t len)
38{ 21{
39 size_t n; 22 const unsigned char *src = from;
40 char *fp, *tp; 23 unsigned char *dst = to;
41 char temp; 24 unsigned char t0, t1;
42 25
43 n = (len / 2) + 1; 26 while (len > 1) {
44 fp = (char *)from; 27 t0 = src[0];
45 tp = (char *)to; 28 t1 = src[1];
46#define STEP do { \ 29 dst[0] = t1;
47 temp = *fp++; \ 30 dst[1] = t0;
48 *tp++ = *fp++; \ 31 src += 2;
49 *tp++ = temp; \ 32 dst += 2;
50} while (0) 33 len -= 2;
51 /* round to multiple of 8 */
52 while ((--n) & 07)
53 STEP;
54 n >>= 3;
55 if (n == 0)
56 return;
57 while (n-- != 0) {
58 STEP; STEP; STEP; STEP;
59 STEP; STEP; STEP; STEP;
60 } 34 }
61} 35}