288 lines
6.0 KiB
C
288 lines
6.0 KiB
C
/*
|
|
This file is part of MOST.
|
|
|
|
Copyright (c) 1991, 1999, 2002, 2005-2018, 2019 John E. Davis
|
|
|
|
This program is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 2 of the License, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc., 675
|
|
Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
#include "config.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#ifdef HAVE_STDLIB_H
|
|
# include <stdlib.h>
|
|
#endif
|
|
|
|
#include <slang.h>
|
|
#include "jdmacros.h"
|
|
|
|
#include "most.h"
|
|
#include "search.h"
|
|
#include "window.h"
|
|
#include "file.h"
|
|
#include "keym.h"
|
|
#include "display.h"
|
|
#include "sysdep.h"
|
|
|
|
static char getkey_nocase (void)
|
|
{
|
|
char ch = most_getkey ();
|
|
if ((ch >= 'a') && (ch <= 'z')) ch = ch - ' ';
|
|
|
|
SLang_flush_input ();
|
|
|
|
return ch;
|
|
}
|
|
|
|
void most_next_file (void)
|
|
{
|
|
static int next = 1;
|
|
char *msg = NULL;
|
|
|
|
if (!Most_Num_Files) msg = "File ring is empty.";
|
|
else if (Most_Num_Files == 1) msg = "There is only one file!";
|
|
else
|
|
{
|
|
most_do_next_file(&next);
|
|
}
|
|
if (msg != NULL) most_message (msg, 1);
|
|
}
|
|
|
|
void most_toggle_case (void)
|
|
{
|
|
char *msg;
|
|
Most_Case_Sensitive = !Most_Case_Sensitive;
|
|
if (Most_Case_Sensitive)
|
|
msg = "Searches now respect case.";
|
|
else
|
|
msg = "Searches nolonger respect case.";
|
|
|
|
most_message (msg, 0);
|
|
}
|
|
|
|
void most_toggle_research (void)
|
|
{
|
|
char *msg;
|
|
|
|
Most_Do_Regexp_Search = !Most_Do_Regexp_Search;
|
|
|
|
if (Most_Do_Regexp_Search)
|
|
msg = "Regexp search enabled";
|
|
else
|
|
msg = "Regexp search disabled";
|
|
|
|
most_message (msg, 0);
|
|
}
|
|
|
|
void most_delete_file_cmd (void)
|
|
{
|
|
int bell = 0;
|
|
char ch;
|
|
char *msg;
|
|
|
|
if ('*' == *Most_Buf->file) return;
|
|
|
|
if (Most_Secure_Mode) Most_D_Opt = 0;
|
|
if (Most_D_Opt == 0) return;
|
|
|
|
most_select_minibuffer ();
|
|
SLsmg_printf ("Delete %s? [n]", Most_Buf->file);
|
|
SLsmg_refresh ();
|
|
|
|
ch = getkey_nocase ();
|
|
if (ch == 'Y')
|
|
{
|
|
if (!most_delete_file(Most_Buf->file))
|
|
{
|
|
msg = "File could not be deleted.";
|
|
bell = 1;
|
|
}
|
|
else
|
|
msg = "File deleted.";
|
|
}
|
|
else
|
|
msg = "File not deleted.";
|
|
most_exit_minibuffer ();
|
|
most_message(msg, bell);
|
|
}
|
|
|
|
void most_toggle_options (void)
|
|
{
|
|
char ch;
|
|
char *msg = NULL;
|
|
int n;
|
|
unsigned int save;
|
|
|
|
most_select_minibuffer();
|
|
SLsmg_write_string("Toggle: b(binary) t(tab) v(verbose) w(wrap) d(selective display) ");
|
|
SLsmg_gotorc (SLtt_Screen_Rows - 1, 0);
|
|
SLsmg_refresh ();
|
|
|
|
ch = getkey_nocase();
|
|
switch (ch)
|
|
{
|
|
default:
|
|
msg = "\007Invalid option!";
|
|
break;
|
|
|
|
case 'B':
|
|
Most_B_Opt = !Most_B_Opt;
|
|
Most_Num_Lines = most_count_lines(Most_Beg,Most_Eob);
|
|
break;
|
|
|
|
case 'D':
|
|
if (Most_W_Opt)
|
|
{
|
|
msg = "\007Selective Display illegal in wrap mode.";
|
|
break;
|
|
}
|
|
|
|
if (Most_Digit_Arg == NULL)
|
|
{
|
|
msg = "Selective Display off. Prefix with integer to set.";
|
|
n = 0;
|
|
}
|
|
else
|
|
{
|
|
msg = "Selective Display is set.";
|
|
n = abs( *Most_Digit_Arg );
|
|
}
|
|
|
|
if (Most_Selective_Display != n)
|
|
{
|
|
Most_Selective_Display = n;
|
|
Most_Num_Lines = most_count_lines(Most_Beg,Most_Eob);
|
|
most_forward_line (-1);
|
|
|
|
/* This is duplicated below */
|
|
/* Most_C_Line = most_count_lines (Most_Beg, Most_C_Pos); */
|
|
}
|
|
|
|
break;
|
|
|
|
case 'S':
|
|
|
|
if (Most_B_Opt) msg = "\007Squeezing not available in Binary mode.";
|
|
else
|
|
{
|
|
Most_S_Opt = !Most_S_Opt;
|
|
Most_Num_Lines = most_count_lines(Most_Beg,Most_Eob);
|
|
if (Most_S_Opt) msg = "Lines are now squeezed.";
|
|
else msg = "Line squeezing is turned off";
|
|
}
|
|
|
|
break;
|
|
|
|
case 'W':
|
|
if (Most_Selective_Display)
|
|
{
|
|
msg = "\007Wrap mode cannot be enabled while selective display is on.";
|
|
break;
|
|
}
|
|
Most_W_Opt = !Most_W_Opt;
|
|
Most_Num_Lines = most_count_lines(Most_Beg, Most_Eob);
|
|
if (Most_W_Opt) msg = "Wrap turned on.";
|
|
else msg = "Wrap turned off.";
|
|
break;
|
|
|
|
case 'V':
|
|
Most_V_Opt = !Most_V_Opt;
|
|
if (Most_V_Opt) msg = "Control char display is turned on.";
|
|
else msg = "Control char display is turned off.";
|
|
break;
|
|
|
|
case 'T':
|
|
if (Most_Digit_Arg == NULL) Most_T_Opt = !Most_T_Opt;
|
|
else
|
|
{
|
|
Most_Tab_Width = abs( *Most_Digit_Arg );
|
|
if (Most_Tab_Width == 0) Most_T_Opt = 1;
|
|
else Most_T_Opt = 0;
|
|
}
|
|
if (Most_T_Opt) msg = "Tabs are nolonger expanded.";
|
|
else msg = "Tabs are now expanded.";
|
|
break;
|
|
}
|
|
|
|
SLsmg_erase_eol ();
|
|
most_exit_minibuffer();
|
|
|
|
if ((msg != NULL) && (*msg == '\007'))
|
|
{
|
|
most_message (msg + 1, 1);
|
|
return;
|
|
}
|
|
|
|
if (!Most_Num_Lines) Most_Num_Lines = 1;
|
|
most_save_win_flags(Most_Win);
|
|
|
|
save = Most_C_Offset;
|
|
Most_C_Offset = 0;
|
|
Most_C_Line = 1;
|
|
Most_C_Line = most_what_line (Most_Beg + save);
|
|
Most_C_Offset = save;
|
|
Most_Win->beg_line = Most_C_Line;
|
|
most_redraw_window();
|
|
most_update_status();
|
|
|
|
if (msg != NULL) most_message (msg, 0);
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------*/
|
|
|
|
void most_extended_key_cmd (void)
|
|
{
|
|
char ch;
|
|
|
|
if (Most_Secure_Mode) Most_D_Opt = 0;
|
|
|
|
most_select_minibuffer();
|
|
SLsmg_write_string ("Choose: N (next file), C(toggle case), R(toggle re-search) O(toggle options)");
|
|
if (Most_D_Opt) SLsmg_write_string (" ,D (delete file)");
|
|
SLsmg_gotorc (SLtt_Screen_Rows - 1, 0);
|
|
SLsmg_refresh ();
|
|
ch = getkey_nocase();
|
|
SLsmg_erase_eol ();
|
|
|
|
most_exit_minibuffer ();
|
|
|
|
switch (ch)
|
|
{
|
|
case 'N':
|
|
most_next_file ();
|
|
break;
|
|
case 'C':
|
|
most_toggle_case ();
|
|
break;
|
|
case 'R':
|
|
most_toggle_research ();
|
|
break;
|
|
case 'O':
|
|
most_toggle_options ();
|
|
break;
|
|
case 'D':
|
|
if (Most_D_Opt)
|
|
{
|
|
most_delete_file_cmd ();
|
|
break;
|
|
}
|
|
/* drop */
|
|
default:
|
|
most_message ("Invalid option.", 1);
|
|
}
|
|
}
|
|
|