* Common Library Functions
*/
#include <acess.h>
+#include <hal_proc.h>
// === CONSTANTS ===
#define RANDOM_SEED 0xACE55052
* \brief Copy a string to a new location
* \note Copies at most `max` chars
*/
-char *strncpy(char *__str1, const char *__str2, size_t max)
+char *strncpy(char *__str1, const char *__str2, size_t __max)
{
- while(*__str2 && max-- >= 1)
+ while(*__str2 && __max-- >= 1)
*__str1++ = *__str2++;
- if(max)
+ if(__max)
*__str1 = '\0'; // Terminate String
return __str1;
}
{
// ASCII
if( Val < 128 ) {
- *str = Val;
+ if( str ) {
+ *str = Val;
+ }
return 1;
}
// Two Byte
if( Val < 0x8000 ) {
- *str = 0xC0 | (Val >> 6);
- str ++;
- *str = 0x80 | (Val & 0x3F);
+ if( str ) {
+ *str++ = 0xC0 | (Val >> 6);
+ *str++ = 0x80 | (Val & 0x3F);
+ }
return 2;
}
// Three Byte
if( Val < 0x10000 ) {
- *str = 0xE0 | (Val >> 12);
- str ++;
- *str = 0x80 | ((Val >> 6) & 0x3F);
- str ++;
- *str = 0x80 | (Val & 0x3F);
+ if( str ) {
+ *str++ = 0xE0 | (Val >> 12);
+ *str++ = 0x80 | ((Val >> 6) & 0x3F);
+ *str++ = 0x80 | (Val & 0x3F);
+ }
return 3;
}
// Four Byte
if( Val < 0x110000 ) {
- *str = 0xF0 | (Val >> 18);
- str ++;
- *str = 0x80 | ((Val >> 12) & 0x3F);
- str ++;
- *str = 0x80 | ((Val >> 6) & 0x3F);
- str ++;
- *str = 0x80 | (Val & 0x3F);
+ if( str ) {
+ *str++ = 0xF0 | (Val >> 18);
+ *str++ = 0x80 | ((Val >> 12) & 0x3F);
+ *str++ = 0x80 | ((Val >> 6) & 0x3F);
+ *str++ = 0x80 | (Val & 0x3F);
+ }
return 4;
}
*/
int CheckString(const char *String)
{
- if( !MM_GetPhysAddr( (tVAddr)String ) )
+ tVAddr addr;
+ int bUser;
+
+ addr = (tVAddr)String;
+
+ if( !MM_GetPhysAddr( addr ) )
return 0;
// Check 1st page
- if( MM_IsUser( (tVAddr)String ) )
+ bUser = MM_IsUser( addr );
+
+ while( *(char*)addr )
{
- // Traverse String
- while( *String )
+ if( (addr & (PAGE_SIZE-1)) == 0 )
{
- if( !MM_IsUser( (tVAddr)String ) )
+ if(bUser && !MM_IsUser(addr) )
return 0;
- // Increment string pointer
- String ++;
- }
- return 1;
- }
- else if( MM_GetPhysAddr( (tVAddr)String ) )
- {
- // Traverse String
- while( *String )
- {
- if( !MM_GetPhysAddr( (tVAddr)String ) )
+ if(!bUser && !MM_GetPhysAddr(addr) )
return 0;
- // Increment string pointer
- String ++;
}
- return 1;
+ addr ++;
}
- return 0;
+ return 1;
}
/**
*/
int CheckMem(const void *Mem, int NumBytes)
{
- tVAddr addr = (tVAddr)Mem;
-
- if( !MM_GetPhysAddr( addr ) )
- return 0;
-
- if( MM_IsUser( addr ) )
- {
- while( NumBytes-- )
- {
- if( !MM_IsUser( addr ) )
- return 0;
- addr ++;
- }
- return 1;
- }
- else if( MM_GetPhysAddr( addr ) )
- {
- while( NumBytes-- )
- {
- if( !MM_GetPhysAddr( addr ) )
- return 0;
- addr ++;
- }
- return 1;
- }
- return 0;
+ return MM_IsValidBuffer( (tVAddr)Mem, NumBytes );
}
/* *
* \}
char *dest = __dest;
const char *src = __src;
void *ret = __dest;
+
+ if( len == 0 || dest == src )
+ return dest;
if( (tVAddr)dest > (tVAddr)src + len )
return memcpy(dest, src, len);
if( (tVAddr)dest + len < (tVAddr)src )
return memcpy(dest, src, len);
+ // NOTE: Assumes memcpy works forward
+ if( (tVAddr)dest < (tVAddr)src )
+ return memcpy(dest, src, len);
+
if( (tVAddr)dest < (tVAddr)src )
block_size = (tVAddr)src - (tVAddr)dest;
else