4223
|
1 #include "IO.h"
|
|
2 #include "Str.h"
|
|
3 #include "main_io.h"
|
|
4 #include "main_opt.h"
|
|
5 #include "match.h"
|
|
6 #include "re.h"
|
|
7 #include "run.h"
|
|
8 #include "val.h"
|
|
9
|
|
10 void do_match(struct val *v, t_regex *re) {
|
|
11 size_t mstart, mend;
|
|
12 size_t i;
|
|
13 size_t bra;
|
|
14
|
|
15 if (V_EXT_P(v)) {
|
|
16 if (Opt.debug & DBG_REGEX) {
|
|
17 V_STR(v);
|
|
18 io_write_s(Err, "match: <<");
|
|
19 io_write_m(Err, ko_ptr(v->ko), ko_length(v->ko));
|
|
20 io_write_m(Err, "\n", 1);
|
|
21 }
|
|
22
|
|
23 if (!(io_bufred(v->magic.ext) && re_iomatch(re, v->magic.ext, &mstart, &mend))) {
|
|
24 if (Opt.debug & DBG_REGEX) {
|
|
25 io_write_s(Err, "...failed\n");
|
|
26 }
|
|
27 while (Interp.match.length) {
|
|
28 --Interp.match.length;
|
|
29 v_end(&Interp.match.matches[Interp.match.length]);
|
|
30 }
|
|
31 v->type = V_UNDEF;
|
|
32 return;
|
|
33 }
|
|
34
|
|
35 if (Opt.debug & DBG_REGEX) {
|
|
36 io_write_s(Err, "...success!\n");
|
|
37 }
|
|
38 v_set_n(&Interp.result, mend);
|
|
39
|
|
40 bra = re_cabra(re);
|
|
41 if (Interp.match.size < bra) {
|
|
42 Interp.match.matches = xrealloc(Interp.match.matches, Interp.match.size = bra);
|
|
43 }
|
|
44 if (Interp.m_start.size < bra) {
|
|
45 Interp.m_start.index = xrealloc(Interp.m_start.index, Interp.m_start.size = bra);
|
|
46 }
|
|
47 if (Interp.m_end.size < bra) {
|
|
48 Interp.m_end.index = xrealloc(Interp.m_end.index, Interp.m_end.size = bra);
|
|
49 }
|
|
50
|
|
51 for (i = 0; i < bra; ++i) {
|
|
52 size_t ms, me;
|
|
53
|
|
54 if (re_backref(re, i, &ms, &me)) {
|
|
55 if (i < Interp.match.length) {
|
|
56 v_set_undef(&Interp.match.matches[i]);
|
|
57 } else {
|
|
58 v_init(&Interp.match.matches[Interp.match.length++]);
|
|
59 }
|
|
60 Interp.m_start.index[i] = -1;
|
|
61 Interp.m_end.index[i] = -1;
|
|
62 } else {
|
|
63 if (i >= Interp.match.length) {
|
|
64 v_init(&Interp.match.matches[Interp.match.length++]);
|
|
65 }
|
|
66 v_set_m(&Interp.match.matches[i], io_bufptr(v->magic.ext) + ms, me - ms);
|
|
67 Interp.m_start.index[i] = ms;
|
|
68 Interp.m_end.index[i] = me;
|
|
69 }
|
|
70 }
|
|
71
|
|
72 io_read(v->magic.ext, NULL, mend);
|
|
73 V_xxx_OFF(v);
|
|
74 } else {
|
|
75 String tmp;
|
|
76
|
|
77 V_STR(v);
|
|
78 V_xxx_OFF(v);
|
|
79
|
|
80 St_fake(&tmp, (char *)ko_ptr(v->ko), ko_length(v->ko));
|
|
81
|
|
82 if (Opt.debug & DBG_REGEX) {
|
|
83 io_write_s(Err, "match: \"");
|
|
84 io_write(Err, &tmp);
|
|
85 io_write_s(Err, "\"\n");
|
|
86 }
|
|
87
|
|
88 if (!re_match(re, &tmp, &mstart, &mend)) {
|
|
89 if (Opt.debug & DBG_REGEX) {
|
|
90 io_write_s(Err, "...failed\n");
|
|
91 }
|
|
92 while (Interp.match.length) {
|
|
93 --Interp.match.length;
|
|
94 v_end(&Interp.match.matches[Interp.match.length]);
|
|
95 }
|
|
96 v->type = V_UNDEF;
|
|
97 return;
|
|
98 }
|
|
99
|
|
100 if (Opt.debug & DBG_REGEX) {
|
|
101 io_write_s(Err, "...success!\n");
|
|
102 }
|
|
103 v_set_n(&Interp.result, mend);
|
|
104
|
|
105 bra = re_cabra(re);
|
|
106 if (Interp.match.size < bra) {
|
|
107 Interp.match.matches = xrealloc(Interp.match.matches, Interp.match.size = bra);
|
|
108 }
|
|
109 if (Interp.m_start.size < bra) {
|
|
110 Interp.m_start.index = xrealloc(Interp.m_start.index, Interp.m_start.size = bra);
|
|
111 }
|
|
112 if (Interp.m_end.size < bra) {
|
|
113 Interp.m_end.index = xrealloc(Interp.m_end.index, Interp.m_end.size = bra);
|
|
114 }
|
|
115
|
|
116 for (i = 0; i < bra; ++i) {
|
|
117 size_t ms, me;
|
|
118
|
|
119 if (re_backref(re, i, &ms, &me)) {
|
|
120 if (i < Interp.match.length) {
|
|
121 v_set_undef(&Interp.match.matches[i]);
|
|
122 } else {
|
|
123 v_init(&Interp.match.matches[Interp.match.length++]);
|
|
124 }
|
|
125 Interp.m_start.index[i] = -1;
|
|
126 Interp.m_end.index[i] = -1;
|
|
127 } else {
|
|
128 if (i >= Interp.match.length) {
|
|
129 v_init(&Interp.match.matches[Interp.match.length++]);
|
|
130 }
|
|
131 v_set_m(&Interp.match.matches[i], ko_ptr(v->ko) + ms, me - ms);
|
|
132 Interp.m_start.index[i] = ms;
|
|
133 Interp.m_end.index[i] = me;
|
|
134 }
|
|
135 }
|
|
136 }
|
|
137
|
|
138 if (!mstart) {
|
|
139 ko_cpy_m(v->ko, "0.", 2);
|
|
140 v->num = 0.0;
|
|
141 v->type = V_STR_K | V_NUM_K;
|
|
142 return;
|
|
143 }
|
|
144
|
|
145 v->num = mstart;
|
|
146 v->type = V_NUM_K;
|
|
147 }
|