Various additions and fixes.
This commit is contained in:
parent
74f990ad84
commit
fd04aacee1
57 changed files with 2176 additions and 159 deletions
136
src/lib9/quote.c
Normal file
136
src/lib9/quote.c
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
#include <u.h>
|
||||
#include <libc.h>
|
||||
|
||||
int (*doquote)(int);
|
||||
|
||||
/* in libfmt */
|
||||
extern int __needsquotes(char*, int*);
|
||||
extern int __runeneedsquotes(Rune*, int*);
|
||||
|
||||
char*
|
||||
unquotestrdup(char *s)
|
||||
{
|
||||
char *t, *ret;
|
||||
int quoting;
|
||||
|
||||
ret = s = strdup(s); /* return unquoted copy */
|
||||
if(ret == nil)
|
||||
return ret;
|
||||
quoting = 0;
|
||||
t = s; /* s is output string, t is input string */
|
||||
while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){
|
||||
if(*t != '\''){
|
||||
*s++ = *t++;
|
||||
continue;
|
||||
}
|
||||
/* *t is a quote */
|
||||
if(!quoting){
|
||||
quoting = 1;
|
||||
t++;
|
||||
continue;
|
||||
}
|
||||
/* quoting and we're on a quote */
|
||||
if(t[1] != '\''){
|
||||
/* end of quoted section; absorb closing quote */
|
||||
t++;
|
||||
quoting = 0;
|
||||
continue;
|
||||
}
|
||||
/* doubled quote; fold one quote into two */
|
||||
t++;
|
||||
*s++ = *t++;
|
||||
}
|
||||
if(t != s)
|
||||
memmove(s, t, strlen(t)+1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Rune*
|
||||
unquoterunestrdup(Rune *s)
|
||||
{
|
||||
Rune *t, *ret;
|
||||
int quoting;
|
||||
|
||||
ret = s = runestrdup(s); /* return unquoted copy */
|
||||
if(ret == nil)
|
||||
return ret;
|
||||
quoting = 0;
|
||||
t = s; /* s is output string, t is input string */
|
||||
while(*t!='\0' && (quoting || (*t!=' ' && *t!='\t'))){
|
||||
if(*t != '\''){
|
||||
*s++ = *t++;
|
||||
continue;
|
||||
}
|
||||
/* *t is a quote */
|
||||
if(!quoting){
|
||||
quoting = 1;
|
||||
t++;
|
||||
continue;
|
||||
}
|
||||
/* quoting and we're on a quote */
|
||||
if(t[1] != '\''){
|
||||
/* end of quoted section; absorb closing quote */
|
||||
t++;
|
||||
quoting = 0;
|
||||
continue;
|
||||
}
|
||||
/* doubled quote; fold one quote into two */
|
||||
t++;
|
||||
*s++ = *t++;
|
||||
}
|
||||
if(t != s)
|
||||
memmove(s, t, (runestrlen(t)+1)*sizeof(Rune));
|
||||
return ret;
|
||||
}
|
||||
|
||||
char*
|
||||
quotestrdup(char *s)
|
||||
{
|
||||
char *t, *u, *ret;
|
||||
int quotelen;
|
||||
Rune r;
|
||||
|
||||
if(__needsquotes(s, "elen) == 0)
|
||||
return strdup(s);
|
||||
|
||||
ret = malloc(quotelen+1);
|
||||
if(ret == nil)
|
||||
return nil;
|
||||
u = ret;
|
||||
*u++ = '\'';
|
||||
for(t=s; *t; t++){
|
||||
r = *t;
|
||||
if(r == L'\'')
|
||||
*u++ = r; /* double the quote */
|
||||
*u++ = r;
|
||||
}
|
||||
*u++ = '\'';
|
||||
*u = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
Rune*
|
||||
quoterunestrdup(Rune *s)
|
||||
{
|
||||
Rune *t, *u, *ret;
|
||||
int quotelen;
|
||||
Rune r;
|
||||
|
||||
if(__runeneedsquotes(s, "elen) == 0)
|
||||
return runestrdup(s);
|
||||
|
||||
ret = malloc((quotelen+1)*sizeof(Rune));
|
||||
if(ret == nil)
|
||||
return nil;
|
||||
u = ret;
|
||||
*u++ = '\'';
|
||||
for(t=s; *t; t++){
|
||||
r = *t;
|
||||
if(r == L'\'')
|
||||
*u++ = r; /* double the quote */
|
||||
*u++ = r;
|
||||
}
|
||||
*u++ = '\'';
|
||||
*u = '\0';
|
||||
return ret;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue