diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2023-04-14 11:00:26 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2023-04-14 11:00:26 +0200 |
commit | 6638fe908eedd0d3fd7531a9af2ed10dd18ed5c1 (patch) | |
tree | 639e1ff84f31a1359f2f8e7c6030dc56d342023c | |
parent | 9d3b555393735e08c27b04a8b616f2736afe26de (diff) | |
download | abase-6638fe908eedd0d3fd7531a9af2ed10dd18ed5c1.tar.gz abase-6638fe908eedd0d3fd7531a9af2ed10dd18ed5c1.tar.bz2 |
implemented simplest possible version of "more"
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | README | 5 | ||||
-rw-r--r-- | more.1 | 9 | ||||
-rw-r--r-- | more.c | 77 | ||||
-rw-r--r-- | util.h | 2 |
5 files changed, 90 insertions, 6 deletions
@@ -40,11 +40,9 @@ $(LIBUTIL): $(LIBUTILOBJ) install: all mkdir -p $(DESTDIR)$(PREFIX)/bin cp -f $(BIN) $(DESTDIR)$(PREFIX)/bin - mv -f $(DESTDIR)$(PREFIX)/bin/xinstall $(DESTDIR)$(PREFIX)/bin/install mkdir -p $(DESTDIR)$(MANPREFIX)/man1 for m in $(MAN); do sed "s/^\.Os abase/.Os abase $(VERSION)/g" < "$$m" > $(DESTDIR)$(MANPREFIX)/man1/"$$m"; done cd $(DESTDIR)$(MANPREFIX)/man1 && chmod 644 $(MAN) - mv -f $(DESTDIR)$(MANPREFIX)/man1/xinstall.1 $(DESTDIR)$(MANPREFIX)/man1/install.1 uninstall: cd $(DESTDIR)$(PREFIX)/bin && rm -f $(BIN) @@ -84,7 +82,6 @@ abase-box-install: abase-box mkdir -p $(DESTDIR)$(MANPREFIX)/man1 for m in $(MAN); do sed "s/^\.Os abase/.Os abase $(VERSION)/g" < "$$m" > $(DESTDIR)$(MANPREFIX)/man1/"$$m"; done cd $(DESTDIR)$(MANPREFIX)/man1 && chmod 644 $(MAN) - mv -f $(DESTDIR)$(MANPREFIX)/man1/xinstall.1 $(DESTDIR)$(MANPREFIX)/man1/install.1 abase-box-uninstall: uninstall cd $(DESTDIR)$(PREFIX)/bin && rm -f abase-box @@ -4,7 +4,10 @@ abase - Aba's tools abase is a collection of tools that didn't fit into ubase or sbase. Currently it contains the following: -- a very simple more +- a very simple 'more' pager +- a simple 'hexdump' +- a 'fdisk' (but we have to decide for which kind of partition types + and what kind of operations, could be too big) Note: abase is a shameless copy of sbase/ubase in certain areas like the Makefile, libutil, etc. This might also make an integration into @@ -11,3 +11,12 @@ pages text file .Ar path to stdout, provides navigation key shortcuts. +.Nm +.Sh COMMANDS +.sp +.RE +\fBRETURN\fP +.RS 4 +Display next page of text. +.RE + @@ -1,7 +1,15 @@ /* See LICENSE file for copyright and license details. */ +#include <fcntl.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdio.h> #include "util.h" +#define COLUMNS 80 +#define ROWS 25 +#define BUFSIZE 10 + static void usage(void) { @@ -11,12 +19,77 @@ usage(void) int main(int argc, char *argv[]) { - int ret = 0; + int fd; + char c; + int col; + int row; + int buf[BUFSIZE]; ARGBEGIN { default: usage(); } ARGEND + + if (argc < 1 && isatty(STDIN_FILENO)) + usage(); + + if (isatty(STDIN_FILENO)) { + if ((fd = open(*argv, O_RDONLY)) < 0) { + weprintf("open %s:", *argv); + return 0; + + } + } else { + fd = STDIN_FILENO; + } + + col = 0; + row = 0; + while (read(fd, &c, 1) != 0) { + switch (c) { + case '\r': + col = 0; + break; + + case '\n': + col = 0; + row++; + break; + + case '\t': + col = ((col+1) | 0x07)+1; + break; + + case '\b': + if (col>0) { + col--; + } + break; + + default: + col++; + break; + } + putchar(c); + + if (row<ROWS) { + continue; + } + + puts("--more--"); + + if (read(STDIN_FILENO, &buf, BUFSIZE) < 0) { + goto END; + } - return ret; + col = 0; + row = 0; + } + +END: + if (fd > STDERR_FILENO) { + close(fd); + } + + return 0; } @@ -2,4 +2,6 @@ #include "arg.h" +void enprintf(int, const char *, ...); void eprintf(const char *, ...); +void weprintf(const char *, ...); |