summaryrefslogtreecommitdiff
path: root/examples/stringv.c
blob: ff5d376c058c96a2edf795898b3cd9211a0726ba (plain)
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;
}