X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Flib.c;h=0dbb9b96afc3e0a1b02e09a0628803c608bd1a0f;hb=4d166a859db826e94382e6222d5aa4d14ef1d3be;hp=ee9f24e0f6bba679a0f977661918cd1f73b17b43;hpb=8bc40333b1401d7616b225945fee53d972c2f418;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index ee9f24e0..0dbb9b96 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -5,6 +5,9 @@ #include // === CONSTANTS === +#define RANDOM_SEED 0xACE55052 +#define RANDOM_A 0x12231ADE +#define RANDOM_C 0x1BADBEEF // Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec const short DAYS_BEFORE[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; #define UNIX_TO_2K ((30*365*3600*24) + (7*3600*24)) //Normal years + leap years @@ -168,6 +171,8 @@ int strpos8(char *str, Uint32 Search) */ int ReadUTF8(Uint8 *str, Uint32 *Val) { + *Val = 0xFFFD; // Assume invalid character + // ASCII if( !(*str & 0x80) ) { *Val = *str; @@ -176,7 +181,6 @@ int ReadUTF8(Uint8 *str, Uint32 *Val) // Middle of a sequence if( (*str & 0xC0) == 0x80 ) { - *Val = -1; return 1; } @@ -217,10 +221,55 @@ int ReadUTF8(Uint8 *str, Uint32 *Val) } // UTF-8 Doesn't support more than four bytes - *Val = -1; return 4; } +/** + * \fn int WriteUTF8(Uint8 *str, Uint32 Val) + * \brief Write a UTF-8 character sequence to a string + */ +int WriteUTF8(Uint8 *str, Uint32 Val) +{ + // ASCII + if( Val < 128 ) { + *str = Val; + return 1; + } + + // Two Byte + if( Val < 0x8000 ) { + *str = 0xC0 | (Val >> 6); + str ++; + *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); + 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); + return 4; + } + + // UTF-8 Doesn't support more than four bytes + return 0; +} + /** * \fn Uint64 timestamp(int sec, int mins, int hrs, int day, int month, int year) * \brief Converts a date into an Acess Timestamp @@ -247,5 +296,25 @@ Sint64 timestamp(int sec, int mins, int hrs, int day, int month, int year) return stamp * 1000; } +/** + * \fn Uint rand() + * \brief Pseudo random number generator + * \note Unknown effectiveness (made up on the spot) + */ +Uint rand() +{ + #if 0 + static Uint randomState = RANDOM_SEED; + Uint ret = randomState; + int roll = randomState & 31; + randomState = (randomState << roll) | (randomState >> (32-roll)); + randomState ^= 0x9A3C5E78; + return ret; + #else + static Uint randomState = RANDOM_SEED; + return randomState = (RANDOM_A*randomState + RANDOM_C) & 0xFFFFFFFF; + #endif +} + EXPORT(timestamp); EXPORT(ReadUTF8);