From xemacs-m  Fri Jan 10 17:31:30 1997
Received: from nvwls.cc.purdue.edu (root@nvwls.cc.purdue.edu [128.210.7.3])
          by xemacs.org (8.8.4/8.8.4) with ESMTP
	  id RAA25612 for <XEmacs-Beta@XEmacs.org>; Fri, 10 Jan 1997 17:31:29 -0600 (CST)
Received: from nvwls.cc.purdue.edu (nuspl@localhost [127.0.0.1]) by nvwls.cc.purdue.edu (8.7.5/8.7.3) with ESMTP id SAA07756 for <XEmacs-Beta@XEmacs.org>; Fri, 10 Jan 1997 18:24:40 -0500
Message-Id: <199701102324.SAA07756@nvwls.cc.purdue.edu>
Reply-to: nuspl@purdue.edu
X-Mailer: MH-E 5.0.2
X-Attribution: jjn
X-Face: K'Q`VIQx)c-;TPHDA`.,kBQq(WyNe3AdopJ?B(.4yT%n|F?4>+?x]pQ4XC83s-4;|U{%9x]
 =yr4dko
To: XEmacs-Beta@XEmacs.org
Subject: Sync patches (1/3)
Mime-Version: 1.0 (split by tm-edit 7.100)
Content-Type: message/partial; id="Fri_Jan_10_18:24:36_1997@nvwls.cc.purdue.edu"; number=1; total=3
Date: Fri, 10 Jan 1997 18:24:37 -0500
From: Joe Nuspl <nuspl@nvwls.cc.purdue.edu>

Reply-to:	nuspl@purdue.edu
X-Mailer:	MH-E 5.0.2
X-Attribution:	jjn
X-Face: K'Q`VIQx)c-;TPHDA`.,kBQq(WyNe3AdopJ?B(.4yT%n|F?4>+?x]pQ4XC83s-4;|U{%9x]
 =yr4dko
To:		 XEmacs-Beta@XEmacs.org
Subject:	 Sync patches
Mime-Version: 1.0 (generated by tm-edit 7.100)
Content-Type: multipart/mixed;
 boundary="Multipart_Fri_Jan_10_18:24:35_1997-1"
Content-Transfer-Encoding: 7bit

--Multipart_Fri_Jan_10_18:24:35_1997-1
Content-Type: text/plain; charset=US-ASCII


In trying to track down a bug in 20.0 that does not exist 19.15 I found a lot
of out of sync code.


A lot of these patches have to do with the new macros such as:
	XSTRING_DATA, XSTRING_LENGTH, and XSTRING_BYTE



--Multipart_Fri_Jan_10_18:24:35_1997-1
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="19.15-b7"
Content-Transfer-Encoding: 7bit

--- src/alloc.c	1997/01/10 20:06:09	1.1
+++ src/alloc.c	1997/01/10 20:17:36
@@ -2088,12 +2088,11 @@
     val = make_uninit_string (len * XINT (length));
     if (len == 1)
       /* Optimize the single-byte case */
-      memset (string_data (XSTRING (val)), XCHAR (init),
-	      string_length (XSTRING (val)));
+      memset (XSTRING_DATA (val), XCHAR (init), XSTRING_LENGTH (val));
     else
       {
 	int i, j, k;
-	Bufbyte *ptr = string_data (XSTRING (val));
+	Bufbyte *ptr = XSTRING_DATA (val);
 
 	k = 0;
 	for (i = 0; i < XINT (length); i++)
@@ -2112,7 +2111,7 @@
   Lisp_Object val;
   
   val = make_uninit_string (length);
-  memcpy (string_data (XSTRING (val)), contents, length);
+  memcpy (XSTRING_DATA (val), contents, length);
   return (val);
 }
 
@@ -2212,10 +2211,11 @@
       struct lrecord_header *lheader = XRECORD_LHEADER (chain);
       struct free_lcrecord_header *free_header =
 	(struct free_lcrecord_header *) lheader;
+
+#ifdef ERROR_CHECK_GC
       CONST struct lrecord_implementation *implementation
 	= lheader->implementation;
 
-#ifdef ERROR_CHECK_GC
       /* There should be no other pointers to the free list. */
       assert (!MARKED_RECORD_HEADER_P (lheader));
       /* Only lcrecords should be here. */
@@ -2227,7 +2227,8 @@
       /* So must the size. */
       assert (implementation->static_size == 0
 	      || implementation->static_size == list->size);
-#endif
+#endif /* ERROR_CHECK_GC */
+
       MARK_RECORD_HEADER (lheader);
       chain = free_header->chain;
     }
