Cleanup
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / string.c
1 /*
2  * AcessOS Basic C Library
3  * string.c
4  */
5 #include <acess/sys.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include "lib.h"
9
10 /**
11  * \fn EXPORT int strcmp(const char *s1, const char *s2)
12  * \brief Compare two strings
13  */
14 EXPORT int strcmp(const char *s1, const char *s2)
15 {
16         while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
17                 s1++; s2++;
18         }
19         return (int)*s1 - (int)*s2;
20 }
21
22 /**
23  * \fn EXPORT char *strcpy(char *dst, const char *src)
24  * \brief Copy a string to another
25  */
26 EXPORT char *strcpy(char *dst, const char *src)
27 {
28         char *_dst = dst;
29         while(*src) {
30                 *dst = *src;
31                 src++; dst++;
32         }
33         *dst = '\0';
34         return _dst;
35 }
36
37 /**
38  * \fn EXPORT int strlen(const char *str)
39  * \brief Get the length of a string
40  */
41 EXPORT int strlen(const char *str)
42 {
43         int retval;
44         for(retval = 0; *str != '\0'; str++)
45                 retval++;
46         return retval;
47 }
48
49 /**
50  * \fn EXPORT int strncmp(const char *s1, const char *s2, size_t len)
51  * \brief Compare two strings with a limit
52  */
53 EXPORT int strncmp(const char *s1, const char *s2, size_t len)
54 {
55         while(--len && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
56                 s1++; s2++;
57         }
58         return (int)*s1 - (int)*s2;
59 }
60
61 /**
62  * \fn EXPORT char *strdup(const char *str)
63  * \brief Duplicate a string using heap memory
64  * \note Defined in POSIX Spec, not C spec
65  */
66 EXPORT char *strdup(const char *str)
67 {
68         size_t  len = strlen(str);
69         char    *ret = malloc(len+1);
70         if(ret == NULL) return NULL;
71         strcpy(ret, str);
72         return ret;
73 }
74
75 // --- Memory ---
76 /**
77  * \fn EXPORT void *memset(void *dest, int val, size_t num)
78  * \brief Clear memory with the specified value
79  */
80 EXPORT void *memset(void *dest, int val, size_t num)
81 {
82         unsigned char *p = dest;
83         while(num--)    *p++ = val;
84         return dest;
85 }
86
87 /**
88  * \fn EXPORT void *memcpy(void *dest, const void *src, size_t count)
89  * \brief Copy one memory area to another
90  */
91 EXPORT void *memcpy(void *dest, const void *src, size_t count)
92 {
93     char *sp = (char *)src;
94     char *dp = (char *)dest;
95     for(;count--;) *dp++ = *sp++;
96     return dest;
97 }
98
99 /**
100  * \fn EXPORT void *memmove(void *dest, const void *src, size_t count)
101  * \brief Copy data in memory, avoiding overlap problems
102  */
103 EXPORT void *memmove(void *dest, const void *src, size_t count)
104 {
105     char *sp = (char *)src;
106     char *dp = (char *)dest;
107         // Check if corruption will happen
108         if( (unsigned int)dest > (unsigned int)src && (unsigned int)dest < (unsigned int)src+count )
109                 for(;count--;) dp[count] = sp[count];
110         else
111         for(;count--;) *dp++ = *sp++;
112     return dest;
113 }

UCC git Repository :: git.ucc.asn.au