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