@@ -3904,7 +3905,7 @@
       if (!cursor_changed && !FRAME_STREAM_P (f))
 	{
 	  char *msg = (STRINGP (Vgc_message)
-		       ? GETTEXT ((char *) string_data (XSTRING (Vgc_message)))
+		       ? GETTEXT ((char *) XSTRING_DATA (Vgc_message))
 		       : 0);
 	  Lisp_Object args[2], whole_msg;
 	  args[0] = build_string (msg ? msg :
@@ -4051,7 +4052,7 @@
       else if (!FRAME_STREAM_P (f))
 	{
 	  char *msg = (STRINGP (Vgc_message)
-		       ? GETTEXT ((char *) string_data (XSTRING (Vgc_message)))
+		       ? GETTEXT ((char *) XSTRING_DATA (Vgc_message))
 		       : 0);
 
 	  /* Show "...done" only if the echo area would otherwise be empty. */
--- src/buffer.c	1997/01/10 20:27:22	1.1
+++ src/buffer.c	1997/01/10 20:36:33
@@ -275,7 +275,7 @@
 	error ("printing unreadable object #<killed buffer>");
       else
 	error ("printing unreadable object #<buffer %s>", 
-	       string_data (XSTRING (b->name)));
+	       XSTRING_DATA (b->name));
     }
   else if (!BUFFER_LIVE_P (b))
     write_c_string ("#<killed buffer>", printcharfun);
@@ -318,7 +318,7 @@
 nsberror (Lisp_Object spec)
 {
   if (STRINGP (spec))
-    error ("No buffer named %s", string_data (XSTRING (spec)));
+    error ("No buffer named %s", XSTRING_DATA (spec));
   signal_simple_error ("Invalid buffer argument", spec);
 }
 
@@ -641,7 +641,7 @@
   if (!NILP (buf))
     return buf;
 
-  if (string_length (XSTRING (name)) == 0)
+  if (XSTRING_LENGTH (name) == 0)
     error ("Empty string for buffer name is not allowed");
 
   b = allocate_buffer ();
@@ -677,14 +677,13 @@
   name = LISP_GETTEXT (name);
   buf = Fget_buffer (name);
   if (!NILP (buf))
-    error ("Buffer name `%s' is in use", string_data (XSTRING (name)));
+    error ("Buffer name `%s' is in use", XSTRING_DATA (name));
 
   base_buffer = Fget_buffer (base_buffer);
   if (NILP (base_buffer))
-    error ("No such buffer: `%s'",
-	   string_data (XSTRING (XBUFFER (base_buffer)->name)));
+    error ("No such buffer: `%s'", XSTRING_DATA (XBUFFER (base_buffer)->name));
 
-  if (string_length (XSTRING (name)) == 0)
+  if (XSTRING_LENGTH (name) == 0)
     error ("Empty string for buffer name is not allowed");
 
   b = allocate_buffer ();
@@ -1090,7 +1089,7 @@
   CHECK_STRING (newname);
   newname = LISP_GETTEXT (newname);
 
-  if (string_length (XSTRING (newname)) == 0)
+  if (XSTRING_LENGTH (newname) == 0)
     error ("Empty string is invalid as a buffer name");
 
   tem = Fget_buffer (newname);
@@ -1107,7 +1106,7 @@
 	newname = Fgenerate_new_buffer_name (newname, current_buffer->name);
       else
 	error ("Buffer name \"%s\" is in use",
-	       string_data (XSTRING (newname)));
+	       XSTRING_DATA (newname));
     }
 
   current_buffer->name = newname;
@@ -1287,7 +1286,7 @@
 	(Qyes_or_no_p,
 	 (emacs_doprnt_string_c
 	  ((CONST Bufbyte *) GETTEXT ("Buffer %s modified; kill anyway? "),
-	   Qnil, -1, string_data (XSTRING (b->name)))));
+	   Qnil, -1, XSTRING_DATA (b->name))));
       UNGCPRO;
       if (NILP (killp))
 	return Qnil;
@@ -2391,7 +2390,8 @@
   %t -- Under MS-DOS, print T if files is text, B if binary.
   %[ -- print one [ for each recursive editing level.  %] similar.
   %% -- print %.                %- -- print infinitely many dashes.
-Decimal digits after the % specify field width to which to pad.  */ );
+Decimal digits after the % specify field width to which to pad.
+*/ );
 
   DEFVAR_BUFFER_DEFAULTS ("default-major-mode", major_mode /*
 *Major mode for new buffers.  Defaults to `fundamental-mode'.
--- src/buffer.h	1997/01/10 20:21:00	1.1
+++ src/buffer.h	1997/01/10 20:26:43
@@ -98,7 +98,7 @@
        in ordinary buffers.  In indirect buffers, this is not used.  */
     struct buffer_text own_text;
 
-    /* This points to the `struct buffer_text' that used for this buffer.
+    /* This points to the `struct buffer_text' that is used for this buffer.
        In an ordinary buffer, this is the own_text field above.
        In an indirect buffer, this is the own_text field of another buffer.  */
     struct buffer_text *text;
@@ -662,21 +662,21 @@
 
 #define buffer_or_string_bufpos_to_bytind(obj, pos) 			\
   (BUFFERP (obj) ? bufpos_to_bytind (XBUFFER (obj), pos) :		\
-   (Bytind) charcount_to_bytecount (string_data (XSTRING (obj)), pos))
+   (Bytind) charcount_to_bytecount (XSTRING_DATA (obj), pos))
 
 #define buffer_or_string_bytind_to_bufpos(obj, ind) 			\
   (BUFFERP (obj) ? bytind_to_bufpos (XBUFFER (obj), ind) :		\
-   (Bufpos) bytecount_to_charcount (string_data (XSTRING (obj)), ind))
+   (Bufpos) bytecount_to_charcount (XSTRING_DATA (obj), ind))
 
 /* Similar for Bufpos's and Meminds. */
 
 #define buffer_or_string_bufpos_to_memind(obj, pos) 			\
   (BUFFERP (obj) ? bufpos_to_memind (XBUFFER (obj), pos) :		\
-   (Memind) charcount_to_bytecount (string_data (XSTRING (obj)), pos))
+   (Memind) charcount_to_bytecount (XSTRING_DATA (obj), pos))
 
 #define buffer_or_string_memind_to_bufpos(obj, ind) 			\
   (BUFFERP (obj) ? memind_to_bufpos (XBUFFER (obj), ind) :		\
-   (Bufpos) bytecount_to_charcount (string_data (XSTRING (obj)), ind))
+   (Bufpos) bytecount_to_charcount (XSTRING_DATA (obj), ind))
 
 /************************************************************************/
 /*                                                                      */
@@ -1142,7 +1142,7 @@
   (byte1) = (ch);				\
   (byte2) = 0;					\
 } while (0)
-#define BYTE_ASCII_P(by) 1
+#define BYTE_ASCII_P(byte) 1
 
 
 /************************************************************************/
