ReactOS  0.4.15-dev-484-g89e716a7
movebytes.c
Go to the documentation of this file.
1 /* @(#)movebytes.c 1.18 09/10/17 Copyright 1985, 1989, 1995-2009 J. Schilling */
2 /*
3  * move data
4  *
5  * Copyright (c) 1985, 1989, 1995-2009 J. Schilling
6  */
7 /*
8  * The contents of this file are subject to the terms of the
9  * Common Development and Distribution License, Version 1.0 only
10  * (the "License"). You may not use this file except in compliance
11  * with the License.
12  *
13  * See the file CDDL.Schily.txt in this distribution for details.
14  *
15  * When distributing Covered Code, include this CDDL HEADER in each
16  * file and include the License file CDDL.Schily.txt from this distribution.
17  */
18 
19 #include <schily/standard.h>
20 #include <schily/align.h>
21 #include <schily/types.h>
22 #include <schily/schily.h>
23 
24 #define DO8(a) a; a; a; a; a; a; a; a;
25 
26 /*
27  * movebytes(from, to, cnt) is the same as memmove(to, from, cnt)
28  */
29 EXPORT char *
30 movebytes(fromv, tov, cnt)
31  const void *fromv;
32  void *tov;
33  ssize_t cnt;
34 {
35  register const char *from = fromv;
36  register char *to = tov;
37  register ssize_t n;
38 
39  /*
40  * If we change cnt to be unsigned, check for == instead of <=
41  */
42  if ((n = cnt) <= 0)
43  return (to);
44 
45  if (from >= to) {
46  /*
47  * source is on higher addresses than destination:
48  * move bytes forwards
49  */
50  if (n >= (ssize_t)(8 * sizeof (long))) {
51  if (l2aligned(from, to)) {
52  register const long *froml = (const long *)from;
53  register long *tol = (long *)to;
54  register ssize_t rem = n % (8 * sizeof (long));
55 
56  n /= (8 * sizeof (long));
57  do {
58  DO8 (*tol++ = *froml++);
59  } while (--n > 0);
60 
61  from = (const char *)froml;
62  to = (char *)tol;
63  n = rem;
64  }
65 
66  if (n >= 8) {
67  n -= 8;
68  do {
69  DO8 (*to++ = *from++);
70  } while ((n -= 8) >= 0);
71  n += 8;
72  }
73 
74  if (n > 0) do {
75  *to++ = *from++;
76  } while (--n > 0);
77  return (to);
78  }
79  if (n > 0) do {
80  *to++ = *from++;
81  } while (--n > 0);
82  return (to);
83  } else {
84  char *ep;
85 
86  /*
87  * source is on lower addresses than destination:
88  * move bytes backwards
89  */
90  to += n;
91  from += n;
92  ep = to;
93  if (n >= (ssize_t)(8 * sizeof (long))) {
94  if (l2aligned(from, to)) {
95  register const long *froml = (const long *)from;
96  register long *tol = (long *)to;
97  register ssize_t rem = n % (8 * sizeof (long));
98 
99  n /= (8 * sizeof (long));
100  do {
101  DO8 (*--tol = *--froml);
102  } while (--n > 0);
103 
104  from = (const char *)froml;
105  to = (char *)tol;
106  n = rem;
107  }
108  if (n >= 8) {
109  n -= 8;
110  do {
111  DO8 (*--to = *--from);
112  } while ((n -= 8) >= 0);
113  n += 8;
114  }
115  if (n > 0) do {
116  *--to = *--from;
117  } while (--n > 0);
118  return (ep);
119  }
120  if (n > 0) do {
121  *--to = *--from;
122  } while (--n > 0);
123  return (ep);
124  }
125 }
GLdouble n
Definition: glext.h:7729
#define l2aligned(a, b)
Definition: align.h:20
int ssize_t
Definition: rosdhcp.h:48
#define long
Definition: qsort.c:33
EXPORT char * movebytes(void *fromv, void *tov, ssize_t cnt) const
Definition: movebytes.c:30
#define DO8(a)
Definition: movebytes.c:24
CardRegion * from
Definition: spigame.cpp:19