変愚蛮怒のメインリポジトリです
Revision | 940d8470dd8f62580e7f674ca4aab930dfee3d6a (tree) |
---|---|
Time | 2002-06-03 16:07:03 |
Author | mogami <mogami@0568...> |
Commiter | mogami |
大量の文字列をKで消したときに配列外に'\0'を書き込んでいたのを修正。
Y と H の動作をよりemacs likeに調整。
@@ -2800,11 +2800,19 @@ void do_cmd_edit_autopick(void) | ||
2800 | 2800 | /* Paste killed text */ |
2801 | 2801 | if (strlen(yank_buf)) |
2802 | 2802 | { |
2803 | - cx = 0; | |
2804 | 2803 | for (j = 0; yank_buf[j]; j += strlen(yank_buf + j) + 1) |
2805 | 2804 | { |
2806 | - insert_return_code(lines_list, 0, cy); | |
2807 | - lines_list[cy] = string_make(yank_buf + j); | |
2805 | + /* Split current line */ | |
2806 | + insert_return_code(lines_list, cx, cy); | |
2807 | + | |
2808 | + /* Paste yank buffer */ | |
2809 | + strcpy(buf, lines_list[cy]); | |
2810 | + strncat(buf, yank_buf + j, 1024); | |
2811 | + string_free(lines_list[cy]); | |
2812 | + lines_list[cy] = string_make(buf); | |
2813 | + | |
2814 | + /* Move to the beggining of next line */ | |
2815 | + cx = 0; | |
2808 | 2816 | cy++; |
2809 | 2817 | } |
2810 | 2818 |
@@ -2821,29 +2829,34 @@ void do_cmd_edit_autopick(void) | ||
2821 | 2829 | |
2822 | 2830 | case KTRL('k'): |
2823 | 2831 | /* Kill rest of line */ |
2824 | - if (lines_list[cy][0] != '\0' && (unsigned int) cx < strlen(lines_list[cy])) | |
2832 | + if (lines_list[cy][0] != '\0' && (uint)cx < strlen(lines_list[cy])) | |
2825 | 2833 | { |
2826 | - for (i = j = 0; lines_list[cy][i] && i < cx; i++) | |
2834 | + /* Save preceding string */ | |
2835 | + for (i = 0; lines_list[cy][i] && i < cx; i++) | |
2827 | 2836 | { |
2828 | 2837 | #ifdef JP |
2829 | 2838 | if (iskanji(lines_list[cy][i])) |
2830 | - buf[j++] = lines_list[cy][i++]; | |
2839 | + { | |
2840 | + buf[i] = lines_list[cy][i]; | |
2841 | + i++; | |
2842 | + } | |
2831 | 2843 | #endif |
2832 | - buf[j++] = lines_list[cy][i]; | |
2844 | + buf[i] = lines_list[cy][i]; | |
2833 | 2845 | } |
2834 | - buf[j] = '\0'; | |
2846 | + buf[i] = '\0'; | |
2835 | 2847 | |
2836 | 2848 | j = 0; |
2837 | 2849 | if (old_key == KTRL('k')) |
2838 | 2850 | while (yank_buf[j]) |
2839 | 2851 | j += strlen(yank_buf + j) + 1; |
2840 | 2852 | |
2841 | - if (j < MAX_YANK - 2) | |
2842 | - { | |
2843 | - strncpy(yank_buf + j, lines_list[cy] + i, MAX_YANK-j-2); | |
2844 | - yank_buf[MAX_YANK-2] = '\0'; | |
2845 | - yank_buf[j + strlen(lines_list[cy] + i) + 1] = '\0'; | |
2846 | - } | |
2853 | + /* Copy following to yank buffer */ | |
2854 | + while (lines_list[cy][i] && j < MAX_YANK - 2) | |
2855 | + yank_buf[j++] = lines_list[cy][i++]; | |
2856 | + yank_buf[j++] = '\0'; | |
2857 | + yank_buf[j] = '\0'; | |
2858 | + | |
2859 | + /* Replace current line with 'preceding string' */ | |
2847 | 2860 | string_free(lines_list[cy]); |
2848 | 2861 | lines_list[cy] = string_make(buf); |
2849 | 2862 |
@@ -2859,6 +2872,11 @@ void do_cmd_edit_autopick(void) | ||
2859 | 2872 | if (iskanji(lines_list[cy][cx])) cx++; |
2860 | 2873 | #endif |
2861 | 2874 | cx++; |
2875 | + | |
2876 | + /* fall through */ | |
2877 | + | |
2878 | + case '\010': | |
2879 | + /* BACK SPACE */ | |
2862 | 2880 | len = strlen(lines_list[cy]); |
2863 | 2881 | if (len < cx) |
2864 | 2882 | { |
@@ -2874,10 +2892,6 @@ void do_cmd_edit_autopick(void) | ||
2874 | 2892 | } |
2875 | 2893 | } |
2876 | 2894 | |
2877 | - /* fall through */ | |
2878 | - | |
2879 | - case '\010': | |
2880 | - /* BACK SPACE */ | |
2881 | 2895 | if (cx == 0) |
2882 | 2896 | { |
2883 | 2897 | /* delete a return code and union two lines */ |