Blame


1 b2cfc4e2 2003-09-30 devnull #include "lib9.h"
2 b2cfc4e2 2003-09-30 devnull #include "regexp9.h"
3 b2cfc4e2 2003-09-30 devnull
4 b2cfc4e2 2003-09-30 devnull /* substitute into one string using the matches from the last regexec() */
5 b2cfc4e2 2003-09-30 devnull extern void
6 b2cfc4e2 2003-09-30 devnull rregsub(Rune *sp, /* source string */
7 b2cfc4e2 2003-09-30 devnull Rune *dp, /* destination string */
8 62390091 2004-03-05 devnull int dlen,
9 b2cfc4e2 2003-09-30 devnull Resub *mp, /* subexpression elements */
10 b2cfc4e2 2003-09-30 devnull int ms) /* number of elements pointed to by mp */
11 b2cfc4e2 2003-09-30 devnull {
12 62390091 2004-03-05 devnull Rune *ssp, *ep;
13 b2cfc4e2 2003-09-30 devnull int i;
14 b2cfc4e2 2003-09-30 devnull
15 62390091 2004-03-05 devnull ep = dp+(dlen/sizeof(Rune))-1;
16 b2cfc4e2 2003-09-30 devnull while(*sp != '\0'){
17 b2cfc4e2 2003-09-30 devnull if(*sp == '\\'){
18 b2cfc4e2 2003-09-30 devnull switch(*++sp){
19 b2cfc4e2 2003-09-30 devnull case '0':
20 b2cfc4e2 2003-09-30 devnull case '1':
21 b2cfc4e2 2003-09-30 devnull case '2':
22 b2cfc4e2 2003-09-30 devnull case '3':
23 b2cfc4e2 2003-09-30 devnull case '4':
24 b2cfc4e2 2003-09-30 devnull case '5':
25 b2cfc4e2 2003-09-30 devnull case '6':
26 b2cfc4e2 2003-09-30 devnull case '7':
27 b2cfc4e2 2003-09-30 devnull case '8':
28 b2cfc4e2 2003-09-30 devnull case '9':
29 b2cfc4e2 2003-09-30 devnull i = *sp-'0';
30 1b68dbef 2016-11-02 rsc if(mp!=0 && mp[i].s.rsp != 0 && ms>i)
31 b2cfc4e2 2003-09-30 devnull for(ssp = mp[i].s.rsp;
32 b2cfc4e2 2003-09-30 devnull ssp < mp[i].e.rep;
33 b2cfc4e2 2003-09-30 devnull ssp++)
34 62390091 2004-03-05 devnull if(dp < ep)
35 62390091 2004-03-05 devnull *dp++ = *ssp;
36 b2cfc4e2 2003-09-30 devnull break;
37 b2cfc4e2 2003-09-30 devnull case '\\':
38 62390091 2004-03-05 devnull if(dp < ep)
39 62390091 2004-03-05 devnull *dp++ = '\\';
40 b2cfc4e2 2003-09-30 devnull break;
41 b2cfc4e2 2003-09-30 devnull case '\0':
42 b2cfc4e2 2003-09-30 devnull sp--;
43 b2cfc4e2 2003-09-30 devnull break;
44 b2cfc4e2 2003-09-30 devnull default:
45 62390091 2004-03-05 devnull if(dp < ep)
46 62390091 2004-03-05 devnull *dp++ = *sp;
47 b2cfc4e2 2003-09-30 devnull break;
48 b2cfc4e2 2003-09-30 devnull }
49 1b68dbef 2016-11-02 rsc }else if(*sp == '&'){
50 1b68dbef 2016-11-02 rsc if(mp!=0 && mp[0].s.rsp != 0 && ms>0)
51 b2cfc4e2 2003-09-30 devnull for(ssp = mp[0].s.rsp;
52 b2cfc4e2 2003-09-30 devnull ssp < mp[0].e.rep; ssp++)
53 62390091 2004-03-05 devnull if(dp < ep)
54 62390091 2004-03-05 devnull *dp++ = *ssp;
55 62390091 2004-03-05 devnull }else{
56 62390091 2004-03-05 devnull if(dp < ep)
57 62390091 2004-03-05 devnull *dp++ = *sp;
58 62390091 2004-03-05 devnull }
59 b2cfc4e2 2003-09-30 devnull sp++;
60 b2cfc4e2 2003-09-30 devnull }
61 b2cfc4e2 2003-09-30 devnull *dp = '\0';
62 b2cfc4e2 2003-09-30 devnull }