Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / Usermode / Libraries / ld-acess.so_src / lib.c
1 /*
2  AcessOS 1
3  Dynamic Loader
4  By thePowersGang
5 */
6 #include "common.h"
7 #include <stdint.h>
8
9 // === CODE ===
10 char *strcpy(char *dest, const char *src)
11 {
12         char    *ret = dest;
13         while(*src) {
14                 *dest = *src;
15                 src ++; dest ++;
16         }
17         *dest = '\0';
18         return ret;
19 }
20
21 char *strcat(char *dest, const char *src)
22 {
23         char    *ret = dest;
24         while(*dest)    dest++;
25         while(*src)             *dest++ = *src++;
26         *dest = '\0';
27         return ret;
28 }
29
30 /**
31  * \fn int strcmp(const char *s1, const char *s2)
32  * \brief Compare two strings
33  */
34 int strcmp(const char *s1, const char *s2)
35 {
36         while(*s1 && *s1 == *s2) s1++,s2++;
37         return *s1-*s2;
38 }
39
40 /**
41  * \fn int strlen(const char *str)
42  * \brief 
43  */
44 int strlen(const char *str)
45 {
46          int    len = 0;
47         while(*str)     len++,str++;
48         return len;
49 }
50
51 int memcmp(const void *p1, const void *p2, int len)
52 {
53         const char      *b1 = p1, *b2 = p2;
54         while(len --)
55         {
56                 if(b1 != b2)    return b1 - b2;
57         }
58         return 0;
59 }
60
61 void *memcpy(void *dest, const void *src, size_t len)
62 {
63         uint8_t *d=dest;
64         const uint8_t *s=src;
65         while(len--)    *d++ = *s++;
66         return dest;
67 }
68
69 /**
70  * \fn int file_exists(char *filename)
71  * \brief Checks if a file exists
72  */
73 int file_exists(const char *filename)
74 {
75          int    fd;
76         fd = _SysOpen(filename, 0);
77         if(fd == -1)    return 0;
78         _SysClose(fd);
79         return 1;
80 }
81
82 uint64_t __divmod64(uint64_t Num, uint64_t Den, uint64_t *Rem)
83 {
84         uint64_t        ret = 0, add = 1;
85
86         if( Den == 0 ) {
87                 if(Rem) *Rem = 0;
88                 return -1;
89         }
90
91         // Find what power of two times Den is > Num
92         while( Num >= Den )
93         {
94                 Den <<= 1;
95                 add <<= 1;
96         }
97
98         // Search backwards
99         while( add > 1 )
100         {
101                 add >>= 1;
102                 Den >>= 1;
103                 // If the numerator is >= Den, subtract and add to return value
104                 if( Num >= Den )
105                 {
106                         ret += add;
107                         Num -= Den;
108                 }
109         }
110         if(Rem) *Rem = Num;
111         return ret;
112 }
113
114 #if 0
115 uint32_t __divmod32(uint32_t Num, uint32_t Den, uint32_t *Rem)
116 {
117         uint32_t        ret = 0, add = 1;
118
119         if( Den == 0 ) {
120                 if(Rem) *Rem = 0;
121                 return -1;
122         }
123
124         // Find what power of two times Den is > Num
125         while( Num >= Den )
126         {
127                 Den <<= 1;
128                 add <<= 1;
129         }
130
131         // Search backwards
132         while( add > 1 )
133         {
134                 add >>= 1;
135                 Den >>= 1;
136                 // If the numerator is >= Den, subtract and add to return value
137                 if( Num >= Den )
138                 {
139                         ret += add;
140                         Num -= Den;
141                 }
142         }
143         if(Rem) *Rem = Num;
144         return ret;
145 }
146
147 uint64_t __udivdi3(uint64_t Num, uint64_t Den)
148 {
149         return __divmod64(Num, Den, NULL);
150 }
151
152 uint64_t __umoddi3(uint64_t Num, uint64_t Den)
153 {
154         uint64_t        ret;
155         __divmod64(Num, Den, &ret);
156         return ret;
157 }
158
159 int32_t __divsi3(int32_t Num, int32_t Den)
160 {
161         int32_t sign = 1;
162         if(Num < 0) {
163                 Num = -Num;
164                 sign = -sign;
165         }
166         if(Den < 0) {
167                 Den = -Den;
168                 sign = -sign;
169         }
170         return sign * __divmod32(Num, Den, NULL);
171 }
172
173 int32_t __modsi3(int32_t Num, int32_t Den)
174 {
175         int32_t sign = 1;
176         uint32_t tmp;
177         if(Num < 0) {
178                 Num = -Num;
179                 sign = -sign;
180         }
181         if(Den < 0) {
182                 Den = -Den;
183                 sign = -sign;
184         }
185         __divmod32(Num, Den, &tmp);
186         return ((int32_t)tmp)*sign;
187 }
188
189 uint32_t __udivsi3(uint32_t Num, uint32_t Den)
190 {
191         return __divmod32(Num, Den, NULL);
192 }
193
194
195 uint32_t __umodsi3(uint32_t Num, uint32_t Den)
196 {
197         uint32_t        ret;
198         __divmod32(Num, Den, &ret);
199         return ret;
200 }
201 #endif
202

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