forked from r-lib/rlang
/
vec-chr.h
101 lines (76 loc) · 2.17 KB
/
vec-chr.h
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
98
99
100
101
#ifndef RLANG_VECTOR_CHR_H
#define RLANG_VECTOR_CHR_H
#include <string.h>
#define r_missing_str R_NaString
extern sexp* r_shared_empty_chr;
static inline sexp* r_chr_get(sexp* chr, r_ssize_t i) {
return STRING_ELT(chr, i);
}
static inline void r_chr_poke(sexp* chr, r_ssize_t i, sexp* elt) {
SET_STRING_ELT(chr, i, elt);
}
static inline const char* r_str_deref(sexp* str) {
return CHAR(str);
}
static inline const char* r_chr_get_c_string(sexp* chr, r_ssize_t i) {
return CHAR(STRING_ELT(chr, i));
}
static inline sexp* r_nms_get(sexp* nms, r_ssize_t i) {
if (nms == r_null) {
static sexp* empty_str = NULL;
if (!empty_str) empty_str = Rf_mkChar("");
return empty_str;
} else {
return r_chr_get(nms, i);
}
}
bool r_chr_has(sexp* chr, const char* c_string);
bool r_chr_has_any(sexp* chr, const char** c_strings);
sexp* r_new_character(const char** strings);
static inline sexp* r_string(const char* c_string) {
return Rf_mkChar(c_string);
}
static inline bool r_is_r_string(sexp* x) {
return r_typeof(x) == CHARSXP;
}
static inline sexp* r_scalar_chr(const char* c_string) {
return Rf_mkString(c_string);
}
static inline sexp* r_as_scalar_chr(sexp* x) {
return Rf_ScalarString(x);
}
static inline const char* r_c_string(sexp* scalar_chr) {
return CHAR(r_chr_get(scalar_chr, 0));
}
sexp* chr_prepend(sexp* chr, sexp* r_string);
sexp* chr_append(sexp* chr, sexp* r_string);
static inline bool r_is_empty_string(sexp* str) {
const char* c_str = CHAR(str);
return strcmp(c_str, "") == 0;
}
static inline bool r_chr_has_empty_string_at(sexp* chr, r_ssize_t i) {
return r_is_empty_string(r_chr_get(chr, i));
}
sexp* r_str_unserialise_unicode(sexp* r_string);
static inline bool r_is_string(sexp* x, const char* string) {
if (r_typeof(x) != r_type_character || r_length(x) != 1) {
return false;
}
if (string && strcmp(r_c_string(x), string) != 0) {
return false;
}
return true;
}
static inline sexp* r_str_as_symbol(sexp* str) {
return r_sym(Rf_translateChar(str));
}
static inline bool r_str_is_name(sexp* str) {
if (str == r_missing_str) {
return false;
}
if (r_is_empty_string(str)) {
return false;
}
return true;
}
#endif