Mercurial > emacs
comparison src/coding.c @ 20680:dd46027e8412
(code_convert_region): Always count chars inserted
in accord with value of enable-multilibyte-characters.
(Fcoding_system_p): Doc fix.
(Fcheck_coding_system): Doc fix.
(Fterminal_coding_system): Doc fix.
(Fkeyboard_coding_system): Doc fix.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 19 Jan 1998 19:45:53 +0000 |
parents | 84032a5b04a9 |
children | ed9ed828415e |
comparison
equal
deleted
inserted
replaced
20679:a9d566444dd4 | 20680:dd46027e8412 |
---|---|
3123 #ifdef emacs | 3123 #ifdef emacs |
3124 /*** 7. Emacs Lisp library functions ***/ | 3124 /*** 7. Emacs Lisp library functions ***/ |
3125 | 3125 |
3126 DEFUN ("coding-system-p", Fcoding_system_p, Scoding_system_p, 1, 1, 0, | 3126 DEFUN ("coding-system-p", Fcoding_system_p, Scoding_system_p, 1, 1, 0, |
3127 "Return t if OBJECT is nil or a coding-system.\n\ | 3127 "Return t if OBJECT is nil or a coding-system.\n\ |
3128 See document of make-coding-system for coding-system object.") | 3128 See the documentation of `make-coding-system' for information\n\ |
3129 about coding-system objects.") | |
3129 (obj) | 3130 (obj) |
3130 Lisp_Object obj; | 3131 Lisp_Object obj; |
3131 { | 3132 { |
3132 if (NILP (obj)) | 3133 if (NILP (obj)) |
3133 return Qt; | 3134 return Qt; |
3171 } | 3172 } |
3172 | 3173 |
3173 DEFUN ("check-coding-system", Fcheck_coding_system, Scheck_coding_system, | 3174 DEFUN ("check-coding-system", Fcheck_coding_system, Scheck_coding_system, |
3174 1, 1, 0, | 3175 1, 1, 0, |
3175 "Check validity of CODING-SYSTEM.\n\ | 3176 "Check validity of CODING-SYSTEM.\n\ |
3176 If valid, return CODING-SYSTEM, else `coding-system-error' is signaled.\n\ | 3177 If valid, return CODING-SYSTEM, else signal a `coding-system-error' error.\n\ |
3177 CODING-SYSTEM is valid if it is a symbol and has \"coding-system\" property.\n\ | 3178 It is valid if it is a symbol with a non-nil `coding-system' property.\n\ |
3178 The value of property should be a vector of length 5.") | 3179 The value of property should be a vector of length 5.") |
3179 (coding_system) | 3180 (coding_system) |
3180 Lisp_Object coding_system; | 3181 Lisp_Object coding_system; |
3181 { | 3182 { |
3182 CHECK_SYMBOL (coding_system, 0); | 3183 CHECK_SYMBOL (coding_system, 0); |
3183 if (!NILP (Fcoding_system_p (coding_system))) | 3184 if (!NILP (Fcoding_system_p (coding_system))) |
3184 return coding_system; | 3185 return coding_system; |
3185 while (1) | 3186 while (1) |
3186 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil)); | 3187 Fsignal (Qcoding_system_error, Fcons (coding_system, Qnil)); |
3187 } | 3188 } |
3188 | 3189 |
3189 DEFUN ("detect-coding-region", Fdetect_coding_region, Sdetect_coding_region, | 3190 DEFUN ("detect-coding-region", Fdetect_coding_region, Sdetect_coding_region, |
3190 2, 2, 0, | 3191 2, 2, 0, |
3191 "Detect coding system of the text in the region between START and END.\n\ | 3192 "Detect coding system of the text in the region between START and END.\n\ |
3192 Return a list of possible coding systems ordered by priority.\n\ | 3193 Return a list of possible coding systems ordered by priority.\n\ |
3193 If only ASCII characters are found, it returns `undecided'\n\ | 3194 If only ASCII characters are found, it returns `undecided'\n\ |
3274 } | 3275 } |
3275 } | 3276 } |
3276 | 3277 |
3277 return val; | 3278 return val; |
3278 } | 3279 } |
3279 | 3280 |
3280 /* Scan text in the region between *BEGP and *ENDP, skip characters | 3281 /* Scan text in the region between *BEGP and *ENDP, skip characters |
3281 which we never have to encode to (iff ENCODEP is 1) or decode from | 3282 which we never have to encode to (iff ENCODEP is 1) or decode from |
3282 coding system CODING at the head and tail, then set BEGP and ENDP | 3283 coding system CODING at the head and tail, then set BEGP and ENDP |
3283 to the addresses of start and end of the text we actually convert. */ | 3284 to the addresses of start and end of the text we actually convert. */ |
3284 | 3285 |
3381 } | 3382 } |
3382 *begp = beg_addr; | 3383 *begp = beg_addr; |
3383 *endp = end_addr; | 3384 *endp = end_addr; |
3384 return; | 3385 return; |
3385 } | 3386 } |
3386 | 3387 |
3387 /* Encode into or decode from (according to ENCODEP) coding system CODING | 3388 /* Encode into or decode from (according to ENCODEP) coding system CODING |
3388 the text between char positions B and E. */ | 3389 the text between char positions B and E. */ |
3389 | 3390 |
3390 Lisp_Object | 3391 Lisp_Object |
3391 code_convert_region (b, e, coding, encodep) | 3392 code_convert_region (b, e, coding, encodep) |
3465 : decode_coding (coding, begp, buf, shrunk_len_byte, buflen, | 3466 : decode_coding (coding, begp, buf, shrunk_len_byte, buflen, |
3466 &consumed)); | 3467 &consumed)); |
3467 | 3468 |
3468 TEMP_SET_PT_BOTH (shrunk_beg, shrunk_beg_byte); | 3469 TEMP_SET_PT_BOTH (shrunk_beg, shrunk_beg_byte); |
3469 | 3470 |
3470 if (encodep) | 3471 /* We let the number of characters in the result |
3471 /* If we just encoded, treat the result as single-byte. */ | 3472 be computed in accord with enable-multilibyte-characters |
3472 insert_1_both (buf, produced, produced, 0, 1, 0); | 3473 even when encoding. Otherwise the buffer contents |
3473 else | 3474 will be inconsistent. */ |
3474 insert (buf, produced); | 3475 insert (buf, produced); |
3475 | 3476 |
3476 del_range_byte (PT_BYTE, PT_BYTE + shrunk_len_byte, 1); | 3477 del_range_byte (PT_BYTE, PT_BYTE + shrunk_len_byte, 1); |
3477 | 3478 |
3478 if (opoint >= end) | 3479 if (opoint >= end) |
3479 { | 3480 { |
3518 } | 3519 } |
3519 | 3520 |
3520 return make_number (len); | 3521 return make_number (len); |
3521 } | 3522 } |
3522 | 3523 |
3524 DEFUN ("decode-coding-region", Fdecode_coding_region, Sdecode_coding_region, | |
3525 3, 3, "r\nzCoding system: ", | |
3526 "Decode current region by specified coding system.\n\ | |
3527 When called from a program, takes three arguments:\n\ | |
3528 START, END, and CODING-SYSTEM. START END are buffer positions.\n\ | |
3529 Return length of decoded text.") | |
3530 (b, e, coding_system) | |
3531 Lisp_Object b, e, coding_system; | |
3532 { | |
3533 struct coding_system coding; | |
3534 | |
3535 CHECK_NUMBER_COERCE_MARKER (b, 0); | |
3536 CHECK_NUMBER_COERCE_MARKER (e, 1); | |
3537 CHECK_SYMBOL (coding_system, 2); | |
3538 | |
3539 if (NILP (coding_system)) | |
3540 return make_number (XFASTINT (e) - XFASTINT (b)); | |
3541 if (setup_coding_system (Fcheck_coding_system (coding_system), &coding) < 0) | |
3542 error ("Invalid coding-system: %s", XSYMBOL (coding_system)->name->data); | |
3543 | |
3544 return code_convert_region (b, e, &coding, 0); | |
3545 } | |
3546 | |
3547 DEFUN ("encode-coding-region", Fencode_coding_region, Sencode_coding_region, | |
3548 3, 3, "r\nzCoding system: ", | |
3549 "Encode current region by specified coding system.\n\ | |
3550 When called from a program, takes three arguments:\n\ | |
3551 START, END, and CODING-SYSTEM. START END are buffer positions.\n\ | |
3552 Return length of encoded text.") | |
3553 (b, e, coding_system) | |
3554 Lisp_Object b, e, coding_system; | |
3555 { | |
3556 struct coding_system coding; | |
3557 | |
3558 CHECK_NUMBER_COERCE_MARKER (b, 0); | |
3559 CHECK_NUMBER_COERCE_MARKER (e, 1); | |
3560 CHECK_SYMBOL (coding_system, 2); | |
3561 | |
3562 if (NILP (coding_system)) | |
3563 return make_number (XFASTINT (e) - XFASTINT (b)); | |
3564 if (setup_coding_system (Fcheck_coding_system (coding_system), &coding) < 0) | |
3565 error ("Invalid coding-system: %s", XSYMBOL (coding_system)->name->data); | |
3566 | |
3567 return code_convert_region (b, e, &coding, 1); | |
3568 } | |
3569 | |
3523 /* Encode or decode (according to ENCODEP) the text of string STR | 3570 /* Encode or decode (according to ENCODEP) the text of string STR |
3524 using coding CODING. If NOCOPY is nil, we never return STR | 3571 using coding CODING. If NOCOPY is nil, we never return STR |
3525 itself, but always a copy. If NOCOPY is non-nil, we return STR | 3572 itself, but always a copy. If NOCOPY is non-nil, we return STR |
3526 if no change is needed. */ | 3573 if no change is needed. */ |
3527 | 3574 |
3599 | 3646 |
3600 /* When decoding, count properly the number of chars in the string. */ | 3647 /* When decoding, count properly the number of chars in the string. */ |
3601 return make_string (buf, head_skip + produced + tail_skip); | 3648 return make_string (buf, head_skip + produced + tail_skip); |
3602 } | 3649 } |
3603 | 3650 |
3604 DEFUN ("decode-coding-region", Fdecode_coding_region, Sdecode_coding_region, | |
3605 3, 3, "r\nzCoding system: ", | |
3606 "Decode current region by specified coding system.\n\ | |
3607 When called from a program, takes three arguments:\n\ | |
3608 START, END, and CODING-SYSTEM. START END are buffer positions.\n\ | |
3609 Return length of decoded text.") | |
3610 (b, e, coding_system) | |
3611 Lisp_Object b, e, coding_system; | |
3612 { | |
3613 struct coding_system coding; | |
3614 | |
3615 CHECK_NUMBER_COERCE_MARKER (b, 0); | |
3616 CHECK_NUMBER_COERCE_MARKER (e, 1); | |
3617 CHECK_SYMBOL (coding_system, 2); | |
3618 | |
3619 if (NILP (coding_system)) | |
3620 return make_number (XFASTINT (e) - XFASTINT (b)); | |
3621 if (setup_coding_system (Fcheck_coding_system (coding_system), &coding) < 0) | |
3622 error ("Invalid coding-system: %s", XSYMBOL (coding_system)->name->data); | |
3623 | |
3624 return code_convert_region (b, e, &coding, 0); | |
3625 } | |
3626 | |
3627 DEFUN ("encode-coding-region", Fencode_coding_region, Sencode_coding_region, | |
3628 3, 3, "r\nzCoding system: ", | |
3629 "Encode current region by specified coding system.\n\ | |
3630 When called from a program, takes three arguments:\n\ | |
3631 START, END, and CODING-SYSTEM. START END are buffer positions.\n\ | |
3632 Return length of encoded text.") | |
3633 (b, e, coding_system) | |
3634 Lisp_Object b, e, coding_system; | |
3635 { | |
3636 struct coding_system coding; | |
3637 | |
3638 CHECK_NUMBER_COERCE_MARKER (b, 0); | |
3639 CHECK_NUMBER_COERCE_MARKER (e, 1); | |
3640 CHECK_SYMBOL (coding_system, 2); | |
3641 | |
3642 if (NILP (coding_system)) | |
3643 return make_number (XFASTINT (e) - XFASTINT (b)); | |
3644 if (setup_coding_system (Fcheck_coding_system (coding_system), &coding) < 0) | |
3645 error ("Invalid coding-system: %s", XSYMBOL (coding_system)->name->data); | |
3646 | |
3647 return code_convert_region (b, e, &coding, 1); | |
3648 } | |
3649 | |
3650 DEFUN ("decode-coding-string", Fdecode_coding_string, Sdecode_coding_string, | 3651 DEFUN ("decode-coding-string", Fdecode_coding_string, Sdecode_coding_string, |
3651 2, 3, 0, | 3652 2, 3, 0, |
3652 "Decode STRING which is encoded in CODING-SYSTEM, and return the result.\n\ | 3653 "Decode STRING which is encoded in CODING-SYSTEM, and return the result.\n\ |
3653 Optional arg NOCOPY non-nil means it is ok to return STRING itself\n\ | 3654 Optional arg NOCOPY non-nil means it is ok to return STRING itself\n\ |
3654 if the decoding operation is trivial.") | 3655 if the decoding operation is trivial.") |
3686 if (setup_coding_system (Fcheck_coding_system (coding_system), &coding) < 0) | 3687 if (setup_coding_system (Fcheck_coding_system (coding_system), &coding) < 0) |
3687 error ("Invalid coding-system: %s", XSYMBOL (coding_system)->name->data); | 3688 error ("Invalid coding-system: %s", XSYMBOL (coding_system)->name->data); |
3688 | 3689 |
3689 return code_convert_string (string, &coding, 1, nocopy); | 3690 return code_convert_string (string, &coding, 1, nocopy); |
3690 } | 3691 } |
3691 | 3692 |
3692 DEFUN ("decode-sjis-char", Fdecode_sjis_char, Sdecode_sjis_char, 1, 1, 0, | 3693 DEFUN ("decode-sjis-char", Fdecode_sjis_char, Sdecode_sjis_char, 1, 1, 0, |
3693 "Decode a JISX0208 character of shift-jis encoding.\n\ | 3694 "Decode a JISX0208 character of shift-jis encoding.\n\ |
3694 CODE is the character code in SJIS.\n\ | 3695 CODE is the character code in SJIS.\n\ |
3695 Return the corresponding character.") | 3696 Return the corresponding character.") |
3696 (code) | 3697 (code) |
3763 } | 3764 } |
3764 else | 3765 else |
3765 XSETFASTINT (val, 0); | 3766 XSETFASTINT (val, 0); |
3766 return val; | 3767 return val; |
3767 } | 3768 } |
3768 | 3769 |
3769 DEFUN ("set-terminal-coding-system-internal", | 3770 DEFUN ("set-terminal-coding-system-internal", |
3770 Fset_terminal_coding_system_internal, | 3771 Fset_terminal_coding_system_internal, |
3771 Sset_terminal_coding_system_internal, 1, 1, 0, "") | 3772 Sset_terminal_coding_system_internal, 1, 1, 0, "") |
3772 (coding_system) | 3773 (coding_system) |
3773 Lisp_Object coding_system; | 3774 Lisp_Object coding_system; |
3792 return Qnil; | 3793 return Qnil; |
3793 } | 3794 } |
3794 | 3795 |
3795 DEFUN ("terminal-coding-system", | 3796 DEFUN ("terminal-coding-system", |
3796 Fterminal_coding_system, Sterminal_coding_system, 0, 0, 0, | 3797 Fterminal_coding_system, Sterminal_coding_system, 0, 0, 0, |
3797 "Return coding-system of your terminal.") | 3798 "Return coding system specified for terminal output.") |
3798 () | 3799 () |
3799 { | 3800 { |
3800 return terminal_coding.symbol; | 3801 return terminal_coding.symbol; |
3801 } | 3802 } |
3802 | 3803 |
3811 return Qnil; | 3812 return Qnil; |
3812 } | 3813 } |
3813 | 3814 |
3814 DEFUN ("keyboard-coding-system", | 3815 DEFUN ("keyboard-coding-system", |
3815 Fkeyboard_coding_system, Skeyboard_coding_system, 0, 0, 0, | 3816 Fkeyboard_coding_system, Skeyboard_coding_system, 0, 0, 0, |
3816 "Return coding-system of what is sent from terminal keyboard.") | 3817 "Return coding system specified for decoding keyboard input.") |
3817 () | 3818 () |
3818 { | 3819 { |
3819 return keyboard_coding.symbol; | 3820 return keyboard_coding.symbol; |
3820 } | 3821 } |
3821 | 3822 |