Mercurial > emacs
comparison src/coding.c @ 20105:c017642863c2
(Qcoding_system_spec): Deleted.
(Vcoding_system_list, Vcoding_system_alist): New variables.
(setup_coding_system): Adjusted for the change in mule.el.
(detect_eol): Likewise.
(Fcoding_system_spec): Changed to Lisp function in mule.el.
(Fcoding_system_p): Do not call Fcoding_system_spec.
(Fread_coding_system): Give Vcoding_system_alist to
Fcompleting_read as the arg TABLE.
(Fread_non_nil_coding_system): Likewise. Give
Vcoding_system_history to Fcompleting_read as the arg HIST.
(syms_of_coding): Deleted codes for Qcoding_system and
Fcoding_system_spec. Set up new Lisp variables.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Tue, 21 Oct 1997 10:43:40 +0000 |
parents | ea89a2408bfa |
children | 402b6e5f4b58 |
comparison
equal
deleted
inserted
replaced
20104:6128508b0c31 | 20105:c017642863c2 |
---|---|
67 (all uppercase), we mean the coding system, and when we write | 67 (all uppercase), we mean the coding system, and when we write |
68 "Big5" (capitalized), we mean the character set. | 68 "Big5" (capitalized), we mean the character set. |
69 | 69 |
70 4. Raw text | 70 4. Raw text |
71 | 71 |
72 A coding system to for a text containing random 8-bit code. Emacs | 72 A coding system for a text containing random 8-bit code. Emacs does |
73 does no code conversion on such a text except for end-of-line | 73 no code conversion on such a text except for end-of-line format. |
74 format. | |
75 | 74 |
76 5. Other | 75 5. Other |
77 | 76 |
78 If a user wants to read/write a text encoded in a coding system not | 77 If a user wants to read/write a text encoded in a coding system not |
79 listed above, he can supply a decoder and an encoder for it in CCL | 78 listed above, he can supply a decoder and an encoder for it in CCL |
270 Unix, CODING_EOL_CRLF on DOS/Windows, and CODING_EOL_CR on Mac. */ | 269 Unix, CODING_EOL_CRLF on DOS/Windows, and CODING_EOL_CR on Mac. */ |
271 int system_eol_type; | 270 int system_eol_type; |
272 | 271 |
273 #ifdef emacs | 272 #ifdef emacs |
274 | 273 |
275 Lisp_Object Qcoding_system_spec, Qcoding_system_p, Qcoding_system_error; | 274 Lisp_Object Vcoding_system_list, Vcoding_system_alist; |
275 | |
276 Lisp_Object Qcoding_system_p, Qcoding_system_error; | |
276 | 277 |
277 /* Coding system emacs-mule is for converting only end-of-line format. */ | 278 /* Coding system emacs-mule is for converting only end-of-line format. */ |
278 Lisp_Object Qemacs_mule; | 279 Lisp_Object Qemacs_mule; |
279 | 280 |
280 /* Coding-systems are handed between Emacs Lisp programs and C internal | 281 /* Coding-systems are handed between Emacs Lisp programs and C internal |
2297 int | 2298 int |
2298 setup_coding_system (coding_system, coding) | 2299 setup_coding_system (coding_system, coding) |
2299 Lisp_Object coding_system; | 2300 Lisp_Object coding_system; |
2300 struct coding_system *coding; | 2301 struct coding_system *coding; |
2301 { | 2302 { |
2302 Lisp_Object type, eol_type; | 2303 Lisp_Object coding_spec, plist, type, eol_type; |
2304 Lisp_Object val; | |
2303 | 2305 |
2304 /* At first, set several fields to default values. */ | 2306 /* At first, set several fields to default values. */ |
2305 coding->require_flushing = 0; | 2307 coding->require_flushing = 0; |
2306 coding->last_block = 0; | 2308 coding->last_block = 0; |
2307 coding->selective = 0; | 2309 coding->selective = 0; |
2312 coding->character_unification_table_for_decode = Qnil; | 2314 coding->character_unification_table_for_decode = Qnil; |
2313 coding->character_unification_table_for_encode = Qnil; | 2315 coding->character_unification_table_for_encode = Qnil; |
2314 | 2316 |
2315 Vlast_coding_system_used = coding->symbol = coding_system; | 2317 Vlast_coding_system_used = coding->symbol = coding_system; |
2316 eol_type = Qnil; | 2318 eol_type = Qnil; |
2317 /* Get value of property `coding-system' until we get a vector. | 2319 |
2318 While doing that, also get values of properties | 2320 /* Get values of property `coding-system' and `eol-type'. |
2321 Also get values of coding system properties: | |
2319 `post-read-conversion', `pre-write-conversion', | 2322 `post-read-conversion', `pre-write-conversion', |
2320 `character-unification-table-for-decode', | 2323 `character-unification-table-for-decode', |
2321 `character-unification-table-for-encode' and `eol-type'. */ | 2324 `character-unification-table-for-encode'. */ |
2322 while (!NILP (coding_system) && SYMBOLP (coding_system)) | 2325 coding_spec = Fget (coding_system, Qcoding_system); |
2323 { | 2326 if (!VECTORP (coding_spec) |
2324 if (NILP (coding->post_read_conversion)) | 2327 || XVECTOR (coding_spec)->size != 5 |
2325 coding->post_read_conversion = Fget (coding_system, | 2328 || !CONSP (XVECTOR (coding_spec)->contents[3])) |
2326 Qpost_read_conversion); | |
2327 if (NILP (coding->pre_write_conversion)) | |
2328 coding->pre_write_conversion = Fget (coding_system, | |
2329 Qpre_write_conversion); | |
2330 if (!inhibit_eol_conversion && NILP (eol_type)) | |
2331 eol_type = Fget (coding_system, Qeol_type); | |
2332 | |
2333 if (NILP (coding->character_unification_table_for_decode)) | |
2334 coding->character_unification_table_for_decode | |
2335 = Fget (coding_system, Qcharacter_unification_table_for_decode); | |
2336 | |
2337 if (NILP (coding->character_unification_table_for_encode)) | |
2338 coding->character_unification_table_for_encode | |
2339 = Fget (coding_system, Qcharacter_unification_table_for_encode); | |
2340 | |
2341 coding_system = Fget (coding_system, Qcoding_system); | |
2342 } | |
2343 | |
2344 while (!NILP (coding->character_unification_table_for_decode) | |
2345 && SYMBOLP (coding->character_unification_table_for_decode)) | |
2346 coding->character_unification_table_for_decode | |
2347 = Fget (coding->character_unification_table_for_decode, | |
2348 Qcharacter_unification_table_for_decode); | |
2349 if (!NILP (coding->character_unification_table_for_decode) | |
2350 && !CHAR_TABLE_P (coding->character_unification_table_for_decode)) | |
2351 coding->character_unification_table_for_decode = Qnil; | |
2352 | |
2353 while (!NILP (coding->character_unification_table_for_encode) | |
2354 && SYMBOLP (coding->character_unification_table_for_encode)) | |
2355 coding->character_unification_table_for_encode | |
2356 = Fget (coding->character_unification_table_for_encode, | |
2357 Qcharacter_unification_table_for_encode); | |
2358 if (!NILP (coding->character_unification_table_for_encode) | |
2359 && !CHAR_TABLE_P (coding->character_unification_table_for_encode)) | |
2360 coding->character_unification_table_for_encode = Qnil; | |
2361 | |
2362 if (!VECTORP (coding_system) | |
2363 || XVECTOR (coding_system)->size != 5) | |
2364 goto label_invalid_coding_system; | 2329 goto label_invalid_coding_system; |
2365 | 2330 if (!inhibit_eol_conversion) |
2331 eol_type = Fget (coding_system, Qeol_type); | |
2332 | |
2333 plist = XVECTOR (coding_spec)->contents[3]; | |
2334 coding->post_read_conversion = Fplist_get (plist, Qpost_read_conversion); | |
2335 coding->pre_write_conversion = Fplist_get (plist, Qpre_write_conversion); | |
2336 val = Fplist_get (plist, Qcharacter_unification_table_for_decode); | |
2337 if (SYMBOLP (val)) | |
2338 val = Fget (val, Qcharacter_unification_table_for_decode); | |
2339 coding->character_unification_table_for_decode | |
2340 = CHAR_TABLE_P (val) ? val : Qnil; | |
2341 val = Fplist_get (plist, Qcharacter_unification_table_for_encode); | |
2342 if (SYMBOLP (val)) | |
2343 val = Fget (val, Qcharacter_unification_table_for_encode); | |
2344 coding->character_unification_table_for_encode | |
2345 = CHAR_TABLE_P (val) ? val : Qnil; | |
2346 | |
2366 if (VECTORP (eol_type)) | 2347 if (VECTORP (eol_type)) |
2367 coding->eol_type = CODING_EOL_UNDECIDED; | 2348 coding->eol_type = CODING_EOL_UNDECIDED; |
2368 else if (XFASTINT (eol_type) == 1) | 2349 else if (XFASTINT (eol_type) == 1) |
2369 coding->eol_type = CODING_EOL_CRLF; | 2350 coding->eol_type = CODING_EOL_CRLF; |
2370 else if (XFASTINT (eol_type) == 2) | 2351 else if (XFASTINT (eol_type) == 2) |
2371 coding->eol_type = CODING_EOL_CR; | 2352 coding->eol_type = CODING_EOL_CR; |
2372 else | 2353 else |
2373 coding->eol_type = CODING_EOL_LF; | 2354 coding->eol_type = CODING_EOL_LF; |
2374 | 2355 |
2375 type = XVECTOR (coding_system)->contents[0]; | 2356 type = XVECTOR (coding_spec)->contents[0]; |
2376 switch (XFASTINT (type)) | 2357 switch (XFASTINT (type)) |
2377 { | 2358 { |
2378 case 0: | 2359 case 0: |
2379 coding->type = coding_type_emacs_mule; | 2360 coding->type = coding_type_emacs_mule; |
2380 break; | 2361 break; |
2388 { | 2369 { |
2389 Lisp_Object val; | 2370 Lisp_Object val; |
2390 Lisp_Object *flags; | 2371 Lisp_Object *flags; |
2391 int i, charset, default_reg_bits = 0; | 2372 int i, charset, default_reg_bits = 0; |
2392 | 2373 |
2393 val = XVECTOR (coding_system)->contents[4]; | 2374 val = XVECTOR (coding_spec)->contents[4]; |
2394 | 2375 |
2395 if (!VECTORP (val) || XVECTOR (val)->size != 32) | 2376 if (!VECTORP (val) || XVECTOR (val)->size != 32) |
2396 goto label_invalid_coding_system; | 2377 goto label_invalid_coding_system; |
2397 | 2378 |
2398 flags = XVECTOR (val)->contents; | 2379 flags = XVECTOR (val)->contents; |
2534 break; | 2515 break; |
2535 | 2516 |
2536 case 3: | 2517 case 3: |
2537 coding->type = coding_type_big5; | 2518 coding->type = coding_type_big5; |
2538 coding->flags | 2519 coding->flags |
2539 = (NILP (XVECTOR (coding_system)->contents[4]) | 2520 = (NILP (XVECTOR (coding_spec)->contents[4]) |
2540 ? CODING_FLAG_BIG5_HKU | 2521 ? CODING_FLAG_BIG5_HKU |
2541 : CODING_FLAG_BIG5_ETEN); | 2522 : CODING_FLAG_BIG5_ETEN); |
2542 break; | 2523 break; |
2543 | 2524 |
2544 case 4: | 2525 case 4: |
2545 coding->type = coding_type_ccl; | 2526 coding->type = coding_type_ccl; |
2546 { | 2527 { |
2547 Lisp_Object val = XVECTOR (coding_system)->contents[4]; | 2528 Lisp_Object val = XVECTOR (coding_spec)->contents[4]; |
2548 if (CONSP (val) | 2529 if (CONSP (val) |
2549 && VECTORP (XCONS (val)->car) | 2530 && VECTORP (XCONS (val)->car) |
2550 && VECTORP (XCONS (val)->cdr)) | 2531 && VECTORP (XCONS (val)->cdr)) |
2551 { | 2532 { |
2552 setup_ccl_program (&(coding->spec.ccl.decoder), XCONS (val)->car); | 2533 setup_ccl_program (&(coding->spec.ccl.decoder), XCONS (val)->car); |
2831 detect_eol (coding, src, src_bytes) | 2812 detect_eol (coding, src, src_bytes) |
2832 struct coding_system *coding; | 2813 struct coding_system *coding; |
2833 unsigned char *src; | 2814 unsigned char *src; |
2834 int src_bytes; | 2815 int src_bytes; |
2835 { | 2816 { |
2836 Lisp_Object val, coding_system; | 2817 Lisp_Object val; |
2837 int eol_type = detect_eol_type (src, src_bytes); | 2818 int eol_type = detect_eol_type (src, src_bytes); |
2838 | 2819 |
2839 if (eol_type == CODING_EOL_UNDECIDED) | 2820 if (eol_type == CODING_EOL_UNDECIDED) |
2840 /* We found no end-of-line in the source text. */ | 2821 /* We found no end-of-line in the source text. */ |
2841 return; | 2822 return; |
2856 /* Else, let's decode only text code anyway. */ | 2837 /* Else, let's decode only text code anyway. */ |
2857 #endif /* 0 */ | 2838 #endif /* 0 */ |
2858 eol_type = CODING_EOL_LF; | 2839 eol_type = CODING_EOL_LF; |
2859 } | 2840 } |
2860 | 2841 |
2861 coding_system = coding->symbol; | 2842 val = Fget (coding->symbol, Qeol_type); |
2862 while (!NILP (coding_system) | |
2863 && NILP (val = Fget (coding_system, Qeol_type))) | |
2864 coding_system = Fget (coding_system, Qcoding_system); | |
2865 if (VECTORP (val) && XVECTOR (val)->size == 3) | 2843 if (VECTORP (val) && XVECTOR (val)->size == 3) |
2866 setup_coding_system (XVECTOR (val)->contents[eol_type], coding); | 2844 setup_coding_system (XVECTOR (val)->contents[eol_type], coding); |
2867 } | 2845 } |
2868 | 2846 |
2869 /* See "GENERAL NOTES about `decode_coding_XXX ()' functions". Before | 2847 /* See "GENERAL NOTES about `decode_coding_XXX ()' functions". Before |
3073 | 3051 |
3074 | 3052 |
3075 #ifdef emacs | 3053 #ifdef emacs |
3076 /*** 7. Emacs Lisp library functions ***/ | 3054 /*** 7. Emacs Lisp library functions ***/ |
3077 | 3055 |
3078 DEFUN ("coding-system-spec", Fcoding_system_spec, Scoding_system_spec, | |
3079 1, 1, 0, | |
3080 "Return coding-spec of CODING-SYSTEM.\n\ | |
3081 If CODING-SYSTEM is not a valid coding-system, return nil.") | |
3082 (obj) | |
3083 Lisp_Object obj; | |
3084 { | |
3085 while (SYMBOLP (obj) && !NILP (obj)) | |
3086 obj = Fget (obj, Qcoding_system); | |
3087 return ((NILP (obj) || !VECTORP (obj) || XVECTOR (obj)->size != 5) | |
3088 ? Qnil : obj); | |
3089 } | |
3090 | |
3091 DEFUN ("coding-system-p", Fcoding_system_p, Scoding_system_p, 1, 1, 0, | 3056 DEFUN ("coding-system-p", Fcoding_system_p, Scoding_system_p, 1, 1, 0, |
3092 "Return t if OBJECT is nil or a coding-system.\n\ | 3057 "Return t if OBJECT is nil or a coding-system.\n\ |
3093 See document of make-coding-system for coding-system object.") | 3058 See document of make-coding-system for coding-system object.") |
3094 (obj) | 3059 (obj) |
3095 Lisp_Object obj; | 3060 Lisp_Object obj; |
3096 { | 3061 { |
3097 return ((NILP (obj) || !NILP (Fcoding_system_spec (obj))) ? Qt : Qnil); | 3062 if (NILP (obj)) |
3063 return Qt; | |
3064 if (!SYMBOLP (obj)) | |
3065 return Qnil; | |
3066 /* Get coding-spec vector for OBJ. */ | |
3067 obj = Fget (obj, Qcoding_system); | |
3068 return ((VECTORP (obj) && XVECTOR (obj)->size == 5) | |
3069 ? Qt : Qnil); | |
3098 } | 3070 } |
3099 | 3071 |
3100 DEFUN ("read-non-nil-coding-system", Fread_non_nil_coding_system, | 3072 DEFUN ("read-non-nil-coding-system", Fread_non_nil_coding_system, |
3101 Sread_non_nil_coding_system, 1, 1, 0, | 3073 Sread_non_nil_coding_system, 1, 1, 0, |
3102 "Read a coding system from the minibuffer, prompting with string PROMPT.") | 3074 "Read a coding system from the minibuffer, prompting with string PROMPT.") |
3104 Lisp_Object prompt; | 3076 Lisp_Object prompt; |
3105 { | 3077 { |
3106 Lisp_Object val; | 3078 Lisp_Object val; |
3107 do | 3079 do |
3108 { | 3080 { |
3109 val = Fcompleting_read (prompt, Vobarray, Qcoding_system_spec, | 3081 val = Fcompleting_read (prompt, Vcoding_system_alist, Qnil, |
3110 Qt, Qnil, Qnil, Qnil, Qnil); | 3082 Qt, Qnil, Qcoding_system_history, Qnil, Qnil); |
3111 } | 3083 } |
3112 while (XSTRING (val)->size == 0); | 3084 while (XSTRING (val)->size == 0); |
3113 return (Fintern (val, Qnil)); | 3085 return (Fintern (val, Qnil)); |
3114 } | 3086 } |
3115 | 3087 |
3120 Lisp_Object prompt, default_coding_system; | 3092 Lisp_Object prompt, default_coding_system; |
3121 { | 3093 { |
3122 Lisp_Object val; | 3094 Lisp_Object val; |
3123 if (SYMBOLP (default_coding_system)) | 3095 if (SYMBOLP (default_coding_system)) |
3124 XSETSTRING (default_coding_system, XSYMBOL (default_coding_system)->name); | 3096 XSETSTRING (default_coding_system, XSYMBOL (default_coding_system)->name); |
3125 val = Fcompleting_read (prompt, Vobarray, Qcoding_system_p, | 3097 val = Fcompleting_read (prompt, Vcoding_system_alist, Qnil, |
3126 Qt, Qnil, Qcoding_system_history, | 3098 Qt, Qnil, Qcoding_system_history, |
3127 default_coding_system, Qnil); | 3099 default_coding_system, Qnil); |
3128 return (XSTRING (val)->size == 0 ? Qnil : Fintern (val, Qnil)); | 3100 return (XSTRING (val)->size == 0 ? Qnil : Fintern (val, Qnil)); |
3129 } | 3101 } |
3130 | 3102 |
3925 staticpro (&Qno_conversion); | 3897 staticpro (&Qno_conversion); |
3926 | 3898 |
3927 Qundecided = intern ("undecided"); | 3899 Qundecided = intern ("undecided"); |
3928 staticpro (&Qundecided); | 3900 staticpro (&Qundecided); |
3929 | 3901 |
3930 Qcoding_system_spec = intern ("coding-system-spec"); | |
3931 staticpro (&Qcoding_system_spec); | |
3932 | |
3933 Qcoding_system_p = intern ("coding-system-p"); | 3902 Qcoding_system_p = intern ("coding-system-p"); |
3934 staticpro (&Qcoding_system_p); | 3903 staticpro (&Qcoding_system_p); |
3935 | 3904 |
3936 Qcoding_system_error = intern ("coding-system-error"); | 3905 Qcoding_system_error = intern ("coding-system-error"); |
3937 staticpro (&Qcoding_system_error); | 3906 staticpro (&Qcoding_system_error); |
3969 staticpro (&Qcharacter_unification_table_for_encode); | 3938 staticpro (&Qcharacter_unification_table_for_encode); |
3970 | 3939 |
3971 Qemacs_mule = intern ("emacs-mule"); | 3940 Qemacs_mule = intern ("emacs-mule"); |
3972 staticpro (&Qemacs_mule); | 3941 staticpro (&Qemacs_mule); |
3973 | 3942 |
3974 defsubr (&Scoding_system_spec); | |
3975 defsubr (&Scoding_system_p); | 3943 defsubr (&Scoding_system_p); |
3976 defsubr (&Sread_coding_system); | 3944 defsubr (&Sread_coding_system); |
3977 defsubr (&Sread_non_nil_coding_system); | 3945 defsubr (&Sread_non_nil_coding_system); |
3978 defsubr (&Scheck_coding_system); | 3946 defsubr (&Scheck_coding_system); |
3979 defsubr (&Sdetect_coding_region); | 3947 defsubr (&Sdetect_coding_region); |
3990 defsubr (&Sterminal_coding_system); | 3958 defsubr (&Sterminal_coding_system); |
3991 defsubr (&Sset_keyboard_coding_system_internal); | 3959 defsubr (&Sset_keyboard_coding_system_internal); |
3992 defsubr (&Skeyboard_coding_system); | 3960 defsubr (&Skeyboard_coding_system); |
3993 defsubr (&Sfind_operation_coding_system); | 3961 defsubr (&Sfind_operation_coding_system); |
3994 | 3962 |
3963 DEFVAR_LISP ("coding-system-list", &Vcoding_system_list, | |
3964 "List of coding systems.\n\ | |
3965 \n\ | |
3966 Do not alter the value of this variable manually. This variable should be\n\ | |
3967 updated by the functions `make-coding-system' and\n\ | |
3968 `define-coding-system-alias'."); | |
3969 Vcoding_system_list = Qnil; | |
3970 | |
3971 DEFVAR_LISP ("coding-system-alist", &Vcoding_system_alist, | |
3972 "Alist of coding system names.\n\ | |
3973 Each element is one element list of coding system name.\n\ | |
3974 This variable is given to `completing-read' as TABLE argument.\n\ | |
3975 \n\ | |
3976 Do not alter the value of this variable manually. This variable should be\n\ | |
3977 updated by the functions `make-coding-system' and\n\ | |
3978 `define-coding-system-alias'."); | |
3979 Vcoding_system_alist = Qnil; | |
3980 | |
3995 DEFVAR_LISP ("coding-category-list", &Vcoding_category_list, | 3981 DEFVAR_LISP ("coding-category-list", &Vcoding_category_list, |
3996 "List of coding-categories (symbols) ordered by priority."); | 3982 "List of coding-categories (symbols) ordered by priority."); |
3997 { | 3983 { |
3998 int i; | 3984 int i; |
3999 | 3985 |