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}