summaryrefslogtreecommitdiffstats
path: root/text-utils/more.c
diff options
context:
space:
mode:
authorSami Kerola2012-10-08 09:08:17 +0200
committerKarel Zak2012-10-15 16:53:59 +0200
commit4eaab145eb8bccf7e332dc1c75dea7d47ef18c86 (patch)
tree088af0d9d9ea58feb78386343eb02fa7f2d6f9ec /text-utils/more.c
parentpg: fix coding style (diff)
downloadkernel-qcow2-util-linux-4eaab145eb8bccf7e332dc1c75dea7d47ef18c86.tar.gz
kernel-qcow2-util-linux-4eaab145eb8bccf7e332dc1c75dea7d47ef18c86.tar.xz
kernel-qcow2-util-linux-4eaab145eb8bccf7e332dc1c75dea7d47ef18c86.zip
more: fix coding style
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
Diffstat (limited to 'text-utils/more.c')
-rw-r--r--text-utils/more.c3408
1 files changed, 1694 insertions, 1714 deletions
diff --git a/text-utils/more.c b/text-utils/more.c
index 58c99cca6..d05639384 100644
--- a/text-utils/more.c
+++ b/text-utils/more.c
@@ -15,30 +15,33 @@
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
-/*
-** more.c - General purpose tty output filter and file perusal program
-**
-** by Eric Shienbrood, UC Berkeley
-**
-** modified by Geoff Peck, UCB to add underlining, single spacing
-** modified by John Foderaro, UCB to add -c and MORE environment variable
-** modified by Erik Troan <ewt@redhat.com> to be more posix and so compile
-** on linux/axp.
-** modified by Kars de Jong <jongk@cs.utwente.nl> to use terminfo instead
-** of termcap.
- 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
- - added Native Language Support
- 1999-03-19 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
- - more nls translatable strings
- 1999-05-09 aeb - applied a RedHat patch (setjmp->sigsetjmp); without it
- a second ^Z would fail.
- 1999-05-09 aeb - undone Kars' work, so that more works without
- libcurses (and hence can be in /bin with libcurses being in /usr/lib
- which may not be mounted). However, when termcap is not present curses
- can still be used.
- 2010-10-21 Davidlohr Bueso <dave@gnu.org>
- - modified mem allocation handling for util-linux
-*/
+/* more.c - General purpose tty output filter and file perusal program
+ *
+ * by Eric Shienbrood, UC Berkeley
+ *
+ * modified by Geoff Peck
+ * UCB to add underlining, single spacing
+ * modified by John Foderaro
+ * UCB to add -c and MORE environment variable
+ * modified by Erik Troan <ewt@redhat.com>
+ * to be more posix and so compile on linux/axp.
+ * modified by Kars de Jong <jongk@cs.utwente.nl>
+ * to use terminfo instead of termcap.
+ * 1999-02-22 Arkadiusz Mi¶kiewicz <misiek@pld.ORG.PL>
+ * added Native Language Support
+ * 1999-03-19 Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ * more nls translatable strings
+ * 1999-05-09 aeb
+ * applied a RedHat patch (setjmp->sigsetjmp); without it a second
+ * ^Z would fail.
+ * 1999-05-09 aeb
+ * undone Kars' work, so that more works without libcurses (and
+ * hence can be in /bin with libcurses being in
+ * /usr/lib which may not be mounted). However, when termcap is not
+ * present curses can still be used.
+ * 2010-10-21 Davidlohr Bueso <dave@gnu.org>
+ * modified mem allocation handling for util-linux
+ */
#include <stdio.h>
#include <string.h>
@@ -66,10 +69,10 @@
#include <regex.h>
#ifndef XTABS
-#define XTABS TAB3
-#endif /* XTABS */
+# define XTABS TAB3
+#endif
-#define VI "vi" /* found on the user's path */
+#define VI "vi" /* found on the user's path */
#define Fopen(s,m) (Currline = 0,file_pos=0,fopen(s,m))
#define Ftell(f) file_pos
@@ -89,37 +92,37 @@ void doclear(void);
void cleareol(void);
void clreos(void);
void home(void);
-void more_error (char *mess);
-void do_shell (char *filename);
-int colon (char *filename, int cmd, int nlines);
-int expand (char **outbuf, char *inbuf);
+void more_error(char *mess);
+void do_shell(char *filename);
+int colon(char *filename, int cmd, int nlines);
+int expand(char **outbuf, char *inbuf);
void argscan(char *s);
-void rdline (register FILE *f);
+void rdline(register FILE *f);
void copy_file(register FILE *f);
void search(char buf[], FILE *file, register int n);
-void skipf (register int nskip);
+void skipf(register int nskip);
void skiplns(register int n, register FILE *f);
-void screen (register FILE *f, register int num_lines);
-int command (char *filename, register FILE *f);
-void erasep (register int col);
-void show (register char ch);
+void screen(register FILE *f, register int num_lines);
+int command(char *filename, register FILE *f);
+void erasep(register int col);
+void show(register char ch);
void set_tty(void);
void reset_tty(void);
-void ttyin (char buf[], register int nmax, char pchar);
-int number(char *cmd);
-int readch (void);
-int get_line(register FILE *f, int *length);
-void prbuf (register char *s, register int n);
-void execute (char *filename, char *cmd, ...);
-FILE *checkf (char *, int *);
+void ttyin(char buf[], register int nmax, char pchar);
+int number(char *cmd);
+int readch(void);
+int get_line(register FILE *f, int *length);
+void prbuf(register char *s, register int n);
+void execute(char *filename, char *cmd, ...);
+FILE *checkf(char *, int *);
void prepare_line_buffer(void);
-#define TBUFSIZ 1024
-#define LINSIZ 256 /* minimal Line buffer size */
+#define TBUFSIZ 1024
+#define LINSIZ 256 /* minimal Line buffer size */
#define ctrl(letter) (letter & 077)
-#define RUBOUT '\177'
-#define ESC '\033'
-#define QUIT '\034'
+#define RUBOUT '\177'
+#define ESC '\033'
+#define QUIT '\034'
#define SCROLL_LEN 11
#define LINES_PER_PAGE 24
#define NUM_COLUMNS 80
@@ -129,419 +132,440 @@ void prepare_line_buffer(void);
#define COMMAND_BUF 200
#define REGERR_BUF NUM_COLUMNS
-struct termios otty, savetty0;
-long file_pos, file_size;
-int fnum, no_intty, no_tty, slow_tty;
-int dum_opt, dlines;
-void onquit(int), onsusp(int), chgwinsz(int), end_it(int);
-int nscroll = SCROLL_LEN; /* Number of lines scrolled by 'd' */
-int fold_opt = 1; /* Fold long lines */
-int stop_opt = 1; /* Stop after form feeds */
-int ssp_opt = 0; /* Suppress white space */
-int ul_opt = 1; /* Underline as best we can */
-int promptlen;
-int Currline; /* Line we are currently at */
-int startup = 1;
-int firstf = 1;
-int notell = 1;
-int docrterase = 0;
-int docrtkill = 0;
-int bad_so; /* True if overwriting does not turn
- off standout */
-int inwait, Pause, errors;
-int within; /* true if we are within a file,
- false if we are between files */
-int hard, dumb, noscroll, hardtabs, clreol, eatnl;
-int catch_susp; /* We should catch the SIGTSTP signal */
-char **fnames; /* The list of file names */
-int nfiles; /* Number of files left to process */
-char *shell; /* The name of the shell to use */
-int shellp; /* A previous shell command exists */
-sigjmp_buf restore;
-char *Line; /* Line buffer */
-size_t LineLen; /* size of Line buffer */
-int Lpp = LINES_PER_PAGE; /* lines per page */
-char *Clear; /* clear screen */
-char *eraseln; /* erase line */
-char *Senter, *Sexit; /* enter and exit standout mode */
-char *ULenter, *ULexit; /* enter and exit underline mode */
-char *chUL; /* underline character */
-char *chBS; /* backspace character */
-char *Home; /* go to home */
-char *cursorm; /* cursor movement */
-char cursorhome[40]; /* contains cursor movement to home */
-char *EodClr; /* clear rest of screen */
-int Mcol = NUM_COLUMNS; /* number of columns */
-int Wrap = 1; /* set if automargins */
-int soglitch; /* terminal has standout mode glitch */
-int ulglitch; /* terminal has underline mode glitch */
-int pstate = 0; /* current UL state */
-static int magic(FILE *, char *);
-char *previousre; /* previous search() buf[] item */
+struct termios otty, savetty0;
+long file_pos, file_size;
+int fnum, no_intty, no_tty, slow_tty;
+int dum_opt, dlines;
+void onquit(int), onsusp(int), chgwinsz(int), end_it(int);
+int nscroll = SCROLL_LEN; /* Number of lines scrolled by 'd' */
+int fold_opt = 1; /* Fold long lines */
+int stop_opt = 1; /* Stop after form feeds */
+int ssp_opt = 0; /* Suppress white space */
+int ul_opt = 1; /* Underline as best we can */
+int promptlen;
+int Currline; /* Line we are currently at */
+int startup = 1;
+int firstf = 1;
+int notell = 1;
+int docrterase = 0;
+int docrtkill = 0;
+int bad_so; /* True if overwriting does not turn
+ off standout */
+int inwait, Pause, errors;
+int within; /* true if we are within a file,
+ false if we are between files */
+int hard, dumb, noscroll, hardtabs, clreol, eatnl;
+int catch_susp; /* We should catch the SIGTSTP signal */
+char **fnames; /* The list of file names */
+int nfiles; /* Number of files left to process */
+char *shell; /* The name of the shell to use */
+int shellp; /* A previous shell command exists */
+sigjmp_buf restore;
+char *Line; /* Line buffer */
+size_t LineLen; /* size of Line buffer */
+int Lpp = LINES_PER_PAGE; /* lines per page */
+char *Clear; /* clear screen */
+char *eraseln; /* erase line */
+char *Senter, *Sexit; /* enter and exit standout mode */
+char *ULenter, *ULexit; /* enter and exit underline mode */
+char *chUL; /* underline character */
+char *chBS; /* backspace character */
+char *Home; /* go to home */
+char *cursorm; /* cursor movement */
+char cursorhome[40]; /* contains cursor movement to home */
+char *EodClr; /* clear rest of screen */
+int Mcol = NUM_COLUMNS; /* number of columns */
+int Wrap = 1; /* set if automargins */
+int soglitch; /* terminal has standout mode glitch */
+int ulglitch; /* terminal has underline mode glitch */
+int pstate = 0; /* current UL state */
+static int magic(FILE *, char *);
+char *previousre; /* previous search() buf[] item */
struct {
- long chrctr, line;
+ long chrctr, line;
} context, screen_start;
-extern char PC; /* pad character */
+extern char PC; /* pad character */
#ifdef HAVE_NCURSES_H
# include <ncurses.h>
#elif defined(HAVE_NCURSES_NCURSES_H)
# include <ncurses/ncurses.h>
-#endif /* HAVE_NCURSES_H */
+#endif
#if defined(HAVE_NCURSES_H) || defined(HAVE_NCURSES_NCURSES_H)
-# include <term.h> /* include after <curses.h> */
-
-#define TERM_AUTO_RIGHT_MARGIN "am"
-#define TERM_CEOL "xhp"
-#define TERM_CLEAR "clear"
-#define TERM_CLEAR_TO_LINE_END "el"
-#define TERM_CLEAR_TO_SCREEN_END "ed"
-#define TERM_COLS "cols"
-#define TERM_CURSOR_ADDRESS "cup"
-#define TERM_EAT_NEW_LINE "xenl"
-#define TERM_ENTER_UNDERLINE "smul"
-#define TERM_EXIT_STANDARD_MODE "rmso"
-#define TERM_EXIT_UNDERLINE "rmul"
-#define TERM_HARD_COPY "hc"
-#define TERM_HOME "home"
-#define TERM_LINE_DOWN "cud1"
-#define TERM_LINES "lines"
-#define TERM_OVER_STRIKE "os"
-#define TERM_PAD_CHAR "pad"
-#define TERM_STANDARD_MODE "smso"
-#define TERM_STD_MODE_GLITCH "xmc"
-#define TERM_UNDERLINE_CHAR "uc"
-#define TERM_UNDERLINE "ul"
-
-static void my_putstring(char *s) {
- tputs (s, fileno(stdout), putchar); /* putp(s); */
+# include <term.h> /* include after <curses.h> */
+
+# define TERM_AUTO_RIGHT_MARGIN "am"
+# define TERM_CEOL "xhp"
+# define TERM_CLEAR "clear"
+# define TERM_CLEAR_TO_LINE_END "el"
+# define TERM_CLEAR_TO_SCREEN_END "ed"
+# define TERM_COLS "cols"
+# define TERM_CURSOR_ADDRESS "cup"
+# define TERM_EAT_NEW_LINE "xenl"
+# define TERM_ENTER_UNDERLINE "smul"
+# define TERM_EXIT_STANDARD_MODE "rmso"
+# define TERM_EXIT_UNDERLINE "rmul"
+# define TERM_HARD_COPY "hc"
+# define TERM_HOME "home"
+# define TERM_LINE_DOWN "cud1"
+# define TERM_LINES "lines"
+# define TERM_OVER_STRIKE "os"
+# define TERM_PAD_CHAR "pad"
+# define TERM_STANDARD_MODE "smso"
+# define TERM_STD_MODE_GLITCH "xmc"
+# define TERM_UNDERLINE_CHAR "uc"
+# define TERM_UNDERLINE "ul"
+
+static void my_putstring(char *s)
+{
+ tputs(s, fileno(stdout), putchar); /* putp(s); */
}
-static void my_setupterm(char *term, int fildes, int *errret) {
- setupterm(term, fildes, errret);
+static void my_setupterm(char *term, int fildes, int *errret)
+{
+ setupterm(term, fildes, errret);
}
-static int my_tgetnum(char *s) {
- return tigetnum(s);
+static int my_tgetnum(char *s)
+{
+ return tigetnum(s);
}
-static int my_tgetflag(char *s) {
- return tigetflag(s);
+static int my_tgetflag(char *s)
+{
+ return tigetflag(s);
}
-static char *my_tgetstr(char *s) {
- return tigetstr(s);
+static char *my_tgetstr(char *s)
+{
+ return tigetstr(s);
}
-static char *my_tgoto(char *cap, int col, int row) {
- return tparm(cap, col, row);
+static char *my_tgoto(char *cap, int col, int row)
+{
+ return tparm(cap, col, row);
}
-#elif defined(HAVE_LIBTERMCAP) /* !ncurses */
-
-#include <termcap.h>
-
-#define TERM_AUTO_RIGHT_MARGIN "am"
-#define TERM_CEOL "xs"
-#define TERM_CLEAR "cl"
-#define TERM_CLEAR_TO_LINE_END "ce"
-#define TERM_CLEAR_TO_SCREEN_END "cd"
-#define TERM_COLS "co"
-#define TERM_CURSOR_ADDRESS "cm"
-#define TERM_EAT_NEW_LINE "xn"
-#define TERM_ENTER_UNDERLINE "us"
-#define TERM_EXIT_STANDARD_MODE "se"
-#define TERM_EXIT_UNDERLINE "ue"
-#define TERM_HARD_COPY "hc"
-#define TERM_HOME "ho"
-#define TERM_LINE_DOWN "le"
-#define TERM_LINES "li"
-#define TERM_OVER_STRIKE "os"
-#define TERM_PAD_CHAR "pc"
-#define TERM_STANDARD_MODE "so"
-#define TERM_STD_MODE_GLITCH "sg"
-#define TERM_UNDERLINE_CHAR "uc"
-#define TERM_UNDERLINE "ul"
+#elif defined(HAVE_LIBTERMCAP) /* ncurses not found */
+
+# include <termcap.h>
+
+# define TERM_AUTO_RIGHT_MARGIN "am"
+# define TERM_CEOL "xs"
+# define TERM_CLEAR "cl"
+# define TERM_CLEAR_TO_LINE_END "ce"
+# define TERM_CLEAR_TO_SCREEN_END "cd"
+# define TERM_COLS "co"
+# define TERM_CURSOR_ADDRESS "cm"
+# define TERM_EAT_NEW_LINE "xn"
+# define TERM_ENTER_UNDERLINE "us"
+# define TERM_EXIT_STANDARD_MODE "se"
+# define TERM_EXIT_UNDERLINE "ue"
+# define TERM_HARD_COPY "hc"
+# define TERM_HOME "ho"
+# define TERM_LINE_DOWN "le"
+# define TERM_LINES "li"
+# define TERM_OVER_STRIKE "os"
+# define TERM_PAD_CHAR "pc"
+# define TERM_STANDARD_MODE "so"
+# define TERM_STD_MODE_GLITCH "sg"
+# define TERM_UNDERLINE_CHAR "uc"
+# define TERM_UNDERLINE "ul"
char termbuffer[TERMINAL_BUF];
char tcbuffer[TERMINAL_BUF];
char *strbuf = termbuffer;
-static void my_putstring(char *s) {
- tputs (s, fileno(stdout), putchar);
+static void my_putstring(char *s)
+{
+ tputs(s, fileno(stdout), putchar);
}
-static void my_setupterm(char *term, int fildes, int *errret) {
- *errret = tgetent(tcbuffer, term);
+static void my_setupterm(char *term, int fildes, int *errret)
+{
+ *errret = tgetent(tcbuffer, term);
}
-static int my_tgetnum(char *s) {
- return tgetnum(s);
+static int my_tgetnum(char *s)
+{
+ return tgetnum(s);
}
-static int my_tgetflag(char *s) {
- return tgetflag(s);
+static int my_tgetflag(char *s)
+{
+ return tgetflag(s);
}
-static char *my_tgetstr(char *s) {
- return tgetstr(s, &strbuf);
+static char *my_tgetstr(char *s)
+{
+ return tgetstr(s, &strbuf);
}
-static char *my_tgoto(char *cap, int col, int row) {
- return tgoto(cap, col, row);
+static char *my_tgoto(char *cap, int col, int row)
+{
+ return tgoto(cap, col, row);
}
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HAVE_LIBTERMCAP */
-static void __attribute__ ((__noreturn__)) usage(FILE *out)
+static void __attribute__((__noreturn__)) usage(FILE *out)
{
- fprintf(out,
- _("Usage: %s [options] file...\n\n"),
- program_invocation_short_name);
- fprintf(out,
- _("Options:\n"
- " -d display help instead of ring bell\n"
- " -f count logical, rather than screen lines\n"
- " -l suppress pause after form feed\n"
- " -p suppress scroll, clean screen and display text\n"
- " -c suppress scroll, display text and clean line ends\n"
- " -u suppress underlining\n"
- " -s squeeze multiple blank lines into one\n"
- " -NUM specify the number of lines per screenful\n"
- " +NUM display file beginning from line number NUM\n"
- " +/STRING display file beginning from search string match\n"
- " -V output version information and exit\n"));
- exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
+ fprintf(out,
+ _("Usage: %s [options] file...\n\n"),
+ program_invocation_short_name);
+ fprintf(out,
+ _("Options:\n"
+ " -d display help instead of ring bell\n"
+ " -f count logical, rather than screen lines\n"
+ " -l suppress pause after form feed\n"
+ " -p suppress scroll, clean screen and display text\n"
+ " -c suppress scroll, display text and clean line ends\n"
+ " -u suppress underlining\n"
+ " -s squeeze multiple blank lines into one\n"
+ " -NUM specify the number of lines per screenful\n"
+ " +NUM display file beginning from line number NUM\n"
+ " +/STRING display file beginning from search string match\n"
+ " -V output version information and exit\n"));
+ exit(out == stderr ? EXIT_FAILURE : EXIT_SUCCESS);
}
-int main(int argc, char **argv) {
- FILE *f;
- char *s;
- int ch;
- int left;
- int prnames = 0;
- int initopt = 0;
- int srchopt = 0;
- int clearit = 0;
- int initline = 0;
- char *initbuf = NULL;
-
- setlocale(LC_ALL, "");
- bindtextdomain(PACKAGE, LOCALEDIR);
- textdomain(PACKAGE);
- atexit(close_stdout);
-
- nfiles = argc;
- fnames = argv;
- setlocale(LC_ALL, "");
- initterm ();
-
- /* Auto set no scroll on when binary is called page */
- if (!(strcmp(program_invocation_short_name, "page")))
- noscroll++;
-
- prepare_line_buffer();
-
- nscroll = Lpp/2 - 1;
- if (nscroll <= 0)
- nscroll = 1;
-
- if ((s = getenv("MORE")) != NULL)
- argscan(s);
-
- while (--nfiles > 0) {
- if ((ch = (*++fnames)[0]) == '-') {
- argscan(*fnames+1);
+int main(int argc, char **argv)
+{
+ FILE *f;
+ char *s;
+ int ch;
+ int left;
+ int prnames = 0;
+ int initopt = 0;
+ int srchopt = 0;
+ int clearit = 0;
+ int initline = 0;
+ char *initbuf = NULL;
+
+ setlocale(LC_ALL, "");
+ bindtextdomain(PACKAGE, LOCALEDIR);
+ textdomain(PACKAGE);
+ atexit(close_stdout);
+
+ nfiles = argc;
+ fnames = argv;
+ setlocale(LC_ALL, "");
+ initterm();
+
+ /* Auto set no scroll on when binary is called page */
+ if (!(strcmp(program_invocation_short_name, "page")))
+ noscroll++;
+
+ prepare_line_buffer();
+
+ nscroll = Lpp / 2 - 1;
+ if (nscroll <= 0)
+ nscroll = 1;
+
+ if ((s = getenv("MORE")) != NULL)
+ argscan(s);
+
+ while (--nfiles > 0) {
+ if ((ch = (*++fnames)[0]) == '-') {
+ argscan(*fnames + 1);
+ } else if (ch == '+') {
+ s = *fnames;
+ if (*++s == '/') {
+ srchopt++;
+ initbuf = xstrdup(s + 1);
+ } else {
+ initopt++;
+ for (initline = 0; *s != '\0'; s++)
+ if (isdigit(*s))
+ initline =
+ initline * 10 + *s - '0';
+ --initline;
+ }
+ } else
+ break;
}
- else if (ch == '+') {
- s = *fnames;
- if (*++s == '/') {
- srchopt++;
- initbuf = xstrdup(s + 1);
- }
- else {
- initopt++;
- for (initline = 0; *s != '\0'; s++)
- if (isdigit (*s))
- initline = initline*10 + *s -'0';
- --initline;
- }
+ /* allow clreol only if Home and eraseln and EodClr strings are
+ * defined, and in that case, make sure we are in noscroll mode */
+ if (clreol) {
+ if ((Home == NULL) || (*Home == '\0') ||
+ (eraseln == NULL) || (*eraseln == '\0') ||
+ (EodClr == NULL) || (*EodClr == '\0'))
+ clreol = 0;
+ else
+ noscroll = 1;
}
- else break;
- }
- /* allow clreol only if Home and eraseln and EodClr strings are
- * defined, and in that case, make sure we are in noscroll mode
- */
- if (clreol) {
- if((Home == NULL) || (*Home == '\0') ||
- (eraseln == NULL) || (*eraseln == '\0') ||
- (EodClr == NULL) || (*EodClr == '\0') )
- clreol = 0;
- else noscroll = 1;
- }
- if (dlines == 0)
- dlines = Lpp - 1; /* was: Lpp - (noscroll ? 1 : 2) */
- left = dlines;
- if (nfiles > 1)
- prnames++;
- if (!no_intty && nfiles == 0)
- usage(stderr);
- else
- f = stdin;
- if (!no_tty) {
- signal(SIGQUIT, onquit);
- signal(SIGINT, end_it);
+ if (dlines == 0)
+ dlines = Lpp - 1; /* was: Lpp - (noscroll ? 1 : 2) */
+ left = dlines;
+ if (nfiles > 1)
+ prnames++;
+ if (!no_intty && nfiles == 0)
+ usage(stderr);
+ else
+ f = stdin;
+ if (!no_tty) {
+ signal(SIGQUIT, onquit);
+ signal(SIGINT, end_it);
#ifdef SIGWINCH
- signal(SIGWINCH, chgwinsz);
-#endif /* SIGWINCH */
- if (signal (SIGTSTP, SIG_IGN) == SIG_DFL) {
- signal(SIGTSTP, onsusp);
- catch_susp++;
- }
- stty (fileno(stderr), &otty);
- }
- if (no_intty) {
- if (no_tty)
- copy_file (stdin);
- else {
- if ((ch = Getc (f)) == '\f')
- doclear();
- else {
- Ungetc (ch, f);
- if (noscroll && (ch != EOF)) {
- if (clreol)
- home ();
- else
- doclear ();
+ signal(SIGWINCH, chgwinsz);
+#endif
+ if (signal(SIGTSTP, SIG_IGN) == SIG_DFL) {
+ signal(SIGTSTP, onsusp);
+ catch_susp++;
}
- }
- if (srchopt)
- {
- previousre = xstrdup(initbuf);
- search (initbuf, stdin, 1);
- if (noscroll)
- left--;
- }
- else if (initopt)
- skiplns (initline, stdin);
- screen (stdin, left);
+ stty(fileno(stderr), &otty);
}
- no_intty = 0;
- prnames++;
- firstf = 0;
- }
-
- while (fnum < nfiles) {
- if ((f = checkf (fnames[fnum], &clearit)) != NULL) {
- context.line = context.chrctr = 0;
- Currline = 0;
- if (firstf) sigsetjmp (restore, 1);
- if (firstf) {
- firstf = 0;
- if (srchopt) {
- previousre = xstrdup(initbuf);
- search (initbuf, f, 1);
- if (noscroll)
- left--;
- }
- else if (initopt)
- skiplns (initline, f);
- }
- else if (fnum < nfiles && !no_tty) {
- sigsetjmp (restore, 1);
- left = command (fnames[fnum], f);
- }
- if (left != 0) {
- if ((noscroll || clearit) && (file_size != LONG_MAX)) {
- if (clreol)
- home ();
- else
- doclear ();
- }
- if (prnames) {
- if (bad_so)
- erasep (0);
- if (clreol)
- cleareol ();
- putsout("::::::::::::::");
- if (promptlen > 14)
- erasep (14);
- putchar('\n');
- if(clreol) cleareol();
- puts(fnames[fnum]);
- if(clreol) cleareol();
- puts("::::::::::::::");
- if (left > Lpp - 4)
- left = Lpp - 4;
- }
+ if (no_intty) {
if (no_tty)
- copy_file (f);
+ copy_file(stdin);
else {
- within++;
- screen(f, left);
- within = 0;
+ if ((ch = Getc(f)) == '\f')
+ doclear();
+ else {
+ Ungetc(ch, f);
+ if (noscroll && (ch != EOF)) {
+ if (clreol)
+ home();
+ else
+ doclear();
+ }
+ }
+ if (srchopt) {
+ previousre = xstrdup(initbuf);
+ search(initbuf, stdin, 1);
+ if (noscroll)
+ left--;
+ } else if (initopt)
+ skiplns(initline, stdin);
+ screen(stdin, left);
+ }
+ no_intty = 0;
+ prnames++;
+ firstf = 0;
+ }
+
+ while (fnum < nfiles) {
+ if ((f = checkf(fnames[fnum], &clearit)) != NULL) {
+ context.line = context.chrctr = 0;
+ Currline = 0;
+ if (firstf)
+ sigsetjmp(restore, 1);
+ if (firstf) {
+ firstf = 0;
+ if (srchopt) {
+ previousre = xstrdup(initbuf);
+ search(initbuf, f, 1);
+ if (noscroll)
+ left--;
+ } else if (initopt)
+ skiplns(initline, f);
+ } else if (fnum < nfiles && !no_tty) {
+ sigsetjmp(restore, 1);
+ left = command(fnames[fnum], f);
+ }
+ if (left != 0) {
+ if ((noscroll || clearit)
+ && (file_size != LONG_MAX)) {
+ if (clreol)
+ home();
+ else
+ doclear();
+ }
+ if (prnames) {
+ if (bad_so)
+ erasep(0);
+ if (clreol)
+ cleareol();
+ putsout("::::::::::::::");
+ if (promptlen > 14)
+ erasep(14);
+ putchar('\n');
+ if (clreol)
+ cleareol();
+ puts(fnames[fnum]);
+ if (clreol)
+ cleareol();
+ puts("::::::::::::::");
+ if (left > Lpp - 4)
+ left = Lpp - 4;
+ }
+ if (no_tty)
+ copy_file(f);
+ else {
+ within++;
+ screen(f, left);
+ within = 0;
+ }
+ }
+ sigsetjmp(restore, 1);
+ fflush(stdout);
+ fclose(f);
+ screen_start.line = screen_start.chrctr = 0L;
+ context.line = context.chrctr = 0L;
}
- }
- sigsetjmp (restore, 1);
- fflush(stdout);
- fclose(f);
- screen_start.line = screen_start.chrctr = 0L;
- context.line = context.chrctr = 0L;
+ fnum++;
+ firstf = 0;
}
- fnum++;
- firstf = 0;
- }
- free (previousre);
- free (initbuf);
- reset_tty ();
- exit(EXIT_SUCCESS);
+ free(previousre);
+ free(initbuf);
+ reset_tty();
+ exit(EXIT_SUCCESS);
}
-void argscan(char *s) {
+void argscan(char *s)
+{
int seen_num = 0;
while (*s != '\0') {
switch (*s) {
- case '0': case '1': case '2':
- case '3': case '4': case '5':
- case '6': case '7': case '8':
- case '9':
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
if (!seen_num) {
dlines = 0;
seen_num = 1;
}
- dlines = dlines*10 + *s - '0';
+ dlines = dlines * 10 + *s - '0';
break;
- case 'd':
+ case 'd':
dum_opt = 1;
break;
- case 'l':
+ case 'l':
stop_opt = 0;
break;
- case 'f':
+ case 'f':
fold_opt = 0;
break;
- case 'p':
+ case 'p':
noscroll++;
break;
- case 'c':
+ case 'c':
clreol++;
break;
- case 's':
+ case 's':
ssp_opt = 1;
break;
- case 'u':
+ case 'u':
ul_opt = 0;
break;
- case '-': case ' ': case '\t':
+ case '-':
+ case ' ':
+ case '\t':
+ break;
+ case 'V':
+ printf(_("more (%s)\n"), PACKAGE_STRING);
+ exit(EXIT_SUCCESS);
break;
- case 'V':
- printf(_("more (%s)\n"), PACKAGE_STRING);
- exit(EXIT_SUCCESS);
- break;
- default:
- warnx(_("unknown option -%s"), s);
+ default:
+ warnx(_("unknown option -%s"), s);
usage(stderr);
break;
}
@@ -549,57 +573,46 @@ void argscan(char *s) {
}
}
-
-/*
-** Check whether the file named by fs is an ASCII file which the user may
-** access. If it is, return the opened file. Otherwise return NULL.
-*/
-
-FILE *
-checkf (fs, clearfirst)
- register char *fs;
- int *clearfirst;
+/* Check whether the file named by fs is an ASCII file which the user may
+ * access. If it is, return the opened file. Otherwise return NULL. */
+FILE *checkf(register char *fs, int *clearfirst)
{
struct stat stbuf;
register FILE *f;
int c;
- if (stat (fs, &stbuf) == -1) {
+ if (stat(fs, &stbuf) == -1) {
(void)fflush(stdout);
if (clreol)
- cleareol ();
+ cleareol();
perror(fs);
- return((FILE *)NULL);
+ return ((FILE *)NULL);
}
if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
printf(_("\n*** %s: directory ***\n\n"), fs);
- return((FILE *)NULL);
+ return ((FILE *)NULL);
}
if ((f = Fopen(fs, "r")) == NULL) {
(void)fflush(stdout);
perror(fs);
- return((FILE *)NULL);
+ return ((FILE *)NULL);
}
if (magic(f, fs))
- return((FILE *)NULL);
- fcntl(fileno(f), F_SETFD, FD_CLOEXEC );
+ return ((FILE *)NULL);
+ fcntl(fileno(f), F_SETFD, FD_CLOEXEC);
c = Getc(f);
*clearfirst = (c == '\f');
- Ungetc (c, f);
+ Ungetc(c, f);
if ((file_size = stbuf.st_size) == 0)
file_size = LONG_MAX;
- return(f);
+ return (f);
}
-/*
- * magic --
- * check for file magic numbers. This code would best be shared with
- * the file(1) program or, perhaps, more should not try to be so smart.
- */
-static int
-magic(f, fs)
- FILE *f;
- char *fs;
+/* magic --
+ * check for file magic numbers. This code would best be shared
+ * with the file(1) program or, perhaps, more should not try to be
+ * so smart. */
+static int magic(FILE *f, char *fs)
{
signed char twobytes[2];
@@ -608,930 +621,900 @@ magic(f, fs)
return 0;
if (fread(twobytes, 2, 1, f) == 1) {
- switch(twobytes[0] + (twobytes[1]<<8)) {
+ switch (twobytes[0] + (twobytes[1] << 8)) {
case 0407: /* a.out obj */
case 0410: /* a.out exec */
case 0413: /* a.out demand exec */
case 0405:
case 0411:
case 0177545:
- case 0x457f: /* simple ELF detection */
- printf(_("\n******** %s: Not a text file ********\n\n"), fs);
+ case 0x457f: /* simple ELF detection */
+ printf(_("\n******** %s: Not a text file ********\n\n"),
+ fs);
(void)fclose(f);
return 1;
}
}
- (void)fseek(f, 0L, SEEK_SET); /* rewind() not necessary */
+ (void)fseek(f, 0L, SEEK_SET); /* rewind() not necessary */
return 0;
}
-/*
-** Print out the contents of the file f, one screenful at a time.
-*/
-
+/* Print out the contents of the file f, one screenful at a time. */
#define STOP -10
-
-void screen (register FILE *f, register int num_lines)
+void screen(register FILE *f, register int num_lines)
{
- register int c;
- register int nchars;
- int length; /* length of current line */
- static int prev_len = 1; /* length of previous line */
-
- for (;;) {
- while (num_lines > 0 && !Pause) {
- if ((nchars = get_line (f, &length)) == EOF)
- {
- if (clreol)
- clreos();
- return;
- }
- if (ssp_opt && length == 0 && prev_len == 0)
- continue;
- prev_len = length;
- if (bad_so || ((Senter && *Senter == ' ') && (promptlen > 0)))
- erasep (0);
- /* must clear before drawing line since tabs on some terminals
- * do not erase what they tab over.
- */
- if (clreol)
- cleareol ();
- prbuf (Line, length);
- if (nchars < promptlen)
- erasep (nchars); /* erasep () sets promptlen to 0 */
- else promptlen = 0;
- /* is this needed?
- * if (clreol)
- * cleareol(); * must clear again in case we wrapped *
- */
- if (nchars < Mcol || !fold_opt)
- prbuf("\n", 1); /* will turn off UL if necessary */
- if (nchars == STOP)
- break;
- num_lines--;
- }
- if (pstate) {
- my_putstring (ULexit);
- pstate = 0;
- }
- fflush(stdout);
- if ((c = Getc(f)) == EOF)
- {
- if (clreol)
- clreos ();
- return;
- }
+ register int c;
+ register int nchars;
+ int length; /* length of current line */
+ static int prev_len = 1; /* length of previous line */
- if (Pause && clreol)
- clreos ();
- Ungetc (c, f);
- sigsetjmp (restore, 1);
- Pause = 0; startup = 0;
- if ((num_lines = command (NULL, f)) == 0)
- return;
- if (hard && promptlen > 0)
- erasep (0);
- if (noscroll && num_lines >= dlines)
- {
- if (clreol)
- home();
- else
- doclear ();
+ for (;;) {
+ while (num_lines > 0 && !Pause) {
+ if ((nchars = get_line(f, &length)) == EOF) {
+ if (clreol)
+ clreos();
+ return;
+ }
+ if (ssp_opt && length == 0 && prev_len == 0)
+ continue;
+ prev_len = length;
+ if (bad_so
+ || ((Senter && *Senter == ' ') && (promptlen > 0)))
+ erasep(0);
+ /* must clear before drawing line since tabs on
+ * some terminals do not erase what they tab
+ * over. */
+ if (clreol)
+ cleareol();
+ prbuf(Line, length);
+ if (nchars < promptlen)
+ erasep(nchars); /* erasep () sets promptlen to 0 */
+ else
+ promptlen = 0;
+ /* is this needed?
+ * if (clreol)
+ * cleareol(); * must clear again in case we wrapped *
+ */
+ if (nchars < Mcol || !fold_opt)
+ prbuf("\n", 1); /* will turn off UL if necessary */
+ if (nchars == STOP)
+ break;
+ num_lines--;
+ }
+ if (pstate) {
+ my_putstring(ULexit);
+ pstate = 0;
+ }
+ fflush(stdout);
+ if ((c = Getc(f)) == EOF) {
+ if (clreol)
+ clreos();
+ return;
+ }
+
+ if (Pause && clreol)
+ clreos();
+ Ungetc(c, f);
+ sigsetjmp(restore, 1);
+ Pause = 0;
+ startup = 0;
+ if ((num_lines = command(NULL, f)) == 0)
+ return;
+ if (hard && promptlen > 0)
+ erasep(0);
+ if (noscroll && num_lines >= dlines) {
+ if (clreol)
+ home();
+ else
+ doclear();
+ }
+ screen_start.line = Currline;
+ screen_start.chrctr = Ftell(f);
}
- screen_start.line = Currline;
- screen_start.chrctr = Ftell (f);
- }
}
-/*
-** Come here if a quit signal is received
-*/
-
-void onquit(int dummy __attribute__ ((__unused__)))
+/* Come here if a quit signal is received */
+void onquit(int dummy __attribute__((__unused__)))
{
- signal(SIGQUIT, SIG_IGN);
- if (!inwait) {
- putchar ('\n');
- if (!startup) {
- signal(SIGQUIT, onquit);
- siglongjmp (restore, 1);
+ signal(SIGQUIT, SIG_IGN);
+ if (!inwait) {
+ putchar('\n');
+ if (!startup) {
+ signal(SIGQUIT, onquit);
+ siglongjmp(restore, 1);
+ } else
+ Pause++;
+ } else if (!dum_opt && notell) {
+ promptlen += fprintf(stderr, _("[Use q or Q to quit]"));
+ notell = 0;
}
- else
- Pause++;
- }
- else if (!dum_opt && notell) {
- promptlen += fprintf(stderr, _("[Use q or Q to quit]"));
- notell = 0;
- }
- signal(SIGQUIT, onquit);
+ signal(SIGQUIT, onquit);
}
-/*
-** Come here if a signal for a window size change is received
-*/
-
+/* Come here if a signal for a window size change is received */
#ifdef SIGWINCH
-void chgwinsz(int dummy __attribute__ ((__unused__)))
+void chgwinsz(int dummy __attribute__((__unused__)))
{
- struct winsize win;
-
- signal(SIGWINCH, SIG_IGN);
- if (ioctl(fileno(stdout), TIOCGWINSZ, &win) != -1) {
- if (win.ws_row != 0) {
- Lpp = win.ws_row;
- nscroll = Lpp/2 - 1;
- if (nscroll <= 0)
- nscroll = 1;
- dlines = Lpp - 1; /* was: Lpp - (noscroll ? 1 : 2) */
+ struct winsize win;
+
+ signal(SIGWINCH, SIG_IGN);
+ if (ioctl(fileno(stdout), TIOCGWINSZ, &win) != -1) {
+ if (win.ws_row != 0) {
+ Lpp = win.ws_row;
+ nscroll = Lpp / 2 - 1;
+ if (nscroll <= 0)
+ nscroll = 1;
+ dlines = Lpp - 1; /* was: Lpp - (noscroll ? 1 : 2) */
+ }
+ if (win.ws_col != 0)
+ Mcol = win.ws_col;
}
- if (win.ws_col != 0)
- Mcol = win.ws_col;
- }
- (void) signal(SIGWINCH, chgwinsz);
+ (void)signal(SIGWINCH, chgwinsz);
}
-#endif /* SIGWINCH */
+#endif /* SIGWINCH */
-/*
-** Clean up terminal state and exit. Also come here if interrupt signal received
-*/
-
-void __attribute__((__noreturn__))
-end_it (int dummy __attribute__ ((__unused__)))
+/* Clean up terminal state and exit. Also come here if interrupt signal received */
+void __attribute__((__noreturn__)) end_it(int dummy __attribute__((__unused__)))
{
- reset_tty ();
- if (clreol) {
- putchar ('\r');
- clreos ();
- fflush (stdout);
- }
- else if (!clreol && (promptlen > 0)) {
- kill_line ();
- fflush (stdout);
- }
- else
- putcerr('\n');
- _exit(EXIT_SUCCESS);
+ reset_tty();
+ if (clreol) {
+ putchar('\r');
+ clreos();
+ fflush(stdout);
+ } else if (!clreol && (promptlen > 0)) {
+ kill_line();
+ fflush(stdout);
+ } else
+ putcerr('\n');
+ _exit(EXIT_SUCCESS);
}
-void copy_file(register FILE *f) {
- register int c;
+void copy_file(register FILE *f)
+{
+ register int c;
- while ((c = getc(f)) != EOF)
- putchar(c);
+ while ((c = getc(f)) != EOF)
+ putchar(c);
}
#define ringbell() putcerr('\007')
-static void prompt (char *filename)
+static void prompt(char *filename)
{
- if (clreol)
- cleareol ();
- else if (promptlen > 0)
- kill_line ();
- if (!hard) {
- promptlen = 0;
- if (Senter && Sexit) {
- my_putstring (Senter);
- promptlen += (2 * soglitch);
- }
if (clreol)
- cleareol ();
- promptlen += printf(_("--More--"));
- if (filename != NULL) {
- promptlen += printf(_("(Next file: %s)"), filename);
- } else if (!no_intty) {
- promptlen += printf("(%d%%)", (int) ((file_pos * 100) / file_size));
- }
- if (dum_opt) {
- promptlen += printf(_("[Press space to continue, 'q' to quit.]"));
- }
- if (Senter && Sexit)
- my_putstring (Sexit);
- if (clreol)
- clreos ();
- fflush(stdout);
- }
- else
- ringbell();
- inwait++;
+ cleareol();
+ else if (promptlen > 0)
+ kill_line();
+ if (!hard) {
+ promptlen = 0;
+ if (Senter && Sexit) {
+ my_putstring(Senter);
+ promptlen += (2 * soglitch);
+ }
+ if (clreol)
+ cleareol();
+ promptlen += printf(_("--More--"));
+ if (filename != NULL) {
+ promptlen += printf(_("(Next file: %s)"), filename);
+ } else if (!no_intty) {
+ promptlen +=
+ printf("(%d%%)",
+ (int)((file_pos * 100) / file_size));
+ }
+ if (dum_opt) {
+ promptlen +=
+ printf(_("[Press space to continue, 'q' to quit.]"));
+ }
+ if (Senter && Sexit)
+ my_putstring(Sexit);
+ if (clreol)
+ clreos();
+ fflush(stdout);
+ } else
+ ringbell();
+ inwait++;
}
void prepare_line_buffer(void)
{
- char *nline;
- size_t nsz = Mcol * 4;
+ char *nline;
+ size_t nsz = Mcol * 4;
- if (LineLen >= nsz)
- return;
+ if (LineLen >= nsz)
+ return;
- if (nsz < LINSIZ)
- nsz = LINSIZ;
+ if (nsz < LINSIZ)
+ nsz = LINSIZ;
- nline = xrealloc(Line, nsz);
- Line = nline;
- LineLen = nsz;
+ nline = xrealloc(Line, nsz);
+ Line = nline;
+ LineLen = nsz;
}
-/*
- * Get a logical line
- */
-
+/* Get a logical line */
int get_line(register FILE *f, int *length)
{
- int c;
- char *p;
- int column;
- static int colflg;
+ int c;
+ char *p;
+ int column;
+ static int colflg;
#ifdef HAVE_WIDECHAR
- size_t i;
- wchar_t wc;
- int wc_width;
- mbstate_t state, state_bak; /* Current status of the stream. */
- char mbc[MB_LEN_MAX]; /* Buffer for one multibyte char. */
- size_t mblength; /* Byte length of multibyte char. */
- size_t mbc_pos = 0; /* Position of the MBC. */
- int use_mbc_buffer_flag = 0; /* If 1, mbc has data. */
- int break_flag = 0; /* If 1, exit while(). */
- long file_pos_bak = Ftell (f);
-
- memset (&state, '\0', sizeof (mbstate_t));
-#endif /* HAVE_WIDECHAR */
-
- prepare_line_buffer();
-
- p = Line;
- column = 0;
- c = Getc (f);
- if (colflg && c == '\n') {
- Currline++;
- c = Getc (f);
- }
- while (p < &Line[LineLen - 1]) {
+ size_t i;
+ wchar_t wc;
+ int wc_width;
+ mbstate_t state, state_bak; /* Current status of the stream. */
+ char mbc[MB_LEN_MAX]; /* Buffer for one multibyte char. */
+ size_t mblength; /* Byte length of multibyte char. */
+ size_t mbc_pos = 0; /* Position of the MBC. */
+ int use_mbc_buffer_flag = 0; /* If 1, mbc has data. */
+ int break_flag = 0; /* If 1, exit while(). */
+ long file_pos_bak = Ftell(f);
+
+ memset(&state, '\0', sizeof(mbstate_t));
+#endif
+
+ prepare_line_buffer();
+
+ p = Line;
+ column = 0;
+ c = Getc(f);
+ if (colflg && c == '\n') {
+ Currline++;
+ c = Getc(f);
+ }
+ while (p < &Line[LineLen - 1]) {
#ifdef HAVE_WIDECHAR
- if (fold_opt && use_mbc_buffer_flag && MB_CUR_MAX > 1) {
- use_mbc_buffer_flag = 0;
- state_bak = state;
- mbc[mbc_pos++] = c;
-process_mbc:
- mblength = mbrtowc (&wc, mbc, mbc_pos, &state);
-
- switch (mblength) {
- case (size_t)-2: /* Incomplete multibyte character. */
- use_mbc_buffer_flag = 1;
- state = state_bak;
- break;
-
- case (size_t)-1: /* Invalid as a multibyte character. */
- *p++ = mbc[0];
- state = state_bak;
- column++;
- file_pos_bak++;
-
- if (column >= Mcol) {
- Fseek (f, file_pos_bak);
- } else {
- memmove (mbc, mbc + 1, --mbc_pos);
- if (mbc_pos > 0) {
- mbc[mbc_pos] = '\0';
- goto process_mbc;
- }
- }
- break;
+ if (fold_opt && use_mbc_buffer_flag && MB_CUR_MAX > 1) {
+ use_mbc_buffer_flag = 0;
+ state_bak = state;
+ mbc[mbc_pos++] = c;
+ process_mbc:
+ mblength = mbrtowc(&wc, mbc, mbc_pos, &state);
+
+ switch (mblength) {
+ case (size_t)-2: /* Incomplete multibyte character. */
+ use_mbc_buffer_flag = 1;
+ state = state_bak;
+ break;
+
+ case (size_t)-1: /* Invalid as a multibyte character. */
+ *p++ = mbc[0];
+ state = state_bak;
+ column++;
+ file_pos_bak++;
+
+ if (column >= Mcol) {
+ Fseek(f, file_pos_bak);
+ } else {
+ memmove(mbc, mbc + 1, --mbc_pos);
+ if (mbc_pos > 0) {
+ mbc[mbc_pos] = '\0';
+ goto process_mbc;
+ }
+ }
+ break;
+
+ default:
+ wc_width = wcwidth(wc);
+
+ if (column + wc_width > Mcol) {
+ Fseek(f, file_pos_bak);
+ break_flag = 1;
+ } else {
+ for (i = 0; i < mbc_pos; i++)
+ *p++ = mbc[i];
+ if (wc_width > 0)
+ column += wc_width;
+ }
+ }
- default:
- wc_width = wcwidth (wc);
+ if (break_flag || column >= Mcol)
+ break;
- if (column + wc_width > Mcol) {
- Fseek (f, file_pos_bak);
- break_flag = 1;
- } else {
- for (i = 0; i < mbc_pos; i++)
- *p++ = mbc[i];
- if (wc_width > 0)
- column += wc_width;
+ c = Getc(f);
+ continue;
+ }
+#endif /* HAVE_WIDECHAR */
+ if (c == EOF) {
+ if (p > Line) {
+ *p = '\0';
+ *length = p - Line;
+ return (column);
+ }
+ *length = p - Line;
+ return (EOF);
+ }
+ if (c == '\n') {
+ Currline++;
+ break;
}
- }
-
- if (break_flag || column >= Mcol)
- break;
-
- c = Getc (f);
- continue;
- }
-#endif /* HAVE_WIDECHAR */
- if (c == EOF) {
- if (p > Line) {
- *p = '\0';
- *length = p - Line;
- return (column);
- }
- *length = p - Line;
- return (EOF);
- }
- if (c == '\n') {
- Currline++;
- break;
- }
- *p++ = c;
+ *p++ = c;
#if 0
- if (c == '\033') { /* ESC */
- c = Getc(f);
- while (c > ' ' && c < '0' && p < &Line[LineLen - 1]) {
- *p++ = c;
+ if (c == '\033') { /* ESC */
c = Getc(f);
+ while (c > ' ' && c < '0' && p < &Line[LineLen - 1]) {
+ *p++ = c;
+ c = Getc(f);
+ }
+ if (c >= '0' && c < '\177' && p < &Line[LineLen - 1]) {
+ *p++ = c;
+ c = Getc(f);
+ continue;
+ }
}
- if (c >= '0' && c < '\177' && p < &Line[LineLen - 1]) {
- *p++ = c;
- c = Getc(f);
- continue;
+#endif /* 0 */
+ if (c == '\t') {
+ if (!hardtabs || (column < promptlen && !hard)) {
+ if (hardtabs && eraseln && !dumb) {
+ column = 1 + (column | 7);
+ my_putstring(eraseln);
+ promptlen = 0;
+ } else {
+ for (--p; p < &Line[LineLen - 1];) {
+ *p++ = ' ';
+ if ((++column & 7) == 0)
+ break;
+ }
+ if (column >= promptlen)
+ promptlen = 0;
+ }
+ } else
+ column = 1 + (column | 7);
+ } else if (c == '\b' && column > 0) {
+ column--;
+ } else if (c == '\r') {
+ int next = Getc(f);
+ if (next == '\n') {
+ p--;
+ Currline++;
+ break;
+ }
+ Ungetc(next, f);
+ column = 0;
+ } else if (c == '\f' && stop_opt) {
+ p[-1] = '^';
+ *p++ = 'L';
+ column += 2;
+ Pause++;
+ } else if (c == EOF) {
+ *length = p - Line;
+ return (column);
+ } else {
+#ifdef HAVE_WIDECHAR
+ if (fold_opt && MB_CUR_MAX > 1) {
+ memset(mbc, '\0', MB_LEN_MAX);
+ mbc_pos = 0;
+ mbc[mbc_pos++] = c;
+ state_bak = state;
+
+ mblength = mbrtowc(&wc, mbc, mbc_pos, &state);
+ /* The value of mblength is always less than 2 here. */
+ switch (mblength) {
+ case (size_t)-2:
+ p--;
+ file_pos_bak = Ftell(f) - 1;
+ state = state_bak;
+ use_mbc_buffer_flag = 1;
+ break;
+
+ case (size_t)-1:
+ state = state_bak;
+ column++;
+ break;
+
+ default:
+ wc_width = wcwidth(wc);
+ if (wc_width > 0)
+ column += wc_width;
+ }
+ } else
+#endif /* HAVE_WIDECHAR */
+ {
+ if (isprint(c))
+ column++;
+ }
}
+
+ if (column >= Mcol && fold_opt)
+ break;
+ c = Getc(f);
}
-#endif /* 0 */
- if (c == '\t') {
- if (!hardtabs || (column < promptlen && !hard)) {
- if (hardtabs && eraseln && !dumb) {
- column = 1 + (column | 7);
- my_putstring (eraseln);
- promptlen = 0;
+ if (column >= Mcol && Mcol > 0) {
+ if (!Wrap) {
+ *p++ = '\n';
}
- else {
- for (--p; p < &Line[LineLen - 1];) {
- *p++ = ' ';
- if ((++column & 7) == 0)
- break;
- }
- if (column >= promptlen) promptlen = 0;
- }
- } else
- column = 1 + (column | 7);
- } else if (c == '\b' && column > 0) {
- column--;
- } else if (c == '\r') {
- int next = Getc(f);
- if (next == '\n') {
- p--;
- Currline++;
- break;
- }
- Ungetc(next,f);
- column = 0;
- } else if (c == '\f' && stop_opt) {
- p[-1] = '^';
- *p++ = 'L';
- column += 2;
- Pause++;
- } else if (c == EOF) {
- *length = p - Line;
- return (column);
- } else {
-#ifdef HAVE_WIDECHAR
- if (fold_opt && MB_CUR_MAX > 1) {
- memset (mbc, '\0', MB_LEN_MAX);
- mbc_pos = 0;
- mbc[mbc_pos++] = c;
- state_bak = state;
-
- mblength = mbrtowc (&wc, mbc, mbc_pos, &state);
-
- /* The value of mblength is always less than 2 here. */
- switch (mblength) {
- case (size_t)-2:
- p--;
- file_pos_bak = Ftell (f) - 1;
- state = state_bak;
- use_mbc_buffer_flag = 1;
- break;
-
- case (size_t)-1:
- state = state_bak;
- column++;
- break;
-
- default:
- wc_width = wcwidth (wc);
- if (wc_width > 0)
- column += wc_width;
- }
- } else
-#endif /* HAVE_WIDECHAR */
- {
- if (isprint(c))
- column++;
- }
}
-
- if (column >= Mcol && fold_opt)
- break;
- c = Getc (f);
- }
- if (column >= Mcol && Mcol > 0) {
- if (!Wrap) {
- *p++ = '\n';
+ colflg = column == Mcol && fold_opt;
+ if (colflg && eatnl && Wrap) {
+ *p++ = '\n'; /* simulate normal wrap */
}
- }
- colflg = column == Mcol && fold_opt;
- if (colflg && eatnl && Wrap) {
- *p++ = '\n'; /* simulate normal wrap */
- }
- *length = p - Line;
- *p = 0;
- return (column);
+ *length = p - Line;
+ *p = 0;
+ return (column);
}
-/*
-** Erase the rest of the prompt, assuming we are starting at column col.
-*/
-
-void erasep (register int col)
+/* Erase the rest of the prompt, assuming we are starting at column col. */
+void erasep(register int col)
{
- if (promptlen == 0)
- return;
- if (hard) {
- putchar ('\n');
- }
- else {
- if (col == 0)
- putchar ('\r');
- if (!dumb && eraseln)
- my_putstring (eraseln);
- else
- for (col = promptlen - col; col > 0; col--)
- putchar (' ');
- }
- promptlen = 0;
+ if (promptlen == 0)
+ return;
+ if (hard) {
+ putchar('\n');
+ } else {
+ if (col == 0)
+ putchar('\r');
+ if (!dumb && eraseln)
+ my_putstring(eraseln);
+ else
+ for (col = promptlen - col; col > 0; col--)
+ putchar(' ');
+ }
+ promptlen = 0;
}
-/*
-** Erase the current line entirely
-*/
-
+/* Erase the current line entirely */
void kill_line()
{
- erasep(0);
- if (!eraseln || dumb)
- putchar('\r');
+ erasep(0);
+ if (!eraseln || dumb)
+ putchar('\r');
}
-/*
- * force clear to end of line
- */
+/* force clear to end of line */
void cleareol()
{
- my_putstring(eraseln);
+ my_putstring(eraseln);
}
void clreos()
{
- my_putstring(EodClr);
+ my_putstring(EodClr);
}
/* Print a buffer of n characters */
-
-void prbuf (register char *s, register int n)
+void prbuf(register char *s, register int n)
{
- register char c; /* next output character */
- register int state; /* next output char's UL state */
+ register char c; /* next output character */
+ register int state; /* next output char's UL state */
#define wouldul(s,n) ((n) >= 2 && (((s)[0] == '_' && (s)[1] == '\b') || ((s)[1] == '\b' && (s)[2] == '_')))
- while (--n >= 0)
- if (!ul_opt)
- putchar (*s++);
- else {
- if (*s == ' ' && pstate == 0 && ulglitch && wouldul(s+1, n-1)) {
- s++;
- continue;
- }
- if ((state = wouldul(s, n)) != 0) {
- c = (*s == '_')? s[2] : *s ;
- n -= 2;
- s += 3;
- } else
- c = *s++;
- if (state != pstate) {
- if (c == ' ' && state == 0 && ulglitch && wouldul(s, n-1))
- state = 1;
- else
- my_putstring(state ? ULenter : ULexit);
- }
- if (c != ' ' || pstate == 0 || state != 0 || ulglitch == 0)
+ while (--n >= 0)
+ if (!ul_opt)
+ putchar(*s++);
+ else {
+ if (*s == ' ' && pstate == 0 && ulglitch
+ && wouldul(s + 1, n - 1)) {
+ s++;
+ continue;
+ }
+ if ((state = wouldul(s, n)) != 0) {
+ c = (*s == '_') ? s[2] : *s;
+ n -= 2;
+ s += 3;
+ } else
+ c = *s++;
+ if (state != pstate) {
+ if (c == ' ' && state == 0 && ulglitch
+ && wouldul(s, n - 1))
+ state = 1;
+ else
+ my_putstring(state ? ULenter : ULexit);
+ }
+ if (c != ' ' || pstate == 0 || state != 0
+ || ulglitch == 0)
#ifdef HAVE_WIDECHAR
- {
- wchar_t wc;
- size_t mblength;
- mbstate_t mbstate;
- memset (&mbstate, '\0', sizeof (mbstate_t));
- s--; n++;
- mblength = mbrtowc (&wc, s, n, &mbstate);
- if (mblength == (size_t) -2 || mblength == (size_t) -1)
- mblength = 1;
- while (mblength--)
- putchar (*s++);
- n += mblength;
- }
+ {
+ wchar_t wc;
+ size_t mblength;
+ mbstate_t mbstate;
+ memset(&mbstate, '\0', sizeof(mbstate_t));
+ s--;
+ n++;
+ mblength = mbrtowc(&wc, s, n, &mbstate);
+ if (mblength == (size_t)-2
+ || mblength == (size_t)-1)
+ mblength = 1;
+ while (mblength--)
+ putchar(*s++);
+ n += mblength;
+ }
#else
- putchar(c);
-#endif /* HAVE_WIDECHAR */
- if (state && *chUL) {
- putsout(chBS);
- my_putstring(chUL);
- }
- pstate = state;
- }
+ putchar(c);
+#endif /* HAVE_WIDECHAR */
+ if (state && *chUL) {
+ putsout(chBS);
+ my_putstring(chUL);
+ }
+ pstate = state;
+ }
}
-/*
-** Clear the screen
-*/
-void
-doclear()
+/* Clear the screen */
+void doclear()
{
- if (Clear && !hard) {
- my_putstring(Clear);
-
- /* Put out carriage return so that system doesn't
- ** get confused by escape sequences when expanding tabs
- */
- putchar ('\r');
- promptlen = 0;
- }
+ if (Clear && !hard) {
+ my_putstring(Clear);
+ /* Put out carriage return so that system doesn't get
+ * confused by escape sequences when expanding tabs */
+ putchar('\r');
+ promptlen = 0;
+ }
}
-/*
- * Go to home position
- */
-void
-home()
+/* Go to home position */
+void home()
{
- my_putstring(Home);
+ my_putstring(Home);
}
static int lastcmd, lastarg, lastp;
static int lastcolon;
char shell_line[SHELL_LINE];
-/*
-** Read a command and do it. A command consists of an optional integer
-** argument followed by the command character. Return the number of lines
-** to display in the next screenful. If there is nothing more to display
-** in the current file, zero is returned.
-*/
-
-int command (char *filename, register FILE *f)
+/* Read a command and do it. A command consists of an optional integer
+ * argument followed by the command character. Return the number of
+ * lines to display in the next screenful. If there is nothing more to
+ * display in the current file, zero is returned. */
+int command(char *filename, register FILE *f)
{
- register int nlines;
- register int retval = 0;
- register int c;
- char colonch;
- int done;
- char comchar, cmdbuf[INIT_BUF];
+ register int nlines;
+ register int retval = 0;
+ register int c;
+ char colonch;
+ int done;
+ char comchar, cmdbuf[INIT_BUF];
#define ret(val) retval=val;done++;break
- done = 0;
- if (!errors)
- prompt (filename);
- else
- errors = 0;
- for (;;) {
- nlines = number (&comchar);
- lastp = colonch = 0;
- if (comchar == '.') { /* Repeat last command */
- lastp++;
- comchar = lastcmd;
- nlines = lastarg;
- if (lastcmd == ':')
- colonch = lastcolon;
- }
- lastcmd = comchar;
- lastarg = nlines;
- if ((cc_t) comchar == otty.c_cc[VERASE]) {
- kill_line ();
- prompt (filename);
- continue;
- }
- switch (comchar) {
- case ':':
- retval = colon (filename, colonch, nlines);
- if (retval >= 0)
- done++;
- break;
- case 'b':
- case ctrl('B'):
- {
- register int initline;
-
- if (no_intty) {
- ringbell();
- return (-1);
+ done = 0;
+ if (!errors)
+ prompt(filename);
+ else
+ errors = 0;
+ for (;;) {
+ nlines = number(&comchar);
+ lastp = colonch = 0;
+ if (comchar == '.') { /* Repeat last command */
+ lastp++;
+ comchar = lastcmd;
+ nlines = lastarg;
+ if (lastcmd == ':')
+ colonch = lastcolon;
}
+ lastcmd = comchar;
+ lastarg = nlines;
+ if ((cc_t) comchar == otty.c_cc[VERASE]) {
+ kill_line();
+ prompt(filename);
+ continue;
+ }
+ switch (comchar) {
+ case ':':
+ retval = colon(filename, colonch, nlines);
+ if (retval >= 0)
+ done++;
+ break;
+ case 'b':
+ case ctrl('B'):
+ {
+ register int initline;
+
+ if (no_intty) {
+ ringbell();
+ return (-1);
+ }
+
+ if (nlines == 0)
+ nlines++;
+
+ putchar('\r');
+ erasep(0);
+ putchar('\n');
+ if (clreol)
+ cleareol();
+ if (nlines != 1)
+ printf(_("...back %d pages"), nlines);
+ else
+ putsout(_("...back 1 page"));
+ if (clreol)
+ cleareol();
+ putchar('\n');
+
+ initline = Currline - dlines * (nlines + 1);
+ if (!noscroll)
+ --initline;
+ if (initline < 0)
+ initline = 0;
+ Fseek(f, 0L);
+ Currline = 0; /* skiplns() will make Currline correct */
+ skiplns(initline, f);
+ if (!noscroll) {
+ ret(dlines + 1);
+ } else {
+ ret(dlines);
+ }
+ }
+ case ' ':
+ case 'z':
+ if (nlines == 0)
+ nlines = dlines;
+ else if (comchar == 'z')
+ dlines = nlines;
+ ret(nlines);
+ case 'd':
+ case ctrl('D'):
+ if (nlines != 0)
+ nscroll = nlines;
+ ret(nscroll);
+ case 'q':
+ case 'Q':
+ end_it(0);
+ case 's':
+ case 'f':
+ case ctrl('F'):
+ if (nlines == 0)
+ nlines++;
+ if (comchar == 'f')
+ nlines *= dlines;
+ putchar('\r');
+ erasep(0);
+ putchar('\n');
+ if (clreol)
+ cleareol();
+ if (nlines == 1)
+ putsout(_("...skipping one line"));
+ else
+ printf(_("...skipping %d lines"), nlines);
- if (nlines == 0) nlines++;
-
- putchar ('\r');
- erasep (0);
- putchar('\n');
- if (clreol)
- cleareol ();
- if (nlines != 1)
- printf(_("...back %d pages"), nlines);
- else
- putsout(_("...back 1 page"));
- if (clreol)
- cleareol ();
- putchar('\n');
+ if (clreol)
+ cleareol();
+ putchar('\n');
- initline = Currline - dlines * (nlines + 1);
- if (! noscroll)
- --initline;
- if (initline < 0) initline = 0;
- Fseek(f, 0L);
- Currline = 0; /* skiplns() will make Currline correct */
- skiplns(initline, f);
- if (! noscroll) {
- ret(dlines + 1);
- }
- else {
- ret(dlines);
- }
- }
- case ' ':
- case 'z':
- if (nlines == 0) nlines = dlines;
- else if (comchar == 'z') dlines = nlines;
- ret (nlines);
- case 'd':
- case ctrl('D'):
- if (nlines != 0) nscroll = nlines;
- ret (nscroll);
- case 'q':
- case 'Q':
- end_it (0);
- case 's':
- case 'f':
- case ctrl('F'):
- if (nlines == 0) nlines++;
- if (comchar == 'f')
- nlines *= dlines;
- putchar ('\r');
- erasep (0);
- putchar('\n');
- if (clreol)
- cleareol ();
- if (nlines == 1)
- putsout(_("...skipping one line"));
- else
- printf(_("...skipping %d lines"), nlines);
-
- if (clreol)
- cleareol ();
- putchar('\n');
-
- while (nlines > 0) {
- while ((c = Getc (f)) != '\n')
- if (c == EOF) {
- retval = 0;
- done++;
- goto endsw;
- }
- Currline++;
- nlines--;
- }
- ret (dlines);
- case '\n':
- if (nlines != 0)
- dlines = nlines;
- else
- nlines = 1;
- ret (nlines);
- case '\f':
- if (!no_intty) {
- doclear ();
- Fseek (f, screen_start.chrctr);
- Currline = screen_start.line;
- ret (dlines);
- }
- else {
- ringbell();
- break;
- }
- case '\'':
- if (!no_intty) {
- kill_line ();
- putsout(_("\n***Back***\n\n"));
- Fseek (f, context.chrctr);
- Currline = context.line;
- ret (dlines);
- }
- else {
- ringbell();
- break;
- }
- case '=':
- kill_line ();
- promptlen = printf("%d", Currline);
- fflush (stdout);
- break;
- case 'n':
- if (!previousre) {
- more_error (_("No previous regular expression"));
- break;
- }
- lastp++;
- /* fallthrough */
- case '/':
- if (nlines == 0) nlines++;
- kill_line ();
- putchar('/');
- promptlen = 1;
- fflush (stdout);
- if (lastp) {
- putcerr('\r');
- search (previousre, f, nlines);
- }
- else {
- ttyin (cmdbuf, sizeof(cmdbuf)-2, '/');
- putcerr('\r');
- free (previousre);
- previousre = xstrdup(cmdbuf);
- search (cmdbuf, f, nlines);
- }
- ret (dlines-1);
- case '!':
- do_shell (filename);
- break;
- case '?':
- case 'h':
- if (noscroll) doclear();
- putsout(_("\n"
-"Most commands optionally preceded by integer argument k. "
-"Defaults in brackets.\n"
-"Star (*) indicates argument becomes new default.\n"));
- puts("---------------------------------------"
- "----------------------------------------");
- putsout(_(
-"<space> Display next k lines of text [current screen size]\n"
-"z Display next k lines of text [current screen size]*\n"
-"<return> Display next k lines of text [1]*\n"
-"d or ctrl-D Scroll k lines [current scroll size, initially 11]*\n"
-"q or Q or <interrupt> Exit from more\n"
-"s Skip forward k lines of text [1]\n"
-"f Skip forward k screenfuls of text [1]\n"
-"b or ctrl-B Skip backwards k screenfuls of text [1]\n"
-"' Go to place where previous search started\n"
-"= Display current line number\n"
-"/<regular expression> Search for kth occurrence of regular expression [1]\n"
-"n Search for kth occurrence of last r.e [1]\n"
-"!<cmd> or :!<cmd> Execute <cmd> in a subshell\n"
-"v Start up /usr/bin/vi at current line\n"
-"ctrl-L Redraw screen\n"
-":n Go to kth next file [1]\n"
-":p Go to kth previous file [1]\n"
-":f Display current file name and line number\n"
-". Repeat previous command\n"));
- puts("---------------------------------------"
- "----------------------------------------");
- prompt(filename);
- break;
- case 'v': /* This case should go right before default */
- if (!no_intty) {
- /*
- * Earlier: call vi +n file. This also works for emacs.
- * POSIX: call vi -c n file (when editor is vi or ex).
- */
- char *editor, *p;
- int n = (Currline - dlines <= 0 ? 1 :
- Currline - (dlines + 1) / 2);
- int split = 0;
-
- editor = getenv("VISUAL");
- if (editor == NULL || *editor == '\0')
- editor = getenv("EDITOR");
- if (editor == NULL || *editor == '\0')
- editor = VI;
-
- p = strrchr(editor, '/');
- if (p)
- p++;
- else
- p = editor;
- if (!strcmp(p, "vi") || !strcmp(p, "ex")) {
- sprintf(cmdbuf, "-c %d", n);
- split = 1;
- } else {
- sprintf(cmdbuf, "+%d", n);
- }
-
- kill_line();
- printf("%s %s %s", editor, cmdbuf, fnames[fnum]);
- if (split) {
- cmdbuf[2] = 0;
- execute(filename, editor, editor, cmdbuf,
- cmdbuf+3, fnames[fnum], (char *)0);
- } else
- execute(filename, editor, editor,
- cmdbuf, fnames[fnum], (char *)0);
- break;
- }
- /* fall through */
- default:
- if (dum_opt) {
- kill_line ();
- if (Senter && Sexit) {
- my_putstring (Senter);
- promptlen = printf(_("[Press 'h' for instructions.]"))
- + 2 * soglitch;
- my_putstring (Sexit);
+ while (nlines > 0) {
+ while ((c = Getc(f)) != '\n')
+ if (c == EOF) {
+ retval = 0;
+ done++;
+ goto endsw;
+ }
+ Currline++;
+ nlines--;
+ }
+ ret(dlines);
+ case '\n':
+ if (nlines != 0)
+ dlines = nlines;
+ else
+ nlines = 1;
+ ret(nlines);
+ case '\f':
+ if (!no_intty) {
+ doclear();
+ Fseek(f, screen_start.chrctr);
+ Currline = screen_start.line;
+ ret(dlines);
+ } else {
+ ringbell();
+ break;
+ }
+ case '\'':
+ if (!no_intty) {
+ kill_line();
+ putsout(_("\n***Back***\n\n"));
+ Fseek(f, context.chrctr);
+ Currline = context.line;
+ ret(dlines);
+ } else {
+ ringbell();
+ break;
+ }
+ case '=':
+ kill_line();
+ promptlen = printf("%d", Currline);
+ fflush(stdout);
+ break;
+ case 'n':
+ if (!previousre) {
+ more_error(_("No previous regular expression"));
+ break;
+ }
+ lastp++;
+ /* fall through */
+ case '/':
+ if (nlines == 0)
+ nlines++;
+ kill_line();
+ putchar('/');
+ promptlen = 1;
+ fflush(stdout);
+ if (lastp) {
+ putcerr('\r');
+ search(previousre, f, nlines);
+ } else {
+ ttyin(cmdbuf, sizeof(cmdbuf) - 2, '/');
+ putcerr('\r');
+ free(previousre);
+ previousre = xstrdup(cmdbuf);
+ search(cmdbuf, f, nlines);
+ }
+ ret(dlines - 1);
+ case '!':
+ do_shell(filename);
+ break;
+ case '?':
+ case 'h':
+ if (noscroll)
+ doclear();
+ putsout(_("\n"
+ "Most commands optionally preceded by integer argument k. "
+ "Defaults in brackets.\n"
+ "Star (*) indicates argument becomes new default.\n"));
+ puts("---------------------------------------"
+ "----------------------------------------");
+ putsout(_
+ ("<space> Display next k lines of text [current screen size]\n"
+ "z Display next k lines of text [current screen size]*\n"
+ "<return> Display next k lines of text [1]*\n"
+ "d or ctrl-D Scroll k lines [current scroll size, initially 11]*\n"
+ "q or Q or <interrupt> Exit from more\n"
+ "s Skip forward k lines of text [1]\n"
+ "f Skip forward k screenfuls of text [1]\n"
+ "b or ctrl-B Skip backwards k screenfuls of text [1]\n"
+ "' Go to place where previous search started\n"
+ "= Display current line number\n"
+ "/<regular expression> Search for kth occurrence of regular expression [1]\n"
+ "n Search for kth occurrence of last r.e [1]\n"
+ "!<cmd> or :!<cmd> Execute <cmd> in a subshell\n"
+ "v Start up /usr/bin/vi at current line\n"
+ "ctrl-L Redraw screen\n"
+ ":n Go to kth next file [1]\n"
+ ":p Go to kth previous file [1]\n"
+ ":f Display current file name and line number\n"
+ ". Repeat previous command\n"));
+ puts("---------------------------------------"
+ "----------------------------------------");
+ prompt(filename);
+ break;
+ case 'v': /* This case should go right before default */
+ if (!no_intty) {
+ /* Earlier: call vi +n file. This also
+ * works for emacs. POSIX: call vi -c n
+ * file (when editor is vi or ex). */
+ char *editor, *p;
+ int n = (Currline - dlines <= 0 ? 1 :
+ Currline - (dlines + 1) / 2);
+ int split = 0;
+
+ editor = getenv("VISUAL");
+ if (editor == NULL || *editor == '\0')
+ editor = getenv("EDITOR");
+ if (editor == NULL || *editor == '\0')
+ editor = VI;
+
+ p = strrchr(editor, '/');
+ if (p)
+ p++;
+ else
+ p = editor;
+ if (!strcmp(p, "vi") || !strcmp(p, "ex")) {
+ sprintf(cmdbuf, "-c %d", n);
+ split = 1;
+ } else {
+ sprintf(cmdbuf, "+%d", n);
+ }
+
+ kill_line();
+ printf("%s %s %s", editor, cmdbuf,
+ fnames[fnum]);
+ if (split) {
+ cmdbuf[2] = 0;
+ execute(filename, editor, editor,
+ cmdbuf, cmdbuf + 3,
+ fnames[fnum], (char *)0);
+ } else
+ execute(filename, editor, editor,
+ cmdbuf, fnames[fnum],
+ (char *)0);
+ break;
+ }
+ /* fall through */
+ default:
+ if (dum_opt) {
+ kill_line();
+ if (Senter && Sexit) {
+ my_putstring(Senter);
+ promptlen =
+ printf(_
+ ("[Press 'h' for instructions.]"))
+ + 2 * soglitch;
+ my_putstring(Sexit);
+ } else
+ promptlen =
+ printf(_
+ ("[Press 'h' for instructions.]"));
+ fflush(stdout);
+ } else
+ ringbell();
+ break;
}
- else
- promptlen = printf(_("[Press 'h' for instructions.]"));
- fflush (stdout);
- }
- else
- ringbell();
- break;
+ if (done)
+ break;
}
- if (done) break;
- }
- putchar ('\r');
-endsw:
- inwait = 0;
- notell++;
- return (retval);
+ putchar('\r');
+ endsw:
+ inwait = 0;
+ notell++;
+ return (retval);
}
static char ch;
-
-/*
- * Execute a colon-prefixed command.
- * Returns <0 if not a command that should cause
- * more of the file to be printed.
- */
-
-int colon (char *filename, int cmd, int nlines) {
+/* Execute a colon-prefixed command. Returns <0 if not a command that
+ * should cause more of the file to be printed. */
+int colon(char *filename, int cmd, int nlines)
+{
if (cmd == 0)
- ch = readch ();
+ ch = readch();
else
ch = cmd;
lastcolon = ch;
switch (ch) {
case 'f':
- kill_line ();
+ kill_line();
if (!no_intty)
- promptlen = printf(_("\"%s\" line %d"), fnames[fnum], Currline);
+ promptlen =
+ printf(_("\"%s\" line %d"), fnames[fnum], Currline);
else
promptlen = printf(_("[Not a file] line %d"), Currline);
- fflush (stdout);
+ fflush(stdout);
return (-1);
case 'n':
if (nlines == 0) {
if (fnum >= nfiles - 1)
- end_it (0);
+ end_it(0);
nlines++;
}
- putchar ('\r');
- erasep (0);
- skipf (nlines);
+ putchar('\r');
+ erasep(0);
+ skipf(nlines);
return (0);
case 'p':
if (no_intty) {
ringbell();
return (-1);
}
- putchar ('\r');
- erasep (0);
+ putchar('\r');
+ erasep(0);
if (nlines == 0)
nlines++;
- skipf (-nlines);
+ skipf(-nlines);
return (0);
case '!':
- do_shell (filename);
+ do_shell(filename);
return (-1);
case 'q':
case 'Q':
- end_it (0);
+ end_it(0);
default:
ringbell();
return (-1);
}
}
-/*
-** Read a decimal number from the terminal. Set cmd to the non-digit which
-** terminates the number.
-*/
-
+/* Read a decimal number from the terminal. Set cmd to the non-digit
+ * which terminates the number. */
int number(char *cmd)
{
register int i;
- i = 0; ch = otty.c_cc[VKILL];
+ i = 0;
+ ch = otty.c_cc[VKILL];
for (;;) {
- ch = readch ();
+ ch = readch();
if (isdigit(ch))
- i = i*10 + ch - '0';
+ i = i * 10 + ch - '0';
else if ((cc_t) ch == otty.c_cc[VKILL])
i = 0;
else {
@@ -1542,22 +1525,22 @@ int number(char *cmd)
return (i);
}
-void do_shell (char *filename)
+void do_shell(char *filename)
{
char cmdbuf[COMMAND_BUF];
int rc;
char *expanded;
- kill_line ();
+ kill_line();
putchar('!');
- fflush (stdout);
+ fflush(stdout);
promptlen = 1;
if (lastp)
putsout(shell_line);
else {
- ttyin (cmdbuf, sizeof(cmdbuf)-2, '!');
+ ttyin(cmdbuf, sizeof(cmdbuf) - 2, '!');
expanded = 0;
- rc = expand (&expanded, cmdbuf);
+ rc = expand(&expanded, cmdbuf);
if (expanded) {
if (strlen(expanded) < sizeof(shell_line))
strcpy(shell_line, expanded);
@@ -1567,341 +1550,336 @@ void do_shell (char *filename)
}
if (rc < 0) {
putserr(_(" Overflow\n"));
- prompt (filename);
+ prompt(filename);
return;
} else if (rc > 0) {
- kill_line ();
+ kill_line();
promptlen = printf("!%s", shell_line);
}
}
- fflush (stdout);
+ fflush(stdout);
putcerr('\n');
promptlen = 0;
shellp = 1;
- execute (filename, shell, shell, "-c", shell_line, 0);
+ execute(filename, shell, shell, "-c", shell_line, 0);
}
-/*
-** Search for nth occurrence of regular expression contained in buf in the file
-*/
-
+/* Search for nth occurrence of regular expression contained in buf in
+ * the file */
void search(char buf[], FILE *file, register int n)
{
- long startline = Ftell (file);
- register long line1 = startline;
- register long line2 = startline;
- register long line3 = startline;
- register int lncount;
- int saveln, rv, rc;
- regex_t re;
-
- context.line = saveln = Currline;
- context.chrctr = startline;
- lncount = 0;
- if ((rc = regcomp (&re, buf, REG_NOSUB)) != 0) {
- char s[REGERR_BUF];
- regerror (rc, &re, s, sizeof s);
- more_error (s);
- }
- while (!feof (file)) {
- line3 = line2;
- line2 = line1;
- line1 = Ftell (file);
- rdline (file);
- lncount++;
- if ((rv = regexec (&re, Line, 0, NULL, 0)) == 0) {
- if (--n == 0) {
- if (lncount > 3 || (lncount > 1 && no_intty))
- {
- putchar('\n');
- if (clreol)
- cleareol ();
- putsout(_("...skipping\n"));
- }
- if (!no_intty) {
- Currline -= (lncount >= 3 ? 3 : lncount);
- Fseek (file, line3);
- if (noscroll) {
- if (clreol) {
- home ();
- cleareol ();
- }
- else
- doclear ();
- }
- }
- else {
- kill_line ();
- if (noscroll) {
- if (clreol) {
- home ();
- cleareol ();
- }
- else
- doclear ();
+ long startline = Ftell(file);
+ register long line1 = startline;
+ register long line2 = startline;
+ register long line3 = startline;
+ register int lncount;
+ int saveln, rv, rc;
+ regex_t re;
+
+ context.line = saveln = Currline;
+ context.chrctr = startline;
+ lncount = 0;
+ if ((rc = regcomp(&re, buf, REG_NOSUB)) != 0) {
+ char s[REGERR_BUF];
+ regerror(rc, &re, s, sizeof s);
+ more_error(s);
+ }
+ while (!feof(file)) {
+ line3 = line2;
+ line2 = line1;
+ line1 = Ftell(file);
+ rdline(file);
+ lncount++;
+ if ((rv = regexec(&re, Line, 0, NULL, 0)) == 0) {
+ if (--n == 0) {
+ if (lncount > 3 || (lncount > 1 && no_intty)) {
+ putchar('\n');
+ if (clreol)
+ cleareol();
+ putsout(_("...skipping\n"));
+ }
+ if (!no_intty) {
+ Currline -=
+ (lncount >= 3 ? 3 : lncount);
+ Fseek(file, line3);
+ if (noscroll) {
+ if (clreol) {
+ home();
+ cleareol();
+ } else
+ doclear();
+ }
+ } else {
+ kill_line();
+ if (noscroll) {
+ if (clreol) {
+ home();
+ cleareol();
+ } else
+ doclear();
+ }
+ puts(Line);
+ }
+ break;
}
- puts(Line);
- }
- break;
}
}
- }
- if (feof (file)) {
- if (!no_intty) {
- Currline = saveln;
- Fseek (file, startline);
- }
- else {
- putsout(_("\nPattern not found\n"));
- end_it (0);
+ if (feof(file)) {
+ if (!no_intty) {
+ Currline = saveln;
+ Fseek(file, startline);
+ } else {
+ putsout(_("\nPattern not found\n"));
+ end_it(0);
+ }
+ more_error(_("Pattern not found"));
+ free(previousre);
+ previousre = NULL;
}
- more_error (_("Pattern not found"));
- free (previousre);
- previousre = NULL;
- }
}
-/*VARARGS2*/
-void execute (char *filename, char *cmd, ...)
+void execute(char *filename, char *cmd, ...)
{
int id;
int n;
va_list argp;
- char * arg;
- char ** args;
+ char *arg;
+ char **args;
int argcount;
- fflush (stdout);
- reset_tty ();
- for (n = 10; (id = fork ()) < 0 && n > 0; n--)
- sleep (5);
+ fflush(stdout);
+ reset_tty();
+ for (n = 10; (id = fork()) < 0 && n > 0; n--)
+ sleep(5);
if (id == 0) {
- if (!isatty(0)) {
- close(0);
- open("/dev/tty", 0);
- }
-
- va_start(argp, cmd);
- arg = va_arg(argp, char *);
- argcount = 0;
- while (arg) {
- argcount++;
- arg = va_arg(argp, char *);
- }
- va_end(argp);
-
- args = alloca(sizeof(char *) * (argcount + 1));
- args[argcount] = NULL;
-
- va_start(argp, cmd);
- arg = va_arg(argp, char *);
- argcount = 0;
- while (arg) {
- args[argcount] = arg;
- argcount++;
- arg = va_arg(argp, char *);
- }
- va_end(argp);
-
- execvp (cmd, args);
- putserr(_("exec failed\n"));
- exit (EXIT_FAILURE);
+ if (!isatty(0)) {
+ close(0);
+ open("/dev/tty", 0);
+ }
+
+ va_start(argp, cmd);
+ arg = va_arg(argp, char *);
+ argcount = 0;
+ while (arg) {
+ argcount++;
+ arg = va_arg(argp, char *);
+ }
+ va_end(argp);
+
+ args = alloca(sizeof(char *) * (argcount + 1));
+ args[argcount] = NULL;
+
+ va_start(argp, cmd);
+ arg = va_arg(argp, char *);
+ argcount = 0;
+ while (arg) {
+ args[argcount] = arg;
+ argcount++;
+ arg = va_arg(argp, char *);
+ }
+ va_end(argp);
+
+ execvp(cmd, args);
+ putserr(_("exec failed\n"));
+ exit(EXIT_FAILURE);
}
if (id > 0) {
- signal (SIGINT, SIG_IGN);
- signal (SIGQUIT, SIG_IGN);
- if (catch_susp)
- signal(SIGTSTP, SIG_DFL);
- while (wait(0) > 0);
- signal (SIGINT, end_it);
- signal (SIGQUIT, onquit);
- if (catch_susp)
- signal(SIGTSTP, onsusp);
+ signal(SIGINT, SIG_IGN);
+ signal(SIGQUIT, SIG_IGN);
+ if (catch_susp)
+ signal(SIGTSTP, SIG_DFL);
+ while (wait(0) > 0) ;
+ signal(SIGINT, end_it);
+ signal(SIGQUIT, onquit);
+ if (catch_susp)
+ signal(SIGTSTP, onsusp);
} else
- putserr(_("can't fork\n"));
- set_tty ();
+ putserr(_("can't fork\n"));
+ set_tty();
puts("------------------------");
- prompt (filename);
+ prompt(filename);
}
-/*
-** Skip n lines in the file f
-*/
-void skiplns (register int n, register FILE *f)
+/* Skip n lines in the file f */
+void skiplns(register int n, register FILE *f)
{
- register int c;
+ register int c;
- while (n > 0) {
- while ((c = Getc (f)) != '\n')
- if (c == EOF)
- return;
- n--;
- Currline++;
- }
+ while (n > 0) {
+ while ((c = Getc(f)) != '\n')
+ if (c == EOF)
+ return;
+ n--;
+ Currline++;
+ }
}
-/*
-** Skip nskip files in the file list (from the command line). Nskip may be
-** negative.
-*/
-
-void skipf (register int nskip)
+/* Skip nskip files in the file list (from the command line). Nskip may
+ * be negative. */
+void skipf(register int nskip)
{
- if (nskip == 0) return;
- if (nskip > 0) {
- if (fnum + nskip > nfiles - 1)
- nskip = nfiles - fnum - 1;
- }
- else if (within)
- ++fnum;
- fnum += nskip;
- if (fnum < 0)
- fnum = 0;
- puts(_("\n...Skipping "));
- if (clreol)
- cleareol ();
- if (nskip > 0)
- putsout(_("...Skipping to file "));
- else
- putsout(_("...Skipping back to file "));
- puts(fnames[fnum]);
- if (clreol)
- cleareol ();
- putchar('\n');
- --fnum;
+ if (nskip == 0)
+ return;
+ if (nskip > 0) {
+ if (fnum + nskip > nfiles - 1)
+ nskip = nfiles - fnum - 1;
+ } else if (within)
+ ++fnum;
+ fnum += nskip;
+ if (fnum < 0)
+ fnum = 0;
+ puts(_("\n...Skipping "));
+ if (clreol)
+ cleareol();
+ if (nskip > 0)
+ putsout(_("...Skipping to file "));
+ else
+ putsout(_("...Skipping back to file "));
+ puts(fnames[fnum]);
+ if (clreol)
+ cleareol();
+ putchar('\n');
+ --fnum;
}
/*----------------------------- Terminal I/O -------------------------------*/
-
void initterm()
{
- int ret;
- char *padstr;
- char *term;
- struct winsize win;
+ int ret;
+ char *padstr;
+ char *term;
+ struct winsize win;
#ifdef do_SIGTTOU
-retry:
-#endif /* do_SIGTTOU */
- no_tty = tcgetattr(fileno(stdout), &otty);
- if (!no_tty) {
- docrterase = (otty.c_cc[VERASE] != 255);
- docrtkill = (otty.c_cc[VKILL] != 255);
+ retry:
+#endif
+ no_tty = tcgetattr(fileno(stdout), &otty);
+ if (!no_tty) {
+ docrterase = (otty.c_cc[VERASE] != 255);
+ docrtkill = (otty.c_cc[VKILL] != 255);
#ifdef do_SIGTTOU
- {
- int tgrp;
- /*
- * Wait until we're in the foreground before we save the
- * the terminal modes.
- */
- if ((tgrp = tcgetpgrp(fileno(stdout))) < 0) {
- perror("tcgetpgrp");
- exit(EXIT_FAILURE);
- }
- if (tgrp != getpgrp(0)) {
- kill(0, SIGTTOU);
- goto retry;
- }
- }
-#endif /* do_SIGTTOU */
- if ((term = getenv("TERM")) == 0) {
- dumb++; ul_opt = 0;
- }
- my_setupterm(term, 1, &ret);
- if (ret <= 0) {
- dumb++; ul_opt = 0;
- }
- else {
+ {
+ int tgrp;
+ /* Wait until we're in the foreground before we
+ * save the the terminal modes. */
+ if ((tgrp = tcgetpgrp(fileno(stdout))) < 0) {
+ perror("tcgetpgrp");
+ exit(EXIT_FAILURE);
+ }
+ if (tgrp != getpgrp(0)) {
+ kill(0, SIGTTOU);
+ goto retry;
+ }
+ }
+#endif /* do_SIGTTOU */
+ if ((term = getenv("TERM")) == 0) {
+ dumb++;
+ ul_opt = 0;
+ }
+ my_setupterm(term, 1, &ret);
+ if (ret <= 0) {
+ dumb++;
+ ul_opt = 0;
+ } else {
#ifdef TIOCGWINSZ
- if (ioctl(fileno(stdout), TIOCGWINSZ, &win) < 0) {
-#endif /* TIOCGWINSZ */
- Lpp = my_tgetnum(TERM_LINES);
- Mcol = my_tgetnum(TERM_COLS);
+ if (ioctl(fileno(stdout), TIOCGWINSZ, &win) < 0) {
+#endif
+ Lpp = my_tgetnum(TERM_LINES);
+ Mcol = my_tgetnum(TERM_COLS);
#ifdef TIOCGWINSZ
- } else {
- if ((Lpp = win.ws_row) == 0)
- Lpp = my_tgetnum(TERM_LINES);
- if ((Mcol = win.ws_col) == 0)
- Mcol = my_tgetnum(TERM_COLS);
- }
-#endif /* TIOCGWINSZ */
- if ((Lpp <= 0) || my_tgetflag(TERM_HARD_COPY)) {
- hard++; /* Hard copy terminal */
- Lpp = LINES_PER_PAGE;
- }
-
- if (my_tgetflag(TERM_EAT_NEW_LINE))
- eatnl++; /* Eat newline at last column + 1; dec, concept */
- if (Mcol <= 0)
- Mcol = NUM_COLUMNS;
-
- Wrap = my_tgetflag(TERM_AUTO_RIGHT_MARGIN);
- bad_so = my_tgetflag (TERM_CEOL);
- eraseln = my_tgetstr(TERM_CLEAR_TO_LINE_END);
- Clear = my_tgetstr(TERM_CLEAR);
- Senter = my_tgetstr(TERM_STANDARD_MODE);
- Sexit = my_tgetstr(TERM_EXIT_STANDARD_MODE);
- if ((soglitch = my_tgetnum(TERM_STD_MODE_GLITCH)) < 0)
- soglitch = 0;
-
- /*
- * Set up for underlining: some terminals don't need it;
- * others have start/stop sequences, still others have an
- * underline char sequence which is assumed to move the
- * cursor forward one character. If underline sequence
- * isn't available, settle for standout sequence.
- */
-
- if (my_tgetflag(TERM_UNDERLINE) || my_tgetflag(TERM_OVER_STRIKE))
- ul_opt = 0;
- if ((chUL = my_tgetstr(TERM_UNDERLINE_CHAR)) == NULL )
- chUL = "";
- if (((ULenter = my_tgetstr(TERM_ENTER_UNDERLINE)) == NULL ||
- (ULexit = my_tgetstr(TERM_EXIT_UNDERLINE)) == NULL) && !*chUL) {
- if ((ULenter = Senter) == NULL || (ULexit = Sexit) == NULL) {
- ULenter = "";
- ULexit = "";
- } else
- ulglitch = soglitch;
- } else {
- ulglitch = 0;
- }
-
- if ((padstr = my_tgetstr(TERM_PAD_CHAR)) != NULL)
- PC = *padstr;
- Home = my_tgetstr(TERM_HOME);
- if (Home == 0 || *Home == '\0') {
- if ((cursorm = my_tgetstr(TERM_CURSOR_ADDRESS)) != NULL) {
- const char *t = (const char *)my_tgoto(cursorm, 0, 0);
- xstrncpy(cursorhome, t, sizeof(cursorhome));
- Home = cursorhome;
- }
- }
- EodClr = my_tgetstr(TERM_CLEAR_TO_SCREEN_END);
- if ((chBS = my_tgetstr(TERM_LINE_DOWN)) == NULL)
- chBS = "\b";
+ } else {
+ if ((Lpp = win.ws_row) == 0)
+ Lpp = my_tgetnum(TERM_LINES);
+ if ((Mcol = win.ws_col) == 0)
+ Mcol = my_tgetnum(TERM_COLS);
+ }
+#endif
+ if ((Lpp <= 0) || my_tgetflag(TERM_HARD_COPY)) {
+ hard++; /* Hard copy terminal */
+ Lpp = LINES_PER_PAGE;
+ }
+
+ if (my_tgetflag(TERM_EAT_NEW_LINE))
+ /* Eat newline at last column + 1; dec, concept */
+ eatnl++;
+ if (Mcol <= 0)
+ Mcol = NUM_COLUMNS;
+
+ Wrap = my_tgetflag(TERM_AUTO_RIGHT_MARGIN);
+ bad_so = my_tgetflag(TERM_CEOL);
+ eraseln = my_tgetstr(TERM_CLEAR_TO_LINE_END);
+ Clear = my_tgetstr(TERM_CLEAR);
+ Senter = my_tgetstr(TERM_STANDARD_MODE);
+ Sexit = my_tgetstr(TERM_EXIT_STANDARD_MODE);
+ if ((soglitch = my_tgetnum(TERM_STD_MODE_GLITCH)) < 0)
+ soglitch = 0;
+
+ /* Set up for underlining: some terminals don't
+ * need it; others have start/stop sequences,
+ * still others have an underline char sequence
+ * which is assumed to move the cursor forward
+ * one character. If underline sequence isn't
+ * available, settle for standout sequence. */
+ if (my_tgetflag(TERM_UNDERLINE)
+ || my_tgetflag(TERM_OVER_STRIKE))
+ ul_opt = 0;
+ if ((chUL = my_tgetstr(TERM_UNDERLINE_CHAR)) == NULL)
+ chUL = "";
+ if (((ULenter =
+ my_tgetstr(TERM_ENTER_UNDERLINE)) == NULL
+ || (ULexit =
+ my_tgetstr(TERM_EXIT_UNDERLINE)) == NULL)
+ && !*chUL) {
+ if ((ULenter = Senter) == NULL
+ || (ULexit = Sexit) == NULL) {
+ ULenter = "";
+ ULexit = "";
+ } else
+ ulglitch = soglitch;
+ } else {
+ ulglitch = 0;
+ }
+ if ((padstr = my_tgetstr(TERM_PAD_CHAR)) != NULL)
+ PC = *padstr;
+ Home = my_tgetstr(TERM_HOME);
+ if (Home == 0 || *Home == '\0') {
+ if ((cursorm =
+ my_tgetstr(TERM_CURSOR_ADDRESS)) != NULL) {
+ const char *t =
+ (const char *)my_tgoto(cursorm, 0,
+ 0);
+ xstrncpy(cursorhome, t,
+ sizeof(cursorhome));
+ Home = cursorhome;
+ }
+ }
+ EodClr = my_tgetstr(TERM_CLEAR_TO_SCREEN_END);
+ if ((chBS = my_tgetstr(TERM_LINE_DOWN)) == NULL)
+ chBS = "\b";
+
+ }
+ if ((shell = getenv("SHELL")) == NULL)
+ shell = "/bin/sh";
+ }
+ no_intty = tcgetattr(fileno(stdin), &otty);
+ tcgetattr(fileno(stderr), &otty);
+ savetty0 = otty;
+ slow_tty = cfgetispeed(&otty) < B1200;
+ hardtabs = (otty.c_oflag & TABDLY) != XTABS;
+ if (!no_tty) {
+ otty.c_lflag &= ~(ICANON | ECHO);
+ otty.c_cc[VMIN] = 1;
+ otty.c_cc[VTIME] = 0;
}
- if ((shell = getenv("SHELL")) == NULL)
- shell = "/bin/sh";
- }
- no_intty = tcgetattr(fileno(stdin), &otty);
- tcgetattr(fileno(stderr), &otty);
- savetty0 = otty;
- slow_tty = cfgetispeed(&otty) < B1200;
- hardtabs = (otty.c_oflag & TABDLY) != XTABS;
- if (!no_tty) {
- otty.c_lflag &= ~(ICANON|ECHO);
- otty.c_cc[VMIN] = 1;
- otty.c_cc[VTIME] = 0;
- }
}
-int readch () {
+int readch()
+{
unsigned char c;
errno = 0;
- if (read (fileno(stderr), &c, 1) <= 0) {
+ if (read(fileno(stderr), &c, 1) <= 0) {
if (errno != EINTR)
end_it(0);
else
@@ -1919,279 +1897,281 @@ static char *CARAT = "^";
else \
putserr(BS);
-void ttyin (char buf[], register int nmax, char pchar) {
- char *sp;
- int c;
- int slash = 0;
- int maxlen;
-
- sp = buf;
- maxlen = 0;
- while (sp - buf < nmax) {
- if (promptlen > maxlen) maxlen = promptlen;
- c = readch ();
- if (c == '\\') {
- slash++;
- }
- else if (((cc_t) c == otty.c_cc[VERASE]) && !slash) {
- if (sp > buf) {
+void ttyin(char buf[], register int nmax, char pchar)
+{
+ char *sp;
+ int c;
+ int slash = 0;
+ int maxlen;
+
+ sp = buf;
+ maxlen = 0;
+ while (sp - buf < nmax) {
+ if (promptlen > maxlen)
+ maxlen = promptlen;
+ c = readch();
+ if (c == '\\') {
+ slash++;
+ } else if (((cc_t) c == otty.c_cc[VERASE]) && !slash) {
+ if (sp > buf) {
#ifdef HAVE_WIDECHAR
- if (MB_CUR_MAX > 1)
- {
- wchar_t wc;
- size_t pos = 0, mblength;
- mbstate_t state, state_bak;
-
- memset (&state, '\0', sizeof (mbstate_t));
-
- while (1) {
- state_bak = state;
- mblength = mbrtowc (&wc, buf + pos, sp - buf, &state);
-
- state = (mblength == (size_t)-2
- || mblength == (size_t)-1) ? state_bak : state;
- mblength = (mblength == (size_t)-2
- || mblength == (size_t)-1
- || mblength == 0) ? 1 : mblength;
-
- if (buf + pos + mblength >= sp)
- break;
-
- pos += mblength;
- }
-
- if (mblength == 1) {
- ERASEONECOLUMN
- }
- else {
- int wc_width;
- wc_width = wcwidth (wc);
- wc_width = (wc_width < 1) ? 1 : wc_width;
- while (wc_width--) {
- ERASEONECOLUMN
+ if (MB_CUR_MAX > 1) {
+ wchar_t wc;
+ size_t pos = 0, mblength;
+ mbstate_t state, state_bak;
+
+ memset(&state, '\0', sizeof(mbstate_t));
+
+ while (1) {
+ state_bak = state;
+ mblength =
+ mbrtowc(&wc, buf + pos,
+ sp - buf, &state);
+
+ state = (mblength == (size_t)-2
+ || mblength ==
+ (size_t)-1) ? state_bak
+ : state;
+ mblength =
+ (mblength == (size_t)-2
+ || mblength == (size_t)-1
+ || mblength ==
+ 0) ? 1 : mblength;
+
+ if (buf + pos + mblength >= sp)
+ break;
+
+ pos += mblength;
+ }
+
+ if (mblength == 1) {
+ ERASEONECOLUMN} else {
+ int wc_width;
+ wc_width = wcwidth(wc);
+ wc_width =
+ (wc_width <
+ 1) ? 1 : wc_width;
+ while (wc_width--) {
+ ERASEONECOLUMN}
+ }
+
+ while (mblength--) {
+ --promptlen;
+ --sp;
+ }
+ } else
+#endif /* HAVE_WIDECHAR */
+ {
+ --promptlen;
+ ERASEONECOLUMN-- sp;
+ }
+
+ if ((*sp < ' ' && *sp != '\n') || *sp == RUBOUT) {
+ --promptlen;
+ ERASEONECOLUMN}
+ continue;
+ } else {
+ if (!eraseln)
+ promptlen = maxlen;
+ siglongjmp(restore, 1);
}
- }
-
- while (mblength--) {
- --promptlen;
- --sp;
- }
- }
- else
-#endif /* HAVE_WIDECHAR */
- {
- --promptlen;
- ERASEONECOLUMN
- --sp;
- }
-
- if ((*sp < ' ' && *sp != '\n') || *sp == RUBOUT) {
- --promptlen;
- ERASEONECOLUMN
+ } else if (((cc_t) c == otty.c_cc[VKILL]) && !slash) {
+ if (hard) {
+ show(c);
+ putchar('\n');
+ putchar(pchar);
+ } else {
+ putchar('\r');
+ putchar(pchar);
+ if (eraseln)
+ erasep(1);
+ else if (docrtkill)
+ while (promptlen-- > 1)
+ putserr(BSB);
+ promptlen = 1;
+ }
+ sp = buf;
+ fflush(stdout);
+ continue;
}
- continue;
- }
- else {
- if (!eraseln) promptlen = maxlen;
- siglongjmp (restore, 1);
- }
- }
- else if (((cc_t) c == otty.c_cc[VKILL]) && !slash) {
- if (hard) {
- show (c);
- putchar ('\n');
- putchar (pchar);
- }
- else {
- putchar ('\r');
- putchar (pchar);
- if (eraseln)
- erasep (1);
- else if (docrtkill)
- while (promptlen-- > 1)
- putserr(BSB);
- promptlen = 1;
- }
- sp = buf;
- fflush (stdout);
- continue;
- }
- if (slash && ((cc_t) c == otty.c_cc[VKILL]
- || (cc_t) c == otty.c_cc[VERASE])) {
- ERASEONECOLUMN
- --sp;
- }
- if (c != '\\')
- slash = 0;
- *sp++ = c;
- if ((c < ' ' && c != '\n' && c != ESC) || c == RUBOUT) {
- c += (c == RUBOUT) ? -0100 : 0100;
- putserr(CARAT);
- promptlen++;
- }
- if (c != '\n' && c != ESC) {
- putcerr(c);
- promptlen++;
+ if (slash && ((cc_t) c == otty.c_cc[VKILL]
+ || (cc_t) c == otty.c_cc[VERASE])) {
+ ERASEONECOLUMN-- sp;
+ }
+ if (c != '\\')
+ slash = 0;
+ *sp++ = c;
+ if ((c < ' ' && c != '\n' && c != ESC) || c == RUBOUT) {
+ c += (c == RUBOUT) ? -0100 : 0100;
+ putserr(CARAT);
+ promptlen++;
+ }
+ if (c != '\n' && c != ESC) {
+ putcerr(c);
+ promptlen++;
+ } else
+ break;
}
- else
- break;
- }
- *--sp = '\0';
- if (!eraseln) promptlen = maxlen;
- if (sp - buf >= nmax - 1)
- more_error (_("Line too long"));
+ *--sp = '\0';
+ if (!eraseln)
+ promptlen = maxlen;
+ if (sp - buf >= nmax - 1)
+ more_error(_("Line too long"));
}
/* return: 0 - unchanged, 1 - changed, -1 - overflow (unchanged) */
-int expand (char **outbuf, char *inbuf) {
- char *inpstr;
- char *outstr;
- char c;
- char *temp;
- int changed = 0;
- int tempsz, xtra, offset;
-
- xtra = strlen (fnames[fnum]) + strlen (shell_line) + 1;
- tempsz = 200 + xtra;
- temp = xmalloc(tempsz);
- inpstr = inbuf;
- outstr = temp;
- while ((c = *inpstr++) != '\0'){
- offset = outstr-temp;
- if (tempsz-offset-1 < xtra) {
- tempsz += 200 + xtra;
- temp = xrealloc(temp, tempsz);
- outstr = temp + offset;
- }
- switch (c) {
- case '%':
- if (!no_intty) {
- strcpy (outstr, fnames[fnum]);
- outstr += strlen (fnames[fnum]);
- changed++;
- } else
- *outstr++ = c;
- break;
- case '!':
- if (!shellp)
- more_error (_("No previous command to substitute for"));
- strcpy (outstr, shell_line);
- outstr += strlen (shell_line);
- changed++;
- break;
- case '\\':
- if (*inpstr == '%' || *inpstr == '!') {
- *outstr++ = *inpstr++;
- break;
- }
- default:
- *outstr++ = c;
+int expand(char **outbuf, char *inbuf)
+{
+ char *inpstr;
+ char *outstr;
+ char c;
+ char *temp;
+ int changed = 0;
+ int tempsz, xtra, offset;
+
+ xtra = strlen(fnames[fnum]) + strlen(shell_line) + 1;
+ tempsz = 200 + xtra;
+ temp = xmalloc(tempsz);
+ inpstr = inbuf;
+ outstr = temp;
+ while ((c = *inpstr++) != '\0') {
+ offset = outstr - temp;
+ if (tempsz - offset - 1 < xtra) {
+ tempsz += 200 + xtra;
+ temp = xrealloc(temp, tempsz);
+ outstr = temp + offset;
+ }
+ switch (c) {
+ case '%':
+ if (!no_intty) {
+ strcpy(outstr, fnames[fnum]);
+ outstr += strlen(fnames[fnum]);
+ changed++;
+ } else
+ *outstr++ = c;
+ break;
+ case '!':
+ if (!shellp)
+ more_error(_
+ ("No previous command to substitute for"));
+ strcpy(outstr, shell_line);
+ outstr += strlen(shell_line);
+ changed++;
+ break;
+ case '\\':
+ if (*inpstr == '%' || *inpstr == '!') {
+ *outstr++ = *inpstr++;
+ break;
+ }
+ default:
+ *outstr++ = c;
+ }
}
- }
- *outstr++ = '\0';
- *outbuf = temp;
- return (changed);
+ *outstr++ = '\0';
+ *outbuf = temp;
+ return (changed);
}
-void show (char c) {
- if ((c < ' ' && c != '\n' && c != ESC) || c == RUBOUT) {
- c += (c == RUBOUT) ? -0100 : 0100;
- putserr(CARAT);
+void show(char c)
+{
+ if ((c < ' ' && c != '\n' && c != ESC) || c == RUBOUT) {
+ c += (c == RUBOUT) ? -0100 : 0100;
+ putserr(CARAT);
+ promptlen++;
+ }
+ putcerr(c);
promptlen++;
- }
- putcerr(c);
- promptlen++;
}
-void more_error (char *mess)
+void more_error(char *mess)
{
- if (clreol)
- cleareol ();
- else
- kill_line ();
- promptlen += strlen (mess);
- if (Senter && Sexit) {
- my_putstring (Senter);
- putsout(mess);
- my_putstring (Sexit);
- }
- else
- putsout(mess);
- fflush(stdout);
- errors++;
- siglongjmp (restore, 1);
+ if (clreol)
+ cleareol();
+ else
+ kill_line();
+ promptlen += strlen(mess);
+ if (Senter && Sexit) {
+ my_putstring(Senter);
+ putsout(mess);
+ my_putstring(Sexit);
+ } else
+ putsout(mess);
+ fflush(stdout);
+ errors++;
+ siglongjmp(restore, 1);
}
-
-void set_tty () {
- otty.c_lflag &= ~(ICANON|ECHO);
+void set_tty()
+{
+ otty.c_lflag &= ~(ICANON | ECHO);
otty.c_cc[VMIN] = 1; /* read at least 1 char */
otty.c_cc[VTIME] = 0; /* no timeout */
stty(fileno(stderr), &otty);
}
-static int
-ourputch(int c) {
+static int ourputch(int c)
+{
return putc(c, stdout);
}
-void
-reset_tty () {
- if (no_tty)
- return;
- if (pstate) {
- tputs(ULexit, fileno(stdout), ourputch); /* putchar - if that isn't a macro */
- fflush(stdout);
- pstate = 0;
- }
- otty.c_lflag |= ICANON|ECHO;
- otty.c_cc[VMIN] = savetty0.c_cc[VMIN];
- otty.c_cc[VTIME] = savetty0.c_cc[VTIME];
- stty(fileno(stderr), &savetty0);
+void reset_tty()
+{
+ if (no_tty)
+ return;
+ if (pstate) {
+ /* putchar - if that isn't a macro */
+ tputs(ULexit, fileno(stdout), ourputch);
+ fflush(stdout);
+ pstate = 0;
+ }
+ otty.c_lflag |= ICANON | ECHO;
+ otty.c_cc[VMIN] = savetty0.c_cc[VMIN];
+ otty.c_cc[VTIME] = savetty0.c_cc[VTIME];
+ stty(fileno(stderr), &savetty0);
}
-void rdline (register FILE *f)
+void rdline(register FILE *f)
{
- register int c;
- register char *p;
+ register int c;
+ register char *p;
- prepare_line_buffer();
+ prepare_line_buffer();
- p = Line;
- while ((c = Getc (f)) != '\n' && c != EOF && (size_t) (p - Line) < LineLen - 1)
- *p++ = c;
- if (c == '\n')
- Currline++;
- *p = '\0';
+ p = Line;
+ while ((c = Getc(f)) != '\n' && c != EOF
+ && (size_t)(p - Line) < LineLen - 1)
+ *p++ = c;
+ if (c == '\n')
+ Currline++;
+ *p = '\0';
}
/* Come here when we get a suspend signal from the terminal */
-
-void onsusp (int dummy __attribute__ ((__unused__)))
+void onsusp(int dummy __attribute__((__unused__)))
{
- sigset_t signals, oldmask;
-
- /* ignore SIGTTOU so we don't get stopped if csh grabs the tty */
- signal(SIGTTOU, SIG_IGN);
- reset_tty ();
- fflush (stdout);
- signal(SIGTTOU, SIG_DFL);
- /* Send the TSTP signal to suspend our process group */
- signal(SIGTSTP, SIG_DFL);
-
- /* unblock SIGTSTP or we won't be able to suspend ourself */
- sigemptyset(&signals);
- sigaddset(&signals, SIGTSTP);
- sigprocmask(SIG_UNBLOCK, &signals, &oldmask);
-
- kill (0, SIGTSTP);
- /* Pause for station break */
-
- sigprocmask(SIG_SETMASK, &oldmask, NULL);
-
- /* We're back */
- signal (SIGTSTP, onsusp);
- set_tty ();
- if (inwait)
- siglongjmp (restore, 1);
+ sigset_t signals, oldmask;
+
+ /* ignore SIGTTOU so we don't get stopped if csh grabs the tty */
+ signal(SIGTTOU, SIG_IGN);
+ reset_tty();
+ fflush(stdout);
+ signal(SIGTTOU, SIG_DFL);
+ /* Send the TSTP signal to suspend our process group */
+ signal(SIGTSTP, SIG_DFL);
+
+ /* unblock SIGTSTP or we won't be able to suspend ourself */
+ sigemptyset(&signals);
+ sigaddset(&signals, SIGTSTP);
+ sigprocmask(SIG_UNBLOCK, &signals, &oldmask);
+
+ kill(0, SIGTSTP);
+ /* Pause for station break */
+
+ sigprocmask(SIG_SETMASK, &oldmask, NULL);
+
+ /* We're back */
+ signal(SIGTSTP, onsusp);
+ set_tty();
+ if (inwait)
+ siglongjmp(restore, 1);
}