8 regex_t regex
; /* the combined regular expression */
9 int n
; /* number of regular expressions in this set */
10 int *grp
; /* the group assigned to each subgroup */
11 int *setgrpcnt
; /* number of groups in each regular expression */
12 int grpcnt
; /* group count */
15 static int re_groupcount(char *s
)
21 if (s
[0] == '\\' && s
[1])
28 struct reset
*reset_make(int n
, char **re
)
30 struct reset
*rs
= malloc(sizeof(*rs
));
31 struct sbuf
*sb
= sbuf_make();
33 memset(rs
, 0, sizeof(*rs
));
34 rs
->grp
= malloc((n
+ 1) * sizeof(rs
->grp
[0]));
35 rs
->setgrpcnt
= malloc((n
+ 1) * sizeof(rs
->setgrpcnt
[0]));
39 for (i
= 0; i
< n
; i
++) {
50 rs
->grp
[i
] = rs
->grpcnt
;
51 rs
->setgrpcnt
[i
] = re_groupcount(re
[i
]);
52 rs
->grpcnt
+= 1 + rs
->setgrpcnt
[i
];
54 rs
->grp
[n
] = rs
->grpcnt
;
56 if (regcomp(&rs
->regex
, sbuf_buf(sb
), REG_EXTENDED
)) {
67 int reset_find(struct reset
*rs
, char *s
, int n
, int *grps
, int flg
)
70 int found
, i
, set
= -1;
73 subs
= malloc(rs
->grpcnt
* sizeof(subs
[0]));
74 found
= !regexec(&rs
->regex
, s
, rs
->grpcnt
, subs
, 0);
75 for (i
= 0; found
&& i
< rs
->n
; i
++)
76 if (rs
->grp
[i
] >= 0 && subs
[rs
->grp
[i
]].rm_so
>= 0)
78 if (found
&& set
>= 0) {
79 for (i
= 0; i
< n
; i
++) {
80 int grp
= rs
->grp
[set
] + i
;
81 if (i
< rs
->setgrpcnt
[set
] + 1) {
82 grps
[i
* 2] = subs
[grp
].rm_so
;
83 grps
[i
* 2 + 1] = subs
[grp
].rm_eo
;
94 void reset_free(struct reset
*rs
)