1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-31 01:20:37 -08:00

(Fmake_char): Make it more backward compatible.

This commit is contained in:
Kenichi Handa 2002-05-14 00:40:45 +00:00
parent 356212fe86
commit b121a744db
2 changed files with 66 additions and 28 deletions

View file

@ -1,3 +1,7 @@
2002-05-14 Kenichi Handa <handa@etl.go.jp>
* charset.c (Fmake_char): Make it more backward compatible.
2002-05-13 Dave Love <fx@gnu.org>
* coding.c: Doc fixes.

View file

@ -1472,50 +1472,84 @@ code-point in CCS. Currently not supported and just ignored. */)
}
DEFUN ("make-char", Fmake_char, Smake_char, 1, 4, 0,
doc: /* Return a character of CHARSET whose position code is CODE.
DEFUN ("make-char", Fmake_char, Smake_char, 1, 5, 0,
doc:
/* Return a character of CHARSET whose position codes are CODEn.
If dimension of CHARSET is two, and the third optional arg CODE2 is
non-nil, CODE actually specifies the first byte of the position code,
and CODE2 specifies the second byte.
If dimension of CHARSET is three, and the third optional arg CODE2 and
the fourth optional arg CODE3 are both non-nil, CODE actually
specifies the first byte of the position code, CODE2 the second byte,
and CODE3 the third byte. */)
(charset, code, code2, code3)
Lisp_Object charset, code, code2, code3;
CODE1 through CODE4 are optional, but if you don't supply sufficient
position codes, it is assumed that the minimum code in each dimension
are specified. */)
(charset, code1, code2, code3, code4)
Lisp_Object charset, code1, code2, code3, code4;
{
int id, dimension;
struct charset *charsetp;
unsigned c;
unsigned code;
int c;
CHECK_CHARSET_GET_ID (charset, id);
charsetp = CHARSET_FROM_ID (id);
if (NILP (code))
code = make_number (CHARSET_MIN_CODE (charsetp));
return make_number (CHARSET_MIN_CHAR (charsetp));
dimension = CHARSET_DIMENSION (charsetp);
if (NILP (code1))
code = charsetp->code_space[(dimension - 1) * 4];
else
{
CHECK_NATNUM (code);
dimension = CHARSET_DIMENSION (charsetp);
if (!NILP (code2))
CHECK_NATNUM (code1);
if (XFASTINT (code1) >= 0x100)
args_out_of_range (make_number (0xFF), code1);
code = XFASTINT (code1);
}
if (dimension > 1)
{
code <<= 8;
if (NILP (code2))
code |= charsetp->code_space[(dimension - 2) * 4];
else
{
CHECK_NATNUM (code2);
if (dimension == 3)
CHECK_NATNUM (code3);
if (XFASTINT (code2) >= 0x100)
args_out_of_range (make_number (0xFF), code2);
code |= XFASTINT (code2);
}
if (dimension > 2)
{
code <<= 8;
if (NILP (code3))
code |= charsetp->code_space[(dimension - 3) * 4];
else
{
CHECK_NATNUM (code3);
if (XFASTINT (code3) >= 0x100)
args_out_of_range (make_number (0xFF), code3);
code |= XFASTINT (code3);
}
if (dimension > 3)
{
code <<= 8;
if (NILP (code4))
code |= charsetp->code_space[0];
else
{
CHECK_NATNUM (code4);
if (XFASTINT (code4) >= 0x100)
args_out_of_range (make_number (0xFF), code4);
code |= XFASTINT (code4);
}
}
}
}
if (dimension == 1 || NILP (code2))
c = XFASTINT (code);
else if (dimension == 2)
c = (XFASTINT (code) << 8) | XFASTINT (code2);
else if (dimension == 3)
c = (XFASTINT (code) << 16) | (XFASTINT (code2) << 8) | XFASTINT (code3);
c = DECODE_CHAR (charsetp, c);
if (CHARSET_ISO_FINAL (charsetp) >= 0)
code &= 0x7F7F7F7F;
c = DECODE_CHAR (charsetp, code);
if (c < 0)
error ("Invalid code(s)");
return make_number (c);
}