]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/libregexp/regsub.c
New libregexp and APE ported to native
[plan9front.git] / sys / src / libregexp / regsub.c
index 2474d29894d3a8ff84fe6164a336a78efc17113e..d11d86f25a47d3320b780dda5a3de8747106478e 100644 (file)
@@ -1,63 +1,66 @@
 #include <u.h>
 #include <libc.h>
-#include "regexp.h"
+#include <regexp.h>
 
-/* substitute into one string using the matches from the last regexec() */
-extern void
-regsub(char *sp,       /* source string */
-       char *dp,       /* destination string */
-       int dlen,
-       Resub *mp,      /* subexpression elements */
-       int ms)         /* number of elements pointed to by mp */
+void
+regsub(char *src, char *dst, int dlen, Resub *match, int msize)
 {
-       char *ssp, *ep;
        int i;
+       char *ep, c;
 
-       ep = dp+dlen-1;
-       while(*sp != '\0'){
-               if(*sp == '\\'){
-                       switch(*++sp){
-                       case '0':
-                       case '1':
-                       case '2':
-                       case '3':
-                       case '4':
-                       case '5':
-                       case '6':
-                       case '7':
-                       case '8':
-                       case '9':
-                               i = *sp-'0';
-                               if(mp!=0 && mp[i].sp != 0 && ms>i)
-                                       for(ssp = mp[i].sp;
-                                            ssp < mp[i].ep;
-                                            ssp++)
-                                               if(dp < ep)
-                                                       *dp++ = *ssp;
-                               break;
-                       case '\\':
-                               if(dp < ep)
-                                       *dp++ = '\\';
-                               break;
-                       case '\0':
-                               sp--;
-                               break;
-                       default:
-                               if(dp < ep)
-                                       *dp++ = *sp;
-                               break;
+       ep = dst + dlen-1;
+       for(;*src != '\0'; src++) switch(*src) {
+       case '\\':
+               switch(*++src) {
+               case '0':
+               case '1':
+               case '2':
+               case '3':
+               case '4':
+               case '5':
+               case '6':
+               case '7':
+               case '8':
+               case '9':
+                       i = *src - '0';
+                       if(match != nil && i < msize && match[i].ep != nil) {
+                               c = *match[i].ep;
+                               *match[i].ep = '\0';
+                               dst = strecpy(dst, ep+1, match[i].sp);
+                               *match[i].ep = c;
                        }
-               }else if(*sp == '&'){
-                       if(mp!=0 && mp[0].sp != 0 && ms>0)
-                               for(ssp = mp[0].sp;
-                                    ssp < mp[0].ep; ssp++)
-                                       if(dp < ep)
-                                               *dp++ = *ssp;
-               }else{
-                       if(dp < ep)
-                               *dp++ = *sp;
+                       break;
+               case '\\':
+                       if(dst < ep)
+                               *dst++ = '\\';
+                       else
+                               goto End;
+                       break;
+               case '\0':
+                       goto End;
+               default:
+                       if(dst < ep)
+                               *dst++ = *src;
+                       else
+                               goto End;
+                       break;
                }
-               sp++;
+               break;
+       case '&':
+               if(match != nil && msize > 0 && match[0].sp != nil) {
+                       c = *match[0].ep;
+                       *match[0].ep = '\0';
+                       dst = strecpy(dst, ep+1, match[0].sp);
+                       *match[0].ep = c;
+               }
+               break;
+       default:
+               if(dst < ep)
+                       *dst++ = *src;
+               else
+                       goto End;
+               break;
        }
-       *dp = '\0';
+End:
+       *dst = '\0';
 }