Copyright (C) 1985-1989, 1992-1995 Free Software Foundation, Inc.
Copyright (C) 1995 Sun Microsystems, Inc.
Copyright (C) 1995, 1996 Ben Wing.
+ Copyright (C) 1999,2000,2001 MORIOKA Tomohiko
This file is part of XEmacs.
list per frame.)
Mly: a few changes for buffer-local vars, 19.8 or 19.9.
Ben Wing: some changes and cleanups for Mule, 19.12.
+ MORIOKA Tomohiko: some changes for XEmacs UTF-2000.
*/
/* This file contains functions that work with buffer objects.
struct buffer *
decode_buffer (Lisp_Object buffer, int allow_string)
{
- if (NILP (buffer))
+ if (NILP (buffer) || (!POINTER_TYPE_P( XTYPE(buffer))))
return current_buffer;
if (allow_string && STRINGP (buffer))
Lisp_Object cons = Frassq (buf, Vbuffer_alist);
Lisp_Object frmcons, devcons, concons;
if (NILP (cons))
- return; /* abort() ? */
+ return; /* ABORT() ? */
Vbuffer_alist = delq_no_quit (cons, Vbuffer_alist);
FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
is provided, then the ordering is for that frame. If the second arg
is t, then the global ordering is returned.
-Note: In FSF Emacs, this function takes two arguments: BUFFER and
-VISIBLE-OK.
+Note: In FSF Emacs, this function takes the arguments in the order of
+BUFFER, VISIBLE-OK and FRAME.
*/
(buffer, frame, visible_ok))
{
delete_from_buffer_alist (buf);
- /* #### This is a problem if this buffer is in a dedicated window.
- Need to undedicate any windows of this buffer first (and delete them?)
- */
+ /* Undedicate any windows of this buffer, and make sure no windows
+ show it. */
+
+ undedicate_windows (buf, Qt);
+
GCPRO1 (buf);
Freplace_buffer_in_windows (buf, Qnil, Qall);
UNGCPRO;
{
REGISTER Lisp_Object lynk, prev;
struct frame *f = selected_frame ();
+ int buffer_found = 0;
+ CHECK_BUFFER (buffer);
+ if (!BUFFER_LIVE_P (XBUFFER (buffer)))
+ return Qnil;
prev = Qnil;
for (lynk = Vbuffer_alist; CONSP (lynk); lynk = XCDR (lynk))
{
if (EQ (XCDR (XCAR (lynk)), buffer))
- break;
+ {
+ buffer_found = 1;
+ break;
+ }
prev = lynk;
}
- /* Effectively do Vbuffer_alist = delq_no_quit (lynk, Vbuffer_alist) */
- if (NILP (prev))
- Vbuffer_alist = XCDR (Vbuffer_alist);
+ if (buffer_found)
+ {
+ /* Effectively do Vbuffer_alist = delq_no_quit (lynk, Vbuffer_alist) */
+ if (NILP (prev))
+ Vbuffer_alist = XCDR (Vbuffer_alist);
+ else
+ XCDR (prev) = XCDR (XCDR (prev));
+ XCDR (lynk) = Vbuffer_alist;
+ Vbuffer_alist = lynk;
+ }
else
- XCDR (prev) = XCDR (XCDR (prev));
- XCDR (lynk) = Vbuffer_alist;
- Vbuffer_alist = lynk;
+ Vbuffer_alist = Fcons (Fcons (Fbuffer_name(buffer), buffer), Vbuffer_alist);
/* That was the global one. Now do the same thing for the
per-frame buffer-alist. */
+ buffer_found = 0;
prev = Qnil;
for (lynk = f->buffer_alist; CONSP (lynk); lynk = XCDR (lynk))
{
if (EQ (XCDR (XCAR (lynk)), buffer))
- break;
+ {
+ buffer_found = 1;
+ break;
+ }
prev = lynk;
}
- /* Effectively do f->buffer_alist = delq_no_quit (lynk, f->buffer_alist) */
- if (NILP (prev))
- f->buffer_alist = XCDR (f->buffer_alist);
+ if (buffer_found)
+ {
+ /* Effectively do f->buffer_alist = delq_no_quit (lynk, f->buffer_alist) */
+ if (NILP (prev))
+ f->buffer_alist = XCDR (f->buffer_alist);
+ else
+ XCDR (prev) = XCDR (XCDR (prev));
+ XCDR (lynk) = f->buffer_alist;
+ f->buffer_alist = lynk;
+ }
else
- XCDR (prev) = XCDR (XCDR (prev));
- XCDR (lynk) = f->buffer_alist;
- f->buffer_alist = lynk;
+ f->buffer_alist = Fcons (Fcons (Fbuffer_name(buffer), buffer),
+ f->buffer_alist);
return Qnil;
}
const Bufbyte *end;
for (end = ptr + len; ptr < end;)
{
+#ifdef UTF2000
+ Bufbyte c =
+ (*ptr < 0xc0) ? *ptr :
+ ((*ptr & 0x1f) << 6) | (*(ptr+1) & 0x3f);
+#else
Bufbyte c =
(BYTE_ASCII_P (*ptr)) ? *ptr :
(*ptr == LEADING_BYTE_CONTROL_1) ? (*(ptr+1) - 0x20) :
(*ptr == LEADING_BYTE_LATIN_ISO8859_1) ? (*(ptr+1)) :
'~';
+#endif
Dynarr_add (conversion_out_dynarr, (Extbyte) c);
INC_CHARPTR (ptr);
{
Bufbyte c = *ptr;
+#ifdef UTF2000
+ if (BYTE_ASCII_P (c))
+ Dynarr_add (conversion_in_dynarr, c);
+ else
+ {
+ Dynarr_add (conversion_in_dynarr, (c >> 6) | 0xC0);
+ Dynarr_add (conversion_in_dynarr, (c & 0x3F) | 0x80);
+ }
+#else
if (BYTE_ASCII_P (c))
Dynarr_add (conversion_in_dynarr, c);
else if (BYTE_C1_P (c))
Dynarr_add (conversion_in_dynarr, LEADING_BYTE_LATIN_ISO8859_1);
Dynarr_add (conversion_in_dynarr, c);
}
+#endif
}
#else
Dynarr_add_many (conversion_in_dynarr, source->data.ptr, source->data.len);
defs->category_table = Vstandard_category_table;
#endif /* MULE */
defs->syntax_table = Vstandard_syntax_table;
+#ifndef UTF2000
defs->mirror_syntax_table =
XCHAR_TABLE (Vstandard_syntax_table)->mirror_table;
+#endif
defs->modeline_format = build_string ("%-"); /* reset in loaddefs.el */
defs->case_fold_search = Qt;
defs->selective_display_ellipses = Qt;
/* #### Warning: 1<<31 is the largest number currently allowable
due to the XINT() handling of this value. With some
- rearrangement you can get 3 more bits. */
+ rearrangement you can get 3 more bits.
+
+ #### 3 more? 34 bits???? -ben */
}
}
DEFVAR_BUFFER_LOCAL ("case-fold-search", case_fold_search /*
*Non-nil if searches should ignore case.
Automatically becomes buffer-local when set in any fashion.
-
-BUG: Under XEmacs/Mule, translations to or from non-ASCII characters
- (this includes chars in the range 128 - 255) are ignored by
- the string/buffer-searching routines. Thus, `case-fold-search'
- will not correctly conflate a-umlaut and A-umlaut even if the
- case tables call for this.
*/ );
DEFVAR_BUFFER_LOCAL ("fill-column", fill_column /*
DEFVAR_BUFFER_LOCAL ("buffer-file-name", filename /*
Name of file visited in current buffer, or nil if not visiting a file.
Each buffer has its own value of this variable.
+Code that changes this variable must maintain the invariant
+`(equal buffer-file-truename (file-truename buffer-file-name))'.
*/ );
#if 0 /* FSFmacs */
#endif /* FSFmacs */
DEFVAR_BUFFER_LOCAL ("buffer-file-truename", file_truename /*
-The real name of the file visited in the current buffer,
-or nil if not visiting a file. This is the result of passing
-buffer-file-name to the `file-truename' function. Every buffer has
-its own value of this variable. This variable is automatically
-maintained by the functions that change the file name associated
-with a buffer.
+The real name of the file visited in the current buffer, or nil if not
+visiting a file. This is the result of passing `buffer-file-name' to the
+`file-truename' function. Every buffer has its own value of this variable.
+Code that changes the file name associated with a buffer maintains the
+invariant `(equal buffer-file-truename (file-truename buffer-file-name))'.
*/ );
DEFVAR_BUFFER_LOCAL ("buffer-auto-save-file-name", auto_save_file_name /*
if ((XINT (buffer_local_flags.slot) != -2 && \
XINT (buffer_local_flags.slot) != -3) \
!= !(NILP (XBUFFER (Vbuffer_local_symbols)->slot))) \
- abort ()
+ ABORT ()
#include "bufslots.h"
#undef MARKED_SLOT