--- src/callint.c	1997/01/10 21:06:52	1.1
+++ src/callint.c	1997/01/10 21:12:01
@@ -189,7 +189,7 @@
 
   /* Fformat no longer smashes its arg vector, so no need to copy it. */
   
-  if (!strchr ((char *) string_data (XSTRING (s)), '%'))
+  if (!strchr ((char *) XSTRING_DATA (s), '%'))
     return (s);
   GCPRO1 (s);
   RETURN_UNGCPRO (emacs_doprnt_string_lisp (0, s, 0, nargs, args));
@@ -421,7 +421,7 @@
     for (;;)
       {
 	if (STRINGP (specs))
-	  prompt_data = (CONST char *) string_data (XSTRING (specs));
+	  prompt_data = (CONST char *) XSTRING_DATA (specs);
     
 	if (prompt_data[prompt_index] == '+')
 	  error ("`+' is not used in `interactive' for ordinary commands");
@@ -614,7 +614,7 @@
 	      int shadowing_speccount = specpdl_depth ();
 
 	      specbind (Qcursor_in_echo_area, Qt);
-	      message ("%s", string_data (XSTRING (PROMPT ())));
+	      message ("%s", XSTRING_DATA (PROMPT ()));
 	      tem = (call0 (Qread_char));
               args[argnum] = tem;
               /* visargs[argnum] = Fsingle_key_description (tem); */
@@ -865,7 +865,7 @@
 	if (!prompt_limit)
 	  break;
 	if (STRINGP (specs))
-	  prompt_data = (CONST char *) string_data (XSTRING (specs));
+	  prompt_data = (CONST char *) XSTRING_DATA (specs);
 	prompt_index += prompt_length + 1 + 1; /* +1 to skip spec, +1 for \n */
       }
     unbind_to (speccount, Qnil);
--- src/callproc.c	1997/01/10 20:38:32	1.1
+++ src/callproc.c	1997/01/10 21:06:17
@@ -104,8 +104,8 @@
   /* for MSDOS fdpid is really (fd . tempfile)  */
   Lisp_Object file = Fcdr (fdpid);
   close (XINT (Fcar (fdpid)));
-  if (strcmp (string_data (XSTRING (file)), NULL_DEVICE) != 0)
-    unlink (string_data (XSTRING (file)));
+  if (strcmp (XSTRING_DATA (file), NULL_DEVICE) != 0)
+    unlink (XSTRING_DATA (file));
 #else /* not MSDOS */
   int fd = XINT (Fcar (fdpid));
   int pid = XINT (Fcdr (fdpid));
@@ -196,7 +196,7 @@
 #ifdef MSDOS
   char *outf, *tempfile;
   int outfilefd;
-#endif
+#endif /* MSDOS */
   
   CHECK_STRING (args[0]);
 
@@ -206,7 +206,7 @@
   /* Without asynchronous processes we cannot have BUFFER == 0.  */
   if (nargs >= 3 && !INTP (args[2]))
     error ("Operating system cannot handle asynchronous subprocesses");
-#endif
+#endif /* NO_SUBPROCESSES */
 
   /* Do this before building new_argv because GC in Lisp code
    *  called by various filename-hacking routines might relocate strings */
@@ -241,8 +241,7 @@
 
   if (nargs >= 2 && ! NILP (args[1]))
     {
-      infile = Fexpand_file_name (args[1],
-				  current_buffer->directory);
+      infile = Fexpand_file_name (args[1], current_buffer->directory);
       CHECK_STRING (infile);
     }
   else
@@ -287,20 +286,20 @@
 
   display = ((nargs >= 4) ? args[3] : Qnil);
 
-  /* From here we assume we won't GC (unless an error is signalled). */
+  /* From here we assume we won't GC (unless an error is signaled). */
   {
     REGISTER int i;
     for (i = 4; i < nargs; i++)
       {
 	CHECK_STRING (args[i]);
-	new_argv[i - 3] = (char *) string_data (XSTRING (args[i]));
+	new_argv[i - 3] = (char *) XSTRING_DATA (args[i]);
       }
     /* Program name is first command arg */
-    new_argv[0] = (char *) string_data (XSTRING (args[0]));
+    new_argv[0] = (char *) XSTRING_DATA (args[0]);
     new_argv[i - 3] = 0;
   }
 
-  filefd = open ((char *) string_data (XSTRING (infile)), O_RDONLY, 0);
+  filefd = open ((char *) XSTRING_DATA (infile), O_RDONLY, 0);
   if (filefd < 0)
     {
       report_file_error ("Opening process input file",
@@ -313,7 +312,7 @@
       report_file_error ("Searching for program",
 			 Fcons (args[0], Qnil));
     }
-  new_argv[0] = (char *) string_data (XSTRING (path));
+  new_argv[0] = (char *) XSTRING_DATA (path);
   
 #ifdef MSDOS
   /* These vars record information from process termination.
@@ -342,7 +341,7 @@
       report_file_error ("Opening process output file",
 			 Fcons (tempfile, Qnil));
     }
-#endif
+#endif /* MSDOS */
 
 #ifndef MSDOS
   if (INTP (buffer))
@@ -408,7 +407,7 @@
        parent process, turn it back on if it was really on when you "turned
        it off" */
     int logging_on = cadillac_stop_logging ();
-#endif
+#endif /* EMACS_BTL */
 
     env = environ;
 
@@ -441,12 +440,12 @@
     else if (STRINGP (error_file))
       {
 #ifdef DOS_NT
-	fd_error = open (string_data (XSTRING (error_file)),
+	fd_error = open (XSTRING_DATA (error_file),
 			 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
 			 S_IREAD | S_IWRITE);
 #else  /* not DOS_NT */
 	fd_error =
-	  creat ((CONST char *) string_data (XSTRING (error_file)), 0666);
+	  creat ((CONST char *) XSTRING_DATA (error_file), 0666);
 #endif /* not DOS_NT */
       }
 
@@ -478,7 +477,7 @@
 	   file. */
 	disconnect_controlling_terminal ();
 	child_setup (filefd, fd1, fd_error, new_argv,
-		     (char *) string_data (XSTRING (current_dir)));
+		     (char *) XSTRING_DATA (current_dir));
       }
 #ifdef EMACS_BTL
     else if (logging_on)
