Re: User-relative paths
From: "H. Peter Anvin" <hpa@zytor.com>
Date: 2016-06-15 22:42:09
Linus Torvalds wrote:
On Sun, 23 Oct 2005, H. Peter Anvin wrote:quoted
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;
}