summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2018-12-21 02:42:30 +0100
committerAndreas Kling <awesomekling@gmail.com>2018-12-21 02:42:30 +0100
commit36bd53b36a7846a5aade225436cd1a09da0af7fc (patch)
tree60798db364683a73cfaef0af3be2b40f6c40e4aa /Userland
parent4dd50b1f6d921db833e0ba6ea97cf3a526077bce (diff)
downloadserenity-36bd53b36a7846a5aade225436cd1a09da0af7fc.zip
Add a simple /bin/more.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/.gitignore1
-rw-r--r--Userland/Makefile9
-rw-r--r--Userland/more.cpp47
3 files changed, 55 insertions, 2 deletions
diff --git a/Userland/.gitignore b/Userland/.gitignore
index a8c5bb5841..a7e9d82205 100644
--- a/Userland/.gitignore
+++ b/Userland/.gitignore
@@ -20,3 +20,4 @@ fgrep
mkdir
touch
sync
+more
diff --git a/Userland/Makefile b/Userland/Makefile
index a51834bd8b..ce4de90c04 100644
--- a/Userland/Makefile
+++ b/Userland/Makefile
@@ -17,7 +17,8 @@ OBJS = \
fgrep.o \
tty.o \
mkdir.o \
- touch.o
+ touch.o \
+ more.o
APPS = \
id \
@@ -39,7 +40,8 @@ APPS = \
tty \
mkdir \
touch \
- sync
+ sync \
+ more
ARCH_FLAGS =
STANDARD_FLAGS = -std=c++17 -nostdinc++ -nostdlib -nostdinc
@@ -119,6 +121,9 @@ touch: touch.o
sync: sync.o
$(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a
+more: more.o
+ $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a
+
.cpp.o:
@echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $<
diff --git a/Userland/more.cpp b/Userland/more.cpp
new file mode 100644
index 0000000000..d0050c6b9d
--- /dev/null
+++ b/Userland/more.cpp
@@ -0,0 +1,47 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+static int key_fd;
+
+void wait_for_key()
+{
+ printf("\033[7m--[ more ]--\033[0m");
+ fflush(stdout);
+ char dummy;
+ read(key_fd, &dummy, 1);
+ printf("\n");
+}
+
+int main(int argc, char** argv)
+{
+ (void) argc;
+ (void) argv;
+
+ key_fd = open(ttyname(1), O_RDONLY);
+ if (key_fd < 0) {
+ perror("open");
+ return 1;
+ }
+
+ struct winsize ws;
+ ioctl(1, TIOCGWINSZ, &ws);
+
+ unsigned lines_printed = 0;
+ while (!feof(stdin)) {
+ char buffer[BUFSIZ];
+ auto* str = fgets(buffer, sizeof(buffer), stdin);
+ if (!str)
+ break;
+ printf(str);
+ ++lines_printed;
+ if ((lines_printed % (ws.ws_row - 1)) == 0) {
+ wait_for_key();
+ }
+
+ }
+
+ close(key_fd);
+ return 0;
+}