Ruby 4.1.0dev (2026-04-06 revision a371a207f1e2ce536ce6d1e68dba3071387a952c)
stringy.c
1#include "prism/internal/stringy.h"
2
3#include "prism/internal/allocator.h"
4
5#include <assert.h>
6#include <stdlib.h>
7#include <string.h>
8
12void
13pm_string_shared_init(pm_string_t *string, const uint8_t *start, const uint8_t *end) {
14 assert(start <= end);
15
16 *string = (pm_string_t) {
17 .type = PM_STRING_SHARED,
18 .source = start,
19 .length = (size_t) (end - start)
20 };
21}
22
26void
27pm_string_owned_init(pm_string_t *string, uint8_t *source, size_t length) {
28 *string = (pm_string_t) {
29 .type = PM_STRING_OWNED,
30 .source = source,
31 .length = length
32 };
33}
34
38void
39pm_string_constant_init(pm_string_t *string, const char *source, size_t length) {
40 *string = (pm_string_t) {
41 .type = PM_STRING_CONSTANT,
42 .source = (const uint8_t *) source,
43 .length = length
44 };
45}
46
53int
54pm_string_compare(const pm_string_t *left, const pm_string_t *right) {
55 size_t left_length = pm_string_length(left);
56 size_t right_length = pm_string_length(right);
57
58 if (left_length < right_length) {
59 return -1;
60 } else if (left_length > right_length) {
61 return 1;
62 }
63
64 return memcmp(pm_string_source(left), pm_string_source(right), left_length);
65}
66
70size_t
71pm_string_length(const pm_string_t *string) {
72 return string->length;
73}
74
78const uint8_t *
79pm_string_source(const pm_string_t *string) {
80 return string->source;
81}
82
86void
87pm_string_cleanup(pm_string_t *string) {
88 if (string->type == PM_STRING_OWNED) {
89 xfree_sized((void *) string->source, string->length);
90 }
91}
A generic string type that can have various ownership semantics.
Definition stringy.h:18
const uint8_t * source
A pointer to the start of the string.
Definition stringy.h:20
size_t length
The length of the string in bytes of memory.
Definition stringy.h:23
enum pm_string_t::@110 type
The type of the string.