1 #ifndef RLANG_NODE_H
2 #define RLANG_NODE_H
3
4
r_node_car(sexp * x)5 static inline sexp* r_node_car(sexp* x) { return CAR(x); }
r_node_cdr(sexp * x)6 static inline sexp* r_node_cdr(sexp* x) { return CDR(x); }
r_node_tag(sexp * x)7 static inline sexp* r_node_tag(sexp* x) { return TAG(x); }
r_node_caar(sexp * x)8 static inline sexp* r_node_caar(sexp* x) { return CAAR(x); }
r_node_cadr(sexp * x)9 static inline sexp* r_node_cadr(sexp* x) { return CADR(x); }
r_node_cdar(sexp * x)10 static inline sexp* r_node_cdar(sexp* x) { return CDAR(x); }
r_node_cddr(sexp * x)11 static inline sexp* r_node_cddr(sexp* x) { return CDDR(x); }
12
13 static inline
r_node_poke_car(sexp * x,sexp * newcar)14 sexp* r_node_poke_car(sexp* x, sexp* newcar) {
15 SETCAR(x, newcar);
16 return x;
17 }
18 static inline
r_node_poke_cdr(sexp * x,sexp * newcdr)19 sexp* r_node_poke_cdr(sexp* x, sexp* newcdr) {
20 SETCDR(x, newcdr);
21 return x;
22 }
23 static inline
r_node_poke_tag(sexp * x,sexp * tag)24 sexp* r_node_poke_tag(sexp* x, sexp* tag) {
25 SET_TAG(x, tag);
26 return x;
27 }
28 static inline
r_node_poke_caar(sexp * x,sexp * newcaar)29 sexp* r_node_poke_caar(sexp* x, sexp* newcaar) {
30 SETCAR(CAR(x), newcaar);
31 return x;
32 }
33 static inline
r_node_poke_cadr(sexp * x,sexp * newcar)34 sexp* r_node_poke_cadr(sexp* x, sexp* newcar) {
35 SETCADR(x, newcar);
36 return x;
37 }
38 static inline
r_node_poke_cdar(sexp * x,sexp * newcdar)39 sexp* r_node_poke_cdar(sexp* x, sexp* newcdar) {
40 SETCDR(CAR(x), newcdar);
41 return x;
42 }
43 static inline
r_node_poke_cddr(sexp * x,sexp * newcdr)44 sexp* r_node_poke_cddr(sexp* x, sexp* newcdr) {
45 SETCDR(CDR(x), newcdr);
46 return x;
47 }
48
49 static inline
r_new_node(sexp * car,sexp * cdr)50 sexp* r_new_node(sexp* car, sexp* cdr) {
51 return Rf_cons(car, cdr);
52 }
53 static inline
r_new_node3(sexp * car,sexp * cdr,sexp * tag)54 sexp* r_new_node3(sexp* car, sexp* cdr, sexp* tag) {
55 sexp* out = Rf_cons(car, cdr);
56 SET_TAG(out, tag);
57 return out;
58 }
59
r_pairlist(sexp * car)60 static inline sexp* r_pairlist(sexp* car) {
61 return Rf_list1(car);
62 }
r_pairlist2(sexp * car1,sexp * car2)63 static inline sexp* r_pairlist2(sexp* car1, sexp* car2) {
64 return Rf_list2(car1, car2);
65 }
r_pairlist3(sexp * car1,sexp * car2,sexp * car3)66 static inline sexp* r_pairlist3(sexp* car1, sexp* car2, sexp* car3) {
67 return Rf_list3(car1, car2, car3);
68 }
69
70 sexp* r_pairlist_find(sexp* node, sexp* tag);
71 sexp* r_pairlist_rev(sexp* node);
72
73 static inline
r_pairlist_get(sexp * node,sexp * tag)74 sexp* r_pairlist_get(sexp* node, sexp* tag) {
75 return r_node_car(r_pairlist_find(node, tag));
76 }
77
78 static inline
r_pairlist_find_last(sexp * x)79 sexp* r_pairlist_find_last(sexp* x) {
80 while (CDR(x) != R_NilValue)
81 x = CDR(x);
82 return x;
83 }
84
85 sexp* r_node_tree_clone(sexp* x);
86 sexp* r_pairlist_clone_until(sexp* node, sexp* sentinel, sexp** sentinel_out);
87
88
89 #endif
90