/* Tests for some interesting cases in non-standard strlcpy(). */

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

int main(void)
{
   size_t copied;

   char *src = malloc(100);
   if (src == NULL) {
      fprintf(stderr, "Memory allocation failure.\n");
      return 1;
   }
   strcpy(src, "Hey, dude!");

   char *dst = malloc(10);
   if (dst == NULL) {
      fprintf(stderr, "Memory allocation failure.\n");
      return 1;
   }

   /* This is ok. */
   copied = strlcpy(dst, src, 10);
   if (copied != 10)
      fprintf(stderr, "Expected 10 but got %zu for test #1.\n", copied);

   /* Here dst is not large enough. */
   copied = strlcpy(dst, src, strlen(src) + 1);
   if (copied != 10)
      fprintf(stderr, "Expected 10 but got %zu for test #2.\n", copied);

   /* This is just a fancy way how to write strlen(src).
      Undocumented but heavily used. */
   copied = strlcpy(NULL, src, 0);
   if (copied != 10)
      fprintf(stderr, "Expected 10 but got %zu for test #3.\n", copied);

   /* Source and destination overlap. */
   strlcpy(src + 9, src, strlen(src) + 1);
   /* Return value is not checked because function behaviour
      is undefined in such case (and valgrind's differs). */

   return 0;
}