// SPDX-FileCopyrightText: 2024 Lizzy Fleckenstein // // SPDX-License-Identifier: AGPL-3.0-or-later #ifndef STR_H #define STR_H #include #include #include "array.h" // string library taken from cuddlesOS: // https://github.com/cuddlesOS/cuddles/blob/master/stage3/string.c typedef array(char) str; #define NILS ((str) { 0, NULL }) #define S(X) ((str) { len(X)-1, X }) #define PSTR(X) (int) (X).len, (X).data typedef arraybuf(char) strbuf; #define NILSBUF ((strbuf) { 0, 0, NULL }) // compares two strings by length and ASCII values. return value: // < 0 if s1 < s2 // = 0 if s1 = s2 // > 0 if s1 > s2 int str_cmp(str s1, str s2); // returns index of first of occurrence in s of any of the chars in tokens // returns length of s if not found size_t str_find(str s, str tokens); // this is a splitting function // returns the next non-empty substring of *s that is delimited by the tokens in sep // the returned string does not contain any of the separators // returns an emtpy string when end is reached // advances s to after the substring plus first delimiting token str str_walk(str *s, str sep); // advances the string while its first token matches any of the chars in tokens // this can be used to consume whitespace, for example str str_eat(str s, str tokens); // advances the string s by x chars, increasing the data pointer and decreasing the length // note: this is not bounds checked str str_advance(str s, size_t x); // returns true if s starts with start bool str_start(str s, str start); // construct a str from a \0 terminated string at runtime // avoid this for literals: use the S macro instead without a runtime cost str str_intro(char *c); // copy a string to the heap str str_clone(str s); #endif