ref: a520f0bae369eb0632cca008a85e56b831897bdd
parent: 34dae69793a22291cfb2c73e995a78e67091df72
author: David <gek@katherine>
date: Mon Mar 1 19:47:11 EST 2021
string utils
--- /dev/null
+++ b/SDL_Examples/include/stringutil.h
@@ -1,0 +1,93 @@
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+//Before we get on, "stringutil.h" is the most C-ish name for a source code file ever, amirite?
+
+#ifndef STRUTIL_ALLOC
+#define STRUTIL_ALLOC(s) malloc(s)
+#endif
+
+#ifndef STRUTIL_NO_SHORT_NAMES
+#define strcata strcatalloc
+#define strcataf1 strcatallocf1
+#define strcataf2 strcatallocf2
+#define strcatafb strcatallocfb
+#endif
+//Strcat but with malloc.
+static inline char* strcatalloc(const char* s1, const char* s2){
+ char* d = STRUTIL_ALLOC(strlen(s1) + strlen(s2) + 1);
+ strcpy(d, s1);
+ strcat(d, s2);
+ return d;
+}
+
+static inline char* strcatallocf1(char* s1, const char* s2){
+ char* d = STRUTIL_ALLOC(strlen(s1) + strlen(s2) + 1);
+ strcpy(d, s1);
+ strcat(d, s2);
+ free(s1);
+ return d;
+}
+
+static inline char* strcatallocf2(const char* s1, char* s2){
+ char* d = STRUTIL_ALLOC(strlen(s1) + strlen(s2) + 1);
+ strcpy(d, s1);
+ strcat(d, s2);
+ free(s2);
+ return d;
+}
+
+static inline char* strcatallocfb(char* s1, char* s2){
+ char* d = STRUTIL_ALLOC(strlen(s1) + strlen(s2) + 1);
+ strcpy(d, s1);
+ strcat(d, s2);
+ free(s1);
+ free(s2);
+ return d;
+}
+
+//Convert a non-null-terminated URL into a null terminated one.
+static inline char* str_null_terminated_alloc(const char* in, unsigned int len){
+ char* d = malloc(len+1);
+ memcpy(d,in,len);
+ d[len] = '\0';
+ return d;
+}
+
+static inline unsigned int strprefix(const char *pre, const char *str)
+{
+ size_t lenpre = strlen(pre),
+ lenstr = strlen(str);
+ return lenstr < lenpre ? 0 : memcmp(pre, str, lenpre) == 0;
+}
+
+//Read file until terminator character is found.
+//Returns the number of characters copied.
+static inline unsigned int read_until_terminator(FILE* f, char* buf, const unsigned int buflen, char terminator){
+ unsigned int i = 0;
+ char c;
+ for(i = 0; i < (buflen-1); i++)
+ {
+ if(feof(f))break;
+ c = fgetc(f);
+ if(c == terminator)break;
+ buf[i] = c;
+ }
+ buf[buflen-1] = '\0'; //READ_UNTIL_TERMINATOR ALWAYS RETURNS A VALID STRING!
+ return i;
+}
+
+
+static inline void* read_file_into_alloced_buffer(FILE* f, unsigned int* len){
+ void* buf = NULL;
+ if(!f) return NULL;
+ fseek(f, 0, SEEK_END);
+ *len = ftell(f);
+ fseek(f,0,SEEK_SET);
+ buf = STRUTIL_ALLOC(*len + 1);
+ if(!buf) return NULL;
+ fread(buf, 1, *len, f);
+ ((char*)buf)[*len] = '\0';
+ return buf;
+}