Ticket #1652: mc-4.8.1-ticket-1652-linebreaks.patch

File mc-4.8.1-ticket-1652-linebreaks.patch, 12.3 KB (added by huksley, 6 years ago)

Patch against 4.8.1 for this feature

  • src/editor/edit.c

    diff -rwu '--exclude=Makefile.in' mc-4.8.1/src/editor/edit.c mc-4.8.1-lbr/src/editor/edit.c
    old new  
    8787int option_cursor_beyond_eol = 0; 
    8888int option_line_state = 0; 
    8989int option_line_state_width = 0; 
     90int option_autodetect_lb = 0; 
    9091 
    9192int option_edit_right_extreme = 0; 
    9293int option_edit_left_extreme = 0; 
     
    423424 
    424425/* --------------------------------------------------------------------------------------------- */ 
    425426/** 
     427 * detect type of line breaks of loaded file by lead BUF_MEDIUM bytes 
     428 * 
     429 */ 
     430static LineBreaks 
     431detect_lb_type (char *filename) 
     432{ 
     433    char buf[BUF_MEDIUM]; 
     434    ssize_t file, sz; 
     435 
     436    file = mc_open (filename, O_RDONLY | O_BINARY); 
     437    if (file == -1) 
     438        return LB_ASIS; 
     439 
     440    memset (buf, 0, sizeof (buf)); 
     441    sz = mc_read (file, buf, sizeof (buf) - 1); 
     442    if (sz < 0) 
     443        return LB_ASIS; 
     444    mc_close (file); 
     445 
     446    buf[(size_t) sz] = '\0'; 
     447    if (strstr (buf, "\r\n") != NULL) 
     448        return LB_WIN; 
     449    if (strchr (buf, '\r') != NULL) 
     450        return LB_MAC; 
     451    return LB_ASIS; 
     452} 
     453 
     454/* --------------------------------------------------------------------------------------------- */ 
     455/** 
    426456 * Open the file and load it into the buffers, either directly or using 
    427457 * a filter.  Return 0 on success, 1 on error. 
    428458 * 
     
    436466edit_load_file (WEdit * edit) 
    437467{ 
    438468    int fast_load = 1; 
     469    LineBreaks lb_type = LB_ASIS; 
    439470    vfs_path_t *vpath = vfs_path_from_str (edit->filename); 
    440471 
    441472    /* Cannot do fast load if a filter is used */ 
     
    460491        /* If we are dealing with a real file, check that it exists */ 
    461492        if (check_file_access (edit, edit->filename, &edit->stat1)) 
    462493            return 1; 
     494 
     495        if (option_autodetect_lb) 
     496            lb_type = detect_lb_type(edit->filename); 
     497        else 
     498            lb_type = LB_ASIS; 
     499 
     500        if (lb_type != LB_ASIS && lb_type != LB_UNIX) 
     501            fast_load = 0; 
    463502    } 
    464503    else 
    465504    { 
     
    482521        if (*edit->filename) 
    483522        { 
    484523            edit->undo_stack_disable = 1; 
    485             if (edit_insert_file (edit, edit->filename) == 0) 
     524            if (edit_insert_file (edit, edit->filename, lb_type) == 0) 
    486525            { 
    487526                edit_clean (edit); 
    488527                return 1; 
    489528            } 
     529            edit_set_markers (edit, 0, 0, 0, 0); 
    490530            edit->undo_stack_disable = 0; 
    491531        } 
    492532    } 
    493     edit->lb = LB_ASIS; 
     533    edit->lb = lb_type; 
    494534    return 0; 
    495535} 
    496536 
     
    18551895        { 
    18561896            long ins_len; 
    18571897 
    1858             ins_len = edit_insert_file (edit, block_file); 
     1898            ins_len = edit_insert_file (edit, block_file, LB_ASIS); 
    18591899            if (nomark == 0 && ins_len > 0) 
    18601900                edit_set_markers (edit, start_mark, start_mark + ins_len, 0, 0); 
    18611901        } 
     
    20712111/* --------------------------------------------------------------------------------------------- */ 
    20722112/** inserts a file at the cursor, returns count of inserted bytes on success */ 
    20732113long 
    2074 edit_insert_file (WEdit * edit, const char *filename) 
     2114edit_insert_file (WEdit * edit, const char *filename, LineBreaks lb_type) 
    20752115{ 
    20762116    char *p; 
    20772117    long ins_len = 0; 
     
    21462186            while ((blocklen = mc_read (file, (char *) buf, TEMP_BUF_LEN)) > 0) 
    21472187            { 
    21482188                for (i = 0; i < blocklen; i++) 
     2189                { 
     2190                    if (buf[i] == '\r') 
     2191                    { 
     2192                        if (lb_type == LB_MAC) 
     2193                            edit_insert (edit, '\n'); 
     2194                        else if (lb_type == LB_WIN) 
     2195                        /* just skip */; 
     2196                        else 
     2197                            edit_insert (edit, '\r'); 
     2198                    } 
     2199                    else 
    21492200                    edit_insert (edit, buf[i]); 
    21502201            } 
     2202            } 
    21512203            /* highlight inserted text then not persistent blocks */ 
    21522204            if (!option_persistent_selections && edit->modified) 
    21532205            { 
     
    22452297    edit->redo_stack_size = START_STACK_SIZE; 
    22462298    edit->redo_stack_size_mask = START_STACK_SIZE - 1; 
    22472299    edit->redo_stack = g_malloc0 ((edit->redo_stack_size + 10) * sizeof (long)); 
    2248  
     2300    edit->highlight = 0; 
    22492301    edit->utf8 = 0; 
    22502302    edit->converter = str_cnv_from_term; 
    22512303    edit_set_codeset (edit); 
     
    43674419} 
    43684420 
    43694421/* --------------------------------------------------------------------------------------------- */ 
     4422 
  • src/editor/editcmd.c

    diff -rwu '--exclude=Makefile.in' mc-4.8.1/src/editor/editcmd.c mc-4.8.1-lbr/src/editor/editcmd.c
    old new  
    348348            g_free (msg); 
    349349            goto error_save; 
    350350        } 
     351         
     352        /* Update the file information, especially the mtime. */ 
     353        if (mc_stat (savename, &edit->stat1) == -1) 
     354            goto error_save; 
    351355    } 
    352356 
    353357    if (filelen != edit->last_byte) 
     
    432436    { 
    433437        char *fname; 
    434438 
     439        /* Don't change current LB type (possibly autodetected), unless user asked to. */ 
     440        if (cur_lb != LB_ASIS) 
    435441        edit->lb = cur_lb; 
    436442        fname = tilde_expand (filename); 
    437443        g_free (filename); 
     
    26842690    /* try use external clipboard utility */ 
    26852691    mc_event_raise (MCEVENT_GROUP_CORE, "clipboard_file_from_ext_clip", NULL); 
    26862692    tmp = mc_config_get_full_path (EDIT_CLIP_FILE); 
    2687     edit_insert_file (edit, tmp); 
     2693    edit_insert_file (edit, tmp, LB_ASIS); 
    26882694    g_free (tmp); 
    26892695} 
    26902696 
     
    28002806        } 
    28012807        else 
    28022808        { 
    2803             if (edit_insert_file (edit, exp) != 0) 
     2809            if (edit_insert_file (edit, exp, LB_ASIS) != 0) 
    28042810            { 
    28052811                g_free (exp); 
    28062812                edit->force |= REDRAW_COMPLETELY; 
     
    28782884    if (edit_block_delete_cmd (edit)) 
    28792885        return 1; 
    28802886    tmp = mc_config_get_full_path (EDIT_TEMP_FILE); 
    2881     edit_insert_file (edit, tmp); 
     2887    edit_insert_file (edit, tmp, LB_ASIS); 
    28822888    g_free (tmp); 
    28832889    return 0; 
    28842890} 
     
    29172923 
    29182924    edit->force |= REDRAW_COMPLETELY; 
    29192925    tmp = mc_config_get_full_path (EDIT_TEMP_FILE); 
    2920     edit_insert_file (edit, tmp); 
     2926    edit_insert_file (edit, tmp, LB_ASIS); 
    29212927    g_free (tmp); 
    29222928    return 0; 
    29232929} 
  • src/editor/editdraw.c

    diff -rwu '--exclude=Makefile.in' mc-4.8.1/src/editor/editdraw.c mc-4.8.1-lbr/src/editor/editdraw.c
    old new  
    108108    unsigned int cur_utf = 0; 
    109109    int cw = 1; 
    110110 
     111    static const char *lb_names[LB_NAMES] = { 
     112        "", 
     113        "LF", 
     114        "CRLF", 
     115        "CR" 
     116    }; 
     117 
    111118    /* 
    112119     * If we are at the end of file, print <EOF>, 
    113120     * otherwise print the current character as is (if printable), 
     
    147154    /* The field lengths just prevent the status line from shortening too much */ 
    148155    if (simple_statusbar) 
    149156        g_snprintf (s, w, 
    150                     "%c%c%c%c %3ld %5ld/%ld %6ld/%ld %s %s", 
     157                    "%c%c%c%c %3ld %5ld/%ld %6ld/%ld %s %s %s", 
    151158                    edit->mark1 != edit->mark2 ? (edit->column_highlight ? 'C' : 'B') : '-', 
    152159                    edit->modified ? 'M' : '-', 
    153160                    macro_index < 0 ? '-' : 'R', 
     
    157164                    edit->total_lines + 1, edit->curs1, edit->last_byte, byte_str, 
    158165#ifdef HAVE_CHARSET 
    159166                    mc_global.source_codepage >= 
    160                     0 ? get_codepage_id (mc_global.source_codepage) : "" 
     167                    0 ? get_codepage_id (mc_global.source_codepage) : "", 
    161168#else 
    162                     "" 
     169                    "", 
    163170#endif 
     171                                        lb_names[edit->lb] 
    164172            ); 
    165173    else 
    166174        g_snprintf (s, w, 
     
    176184                    edit->total_lines + 1, edit->curs1, edit->last_byte, byte_str, 
    177185#ifdef HAVE_CHARSET 
    178186                    mc_global.source_codepage >= 
    179                     0 ? get_codepage_id (mc_global.source_codepage) : "" 
     187                    0 ? get_codepage_id (mc_global.source_codepage) : "", 
    180188#else 
    181                     "" 
     189                    "", 
    182190#endif 
     191                                        lb_names[edit->lb] 
    183192            ); 
    184193} 
    185194 
  • src/editor/edit.h

    diff -rwu '--exclude=Makefile.in' mc-4.8.1/src/editor/edit.h mc-4.8.1-lbr/src/editor/edit.h
    old new  
    3636extern int option_fill_tabs_with_spaces; 
    3737extern int option_return_does_auto_indent; 
    3838extern int option_backspace_through_tabs; 
     39extern int option_autodetect_lb; 
    3940extern int option_fake_half_tabs; 
    4041extern int option_persistent_selections; 
    4142extern int option_cursor_beyond_eol; 
  • src/editor/edit-impl.h

    diff -rwu '--exclude=Makefile.in' mc-4.8.1/src/editor/edit-impl.h mc-4.8.1-lbr/src/editor/edit-impl.h
    old new  
    245245void edit_insert_over (WEdit * edit); 
    246246int edit_insert_column_of_text_from_file (WEdit * edit, int file, 
    247247                                          long *start_pos, long *end_pos, int *col1, int *col2); 
    248 long edit_insert_file (WEdit * edit, const char *filename); 
     248long edit_insert_file (WEdit * edit, const char *filename, LineBreaks lb_type); 
    249249int edit_load_back_cmd (WEdit * edit); 
    250250int edit_load_forward_cmd (WEdit * edit); 
    251251void edit_block_process_cmd (WEdit * edit, int macro_number); 
  • src/editor/editoptions.c

    diff -rwu '--exclude=Makefile.in' mc-4.8.1/src/editor/editoptions.c mc-4.8.1-lbr/src/editor/editoptions.c
    old new  
    109109                                 N_("Confir&m before saving"), &edit_confirm_save), 
    110110        /* 12 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 3, OPT_DLG_H, 
    111111                                 N_("&Return does autoindent"), &option_return_does_auto_indent), 
    112         /* 13 */ QUICK_LABEL (3, OPT_DLG_W, 11, OPT_DLG_H, N_("Tab spacing:")), 
    113         /* 14 */ QUICK_INPUT (3 + 24, OPT_DLG_W, 11, OPT_DLG_H, 
     112        /* 13 */ QUICK_LABEL (3, OPT_DLG_W, 12, OPT_DLG_H, N_("Tab spacing:")), 
     113        /* 14 */ QUICK_INPUT (3 + 24, OPT_DLG_W, 12, OPT_DLG_H, 
    114114                              tab_spacing, OPT_DLG_W / 2 - 4 - 24, 0, "edit-tab-spacing", &q), 
    115         /* 15 */ QUICK_CHECKBOX (3, OPT_DLG_W, 10, OPT_DLG_H, 
     115        /* 15 */ QUICK_CHECKBOX (3, OPT_DLG_W, 11, OPT_DLG_H, 
    116116                                 N_("Fill tabs with &spaces"), &option_fill_tabs_with_spaces), 
    117         /* 16 */ QUICK_CHECKBOX (3, OPT_DLG_W, 9, OPT_DLG_H, 
     117        /* 16 */ QUICK_CHECKBOX (3, OPT_DLG_W, 10, OPT_DLG_H, 
    118118                                 N_("&Backspace through tabs"), &option_backspace_through_tabs), 
    119         /* 17 */ QUICK_CHECKBOX (3, OPT_DLG_W, 8, OPT_DLG_H, 
     119        /* 17 */ QUICK_CHECKBOX (3, OPT_DLG_W, 9, OPT_DLG_H, 
    120120                                 N_("&Fake half tabs"), &option_fake_half_tabs), 
    121         /* 18 */ QUICK_RADIO (4, OPT_DLG_W, 4, OPT_DLG_H, 3, wrap_str, &wrap_mode), 
    122         /* 19 */ QUICK_LABEL (3, OPT_DLG_W, 3, OPT_DLG_H, N_("Wrap mode")), 
     121        /* 18 */ QUICK_CHECKBOX (3, OPT_DLG_W, 8, OPT_DLG_H, 
     122                                 N_("&Autodetect line break"), &option_autodetect_lb), 
     123        /* 19 */ QUICK_RADIO (4, OPT_DLG_W, 4, OPT_DLG_H, 3, wrap_str, &wrap_mode), 
     124        /* 20 */ QUICK_LABEL (3, OPT_DLG_W, 3, OPT_DLG_H, N_("Wrap mode")), 
    123125        QUICK_END 
    124126    }; 
    125127 
  • src/setup.c

    diff -rwu '--exclude=Makefile.in' mc-4.8.1/src/setup.c mc-4.8.1-lbr/src/setup.c
    old new  
    298298    { "editor_word_wrap_line_length", &option_word_wrap_line_length }, 
    299299    { "editor_fill_tabs_with_spaces", &option_fill_tabs_with_spaces }, 
    300300    { "editor_return_does_auto_indent", &option_return_does_auto_indent }, 
     301    { "editor_autodetect_linebreak", &option_autodetect_lb }, 
    301302    { "editor_backspace_through_tabs", &option_backspace_through_tabs }, 
    302303    { "editor_fake_half_tabs", &option_fake_half_tabs }, 
    303304    { "editor_option_save_mode", &option_save_mode }, 
     
    13771378} 
    13781379 
    13791380/* --------------------------------------------------------------------------------------------- */ 
     1381