1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#define NONSTD_IMPLEMENTATION
#include "../nonstd.h"
#include <stdio.h>
// Helper function to print a string view
void print_sv(const char *label, stringv sv) {
printf("%s (len=%zu): \"", label, sv.length);
fwrite(sv.data, 1, sv.length, stdout);
printf("\"\n");
}
int main(void) {
// Example 1: Create string view from C string
const char *hello = "Hello, World!";
stringv sv1 = sv_from_cstr(hello);
print_sv(" sv1", sv1);
printf("\n");
// Example 2: Create view from pointer and length
const char *text = "Programming in C";
stringv sv2 = sv_from_parts(text, 11); // Only "Programming"
print_sv(" sv2", sv2);
printf("\n");
// Example 3: Slicing - extract substrings without copying
stringv original = sv_from_cstr("The quick brown fox");
stringv word1 = sv_slice(original, 0, 3); // "The"
stringv word2 = sv_slice(original, 4, 9); // "quick"
stringv word3 = sv_slice(original, 10, 15); // "brown"
print_sv(" Original", original);
print_sv(" Word 1", word1);
print_sv(" Word 2", word2);
print_sv(" Word 3", word3);
printf("\n");
// Example 4: Comparing string views
stringv str_a = sv_from_cstr("hello");
stringv str_b = sv_from_cstr("hello");
stringv str_c = sv_from_cstr("world");
printf(" str_a == str_b: %s\n", sv_equals(str_a, str_b) ? "true" : "false");
printf(" str_a == str_c: %s\n", sv_equals(str_a, str_c) ? "true" : "false");
printf("\n");
// Example 5: Prefix and suffix checking
stringv filename = sv_from_cstr("document.txt");
stringv prefix = sv_from_cstr("doc");
stringv suffix = sv_from_cstr(".txt");
stringv wrong_suffix = sv_from_cstr(".pdf");
print_sv(" Filename", filename);
printf(" Starts with 'doc': %s\n", sv_starts_with(filename, prefix) ? "yes" : "no");
printf(" Ends with '.txt': %s\n", sv_ends_with(filename, suffix) ? "yes" : "no");
printf(" Ends with '.pdf': %s\n", sv_ends_with(filename, wrong_suffix) ? "yes" : "no");
printf("\n");
// Example 6: Parsing a path (practical use case)
const char *path = "/home/user/documents/report.pdf";
stringv path_sv = sv_from_cstr(path);
// Find the last '/' to extract filename
size_t last_slash = 0;
for (size_t i = 0; i < path_sv.length; i++) {
if (path_sv.data[i] == '/') {
last_slash = i + 1;
}
}
stringv directory = sv_slice(path_sv, 0, last_slash);
stringv filename2 = sv_slice(path_sv, last_slash, path_sv.length);
print_sv(" Full path", path_sv);
print_sv(" Directory", directory);
print_sv(" Filename", filename2);
printf("\n");
// Example 7: Tokenizing without allocation
const char *sentence = "one two three four";
stringv sent_sv = sv_from_cstr(sentence);
size_t start = 0;
for (size_t i = 0; i <= sent_sv.length; i++) {
if (i == sent_sv.length || sent_sv.data[i] == ' ') {
if (i > start) {
stringv token = sv_slice(sent_sv, start, i);
print_sv(" Token", token);
}
start = i + 1;
}
}
printf("\n");
return 0;
}
|