Re: User-relative paths
- From
- H. Peter Anvin <hpa@zytor.com>
- Date
- Oct 24, 2005, 01:44 UTC
- Message-ID
- <435C3C6D.7000201@zytor.com>
- In-Reply-To
- <Pine.LNX.4.64.0510231836020.10477@g5.osdl.org>
Linus Torvalds wrote:
Show 9 quoted lines
> > On Sun, 23 Oct 2005, H. Peter Anvin wrote: > >>If this is meant to dequote shell-quoted paths, it really should be modal. > > It _only_ accepts quoted strings, so it "is" modal. It has one mode: > string. And it's a bitch about enforcing it, too (it just dies if it > wasn't one). >
That wasn't what I meant. '...' is a modal escape in the shell. Thus, something like this which actually mimics the state machine, at least for the potential characters we care about.
#define EMIT(x) { ( ++len < n ) && *dst++ = (x) )int unquote(char *dst, size_t n, const char *src)
{
enum state st = { st_zero, st_quote, st_escape };
int len = 0;
char c;
while ( (c = *src++) ) {
switch ( st ) {
case st_zero:
if ( c == '\'' )
st = st_quote;
else if ( c == '\\' )
st = st_escape;
else
EMIT(c);
break;
case st_quote:
if ( c == '\'' )
st = st_zero;
else
EMIT(c);
break;
case st_escape:
EMIT(c);
st = st_zero;
break;
}
}
if ( n )
*dst = 0;
return (st == st_zero) ? len : -1;
}