first usable version of kernel and commands
After an year of hard work, this is a first "usable" version of Jehanne.
This commit is contained in:
72
sys/src/lib/regexp/regsub.c
Normal file
72
sys/src/lib/regexp/regsub.c
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* This file is part of the UCB release of Plan 9. It is subject to the license
|
||||
* terms in the LICENSE file found in the top-level directory of this
|
||||
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
|
||||
* part of the UCB release of Plan 9, including this file, may be copied,
|
||||
* modified, propagated, or distributed except according to the terms contained
|
||||
* in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include <u.h>
|
||||
#include <libc.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 */
|
||||
{
|
||||
char *ssp, *ep;
|
||||
int i;
|
||||
|
||||
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;
|
||||
}
|
||||
}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;
|
||||
}
|
||||
sp++;
|
||||
}
|
||||
*dp = '\0';
|
||||
}
|
Reference in New Issue
Block a user