Usermode/ld-acess - Implemented R_836_COPY and R_X86_64_COPY
[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, *s=src;
64         while(len--)    *d++ = *s++;
65         return dest;
66 }
67
68 /**
69  * \fn int file_exists(char *filename)
70  * \brief Checks if a file exists
71  */
72 int file_exists(const char *filename)
73 {
74          int    fd;
75         //fd = open(filename, OPENFLAG_READ);
76         fd = open(filename, 0);
77         if(fd == -1)    return 0;
78         close(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 uint32_t __divmod32(uint32_t Num, uint32_t Den, uint32_t *Rem)
115 {
116         uint32_t        ret = 0, add = 1;
117
118         if( Den == 0 ) {
119                 if(Rem) *Rem = 0;
120                 return -1;
121         }
122
123         // Find what power of two times Den is > Num
124         while( Num >= Den )
125         {
126                 Den <<= 1;
127                 add <<= 1;
128         }
129
130         // Search backwards
131         while( add > 1 )
132         {
133                 add >>= 1;
134                 Den >>= 1;
135                 // If the numerator is >= Den, subtract and add to return value
136                 if( Num >= Den )
137                 {
138                         ret += add;
139                         Num -= Den;
140                 }
141         }
142         if(Rem) *Rem = Num;
143         return ret;
144 }
145
146 uint64_t __udivdi3(uint64_t Num, uint64_t Den)
147 {
148         return __divmod64(Num, Den, NULL);
149 }
150
151 uint64_t __umoddi3(uint64_t Num, uint64_t Den)
152 {
153         uint64_t        ret;
154         __divmod64(Num, Den, &ret);
155         return ret;
156 }
157
158 int32_t __divsi3(int32_t Num, int32_t Den)
159 {
160         int32_t sign = 1;
161         if(Num < 0) {
162                 Num = -Num;
163                 sign = -sign;
164         }
165         if(Den < 0) {
166                 Den = -Den;
167                 sign = -sign;
168         }
169         return sign * __divmod32(Num, Den, NULL);
170 }
171
172 int32_t __modsi3(int32_t Num, int32_t Den)
173 {
174         int32_t sign = 1;
175         uint32_t tmp;
176         if(Num < 0) {
177                 Num = -Num;
178                 sign = -sign;
179         }
180         if(Den < 0) {
181                 Den = -Den;
182                 sign = -sign;
183         }
184         __divmod32(Num, Den, &tmp);
185         return ((int32_t)tmp)*sign;
186 }
187
188 uint32_t __udivsi3(uint32_t Num, uint32_t Den)
189 {
190         return __divmod32(Num, Den, NULL);
191 }
192
193
194 uint32_t __umodsi3(uint32_t Num, uint32_t Den)
195 {
196         uint32_t        ret;
197         __divmod32(Num, Den, &ret);
198         return ret;
199 }
200

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