[Mesa-dev] [PATCH v6 1/3] util: Add util_strlcpy

Robert Foss robert.foss at collabora.com
Thu Jul 6 18:52:34 UTC 2017


On Wed, 2017-07-05 at 08:46 -0600, Brian Paul wrote:
> On 07/05/2017 12:57 AM, Robert Foss wrote:
> > Add local strlcpy implementation.
> > 
> > Signed-off-by: Robert Foss <robert.foss at collabora.com>
> > ---
> > Changes since v5:
> >    Actually include changes from v5 in patch
> > 
> > Changes since v4:
> >    Gustaw Smolarczyk <wielkiegie at gmail.com>
> >     - Make util_strlcpy have the same behaviour as strlcpy
> > 
> > Changes since v3:
> >    Matt Turner <mattst88 at gmail.com>
> >     - Change name of util_strncpy to util_strlcpy
> > 
> > Changes since v2:
> >    Brian Paul <brianp at vmware.com>
> >      - Patch added
> > 
> > 
> >   src/util/u_string.h | 9 +++++++++
> >   1 file changed, 9 insertions(+)
> > 
> > diff --git a/src/util/u_string.h b/src/util/u_string.h
> > index e88e13f42c..bbabcbc7cb 100644
> > --- a/src/util/u_string.h
> > +++ b/src/util/u_string.h
> > @@ -48,6 +48,15 @@
> >   extern "C" {
> >   #endif
> > 
> > +static inline size_t
> > +util_strlcpy(char *dst, const char *src, size_t n)
> > +{
> > +   strncpy(dst, src, n);
> > +   dst[n-1] = '\0';
> > +
> > +   return strnlen(src, n);
> > +}
> 
> This effectively walks over the source string twice.  I'd suggest
> just 
> using your own loop.
> 

I don't think a solution can be built using strlen if we want to only
iterate once. So one iteration will have to do both counting and
copying, which rules out using memcpy too.

So how about something like this:

static inline size_t
util_strlcpy(char *dst, const char *src, size_t n)
{
   size_t src_len = 0;

   /* Copy chars for as long as there is space in dst */   
   while (src_len < (n - 1) && *src[src_len] != "\0") {
      dst[src_len] = src[src_len];
      src_len++;
   }

   /* The last char of either src or if dst is filled
    * should always be \0.
    */
   dst[src_len] = '\0';

   /* Continue on finding the end of src */
   while (src[src_len] != "\0") {
      src_len++;
   }

   return src_len;
}

Rob.


More information about the mesa-dev mailing list