X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Fld-acess.so_src%2Flib.c;h=9b8f86a88cbeadd9222e7be4e779fdb59eb91de1;hb=f595a692ef1efccef616b8600a0087e23d6066fe;hp=150ae77cff61812d0748f77f5d38ae393ac9c308;hpb=11686aa86bc0adae2555aa7796fe229770bb02f7;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/ld-acess.so_src/lib.c b/Usermode/Libraries/ld-acess.so_src/lib.c index 150ae77c..9b8f86a8 100644 --- a/Usermode/Libraries/ld-acess.so_src/lib.c +++ b/Usermode/Libraries/ld-acess.so_src/lib.c @@ -58,6 +58,14 @@ int memcmp(const void *p1, const void *p2, int len) return 0; } +void *memcpy(void *dest, const void *src, size_t len) +{ + uint8_t *d=dest; + const uint8_t *s=src; + while(len--) *d++ = *s++; + return dest; +} + /** * \fn int file_exists(char *filename) * \brief Checks if a file exists @@ -65,17 +73,54 @@ int memcmp(const void *p1, const void *p2, int len) int file_exists(const char *filename) { int fd; - //fd = open(filename, OPENFLAG_READ); - fd = open(filename, 0); + fd = _SysOpen(filename, 0); if(fd == -1) return 0; - close(fd); + _SysClose(fd); return 1; } -uint64_t __udivdi3(uint64_t Num, uint64_t Den) +uint64_t __divmod64(uint64_t Num, uint64_t Den, uint64_t *Rem) { uint64_t ret = 0, add = 1; + if( Den == 0 ) { + if(Rem) *Rem = 0; + return -1; + } + + // Find what power of two times Den is > Num + while( Num >= Den ) + { + Den <<= 1; + add <<= 1; + } + + // Search backwards + while( add > 1 ) + { + add >>= 1; + Den >>= 1; + // If the numerator is >= Den, subtract and add to return value + if( Num >= Den ) + { + ret += add; + Num -= Den; + } + } + if(Rem) *Rem = Num; + return ret; +} + +#if 0 +uint32_t __divmod32(uint32_t Num, uint32_t Den, uint32_t *Rem) +{ + uint32_t ret = 0, add = 1; + + if( Den == 0 ) { + if(Rem) *Rem = 0; + return -1; + } + // Find what power of two times Den is > Num while( Num >= Den ) { @@ -88,14 +133,70 @@ uint64_t __udivdi3(uint64_t Num, uint64_t Den) { add >>= 1; Den >>= 1; - // If the numerator is > Den, subtract and add to return value - if( Num > Den ) + // If the numerator is >= Den, subtract and add to return value + if( Num >= Den ) { ret += add; Num -= Den; } } -// if(Rem) *Rem = Num; + if(Rem) *Rem = Num; + return ret; +} + +uint64_t __udivdi3(uint64_t Num, uint64_t Den) +{ + return __divmod64(Num, Den, NULL); +} + +uint64_t __umoddi3(uint64_t Num, uint64_t Den) +{ + uint64_t ret; + __divmod64(Num, Den, &ret); + return ret; +} + +int32_t __divsi3(int32_t Num, int32_t Den) +{ + int32_t sign = 1; + if(Num < 0) { + Num = -Num; + sign = -sign; + } + if(Den < 0) { + Den = -Den; + sign = -sign; + } + return sign * __divmod32(Num, Den, NULL); +} + +int32_t __modsi3(int32_t Num, int32_t Den) +{ + int32_t sign = 1; + uint32_t tmp; + if(Num < 0) { + Num = -Num; + sign = -sign; + } + if(Den < 0) { + Den = -Den; + sign = -sign; + } + __divmod32(Num, Den, &tmp); + return ((int32_t)tmp)*sign; +} + +uint32_t __udivsi3(uint32_t Num, uint32_t Den) +{ + return __divmod32(Num, Den, NULL); +} + + +uint32_t __umodsi3(uint32_t Num, uint32_t Den) +{ + uint32_t ret; + __divmod32(Num, Den, &ret); return ret; } +#endif