source: mainline/kernel/generic/src/lib/memstr.c@ ac02aaa

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since ac02aaa was 9f3363e, checked in by Jakub Jermar <jakub@…>, 17 years ago

cstyle

  • Property mode set to 100644
File size: 4.0 KB
Line 
1/*
2 * Copyright (c) 2001-2004 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup generic
30 * @{
31 */
32
33/**
34 * @file
35 * @brief Memory string operations.
36 *
37 * This file provides architecture independent functions to manipulate blocks of
38 * memory. These functions are optimized as much as generic functions of this
39 * type can be. However, architectures are free to provide even more optimized
40 * versions of these functions.
41 */
42
43#include <memstr.h>
44#include <arch/types.h>
45#include <align.h>
46
47/** Copy block of memory.
48 *
49 * Copy cnt bytes from src address to dst address. The copying is done
50 * word-by-word and then byte-by-byte. The source and destination memory areas
51 * cannot overlap.
52 *
53 * @param src Source address to copy from.
54 * @param dst Destination address to copy to.
55 * @param cnt Number of bytes to copy.
56 *
57 * @return Destination address.
58 */
59void *_memcpy(void *dst, const void *src, size_t cnt)
60{
61 unsigned int i, j;
62
63 if (ALIGN_UP((uintptr_t) src, sizeof(unative_t)) != (uintptr_t) src ||
64 ALIGN_UP((uintptr_t) dst, sizeof(unative_t)) != (uintptr_t) dst) {
65 for (i = 0; i < cnt; i++)
66 ((uint8_t *) dst)[i] = ((uint8_t *) src)[i];
67 } else {
68 for (i = 0; i < cnt / sizeof(unative_t); i++)
69 ((unative_t *) dst)[i] = ((unative_t *) src)[i];
70
71 for (j = 0; j < cnt % sizeof(unative_t); j++)
72 ((uint8_t *)(((unative_t *) dst) + i))[j] =
73 ((uint8_t *)(((unative_t *) src) + i))[j];
74 }
75
76 return (char *) dst;
77}
78
79/** Fill block of memory
80 *
81 * Fill cnt bytes at dst address with the value x. The filling is done
82 * byte-by-byte.
83 *
84 * @param dst Destination address to fill.
85 * @param cnt Number of bytes to fill.
86 * @param x Value to fill.
87 *
88 */
89void _memsetb(void *dst, size_t cnt, uint8_t x)
90{
91 unsigned int i;
92 uint8_t *p = (uint8_t *) dst;
93
94 for (i = 0; i < cnt; i++)
95 p[i] = x;
96}
97
98/** Fill block of memory.
99 *
100 * Fill cnt words at dst address with the value x. The filling is done
101 * word-by-word.
102 *
103 * @param dst Destination address to fill.
104 * @param cnt Number of words to fill.
105 * @param x Value to fill.
106 *
107 */
108void _memsetw(void *dst, size_t cnt, uint16_t x)
109{
110 unsigned int i;
111 uint16_t *p = (uint16_t *) dst;
112
113 for (i = 0; i < cnt; i++)
114 p[i] = x;
115}
116
117/** Copy string.
118 *
119 * Copy string from src address to dst address. The copying is done
120 * char-by-char until the null character. The source and destination memory
121 * areas cannot overlap.
122 *
123 * @param src Source string to copy from.
124 * @param dst Destination string to copy to.
125 *
126 * @return Address of the destination string.
127 */
128char *strcpy(char *dest, const char *src)
129{
130 char *orig = dest;
131
132 while ((*(dest++) = *(src++)))
133 ;
134 return orig;
135}
136
137/** @}
138 */
Note: See TracBrowser for help on using the repository browser.