@@ -516,7 +515,7 @@
 	 we don't need to do this, I think because it will then have
 	 the facilities for handling SIGCHLD.  */
       wait_without_blocking ();
-#endif
+#endif /* NO_SUBPROCESSES */
       return Qnil;
     }
 
@@ -535,7 +534,7 @@
     record_unwind_protect (call_process_cleanup,
                            Fcons (make_int (fd[0]),
                                   build_string (tempfile)));
-#else
+#else /* not MSDOS */
     record_unwind_protect (call_process_cleanup,
                            Fcons (make_int (fd[0]), make_int (pid)));
 #endif /* not MSDOS */
@@ -733,7 +732,7 @@
 	 tem = XCDR (tem))
     {
       char **ep = env;
-      char *string = (char *) string_data (XSTRING (XCAR (tem)));
+      char *string = (char *) XSTRING_DATA (XCAR (tem));
       /* See if this string duplicates any string already in the env.
 	 If so, don't put it in.
 	 When an env var has multiple definitions,
@@ -873,18 +872,18 @@
       Lisp_Object entry = XCAR (scan);
       
       if (STRINGP (entry)
-	  && string_length (XSTRING (entry)) > varlen
-	  && string_byte (XSTRING (entry), varlen) == '='
+	  && XSTRING_LENGTH (entry) > varlen
+	  && XSTRING_BYTE (entry, varlen) == '='
 #ifdef WINDOWSNT
 	  /* NT environment variables are case insensitive.  */
-	  && ! memicmp (string_data (XSTRING (entry)), var, varlen)
+	  && ! memicmp (XSTRING_DATA (entry), var, varlen)
 #else  /* not WINDOWSNT */
-	  && ! memcmp (string_data (XSTRING (entry)), var, varlen)
+	  && ! memcmp (XSTRING_DATA (entry), var, varlen)
 #endif /* not WINDOWSNT */
 	  )
 	{
-	  *value    = string_data (XSTRING (entry)) + (varlen + 1);
-	  *valuelen = string_length (XSTRING (entry)) - (varlen + 1);
+	  *value    = XSTRING_DATA   (entry) + (varlen + 1);
+	  *valuelen = XSTRING_LENGTH (entry) - (varlen + 1);
 	  return 1;
 	}
     }
@@ -907,15 +906,13 @@
 
   CHECK_STRING (var);
   GCPRO1 (v);
