Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Mar 2017 13:34:31 -0600
From:      Ian Lepore <ian@freebsd.org>
To:        Roman Divacky <rdivacky@freebsd.org>, Warner Losh <imp@FreeBSD.org>
Cc:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r315773 - head/sbin/devd
Message-ID:  <1490297671.58015.102.camel@freebsd.org>
In-Reply-To: <20170323185853.GA87388@vlakno.cz>
References:  <201703230236.v2N2apvX051799@repo.freebsd.org> <20170323185853.GA87388@vlakno.cz>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 2017-03-23 at 19:58 +0100, Roman Divacky wrote:
> On Thu, Mar 23, 2017 at 02:36:51AM +0000, Warner Losh wrote:
> > 
> > Author: imp
> > Date: Thu Mar 23 02:36:51 2017
> > New Revision: 315773
> > URL: https://svnweb.freebsd.org/changeset/base/315773
> > 
> > Log:
> >   Implement quote escaping. String values may now contain " if you
> >   it is preceded by \.
> >   
> >   foo="I \"like\" C++"
> >   
> >   gives the value 'I "like" C++' to the variable 'foo'. If a
> > character
> >   other than " follows the \, both the \ and that character are
> > passed
> >   through.
> >   
> >   Differential Revision: https://reviews.freebsd.org/D6286
> >   Sponsored by: Netflix
> > 
> > Modified:
> >   head/sbin/devd/devd.cc
> >   head/sbin/devd/devd.hh
> > 
> > Modified: head/sbin/devd/devd.cc
> > ===================================================================
> > ===========
> > --- head/sbin/devd/devd.cc	Thu Mar 23 02:33:27 2017	(
> > r315772)
> > +++ head/sbin/devd/devd.cc	Thu Mar 23 02:36:51 2017	(
> > r315773)
> > @@ -411,6 +411,32 @@ var_list::is_set(const string &var) cons
> >  	return (_vars.find(var) != _vars.end());
> >  }
> >  
> > +/** fix_value
> > + *
> > + * Removes quoted characters that have made it this far. \" are
> > + * converted to ". For all other characters, both \ and following
> > + * character. So the string 'fre\:\"' is translated to 'fred\:"'.
> > + */
> > +const std::string &
> > +var_list::fix_value(const std::string &val) const
> > +{
> > +	char *tmp, *dst;
> > +	const char *src;
> > +	std::string *rv;
> > +
> > +	dst = tmp = new char[val.length()];
> > +	src = val.c_str();
> > +	while (*src) {
> > +		if (*src == '\\' && src[1] == '"')
> > +			src++;
> > +		else
> > +			*dst++ = *src++;
> > +	}
> > +	rv = new string(tmp);
> > +	delete tmp;
> > +	return *rv;
> > +}
> Can the temporary char[] be stack allocated? Also, when returning a
> reference to
> a heap allocated string who is responsible for freeing it? Perhaps
> you can just
> return std::string and let the compiler optimize it?
> 
> Roman
> 

Returning a reference to a new'd string is not good.

IMO, the implementation of the function should take into account the
idea that embedded escaped quotes are rare.  The function should be
optimized for readability and the common case of simply copying the
string unmodified, something like:


std::string
var_list::fix_value(const std::string &val) const
{
	std::string rv(val);
	std::string::size_type pos(0);

	while ((pos = rv.find("\\\"", pos)) != rv.npos) {
		rv.erase(pos, 1);
	}
	return (rv);
}

-- Ian




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1490297671.58015.102.camel>