strmake.c 1.91 KB
Newer Older
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
1 2 3 4
/* Copyright (C) 2000 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
6 7

   This program is distributed in the hope that it will be useful,
bk@work.mysql.com's avatar
bk@work.mysql.com committed
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
9 10 11 12 13 14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
bk@work.mysql.com's avatar
bk@work.mysql.com committed
15 16 17 18 19 20 21 22

/*  File   : strmake.c
    Author : Michael Widenius
    Updated: 20 Jul 1984
    Defines: strmake()

    strmake(dst,src,length) moves length characters, or until end, of src to
    dst and appends a closing NUL to dst.
23
    Note that if strlen(src) >= length then dst[length] will be set to \0
monty@hundin.mysql.fi's avatar
monty@hundin.mysql.fi committed
24
    strmake() returns pointer to closing null
bk@work.mysql.com's avatar
bk@work.mysql.com committed
25 26
*/

27
#include <my_global.h>
bk@work.mysql.com's avatar
bk@work.mysql.com committed
28 29
#include "m_string.h"

30
char *strmake(register char *dst, register const char *src, uint length)
bk@work.mysql.com's avatar
bk@work.mysql.com committed
31
{
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#ifdef EXTRA_DEBUG
  /*
    'length' is the maximum length of the string; the buffer needs
    to be one character larger to accomodate the terminating '\0'.
    This is easy to get wrong, so we make sure we write to the
    entire length of the buffer to identify incorrect buffer-sizes.
    We only initialise the "unused" part of the buffer here, a) for
    efficiency, and b) because dst==src is allowed, so initialising
    the entire buffer would overwrite the source-string. Also, we
    write a character rather than '\0' as this makes spotting these
    problems in the results easier.
  */
  uint n= strlen(src) + 1;
  if (n <= length)
    memset(dst + n, (int) 'Z', length - n + 1);
bk@work.mysql.com's avatar
bk@work.mysql.com committed
47 48 49 50 51 52 53 54
#endif

  while (length--)
    if (! (*dst++ = *src++))
      return dst-1;
  *dst=0;
  return dst;
}