Usermode/ld-acess - Sorting and improvements to ld-acess
[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 /**
62  * \fn int file_exists(char *filename)
63  * \brief Checks if a file exists
64  */
65 int file_exists(const char *filename)
66 {
67          int    fd;
68         //fd = open(filename, OPENFLAG_READ);
69         fd = open(filename, 0);
70         if(fd == -1)    return 0;
71         close(fd);
72         return 1;
73 }
74
75 uint64_t __divmod64(uint64_t Num, uint64_t Den, uint64_t *Rem)
76 {
77         uint64_t        ret = 0, add = 1;
78
79         if( Den == 0 ) {
80                 if(Rem) *Rem = 0;
81                 return -1;
82         }
83
84         // Find what power of two times Den is > Num
85         while( Num >= Den )
86         {
87                 Den <<= 1;
88                 add <<= 1;
89         }
90
91         // Search backwards
92         while( add > 1 )
93         {
94                 add >>= 1;
95                 Den >>= 1;
96                 // If the numerator is >= Den, subtract and add to return value
97                 if( Num >= Den )
98                 {
99                         ret += add;
100                         Num -= Den;
101                 }
102         }
103         if(Rem) *Rem = Num;
104         return ret;
105 }
106
107 uint32_t __divmod32(uint32_t Num, uint32_t Den, uint32_t *Rem)
108 {
109         uint32_t        ret = 0, add = 1;
110
111         if( Den == 0 ) {
112                 if(Rem) *Rem = 0;
113                 return -1;
114         }
115
116         // Find what power of two times Den is > Num
117         while( Num >= Den )
118         {
119                 Den <<= 1;
120                 add <<= 1;
121         }
122
123         // Search backwards
124         while( add > 1 )
125         {
126                 add >>= 1;
127                 Den >>= 1;
128                 // If the numerator is >= Den, subtract and add to return value
129                 if( Num >= Den )
130                 {
131                         ret += add;
132                         Num -= Den;
133                 }
134         }
135         if(Rem) *Rem = Num;
136         return ret;
137 }
138
139 uint64_t __udivdi3(uint64_t Num, uint64_t Den)
140 {
141         return __divmod64(Num, Den, NULL);
142 }
143
144 uint64_t __umoddi3(uint64_t Num, uint64_t Den)
145 {
146         uint64_t        ret;
147         __divmod64(Num, Den, &ret);
148         return ret;
149 }
150
151 int32_t __divsi3(int32_t Num, int32_t Den)
152 {
153         int32_t sign = 1;
154         if(Num < 0) {
155                 Num = -Num;
156                 sign = -sign;
157         }
158         if(Den < 0) {
159                 Den = -Den;
160                 sign = -sign;
161         }
162         return sign * __divmod32(Num, Den, NULL);
163 }
164
165 int32_t __modsi3(int32_t Num, int32_t Den)
166 {
167         int32_t sign = 1;
168         uint32_t tmp;
169         if(Num < 0) {
170                 Num = -Num;
171                 sign = -sign;
172         }
173         if(Den < 0) {
174                 Den = -Den;
175                 sign = -sign;
176         }
177         __divmod32(Num, Den, &tmp);
178         return ((int32_t)tmp)*sign;
179 }
180
181 uint32_t __udivsi3(uint32_t Num, uint32_t Den)
182 {
183         return __divmod32(Num, Den, NULL);
184 }
185
186
187 uint32_t __umodsi3(uint32_t Num, uint32_t Den)
188 {
189         uint32_t        ret;
190         __divmod32(Num, Den, &ret);
191         return ret;
192 }
193

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