Path: blob/master/RSDKv5/RSDK/Storage/Text.hpp
1163 views
#ifndef TEXT_H1#define TEXT_H23namespace RSDK4{56struct GameVersionInfo {7char gameTitle[0x40];8char gameSubtitle[0x100];9char version[0x10];10#if !RETRO_REV0211uint8 platform;12uint8 language;13uint8 region;14#endif15};1617extern GameVersionInfo gameVerInfo;1819struct String {20uint16 *chars; // text21uint16 length; // string length22uint16 size; // total alloc length23};2425#if RETRO_REV0U26inline void StrCopy(char *dest, const char *src)27{28#ifdef USE_STDLIB29strcpy(dest, src);30#else31int32 i = 0;32for (; src[i]; ++i) dest[i] = src[i];33dest[i] = 0;34#endif35}3637inline void StrAdd(char *dest, const char *src)38{39int32 destStrPos = 0;40int32 srcStrPos = 0;41while (dest[destStrPos]) ++destStrPos;42while (true) {43if (!src[srcStrPos]) {44break;45}46dest[destStrPos++] = src[srcStrPos++];47}48dest[destStrPos] = 0;49}5051inline bool StrComp(const char *stringA, const char *stringB)52{53bool32 match = true;54bool32 finished = false;55while (!finished) {56if (*stringA == *stringB || *stringA == *stringB + ' ' || *stringA == *stringB - ' ') {57if (*stringA) {58++stringA;59++stringB;60}61else {62finished = true;63}64}65else {66match = false;67finished = true;68}69}7071return match;72}7374inline int32 StrLength(const char *string)75{76int32 len = 0;77for (len = 0; string[len]; len++)78;79return len;80}8182int32 FindStringToken(const char *string, const char *token, uint8 stopID);83#endif8485inline void StringLowerCase(char *dest, const char *src)86{87int32 destPos = 0;88int32 curChar = *src;89if (*src) {90int32 srcPos = 0;91do {92while ((uint32)curChar - 'A' < 26) {93destPos = srcPos;94dest[destPos] = curChar + ' ';95curChar = src[++srcPos];96if (!curChar) {97dest[++destPos] = 0;98return;99}100}101destPos = srcPos;102dest[destPos] = curChar;103curChar = src[++srcPos];104} while (curChar);105}106dest[++destPos] = 0;107}108109inline void StringUpperCase(char *dest, const char *src)110{111int32 destPos = 0;112int32 curChar = *src;113if (*src) {114int32 srcPos = 0;115do {116while ((uint32)curChar - 'a' < 26) {117destPos = srcPos;118dest[destPos] = curChar - ' ';119curChar = src[++srcPos];120if (!curChar) {121dest[++destPos] = 0;122return;123}124}125destPos = srcPos;126dest[destPos] = curChar;127curChar = src[++srcPos];128} while (curChar);129}130dest[++destPos] = 0;131}132133extern char textBuffer[0x400];134void GenerateHashMD5(uint32 *buffer, char *textBuffer, int32 textBufferLen);135void GenerateHashCRC(uint32 *id, char *inputString);136137#define RETRO_HASH_MD5(name) uint32 name[4]138#define HASH_SIZE_MD5 (4 * sizeof(uint32))139#define HASH_MATCH_MD5(a, b) (memcmp(a, b, HASH_SIZE_MD5) == 0)140// this is NOT thread-safe!141#define GEN_HASH_MD5(text, hash) \142strcpy(textBuffer, text); \143GenerateHashMD5(hash, textBuffer, (int32)strlen(textBuffer))144// this one is but assumes buffer has already been setup145#define GEN_HASH_MD5_BUFFER(buffer, hash) GenerateHashMD5(hash, buffer, (int32)strlen(buffer))146#define HASH_COPY_MD5(dst, src) memcpy(dst, src, HASH_SIZE_MD5)147#define HASH_CLEAR_MD5(hash) MEM_ZERO(hash)148149inline void InitString(String *string, const char *text, uint32 textLength)150{151string->length = 0;152string->size = 0;153154if (text != NULL) {155string->length = 0;156while (text[string->length] != '\0') ++string->length;157158if (textLength != 0 && textLength >= string->length)159string->size = textLength;160else161string->size = string->length;162163if (string->size == 0)164string->size = 1;165166AllocateStorage((void **)&string->chars, sizeof(uint16) * string->size, DATASET_STR, false);167168for (uint32 pos = 0; text[pos] != '\0'; ++pos)169string->chars[pos] = text[pos];170}171}172173void SetString(String *string, const char *text);174175inline void CopyString(String *dst, String *src)176{177if (dst == src)178return;179180int32 srcLength = src->length;181dst->chars = NULL;182if (dst->size >= srcLength) {183if (!dst->chars) {184AllocateStorage((void **)&dst->chars, sizeof(uint16) * dst->size, DATASET_STR, false);185}186}187else {188dst->size = srcLength;189AllocateStorage((void **)&dst->chars, sizeof(uint16) * dst->size, DATASET_STR, false);190}191192dst->length = src->length;193for (int32 c = 0; c < dst->length; ++c) dst->chars[c] = src->chars[c];194}195196inline void GetCString(char *destChars, String *string)197{198if (!string->chars)199return;200201char *cString = destChars ? destChars : textBuffer;202int32 textLen = destChars ? string->length : 0x400;203204int32 c = 0;205for (; c < textLen; ++c) cString[c] = (char)string->chars[c];206cString[c] = 0;207}208209void AppendText(String *string, const char *appendText);210void AppendString(String *string, String *appendString);211bool32 CompareStrings(String *string1, String *string2, bool32 exactMatch);212213void InitStringList(String *stringList, int32 size);214void LoadStringList(String *stringList, const char *filePath, uint32 charSize);215bool32 SplitStringList(String *splitStrings, String *stringList, int32 startStringID, int32 stringCount);216217#if RETRO_REV0U218#include "Legacy/TextLegacy.hpp"219#endif220221} // namespace RSDK222223#endif224225226