annotate src/util.cc @ 32:93224b26a0ee default tip

player: efforts towards C-ization
author Paper <paper@tflc.us>
date Mon, 10 Feb 2025 19:17:29 -0500
parents a76e55e098d1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
1 #include "animone/util.h"
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
2
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
3 #include <string.h>
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
4
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
5 #include <regex> // FIXME use a C library for this
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
6
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
7 int animone_internal_util_ReadFile(const char *path, char **data, size_t *size)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
8 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
9 // whatever
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
10 size_t sz_local;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
11 if (!size)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
12 size = &sz_local;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
13
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
14 FILE *f = fopen(path, "r");
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
15 if (!f)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
16 return 0;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
17
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
18 fseek(f, 0, SEEK_END);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
19 long end = ftell(f);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
20 if (end < 0)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
21 return 0;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
22 fseek(f, 0, SEEK_SET);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
23
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
24 *size = end;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
25
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
26 if (data) {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
27 // add a NUL terminator anyway
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
28 *data = (char *)malloc(end + 1);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
29 if (!*data) {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
30 *size = 0;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
31 return 0;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
32 }
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
33
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
34 *size = fread(*data, 1, *size, f);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
35 (*data)[*size] = '\0';
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
36 }
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
37
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
38 return 1;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
39 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
40
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
41 static inline unsigned char _animone_internal_tolower(unsigned char c)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
42 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
43 return (c >= 'A' && c <= 'Z') ? (c | 0x20) : c;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
44 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
45
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
46 /* this is, in essence, strcasecmp. */
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
47 int animone_internal_util_EqualStrings(const char *str1, const char *str2)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
48 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
49 unsigned char c1, c2;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
50
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
51 do {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
52 c1 = _animone_internal_tolower(*str1++);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
53 c2 = _animone_internal_tolower(*str2++);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
54 } while (c1 == c2 && c1);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
55
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
56 return !!(c1 - c2);
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
57 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
58
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
59 char *animone_internal_Stem(const char *filename)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
60 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
61 const char *ptr = strrchr(filename, '.');
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
62 if (!ptr)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
63 return NULL;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
64
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
65 size_t len = ptr - filename;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
66
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
67 char *stem = (char *)malloc(len + 1);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
68 if (!stem)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
69 return NULL;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
70
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
71 memcpy(stem, filename, len);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
72 stem[len] = '\0';
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
73
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
74 return stem;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
75 }
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
76
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
77 int animone_internal_util_CheckPattern(const char *pattern, const char *str)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
78 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
79 switch (*pattern) {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
80 case '\0': return 0;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
81 case '^':
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
82 // FIXME: Convert to C
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
83 if (std::regex_match(std::string(str), std::regex(pattern)))
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
84 return 1;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
85 default:
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
86 break;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
87 }
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
88
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
89 return animone_internal_util_EqualStrings(pattern, str);
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
90 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
91
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
92 /* Modifies `str` inplace */
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
93 int animone_internal_util_TrimLeft(char *str, const char* chars)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
94 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
95 if (!str || !*str)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
96 return 0;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
97
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
98 const size_t found = strcspn(str, chars);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
99 const size_t len = strlen(str);
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
100
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
101 if (found == len)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
102 return 1; // nothing to do
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
103
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
104 memmove(str, str + found, len - found);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
105 str[len - found] = '\0';
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
106
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
107 return 1;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
108 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
109
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
110 // reverse version of strcspn
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
111 static inline size_t _animone_internal_strrcspn(const char *str1, const char *str2)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
112 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
113 const size_t str1len = strlen(str1);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
114 ptrdiff_t i; /* FIXME: this should be using size_t */
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
115
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
116 for (i = str1len - 1; i >= 0; i--) {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
117 size_t found = strcspn(str1 + i, str2);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
118 if (found != str1len - i)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
119 return i;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
120 }
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
121
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
122 return str1len;
14
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
123 }
27b988a1048c *: convert all files CRLF -> LF
Paper <paper@paper.us.eu.org>
parents: 0
diff changeset
124
30
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
125 int animone_internal_util_TrimRight(char *str, const char* chars)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
126 {
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
127 if (!str || !*str)
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
128 return 0;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
129
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
130 // We can get away without really moving memory around here.
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
131 // The old version simply used std::string::find_last_not_of,
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
132 // which I'm fairly sure isn't the intention of this function
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
133 // (for example find_last_not_of("gb ") returns "gb ").
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
134 const size_t found = _animone_internal_strrcspn(str, chars);
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
135 str[found] = '\0';
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
136
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
137 return 1;
a76e55e098d1 util: rewrite functions in C-ish
Paper <paper@tflc.us>
parents: 14
diff changeset
138 }