428
+ − 1 /* This file is part of XEmacs.
+ − 2
+ − 3 XEmacs is free software; you can redistribute it and/or modify it
+ − 4 under the terms of the GNU General Public License as published by the
+ − 5 Free Software Foundation; either version 2, or (at your option) any
+ − 6 later version.
+ − 7
+ − 8 XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ − 9 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ − 10 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ − 11 for more details.
+ − 12
+ − 13 You should have received a copy of the GNU General Public License
+ − 14 along with XEmacs; see the file COPYING. If not, write to
+ − 15 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ − 16 Boston, MA 02111-1307, USA. */
+ − 17
+ − 18 /* Synched up with: Not in FSF. */
+ − 19
+ − 20 /* In SunOS 4.1.1 the strcpy function references memory past the last byte of
+ − 21 the string! This will core dump if the memory following the last byte is
+ − 22 not mapped.
+ − 23
+ − 24 Here are correct versions by hbs@lucid.com.
+ − 25 */
+ − 26
+ − 27 # include <config.h>
+ − 28 # ifndef REGISTER /* Strictly enforced in 20.3 */
+ − 29 # define REGISTER
+ − 30 # endif
+ − 31
+ − 32 #define ALIGNED(x) (!(((unsigned long) (x)) & (sizeof (unsigned long) - 1)))
+ − 33
+ − 34 #define MAGIC 0x7efefeff
+ − 35 #define HIGH_BIT_P(c) ((c) & hi_bit)
+ − 36 #define HAS_ZERO(c) (((((c) + magic) ^ (c)) & not_magic) != not_magic)
+ − 37
+ − 38 char *
+ − 39 strcpy (char *to, const char *from)
+ − 40 {
+ − 41 char *return_value = to;
+ − 42 if (to == from)
+ − 43 return to;
+ − 44 else if (ALIGNED (to) && ALIGNED (from))
+ − 45 {
+ − 46 unsigned long *to1 = (unsigned long *) to;
+ − 47 const unsigned long *from1 = (const unsigned long *) from;
+ − 48 unsigned long c;
+ − 49 unsigned long magic = MAGIC;
+ − 50 unsigned long not_magic = ~magic;
+ − 51 /* unsigned long hi_bit = 0x80000000; */
+ − 52
+ − 53 while ((c = *from1) != 0)
+ − 54 {
+ − 55 if (HAS_ZERO(c))
+ − 56 {
+ − 57 to = (char *) to1;
442
+ − 58 from = (const char *) from1;
428
+ − 59 goto slow_loop;
+ − 60 }
+ − 61 else
+ − 62 {
+ − 63 *to1 = c;
+ − 64 to1++;
+ − 65 from1++;
+ − 66 }
+ − 67 }
+ − 68
+ − 69 to = (char *) to1;
+ − 70 *to = (char) 0;
+ − 71 return return_value;
+ − 72 }
+ − 73 else
+ − 74 {
+ − 75 char c;
+ − 76
+ − 77 slow_loop:
+ − 78
+ − 79 while ((c = *from) != 0)
+ − 80 {
+ − 81 *to = c;
+ − 82 to++;
+ − 83 from++;
+ − 84 }
+ − 85 *to = (char) 0;
+ − 86 }
+ − 87 return return_value;
+ − 88 }