diff options
Diffstat (limited to 'src/alloc.c')
| -rw-r--r-- | src/alloc.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/alloc.c b/src/alloc.c index 0a7fda6815c..56a9763db15 100644 --- a/src/alloc.c +++ b/src/alloc.c | |||
| @@ -1973,7 +1973,6 @@ INIT must be an integer that represents a character. */) | |||
| 1973 | (Lisp_Object length, Lisp_Object init) | 1973 | (Lisp_Object length, Lisp_Object init) |
| 1974 | { | 1974 | { |
| 1975 | register Lisp_Object val; | 1975 | register Lisp_Object val; |
| 1976 | register unsigned char *p, *end; | ||
| 1977 | int c; | 1976 | int c; |
| 1978 | EMACS_INT nbytes; | 1977 | EMACS_INT nbytes; |
| 1979 | 1978 | ||
| @@ -1985,31 +1984,36 @@ INIT must be an integer that represents a character. */) | |||
| 1985 | { | 1984 | { |
| 1986 | nbytes = XINT (length); | 1985 | nbytes = XINT (length); |
| 1987 | val = make_uninit_string (nbytes); | 1986 | val = make_uninit_string (nbytes); |
| 1988 | p = SDATA (val); | 1987 | memset (SDATA (val), c, nbytes); |
| 1989 | end = p + SCHARS (val); | 1988 | SDATA (val)[nbytes] = 0; |
| 1990 | while (p != end) | ||
| 1991 | *p++ = c; | ||
| 1992 | } | 1989 | } |
| 1993 | else | 1990 | else |
| 1994 | { | 1991 | { |
| 1995 | unsigned char str[MAX_MULTIBYTE_LENGTH]; | 1992 | unsigned char str[MAX_MULTIBYTE_LENGTH]; |
| 1996 | int len = CHAR_STRING (c, str); | 1993 | int len = CHAR_STRING (c, str); |
| 1997 | EMACS_INT string_len = XINT (length); | 1994 | EMACS_INT string_len = XINT (length); |
| 1995 | unsigned char *p, *beg, *end; | ||
| 1998 | 1996 | ||
| 1999 | if (string_len > STRING_BYTES_MAX / len) | 1997 | if (string_len > STRING_BYTES_MAX / len) |
| 2000 | string_overflow (); | 1998 | string_overflow (); |
| 2001 | nbytes = len * string_len; | 1999 | nbytes = len * string_len; |
| 2002 | val = make_uninit_multibyte_string (string_len, nbytes); | 2000 | val = make_uninit_multibyte_string (string_len, nbytes); |
| 2003 | p = SDATA (val); | 2001 | for (beg = SDATA (val), p = beg, end = beg + nbytes; p < end; p += len) |
| 2004 | end = p + nbytes; | ||
| 2005 | while (p != end) | ||
| 2006 | { | 2002 | { |
| 2007 | memcpy (p, str, len); | 2003 | /* First time we just copy `str' to the data of `val'. */ |
| 2008 | p += len; | 2004 | if (p == beg) |
| 2005 | memcpy (p, str, len); | ||
| 2006 | else | ||
| 2007 | { | ||
| 2008 | /* Next time we copy largest possible chunk from | ||
| 2009 | initialized to uninitialized part of `val'. */ | ||
| 2010 | len = min (p - beg, end - p); | ||
| 2011 | memcpy (p, beg, len); | ||
| 2012 | } | ||
| 2009 | } | 2013 | } |
| 2014 | *p = 0; | ||
| 2010 | } | 2015 | } |
| 2011 | 2016 | ||
| 2012 | *p = 0; | ||
| 2013 | return val; | 2017 | return val; |
| 2014 | } | 2018 | } |
| 2015 | 2019 | ||