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>