text: /* xmalloc.c -- Allocation package that calls fatal() when out of memory
   *
   * Copyright (c) 1994-2008 Carnegie Mellon University.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The name "Carnegie Mellon University" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For permission or any legal
   *    details, please contact
   *      Carnegie Mellon University
   *      Center for Technology Transfer and Enterprise Creation
   *      4615 Forbes Avenue
   *      Suite 302
   *      Pittsburgh, PA  15213
   *      (412) 268-7393, fax: (412) 268-7395
   *      innovation@andrew.cmu.edu
   *
   * 4. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by Computing Services
   *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
   *
   * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
   * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
   * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
   * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
   * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
   * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   */
  
  #include "xstrlcpy.h"
  
  #ifndef HAVE_STRLCPY
  /* strlcpy -- copy string smartly.
   *
   * i believe/hope this is compatible with the BSD strlcpy().
   */
  EXPORTED size_t strlcpy(char *dst, const char *src, size_t len)
  {
      size_t n;
  
      if (len <= 0) {
          /* we can't do anything ! */
          return strlen(src);
      }
  
      /* assert(len >= 1); */
      for (n = 0; n < len-1; n++) {
          if ((dst[n] = src[n]) == '\0') break;
      }
      if (n >= len-1) {
          /* ran out of space */
          dst[n] = '\0';
          while(src[n]) n++;
      }
      return n;
  }
  #endif
  