aboutsummaryrefslogtreecommitdiff
path: root/src/util.cc
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-05-25 00:25:01 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-05-25 00:25:01 -0300
commit5f883a80175a4cc9abda9d647a6a0d73bda84878 (patch)
treed585487084c455a5ff0659a8cff6fdaf9d357ba9 /src/util.cc
parent3f557369c7bbd08fdf2e6dbd9271873b20a9a144 (diff)
downloadgame-5f883a80175a4cc9abda9d647a6a0d73bda84878.tar.gz
game-5f883a80175a4cc9abda9d647a6a0d73bda84878.zip
move string utility to `util.cc` + small script identifier fix
Diffstat (limited to 'src/util.cc')
-rw-r--r--src/util.cc102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/util.cc b/src/util.cc
index 30e1ba5..017e98b 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -41,6 +41,108 @@ void print(int Level, char *Text, ...){
}
}
+// String Utility
+// =============================================================================
+bool isSpace(int c){
+ return c == ' '
+ || c == '\t'
+ || c == '\n'
+ || c == '\r'
+ || c == '\v'
+ || c == '\f';
+}
+
+bool isAlpha(int c){
+ // TODO(fusion): This is most likely wrong! We're assuming a direct conversion
+ // from `char` to `int` which will cause sign extension for negative values. This
+ // wouldn't be a problem if we expected to parse only streams of `char[]` but can
+ // be problematic for the output of `getc` which returns bytes as `unsigned char`
+ // converted to `int`.
+ // TLDR: The parameter `c` should be `uint8`.
+ return ('A' <= c && c <= 'Z')
+ || ('a' <= c && c <= 'z')
+ || c == -0x1C // E4 => ä
+ || c == -0x0A // F6 => ö
+ || c == -0x04 // FC => ü
+ || c == -0x3C // C4 => Ä
+ || c == -0x2A // D6 => Ö
+ || c == -0x24 // DC => Ü
+ || c == -0x21; // DF => ß
+}
+
+bool isEngAlpha(int c){
+ return ('A' <= c && c <= 'Z')
+ || ('a' <= c && c <= 'z');
+}
+
+bool isDigit(int c){
+ return ('0' <= c && c <= '9');
+}
+
+int toLower(int c){
+ // TODO(fusion): Same problem as `isAlpha`.
+ if(('A' <= c && c <= 'Z') || (0xC0 <= c && c <= 0xDE && c != 0xD7)){
+ c += 32;
+ }
+ return c;
+}
+
+int toUpper(int c){
+ // TODO(fusion): Same problem as `isAlpha`.
+ if(('A' <= c && c <= 'Z') || (0xE0 <= c && c <= 0xFE && c != 0xF7)){
+ c -= 32;
+ }
+ return c;
+}
+
+char *strLower(char *s){
+ for(int i = 0; s[i] != 0; i += 1){
+ s[i] = (char)toLower(s[i]);
+ }
+ return s;
+}
+
+char *strUpper(char *s){
+ for(int i = 0; s[i] != 0; i += 1){
+ s[i] = (char)toUpper(s[i]);
+ }
+ return s;
+}
+
+int stricmp(const char *s1, const char *s2, int Pos){
+ for(int i = 0; i < Pos; i += 1){
+ int c1 = toLower(s1[i]);
+ int c2 = toLower(s2[i]);
+ if(c1 > c2){
+ return 1;
+ }else if(c1 < c2){
+ return -1;
+ }else{
+ ASSERT(c1 == c2);
+ if(c1 == 0){
+ return 0;
+ }
+ }
+ }
+}
+
+char *findFirst(char *s, char c){
+ return strchr(s, (int)c);
+}
+
+char *findLast(char *s, char c){
+ char *Current = s;
+ char *Last = NULL;
+ while(true){
+ Current = strchr(Current, (int)c);
+ if(Current == NULL)
+ break;
+ Last = Current;
+ Current += 1; // skip character
+ }
+ return Last;
+}
+
// TReadStream
// =============================================================================
bool TReadStream::readFlag(void){