2 * Functions to deal with ptrlens.
8 bool ptrlen_eq_string(ptrlen pl
, const char *str
)
10 size_t len
= strlen(str
);
11 return (pl
.len
== len
&& !memcmp(pl
.ptr
, str
, len
));
14 bool ptrlen_eq_ptrlen(ptrlen pl1
, ptrlen pl2
)
16 return (pl1
.len
== pl2
.len
&& !memcmp(pl1
.ptr
, pl2
.ptr
, pl1
.len
));
19 int ptrlen_strcmp(ptrlen pl1
, ptrlen pl2
)
21 size_t minlen
= pl1
.len
< pl2
.len
? pl1
.len
: pl2
.len
;
22 if (minlen
) { /* tolerate plX.ptr==NULL as long as plX.len==0 */
23 int cmp
= memcmp(pl1
.ptr
, pl2
.ptr
, minlen
);
27 return pl1
.len
< pl2
.len
? -1 : pl1
.len
> pl2
.len
? +1 : 0;
30 bool ptrlen_startswith(ptrlen whole
, ptrlen prefix
, ptrlen
*tail
)
32 if (whole
.len
>= prefix
.len
&&
33 !memcmp(whole
.ptr
, prefix
.ptr
, prefix
.len
)) {
35 tail
->ptr
= (const char *)whole
.ptr
+ prefix
.len
;
36 tail
->len
= whole
.len
- prefix
.len
;
43 bool ptrlen_endswith(ptrlen whole
, ptrlen suffix
, ptrlen
*tail
)
45 if (whole
.len
>= suffix
.len
&&
46 !memcmp((char *)whole
.ptr
+ (whole
.len
- suffix
.len
),
47 suffix
.ptr
, suffix
.len
)) {
49 tail
->ptr
= whole
.ptr
;
50 tail
->len
= whole
.len
- suffix
.len
;
57 bool ptrlen_contains(ptrlen input
, const char *characters
)
59 for (const char *p
= input
.ptr
, *end
= p
+ input
.len
; p
< end
; p
++)
60 if (strchr(characters
, *p
))
65 bool ptrlen_contains_only(ptrlen input
, const char *characters
)
67 for (const char *p
= input
.ptr
, *end
= p
+ input
.len
; p
< end
; p
++)
68 if (!strchr(characters
, *p
))
73 ptrlen
ptrlen_get_word(ptrlen
*input
, const char *separators
)
75 const char *p
= input
->ptr
, *end
= p
+ input
->len
;
78 while (p
< end
&& strchr(separators
, *p
))
81 while (p
< end
&& !strchr(separators
, *p
))
83 toret
.len
= p
- (const char *)toret
.ptr
;
85 size_t to_consume
= p
- (const char *)input
->ptr
;
86 assert(to_consume
<= input
->len
);
87 input
->ptr
= (const char *)input
->ptr
+ to_consume
;
88 input
->len
-= to_consume
;
93 char *mkstr(ptrlen pl
)
95 char *p
= snewn(pl
.len
+ 1, char);
96 memcpy(p
, pl
.ptr
, pl
.len
);
101 bool strstartswith(const char *s
, const char *t
)
103 return !strncmp(s
, t
, strlen(t
));
106 bool strendswith(const char *s
, const char *t
)
108 size_t slen
= strlen(s
), tlen
= strlen(t
);
109 return slen
>= tlen
&& !strcmp(s
+ (slen
- tlen
), t
);