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