part way through switch to cin parser

This commit is contained in:
2025-08-19 12:00:18 -05:00
parent d4d4a236e9
commit ba9216a338
6 changed files with 107 additions and 159 deletions

View File

@@ -1,33 +1,44 @@
#include <cstdio>
#include <assert.h>
#include <cstring>
#include <cwctype>
#include <stdlib.h>
#include "util.hpp"
array<char*> _split_str_inner(const char* s, char delim, bool just_check_ws);
template<class T> void append(array<T>& a, T el) {
if (a.len == a.cap) {
resize(a, a.cap*2);
resize(a, a.cap * 2);
}
a[a.len] = el;
a.len++;
}
template<class T> T pop(array<T>& a) {
assert(a.len >= 1);
a.len--;
return a.data[a.len+1];
return a.data[a.len + 1];
}
template<class T> void resize(array<T> &a, size_t new_cap) {
template<class T> void resize(array<T>& a, size_t new_cap) {
T* new_data = (T*)malloc(new_cap);
memcpy(new_data, a.data, min(a.len, new_cap));
if (a.len > 0) {
memcpy(new_data, a.data, min(a.len, new_cap));
}
free(a.data);
a.len = min(a.len, new_cap);
a.cap = new_cap;
}
template<class T> void free(array<T>& a) {
if (a.len > 0)
free(a.data);
a.len = 0;
a.cap = 0;
}
bool read_file(array<char>* out, const char* filepath) {
FILE* fp = NULL;
if (fopen_s(&fp, filepath, "rb") != 0) {
@@ -46,3 +57,38 @@ bool read_file(array<char>* out, const char* filepath) {
out->len = sz;
return true;
}
array<char*> split_str(const char* s, char delimiter) { return _split_str_inner(s, delimiter, false); }
array<char*> split_str(const char* s) { return _split_str_inner(s, ' ', true); }
array<char*> _split_str_inner(const char* s, char delim, bool just_check_ws) {
array<char*> res = { NULL, 0, 0 };
char c;
int i = 0;
array<char> cur_word = { NULL, 0, 0 };
while (true) {
c = s[i++];
bool is_delim = just_check_ws ? iswspace(c) : c == delim;
if ((is_delim || c == '\0') && cur_word.len > 0) {
char* word = (char*)malloc(sizeof(char) * cur_word.len + 1);
memcpy(word, cur_word.data, cur_word.len);
word[cur_word.len] = '\0';
append(res, word);
free(cur_word);
if (c == '\0') {
break;
}
continue;
} else {
append(cur_word, c);
}
if (c == '\0') {
break;
}
}
free(cur_word);
return res;
}