]> code.delx.au - gnu-emacs/blobdiff - src/data.c
Merge from emacs--devo--0
[gnu-emacs] / src / data.c
index a4d865f681e917d7ebe03979587ea94a8ce9d7b0..ec9a176f078408d0258b81707d81bb8d3e48c11e 100644 (file)
@@ -125,7 +125,14 @@ wrong_type_argument (predicate, value)
       tem = call1 (predicate, value);
     }
   while (NILP (tem));
+  /* This function is marked as NO_RETURN, gcc would warn if it has a
+     return statement or if falls off the function.  Other compilers
+     warn if no return statement is present.  */
+#ifndef __GNUC__
   return value;
+#else
+  abort ();
+#endif
 }
 
 void
@@ -2094,39 +2101,9 @@ bool-vector.  IDX starts at 0.  */)
        args_out_of_range (array, idx);
       CHECK_NUMBER (newelt);
 
-      if (XINT (newelt) < 0 || ASCII_CHAR_P (XINT (newelt))
-         || CHAR_BYTE8_P (XINT (newelt)))
-       SSET (array, idxval, XINT (newelt));
-      else
-       {
-         /* We must relocate the string data while converting it to
-            multibyte.  */
-         int idxval_byte, prev_bytes, new_bytes;
-         unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *p0 = workbuf, *p1;
-         unsigned char *origstr = SDATA (array), *str;
-         int nchars, nbytes;
-         USE_SAFE_ALLOCA;
-
-         nchars = SCHARS (array);
-         nbytes = idxval_byte = count_size_as_multibyte (origstr, idxval);
-         nbytes += count_size_as_multibyte (origstr + idxval,
-                                            nchars - idxval);
-         SAFE_ALLOCA (str, unsigned char *, nbytes);
-         copy_text (SDATA (array), str, nchars, 0, 1);
-         PARSE_MULTIBYTE_SEQ (str + idxval_byte, nbytes - idxval_byte,
-                              prev_bytes);
-         new_bytes = CHAR_STRING (XINT (newelt), p0);
-         allocate_string_data (XSTRING (array), nchars,
-                               nbytes + new_bytes - prev_bytes);
-         bcopy (str, SDATA (array), idxval_byte);
-         p1 = SDATA (array) + idxval_byte;
-         while (new_bytes--)
-           *p1++ = *p0++;
-         bcopy (str + idxval_byte + prev_bytes, p1,
-                nbytes - (idxval_byte + prev_bytes));
-         SAFE_FREE ();
-         clear_string_char_byte_cache ();
-       }
+      if (XINT (newelt) >= 0 && ! SINGLE_BYTE_CHAR_P (XINT (newelt)))
+       args_out_of_range (array, newelt);
+      SSET (array, idxval, XINT (newelt));
     }
 
   return newelt;