Merge branch 'master' of git.mutabah.net:acess2
[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 = open(filename, OPENFLAG_READ);
77         fd = open(filename, 0);
78         if(fd == -1)    return 0;
79         close(fd);
80         return 1;
81 }
82
83 uint64_t __divmod64(uint64_t Num, uint64_t Den, uint64_t *Rem)
84 {
85         uint64_t        ret = 0, add = 1;
86
87         if( Den == 0 ) {
88                 if(Rem) *Rem = 0;
89                 return -1;
90         }
91
92         // Find what power of two times Den is > Num
93         while( Num >= Den )
94         {
95                 Den <<= 1;
96                 add <<= 1;
97         }
98
99         // Search backwards
100         while( add > 1 )
101         {
102                 add >>= 1;
103                 Den >>= 1;
104                 // If the numerator is >= Den, subtract and add to return value
105                 if( Num >= Den )
106                 {
107                         ret += add;
108                         Num -= Den;
109                 }
110         }
111         if(Rem) *Rem = Num;
112         return ret;
113 }
114
115 #if 0
116 uint32_t __divmod32(uint32_t Num, uint32_t Den, uint32_t *Rem)
117 {
118         uint32_t        ret = 0, add = 1;
119
120         if( Den == 0 ) {
121                 if(Rem) *Rem = 0;
122                 return -1;
123         }
124
125         // Find what power of two times Den is > Num
126         while( Num >= Den )
127         {
128                 Den <<= 1;
129                 add <<= 1;
130         }
131
132         // Search backwards
133         while( add > 1 )
134         {
135                 add >>= 1;
136                 Den >>= 1;
137                 // If the numerator is >= Den, subtract and add to return value
138                 if( Num >= Den )
139                 {
140                         ret += add;
141                         Num -= Den;
142                 }
143         }
144         if(Rem) *Rem = Num;
145         return ret;
146 }
147
148 uint64_t __udivdi3(uint64_t Num, uint64_t Den)
149 {
150         return __divmod64(Num, Den, NULL);
151 }
152
153 uint64_t __umoddi3(uint64_t Num, uint64_t Den)
154 {
155         uint64_t        ret;
156         __divmod64(Num, Den, &ret);
157         return ret;
158 }
159
160 int32_t __divsi3(int32_t Num, int32_t Den)
161 {
162         int32_t sign = 1;
163         if(Num < 0) {
164                 Num = -Num;
165                 sign = -sign;
166         }
167         if(Den < 0) {
168                 Den = -Den;
169                 sign = -sign;
170         }
171         return sign * __divmod32(Num, Den, NULL);
172 }
173
174 int32_t __modsi3(int32_t Num, int32_t Den)
175 {
176         int32_t sign = 1;
177         uint32_t tmp;
178         if(Num < 0) {
179                 Num = -Num;
180                 sign = -sign;
181         }
182         if(Den < 0) {
183                 Den = -Den;
184                 sign = -sign;
185         }
186         __divmod32(Num, Den, &tmp);
187         return ((int32_t)tmp)*sign;
188 }
189
190 uint32_t __udivsi3(uint32_t Num, uint32_t Den)
191 {
192         return __divmod32(Num, Den, NULL);
193 }
194
195
196 uint32_t __umodsi3(uint32_t Num, uint32_t Den)
197 {
198         uint32_t        ret;
199         __divmod32(Num, Den, &ret);
200         return ret;
201 }
202 #endif
203

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