#ifndef PK_STR_H #define PK_STR_H #include "pkmem.h" /* deleteme */ #include struct pk_str { char *val; uint32_t length; uint32_t reserved; }; struct pk_cstr { const char *val; uint32_t length; uint32_t reserved; }; struct pk_str cstring_to_pk_str(char *s); struct pk_cstr cstring_to_pk_cstr(const char *s); struct pk_str pk_cstr_to_pk_str(const struct pk_cstr *s); struct pk_cstr pk_str_to_pk_cstr(const struct pk_str *s); struct pk_str pk_str_clone(const struct pk_str *s, struct pk_membucket *bkt); struct pk_cstr pk_cstr_clone(const struct pk_cstr *s, struct pk_membucket *bkt); int pk_compare_str(const struct pk_str *lhs, const struct pk_str *rhs); int pk_compare_cstr(const struct pk_cstr *lhs, const struct pk_cstr *rhs); #endif /* PK_STR_H */ #ifdef PK_IMPL_STR #include "./pkmacros.h" /* deleteme */ #include struct pk_str cstring_to_pk_str(char *s) { struct pk_str ret; ret.val = s; ret.length = (uint32_t)(strlen(s)); ret.reserved = 0; return ret; } struct pk_cstr cstring_to_pk_cstr(const char *s) { struct pk_cstr ret; ret.val = s; ret.length = (uint32_t)(strlen(s)); ret.reserved = 0; return ret; } struct pk_str pk_cstr_to_pk_str(const struct pk_cstr *s) { struct pk_str ret; ret.val = (char *)s->val; ret.length = s->length; ret.reserved = s->reserved; return ret; } struct pk_cstr pk_str_to_pk_cstr(const struct pk_str *s) { struct pk_cstr ret; ret.val = (char *)s->val; ret.length = s->length; ret.reserved = s->reserved; return ret; } struct pk_str pk_str_clone(const struct pk_str *s, struct pk_membucket *bkt) { struct pk_str str; str.length = s->length == 0 ? strlen(s->val) : s->length; str.reserved = s->length + 1; char *ss = (char*)pk_new(str.reserved * sizeof(char), alignof(char), bkt); strncpy(ss, s->val, str.reserved); str.val = ss; return str; } struct pk_cstr pk_cstr_clone(const struct pk_cstr *s, struct pk_membucket *bkt) { struct pk_cstr str; str.length = s->length == 0 ? strlen(s->val) : s->length; str.reserved = s->length + 1; char *ss = (char*)pk_new(str.reserved * sizeof(char), alignof(char), bkt); strncpy(ss, s->val, str.reserved); str.val = ss; return str; } int pk_compare_str(const struct pk_str *lhs, const struct pk_str *rhs) { return strncmp(lhs->val, rhs->val, PK_MIN(lhs->length, rhs->length)); } int pk_compare_cstr(const struct pk_cstr *lhs, const struct pk_cstr *rhs) { return strncmp(lhs->val, rhs->val, PK_MIN(lhs->length, rhs->length)); } #endif /* PK_IMPL_STR */