rust-most/vendor/most-5.1.0/src/cmd.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);
}
}