-  if (getenv_internal (string_data (XSTRING (var)),
-		       string_length (XSTRING (var)),
+  if (getenv_internal (XSTRING_DATA (var), XSTRING_LENGTH (var),
 		       &value, &valuelen))
     v = make_string (value, valuelen);
   if (!NILP (interactivep))
     {
       if (NILP (v))
-	message ("%s not defined in environment",
-		 string_data (XSTRING (var)));
+	message ("%s not defined in environment", XSTRING_DATA (var));
       else
 	message ("\"%s\"", value);
     }
@@ -962,14 +959,14 @@
   if (!initialized)
     {
       Vdata_directory = Qnil;
-      Vdoc_directory = Qnil;
-      Vexec_path = Qnil;
+      Vdoc_directory  = Qnil;
+      Vexec_path      = Qnil;
     }
   else
 #endif
     {
       char *data_dir = egetenv ("EMACSDATA");
-      char *doc_dir = egetenv ("EMACSDOC");
+      char *doc_dir  = egetenv ("EMACSDOC");
     
 #ifdef PATH_DATA
       if (!data_dir)
@@ -1015,7 +1012,7 @@
   if (!NILP (Vexec_directory))
     {
       tempdir = Fdirectory_file_name (Vexec_directory);
-      if (access ((char *) string_data (XSTRING (tempdir)), 0) < 0)
+      if (access ((char *) XSTRING_DATA (tempdir), 0) < 0)
 	{
 	  /* If the hard-coded path is bogus, fail silently.
 	     This will allow the normal heuristics to make an attempt. */
@@ -1023,7 +1020,7 @@
 	  warn_when_safe
 	    (Qpath, Qwarning,
 	     "Warning: machine-dependent data dir (%s) does not exist.\n",
-	     string_data (XSTRING (Vexec_directory)));
+	     XSTRING_DATA (Vexec_directory));
 #else
 	  Vexec_directory = Qnil;
 #endif
@@ -1033,7 +1030,7 @@
   if (!NILP (Vdata_directory))
     {
       tempdir = Fdirectory_file_name (Vdata_directory);
-      if (access ((char *) string_data (XSTRING (tempdir)), 0) < 0)
+      if (access ((char *) XSTRING_DATA (tempdir), 0) < 0)
 	{
 	  /* If the hard-coded path is bogus, fail silently.
 	     This will allow the normal heuristics to make an attempt. */
@@ -1041,7 +1038,7 @@
 	  warn_when_safe
 	    (Qpath, Qwarning,
 	     "Warning: machine-independent data dir (%s) does not exist.\n",
-	     string_data (XSTRING (Vdata_directory)));
+	     XSTRING_DATA (Vdata_directory));
 #else
 	  Vdata_directory = Qnil;
 #endif
--- src/database.c	1997/01/10 21:12:10	1.1
+++ src/database.c	1997/01/10 21:19:22
@@ -138,7 +138,7 @@
       subtype = dbase->funcs->get_subtype (dbase);
       
       sprintf (buf, "#<database %s (%s/%s/%s) 0x%x>",
-	       string_data (XSTRING (dbase->fname)), type, subtype, perms,
+	       XSTRING_DATA (dbase->fname), type, subtype, perms,
 	       dbase->header.uid);
       write_c_string (buf, printcharfun);
     }
@@ -264,8 +264,8 @@
 {
   datum keydatum, valdatum;
   DBM *handle = (DBM *)db->db_handle;
-  keydatum.dptr = (char *) string_data (XSTRING (key));
-  keydatum.dsize = string_length (XSTRING (key));
+  keydatum.dptr = (char *) XSTRING_DATA (key);
+  keydatum.dsize = XSTRING_LENGTH (key);
   valdatum = dbm_fetch (handle, keydatum);
 
   return (valdatum.dptr
@@ -282,10 +282,10 @@
   DBM *handle = (DBM *)db->db_handle;
   datum keydatum, valdatum;
   
-  valdatum.dptr = (char *) string_data (XSTRING (val));
-  valdatum.dsize = string_length (XSTRING (val));
-  keydatum.dptr = (char *) string_data (XSTRING (key));
-  keydatum.dsize = string_length (XSTRING (key));
+  valdatum.dptr = (char *) XSTRING_DATA (val);
+  valdatum.dsize = XSTRING_LENGTH (val);
+  keydatum.dptr = (char *) XSTRING_DATA (key);
+  keydatum.dsize = XSTRING_LENGTH (key);
 
   return (!dbm_store (handle, keydatum, valdatum,
 		      (NILP (replace)) ? DBM_INSERT : DBM_REPLACE));
@@ -295,8 +295,8 @@
 dbm_remove (struct database_struct *db, Lisp_Object key)
 {
   datum keydatum;
-  keydatum.dptr = (char *) string_data (XSTRING (key));
-  keydatum.dsize = string_length (XSTRING (key));
+  keydatum.dptr = (char *) XSTRING_DATA (key);
+  keydatum.dsize = XSTRING_LENGTH (key);
   return (dbm_delete (db->db_handle, keydatum));
 }
 
@@ -423,8 +423,8 @@
   DB *dbp = (DB *) db->db_handle;
   int status = 0;
 
-  keydatum.data = string_data (XSTRING (key));
-  keydatum.size = string_length (XSTRING (key));
+  keydatum.data = XSTRING_DATA (key);
+  keydatum.size = XSTRING_LENGTH (key);
   
   status = dbp->get (dbp, &keydatum, &valdatum, 0);
 
@@ -445,10 +445,10 @@
   DB *dbp = (DB *) db->db_handle;
   int status = 0;
 
-  keydatum.data = string_data (XSTRING (key));
-  keydatum.size = string_length (XSTRING (key));
-  valdatum.data = string_data (XSTRING (val));
-  valdatum.size = string_length (XSTRING (val));
+  keydatum.data = XSTRING_DATA   (key);
+  keydatum.size = XSTRING_LENGTH (key);
+  valdatum.data = XSTRING_DATA   (val);
+  valdatum.size = XSTRING_LENGTH (val);
   status = dbp->put (dbp, &keydatum, &valdatum, NILP (replace)
 		     ? R_NOOVERWRITE : 0);
   db->errno = (status == 1) ? -1 : errno;
@@ -462,8 +462,8 @@
   DB *dbp = (DB *) db->db_handle;
   int status;
 
-  keydatum.data = string_data (XSTRING (key));
-  keydatum.size = string_length (XSTRING (key));
+  keydatum.data = XSTRING_DATA   (key);
+  keydatum.size = XSTRING_LENGTH (key);
   
   status = dbp->del (dbp, &keydatum, 0);
   if (!status)
@@ -563,7 +563,7 @@
     {
       char *acc;
       CHECK_STRING (ackcess);
-      acc = (char *) string_data (XSTRING (ackcess));
+      acc = (char *) XSTRING_DATA (ackcess);
       
       if (strchr (acc, '+'))
 	accessmask |= O_CREAT;
@@ -615,7 +615,7 @@
   return (Qnil);
 
  db_done:
-  db = funcblock->open_file ((char *) string_data (XSTRING (file)), subtype,
+  db = funcblock->open_file ((char *) XSTRING_DATA (file), subtype,
 			     accessmask, modemask);
   
   if (!db)
--- src/device-tty.c	1997/01/10 21:19:57	1.1
+++ src/device-tty.c	1997/01/10 21:21:45
@@ -65,8 +65,7 @@
   allocate_tty_device_struct (d);
   init_baud_rate (d);
 
-  switch (init_tty_for_redisplay
-	  (d, (char *) string_data (XSTRING (terminal_type))))
+  switch (init_tty_for_redisplay (d, (char *) XSTRING_DATA (terminal_type)))
     {
 #if 0
     case TTY_UNABLE_OPEN_DATABASE:
@@ -77,12 +76,12 @@
     case TTY_TYPE_UNDEFINED:
       suppress_early_backtrace = 1;
       error ("Terminal type `%s' undefined (or can't access database?)",
-	     string_data (XSTRING (terminal_type)));
+	     XSTRING_DATA (terminal_type));
       break;
     case TTY_TYPE_INSUFFICIENT:
       suppress_early_backtrace = 1;
       error ("Terminal type `%s' not powerful enough to run Emacs",
-	     string_data (XSTRING (terminal_type)));
+	     XSTRING_DATA (terminal_type));
       break;
     case TTY_SIZE_UNSPECIFIED:
       suppress_early_backtrace = 1;
--- src/device-x.c	1997/01/10 21:21:59	1.1
+++ src/device-x.c	1997/01/10 21:30:34
@@ -227,7 +227,7 @@
   make_argc_argv (Vx_initial_argv_list, &argc, &argv);
 
   if (STRINGP (Vx_emacs_application_class) &&
-      string_length (XSTRING (Vx_emacs_application_class)) > 0)
+      XSTRING_LENGTH (Vx_emacs_application_class) > 0)
     GET_C_STRING_CTEXT_DATA_ALLOCA (Vx_emacs_application_class, app_class);
   else
     app_class = "Emacs";
@@ -257,7 +257,7 @@
   DEVICE_NAME (d) = Fcopy_sequence (DEVICE_NAME (d));
   /* colons and periods can't appear in individual elements of resource
      strings */
-  validify_resource_string ((char *) string_data (XSTRING (DEVICE_NAME (d))));
+  validify_resource_string ((char *) XSTRING_DATA (DEVICE_NAME (d)));
   DEVICE_XT_APP_SHELL (d) = XtAppCreateShell (NULL, app_class,
 					      applicationShellWidgetClass,
 					      dpy, NULL, 0);
@@ -519,7 +519,7 @@
 
       stderr_out ("\n%s: ",
 		  (STRINGP (Vinvocation_name)
-		   ? (char *) string_data (XSTRING (Vinvocation_name))
+		   ? (char *) XSTRING_DATA (Vinvocation_name)
 		   : "xemacs"));
       XmuPrintDefaultErrorMessage (disp, event, stderr);
     }
@@ -587,7 +587,7 @@
       stderr_out
 	("\n%s: Fatal I/O Error %d (%s) on display connection \"%s\"\n",
          (STRINGP (Vinvocation_name) ?
-	  (char *) string_data (XSTRING (Vinvocation_name)) : "xemacs"),
+	  (char *) XSTRING_DATA (Vinvocation_name) : "xemacs"),
 	 errno, strerror (errno), DisplayString (disp));
       stderr_out
         ("  after %lu requests (%lu known processed) with %d events remaining.\n",
@@ -780,16 +780,14 @@
     {
       strcat (name_out, ".buffer.");
       /* we know buffer is live; otherwise we got an error above. */
-      strcat (name_out,
-	      (CONST char *) string_data (XSTRING (Fbuffer_name (locale))));
+      strcat (name_out, (CONST char *) XSTRING_DATA (Fbuffer_name (locale)));
       strcat (class_out, ".EmacsLocaleType.EmacsBuffer");
     }
   else if (FRAMEP (locale))
     {
       strcat (name_out, ".frame.");
       /* we know frame is live; otherwise we got an error above. */
-      strcat (name_out,
-	      (CONST char *) string_data (XSTRING (Fframe_name (locale))));
+      strcat (name_out, (CONST char *) XSTRING_DATA (Fframe_name (locale)));
       strcat (class_out, ".EmacsLocaleType.EmacsFrame");
     }
   else
@@ -797,8 +795,7 @@
       assert (DEVICEP (locale));
       strcat (name_out, ".device.");
       /* we know device is live; otherwise we got an error above. */
-      strcat (name_out,
-	      (CONST char *) string_data (XSTRING (Fdevice_name (locale))));
+      strcat (name_out, (CONST char *) XSTRING_DATA (Fdevice_name (locale)));
       strcat (class_out, ".EmacsLocaleType.EmacsDevice");
     }
   return;
@@ -917,9 +914,9 @@
   db = XtDatabase (display);
 
   strcat (name_string, ".");
-  strcat (name_string, (CONST char *) string_data (XSTRING (name)));
+  strcat (name_string, (CONST char *) XSTRING_DATA (name));
   strcat (class_string, ".");
-  strcat (class_string, (CONST char *) string_data (XSTRING (class)));
+  strcat (class_string, (CONST char *) XSTRING_DATA (class));
 
   {
     XrmValue xrm_value;
@@ -1024,7 +1021,7 @@
   char *str, *colon_pos;
 
   CHECK_STRING (resource_line);
-  str = (char *) string_data (XSTRING (resource_line));
+  str = (char *) XSTRING_DATA (resource_line);
   if (!(colon_pos = strchr (str, ':')) || strchr (str, '\n'))
   invalid:
     signal_simple_error ("Invalid resource line", resource_line);
--- src/device.c	1997/01/10 21:30:51	1.1
+++ src/device.c	1997/01/10 21:32:40
@@ -111,7 +111,7 @@
 
   if (print_readably)
     error ("printing unreadable object #<device %s 0x%x>",
-	   string_data (XSTRING (d->name)), d->header.uid);
+	   XSTRING_DATA (d->name), d->header.uid);
 
   sprintf (buf, "#<%s-device", !DEVICE_LIVE_P (d) ? "dead" :
 	   DEVICE_TYPE_NAME (d));
--- src/dialog-x.c	1997/01/10 21:33:07	1.1
+++ src/dialog-x.c	1997/01/10 21:33:50
@@ -125,7 +125,7 @@
 
   CHECK_CONS (desc);
   CHECK_STRING (XCAR (desc));
-  name = (char *) string_data (XSTRING (LISP_GETTEXT (XCAR (desc))));
+  name = (char *) XSTRING_DATA (LISP_GETTEXT (XCAR (desc)));
   desc = XCDR (desc);
   if (!CONSP (desc))
     error ("dialog boxes must have some buttons");
--- src/dired.c	1997/01/10 21:34:08	1.1
+++ src/dired.c	1997/01/10 21:43:53
@@ -93,9 +93,9 @@
     /* XEmacs: this should come before the opendir() because it might error. */
     Lisp_Object name_as_dir = Ffile_name_as_directory (dirname);
     CHECK_STRING (name_as_dir);
-    memcpy (statbuf, ((char *) string_data (XSTRING (name_as_dir))),
-           string_length (XSTRING (name_as_dir)));
-    statbuf_tail = statbuf + string_length (XSTRING (name_as_dir));
+    memcpy (statbuf, ((char *) XSTRING_DATA (name_as_dir)),
+           XSTRING_LENGTH (name_as_dir));
+    statbuf_tail = statbuf + XSTRING_LENGTH (name_as_dir);
   }
 
   /* XEmacs: this should come after Ffile_name_as_directory() to avoid
@@ -126,16 +126,16 @@
      an error is signalled while the directory stream is open, we
      have to make sure it gets closed, and setting up an
      unwind_protect to do so would be a pain.  */
-  d = opendir ((char *) string_data (XSTRING (dirfilename)));
+  d = opendir ((char *) XSTRING_DATA (dirfilename));
   if (! d)
     report_file_error ("Opening directory", list1 (dirname));
 
   list = Qnil;
   tail_cons = Qnil;
-  dirname_length = string_length (XSTRING (dirname));
+  dirname_length = XSTRING_LENGTH (dirname);
 #ifndef VMS
   if (dirname_length == 0
-      || !IS_ANY_SEP (string_byte (XSTRING (dirname), dirname_length - 1)))
+      || !IS_ANY_SEP (XSTRING_BYTE (dirname, dirname_length - 1)))
   {
     *filename++ = DIRECTORY_SEP;
     dirname_length++;
@@ -277,11 +277,11 @@
 			   struct stat *st_addr)
 {
   Bytecount len = NAMLEN (dp);
-  Bytecount pos = string_length (XSTRING (dirname));
+  Bytecount pos = XSTRING_LENGTH (dirname);
   int value;
   char *fullname = (char *) alloca (len + pos + 2);
 
-  memcpy (fullname, string_data (XSTRING (dirname)), pos);
+  memcpy (fullname, XSTRING_DATA (dirname), pos);
 #ifndef VMS
   if (!IS_DIRECTORY_SEP (fullname[pos - 1]))
     fullname[pos++] = DIRECTORY_SEP;
@@ -348,7 +348,7 @@
   for (passcount = !!all_flag; NILP (bestmatch) && passcount < 2; passcount++)
     {
       d = opendir ((char *)
-		   string_data (XSTRING (Fdirectory_file_name (dirname))));
+		   XSTRING_DATA (Fdirectory_file_name (dirname)));
       if (!d)
 	report_file_error ("Opening directory", list1 (dirname));
 
@@ -381,9 +381,7 @@
 
 	  if (! DIRENTRY_NONEMPTY (dp)
 	      || cclen < file_name_length
-	      || 0 <= scmp (d_name,
-			    string_data (XSTRING (file)),
-			    file_name_length))
+	      || 0 <= scmp (d_name, XSTRING_DATA (file), file_name_length))
 	    continue;
 
           if (file_name_completion_stat (dirname, dp, &st) < 0)
@@ -420,7 +418,7 @@
 		      if (skip < 0) continue;
 
 		      if (0 > scmp (charptr_n_addr (d_name, skip),
-				    string_data (XSTRING (elt)),
+				    XSTRING_DATA (elt),
 				    string_char_length (XSTRING (elt))))
 			{
 			  ignored_extension_p = 1;
@@ -464,7 +462,7 @@
           else
             {
               Charcount compare = min (bestmatchsize, cclen);
-              Bufbyte *p1 = string_data (XSTRING (bestmatch));
+              Bufbyte *p1 = XSTRING_DATA (bestmatch);
               Bufbyte *p2 = d_name;
               Charcount matchsize = scmp (p1, p2, compare);
 
@@ -490,9 +488,9 @@
                        /* If there is more than one exact match aside from
                           case, and one of them is exact including case,
                           prefer that one.  */
-                       && 0 > scmp_1 (p2, string_data (XSTRING (file)),
+                       && 0 > scmp_1 (p2, XSTRING_DATA (file),
 				      file_name_length, 0)
-                       && 0 <= scmp_1 (p1, string_data (XSTRING (file)),
+                       && 0 <= scmp_1 (p1, XSTRING_DATA (file),
 				       file_name_length, 0)))
                     {
                       bestmatch = make_string (d_name, len);
@@ -578,7 +576,7 @@
   CHECK_STRING (filename);
   fab      = cc$rms_fab;
   xabfhc   = cc$rms_xabfhc;
-  fab.fab$l_fna = string_data (XSTRING (filename));
+  fab.fab$l_fna = XSTRING_DATA (filename);
   fab.fab$b_fns = strlen (fab.fab$l_fna);
   fab.fab$l_xab = (char *) &xabfhc;
   status = sys$open (&fab, 0, 0);
@@ -645,7 +643,7 @@
   if (!NILP (handler))
     return call2 (handler, Qfile_attributes, filename);
 
-  if (lstat ((char *) string_data (XSTRING (filename)), &s) < 0)
+  if (lstat ((char *) XSTRING_DATA (filename), &s) < 0)
     return Qnil;
 
   GCPRO2 (filename, dirname);
@@ -656,15 +654,14 @@
 
 #ifdef MSDOS
   {
-    char *tmpnam =
-      (char *) string_data (XSTRING (Ffile_name_nondirectory (filename)));
+    char *tmpnam = (char *) XSTRING_DATA (Ffile_name_nondirectory (filename));
     int l = strlen (tmpnam);
 
     if (l >= 5 
 	&& S_ISREG (s.st_mode)
-	&& (stricmp (&tmpnam[l - 4], ".com") == 0
-	    || stricmp (&tmpnam[l - 4], ".exe") == 0
-	    || stricmp (&tmpnam[l - 4], ".bat") == 0))
+	&& (stricmp (&tmpnam[l - 4], ".com") == 0 ||
+	    stricmp (&tmpnam[l - 4], ".exe") == 0 ||
+	    stricmp (&tmpnam[l - 4], ".bat") == 0))
       {
 	s.st_mode |= S_IEXEC;
       }
@@ -702,7 +699,7 @@
   {
     struct stat sdir;
 
-    if (!NILP (dirname) && stat ((char *) string_data (XSTRING (dirname)), &sdir) == 0)
+    if (!NILP (dirname) && stat ((char *) XSTRING_DATA (dirname), &sdir) == 0)
       values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
     else                        /* if we can't tell, assume worst */
       values[9] = Qt;
--- src/doc.c	1997/01/10 19:08:46	1.1
+++ src/doc.c	1997/01/10 19:32:19
@@ -155,7 +155,7 @@
             case '_': *to++ = '\037'; break;
             default:
               return_me = list2 (build_string
-                                 ("Invalid data in documentation file -- ^A followed by weird code"),
+	("Invalid data in documentation file -- ^A followed by weird code"),
                                  make_int (c));
               goto done;
             }
@@ -172,15 +172,15 @@
 }
 
 #define string_join(dest, s1, s2) \
-  memcpy ((void *) dest, (void *) XSTRING_data (s1), XSTRING_length (s1)); \
-  memcpy ((void *) ((Bufbyte *) dest + XSTRING_length (s1)), \
-          (void *) XSTRING_data (s2), XSTRING_length (s2));  \
-          dest[XSTRING_length (s1) + XSTRING_length (s2)] = '\0'
+  memcpy ((void *) dest, (void *) XSTRING_DATA (s1), XSTRING_LENGTH (s1)); \
+  memcpy ((void *) ((Bufbyte *) dest + XSTRING_LENGTH (s1)), \
+          (void *) XSTRING_DATA (s2), XSTRING_LENGTH (s2));  \
+          dest[XSTRING_LENGTH (s1) + XSTRING_LENGTH (s2)] = '\0'
 
 /* Extract a doc string from a file.  FILEPOS says where to get it.
    (This could actually be byte code instructions/constants instead
    of a doc string.)
-   If it is an integer, use that position in the standard DOC-... file.
+   If it is an integer, use that position in the standard DOC file.
    If it is (FILE . INTEGER), use FILE as the file name
    and INTEGER as the position in that file.
    But if INTEGER is negative, make it positive.
@@ -227,16 +227,11 @@
       if (!STRINGP (Vdoc_directory))
 	return Qnil;
 
-      minsize = string_length (XSTRING (Vdoc_directory));
+      minsize = XSTRING_LENGTH (Vdoc_directory);
       /* sizeof ("../lib-src/") == 12 */
       if (minsize < 12)
 	minsize = 12;
-      name_nonreloc
-	= (char *) alloca (minsize + string_length (XSTRING (file)) + 8);
-      /*
-      strcpy (name_nonreloc, (char *) string_data (XSTRING (Vdoc_directory)));
-      strcat (name_nonreloc, (char *) string_data (XSTRING (file)));
-      */
+      name_nonreloc = (char *) alloca (minsize + XSTRING_LENGTH (file) + 8);
       string_join (name_nonreloc, Vdoc_directory, file);
       munge_doc_file_name (name_nonreloc);
     }
@@ -244,29 +239,28 @@
     name_reloc = file;
 
   fd = open (name_nonreloc ? name_nonreloc :
-	     (char *) string_data (XSTRING (name_reloc)), O_RDONLY, 0);
+	     (char *) XSTRING_DATA (name_reloc), O_RDONLY, 0);
   if (fd < 0)
     {
 #ifndef CANNOT_DUMP
       if (purify_flag)
 	{
-	  name_nonreloc
 	    /* sizeof ("../lib-src/") == 12 */
-	    = (char *) alloca (12 + string_length (XSTRING (file)) + 8);
+	  name_nonreloc = (char *) alloca (12 + XSTRING_LENGTH (file) + 8);
 	  /* Preparing to dump; DOC file is probably not installed.
 	     So check in ../lib-src. */
 	  strcpy (name_nonreloc, "../lib-src/");
-	  strcat (name_nonreloc, (char *) string_data (XSTRING (file)));
+	  strcat (name_nonreloc, (char *) XSTRING_DATA (file));
 	  munge_doc_file_name (name_nonreloc);
 
 	  fd = open (name_nonreloc, O_RDONLY, 0);
 	}
-#endif
+#endif /* CANNOT_DUMP */
 
       if (fd < 0)
 	error ("Cannot open doc string file \"%s\"",
 	       name_nonreloc ? name_nonreloc :
-	       (char *) string_data (XSTRING (name_reloc)));
+	       (char *) XSTRING_DATA (name_reloc));
     }
 
   tem = unparesseuxify_doc_string (fd, position, name_nonreloc, name_reloc);
@@ -430,7 +424,7 @@
 static void
 weird_doc (Lisp_Object sym, CONST char *weirdness, CONST char *type, int pos)
 {
-#ifdef ENERGIZE /* hide kludgery... */
+#if defined(ENERGIZE) || defined(SUNPRO) /* hide kludgery... */
   if (!strcmp (weirdness, GETTEXT ("duplicate"))) return;
 #endif
   message ("Note: Strange doc (%s) for %s %s @ %d",
@@ -467,16 +461,16 @@
   CHECK_STRING (filename);
 
 #ifndef CANNOT_DUMP
-  name = (char *) alloca (string_length (XSTRING (filename)) + 14);
+  name = (char *) alloca (XSTRING_LENGTH (filename) + 14);
   strcpy (name, "../lib-src/");
 #else /* CANNOT_DUMP */
   CHECK_STRING (Vdoc_directory);
-  name = (char *) alloca (string_length (XSTRING (filename)) 
-                          + string_length (XSTRING (Vdoc_directory))
+  name = (char *) alloca (XSTRING_LENGTH (filename) 

