muon/include/lang/string.h
Vincent Torri 9d16636042 Windows: add str_endswithi() for compiler_cl_args_output()
also added references in meson to check if it is
compatible with meson
2024-02-02 09:49:47 -05:00

90 lines
3.1 KiB
C

/*
* SPDX-FileCopyrightText: Stone Tickle <lattis@mochiro.moe>
* SPDX-License-Identifier: GPL-3.0-only
*/
#ifndef MUON_LANG_STRING_H
#define MUON_LANG_STRING_H
#include "compat.h"
#include "lang/object.h"
struct workspace;
#define WKSTR(cstring) (struct str){ .s = cstring, .len = strlen(cstring) }
/* sbuf */
enum sbuf_flags {
sbuf_flag_overflown = 1 << 0,
sbuf_flag_overflow_obj_str = 0 << 1, // the default
sbuf_flag_overflow_alloc = 1 << 1,
sbuf_flag_overflow_error = 1 << 2,
sbuf_flag_write = 1 << 3,
sbuf_flag_string_exposed = 1 << 4,
};
#define SBUF_CUSTOM(name, static_len, flags) \
struct sbuf name; \
char sbuf_static_buf_ ## name[static_len]; \
sbuf_init(&name, sbuf_static_buf_ ## name, static_len, flags);
#define SBUF(name) SBUF_CUSTOM(name, 1024, 0)
#define SBUF_manual(name) SBUF_CUSTOM(name, 1024, sbuf_flag_overflow_alloc)
struct sbuf {
char *buf;
uint32_t len, cap;
enum sbuf_flags flags;
obj s;
};
void sbuf_init(struct sbuf *sb, char *initial_buffer, uint32_t initial_buffer_cap,
enum sbuf_flags flags);
void sbuf_destroy(struct sbuf *sb);
void sbuf_clear(struct sbuf *sb);
void sbuf_grow(struct workspace *wk, struct sbuf *sb, uint32_t inc);
void sbuf_push(struct workspace *wk, struct sbuf *sb, char s);
void sbuf_pushn(struct workspace *wk, struct sbuf *sb, const char *s, uint32_t n);
void sbuf_pushs(struct workspace *wk, struct sbuf *sb, const char *s);
void sbuf_pushf(struct workspace *wk, struct sbuf *sb, const char *fmt, ...)
MUON_ATTR_FORMAT(printf, 3, 4);
obj sbuf_into_str(struct workspace *wk, struct sbuf *sb);
void str_unescape(struct workspace *wk, struct sbuf *sb, const struct str *ss,
bool escape_whitespace);
bool str_has_null(const struct str *ss);
const char *get_cstr(struct workspace *wk, obj s);
obj make_str(struct workspace *wk, const char *str);
obj make_strn(struct workspace *wk, const char *str, uint32_t n);
obj make_strf(struct workspace *wk, const char *fmt, ...)
MUON_ATTR_FORMAT(printf, 2, 3);
void str_app(struct workspace *wk, obj *s, const char *str);
void str_appf(struct workspace *wk, obj *s, const char *fmt, ...)
MUON_ATTR_FORMAT(printf, 3, 4);
void str_appn(struct workspace *wk, obj *s, const char *str, uint32_t n);
obj str_clone(struct workspace *wk_src, struct workspace *wk_dest, obj val);
obj str_clone_mutable(struct workspace *wk, obj val);
bool str_eql(const struct str *ss1, const struct str *ss2);
bool str_eql_glob(const struct str *ss1, const struct str *ss2);
bool str_startswith(const struct str *ss, const struct str *pre);
bool str_startswithi(const struct str *ss, const struct str *pre);
bool str_endswith(const struct str *ss, const struct str *suf);
bool str_endswithi(const struct str *ss, const struct str *suf);
obj str_join(struct workspace *wk, obj s1, obj s2);
bool str_to_i(const struct str *ss, int64_t *res, bool strip);
obj str_split(struct workspace *wk, const struct str *ss, const struct str *split);
obj str_strip(struct workspace *wk, const struct str *ss, const struct str *strip);
obj str_split_strip(struct workspace *wk, const struct str *ss, const struct str *split, const struct str *strip);
bool is_whitespace(char c);
#endif