emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/coding.c [lexbind]


From: Miles Bader
Subject: [Emacs-diffs] Changes to emacs/src/coding.c [lexbind]
Date: Wed, 08 Dec 2004 18:57:21 -0500

Index: emacs/src/coding.c
diff -c emacs/src/coding.c:1.245.2.12 emacs/src/coding.c:1.245.2.13
*** emacs/src/coding.c:1.245.2.12       Wed Oct  6 05:23:55 2004
--- emacs/src/coding.c  Wed Dec  8 23:36:24 2004
***************
*** 6008,6013 ****
--- 6008,6044 ----
    return 0;
  }
  
+ /* Name (or base name) of work buffer for code conversion.  */
+ static Lisp_Object Vcode_conversion_workbuf_name;
+ 
+ /* Set the current buffer to the working buffer prepared for
+    code-conversion.  MULTIBYTE specifies the multibyteness of the
+    buffer.  */
+ 
+ static struct buffer *
+ set_conversion_work_buffer (multibyte)
+      int multibyte;
+ {
+   Lisp_Object buffer;
+   struct buffer *buf;
+ 
+   buffer = Fget_buffer_create (Vcode_conversion_workbuf_name);
+   buf = XBUFFER (buffer);
+   delete_all_overlays (buf);
+   buf->directory = current_buffer->directory;
+   buf->read_only = Qnil;
+   buf->filename = Qnil;
+   buf->undo_list = Qt;
+   eassert (buf->overlays_before == NULL);
+   eassert (buf->overlays_after == NULL);
+   set_buffer_internal (buf);
+   if (BEG != BEGV || Z != ZV)
+     Fwiden ();
+   del_range_2 (BEG, BEG_BYTE, Z, Z_BYTE, 0);
+   buf->enable_multibyte_characters = multibyte ? Qt : Qnil;
+   return buf;
+ }
+ 
  Lisp_Object
  run_pre_post_conversion_on_str (str, coding, encodep)
       Lisp_Object str;
***************
*** 6017,6023 ****
    int count = SPECPDL_INDEX ();
    struct gcpro gcpro1, gcpro2;
    int multibyte = STRING_MULTIBYTE (str);
-   Lisp_Object buffer;
    struct buffer *buf;
    Lisp_Object old_deactivate_mark;
  
--- 6048,6053 ----
***************
*** 6028,6050 ****
    old_deactivate_mark = Vdeactivate_mark;
    GCPRO2 (str, old_deactivate_mark);
  
-   buffer = Fget_buffer_create (build_string (" *code-converting-work*"));
-   buf = XBUFFER (buffer);
- 
-   delete_all_overlays (buf);
-   buf->directory = current_buffer->directory;
-   buf->read_only = Qnil;
-   buf->filename = Qnil;
-   buf->undo_list = Qt;
-   eassert (buf->overlays_before == NULL);
-   eassert (buf->overlays_after == NULL);
- 
-   set_buffer_internal (buf);
    /* We must insert the contents of STR as is without
       unibyte<->multibyte conversion.  For that, we adjust the
       multibyteness of the working buffer to that of STR.  */
!   Ferase_buffer ();
!   buf->enable_multibyte_characters = multibyte ? Qt : Qnil;
  
    insert_from_string (str, 0, 0,
                      SCHARS (str), SBYTES (str), 0);
--- 6058,6067 ----
    old_deactivate_mark = Vdeactivate_mark;
    GCPRO2 (str, old_deactivate_mark);
  
    /* We must insert the contents of STR as is without
       unibyte<->multibyte conversion.  For that, we adjust the
       multibyteness of the working buffer to that of STR.  */
!   set_conversion_work_buffer (multibyte);
  
    insert_from_string (str, 0, 0,
                      SCHARS (str), SBYTES (str), 0);
***************
*** 6065,6070 ****
--- 6082,6145 ----
    return unbind_to (count, str);
  }
  
+ 
+ /* Run pre-write-conversion function of CODING on NCHARS/NBYTES
+    text in *STR.  *SIZE is the allocated bytes for STR.  As it
+    is intended that this function is called from encode_terminal_code,
+    the pre-write-conversion function is run by safe_call and thus
+    "Error during redisplay: ..." is logged when an error occurs.
+ 
+    Store the resulting text in *STR and set CODING->produced_char and
+    CODING->produced to the number of characters and bytes
+    respectively.  If the size of *STR is too small, enlarge it by
+    xrealloc and update *STR and *SIZE.  */
+ 
+ void
+ run_pre_write_conversin_on_c_str (str, size, nchars, nbytes, coding)
+      unsigned char **str;
+      int *size, nchars, nbytes;
+      struct coding_system *coding;
+ {
+   struct gcpro gcpro1, gcpro2;
+   struct buffer *cur = current_buffer;
+   Lisp_Object old_deactivate_mark, old_last_coding_system_used;
+   Lisp_Object args[3];
+ 
+   /* It is not crucial to specbind this.  */
+   old_deactivate_mark = Vdeactivate_mark;
+   old_last_coding_system_used = Vlast_coding_system_used;
+   GCPRO2 (old_deactivate_mark, old_last_coding_system_used);
+ 
+   /* We must insert the contents of STR as is without
+      unibyte<->multibyte conversion.  For that, we adjust the
+      multibyteness of the working buffer to that of STR.  */
+   set_conversion_work_buffer (coding->src_multibyte);
+   insert_1_both (*str, nchars, nbytes, 0, 0, 0);
+   UNGCPRO;
+   inhibit_pre_post_conversion = 1;
+   args[0] = coding->pre_write_conversion;
+   args[1] = make_number (BEG);
+   args[2] = make_number (Z);
+   safe_call (3, args);
+   inhibit_pre_post_conversion = 0;
+   Vdeactivate_mark = old_deactivate_mark;
+   Vlast_coding_system_used = old_last_coding_system_used;
+   coding->produced_char = Z - BEG;
+   coding->produced = Z_BYTE - BEG_BYTE;
+   if (coding->produced > *size)
+     {
+       *size = coding->produced;
+       *str = xrealloc (*str, *size);
+     }
+   if (BEG < GPT && GPT < Z)
+     move_gap (BEG);
+   bcopy (BEG_ADDR, *str, coding->produced);
+   coding->src_multibyte
+     = ! NILP (current_buffer->enable_multibyte_characters);
+   set_buffer_internal (cur);
+ }
+ 
+ 
  Lisp_Object
  decode_coding_string (str, coding, nocopy)
       Lisp_Object str;
***************
*** 7543,7548 ****
--- 7618,7626 ----
  void
  syms_of_coding ()
  {
+   staticpro (&Vcode_conversion_workbuf_name);
+   Vcode_conversion_workbuf_name = build_string (" *code-conversion-work*");
+ 
    Qtarget_idx = intern ("target-idx");
    staticpro (&Qtarget_idx);
  




reply via email to

[Prev in Thread] Current Thread [Next in Thread]