tregsub.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tregsub.c (1106B)
       ---
            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 regsub(char *sp,        /* source string */
            7         char *dp,        /* destination string */
            8         int dlen,
            9         Resub *mp,        /* subexpression elements */
           10         int ms)                /* number of elements pointed to by mp */
           11 {
           12         char *ssp, *ep;
           13         int i;
           14 
           15         ep = dp+dlen-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.sp != 0 && ms>i)
           31                                         for(ssp = mp[i].s.sp;
           32                                              ssp < mp[i].e.ep;
           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.sp != 0 && ms>0)
           51                                 for(ssp = mp[0].s.sp;
           52                                      ssp < mp[0].e.ep; 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 }