From fa6d445b0d29da8f1b9f0cfa3ebfe8fce195614f Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Fri, 16 Mar 2012 15:56:09 +0100 Subject: [PATCH] Added type(1), a replacement for the "traditional" Sortix cat(1). cat(1) now work as you would expect. --- utils/Makefile | 1 + utils/cat.cpp | 91 +++++++++++++++++++++----------------------- utils/type.cpp | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 49 deletions(-) create mode 100644 utils/type.cpp diff --git a/utils/Makefile b/utils/Makefile index c782c199..5c5ea2bd 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -27,6 +27,7 @@ column \ pager \ head \ tail \ +type \ BINARIES:=$(addprefix $(INITRDDIR)/,$(LOCALBINARIES)) diff --git a/utils/cat.cpp b/utils/cat.cpp index 035621e7..33f2c7b9 100644 --- a/utils/cat.cpp +++ b/utils/cat.cpp @@ -20,12 +20,11 @@ *******************************************************************************/ -#include -#include -#include #include -#include #include +#include +#include +#include #include #include @@ -51,12 +50,47 @@ int docat(const char* inputname, int fd) return 0; } -int cat(int argc, char* argv[]) +void usage(FILE* fp, const char* argv0) { - int result = 0; + fprintf(fp, "usage: %s [FILE ...]\n", argv0); + fprintf(fp, "Concatenate files and print on the standard output.\n"); +} + +void help(FILE* fp, const char* argv0) +{ + return usage(fp, argv0); +} + +void version(FILE* fp, const char* argv0) +{ + return usage(fp, argv0); +} + +int main(int argc, char* argv[]) +{ + const char* argv0 = argv[0]; for ( int i = 1; i < argc; i++ ) { + const char* arg = argv[i]; + if ( arg[0] != '-' ) { continue; } + argv[i] = NULL; + if ( !strcmp(arg, "--") ) { break; } + if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } + if ( !strcmp(arg, "--usage") ) { usage(stdout, argv0); exit(0); } + if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } + error(0, 0, "unrecognized option: %s", arg); + usage(stderr, argv0); + exit(1); + } + + int result = 0; + + bool any = false; + for ( int i = 1; i < argc; i++ ) + { + if ( !argv[i] ) { continue; } + any = true; int fd = open(argv[i], O_RDONLY); if ( fd < 0 ) { @@ -69,49 +103,8 @@ int cat(int argc, char* argv[]) close(fd); } + if ( !any ) { result = docat("", 0); } + return result; } -int main(int argc, char* argv[]) -{ - if ( 1 < argc ) - { - return cat(argc, argv); - } - - if ( !isatty(0) || !isatty(1) ) { return docat("", 0); } - - bool lastwasesc = false; - - // TODO: This is just compatibility with how cat worked in early versions of - // Sortix. Ideally, this should be removed and just cat the raw stdin. - // Read the keyboard input from the user. - unsigned termmode = TERMMODE_KBKEY | TERMMODE_UNICODE | TERMMODE_SIGNAL; - if ( settermmode(0, termmode) ) { error(1, errno, "settermmode"); } - while ( true ) - { - uint32_t codepoint; - ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); - if ( !numbytes ) { break; } - if ( numbytes < 0 ) { break; } - int kbkey = KBKEY_DECODE(codepoint); - if ( kbkey < 0 ) { continue; } - if ( kbkey == KBKEY_UP ) { printf("\e[A"); fflush(stdout); continue; } - if ( kbkey == KBKEY_DOWN ) { printf("\e[B"); fflush(stdout); continue; } - if ( kbkey == KBKEY_RIGHT ) { printf("\e[C"); fflush(stdout); continue; } - if ( kbkey == KBKEY_LEFT ) { printf("\e[D"); fflush(stdout); continue; } - if ( kbkey == KBKEY_ESC ) { printf("\e["); fflush(stdout); lastwasesc = true; continue; } - if ( kbkey ) { continue; } - if ( lastwasesc && codepoint == '[' ) { continue; } - - if ( codepoint >= 0x80 ) { continue; } - - char msg[2]; msg[0] = codepoint; msg[1] = '\0'; - printf(msg); - fflush(stdout); - lastwasesc = false; - } - - return 0; -} - diff --git a/utils/type.cpp b/utils/type.cpp new file mode 100644 index 00000000..a4d10114 --- /dev/null +++ b/utils/type.cpp @@ -0,0 +1,100 @@ +/******************************************************************************* + + COPYRIGHT(C) JONAS 'SORTIE' TERMANSEN 2011, 2012. + + 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 3 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, see . + + type.cpp + Lets you move the tty cursor around and easily issue ANSI escape codes. + +*******************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +void usage(FILE* fp, const char* argv0) +{ + fprintf(fp, "usage: %s [--usage | --help | --version]\n", argv0); + fprintf(fp, "Lets you type freely onto the tty.\n"); +} + +void help(FILE* fp, const char* argv0) +{ + return usage(fp, argv0); +} + +void version(FILE* fp, const char* argv0) +{ + return usage(fp, argv0); +} + +int main(int argc, char* argv[]) +{ + const char* argv0 = argv[0]; + + for ( int i = 1; i < argc; i++ ) + { + const char* arg = argv[i]; + if ( arg[0] != '-' ) { continue; } + argv[i] = NULL; + if ( !strcmp(arg, "--") ) { break; } + if ( !strcmp(arg, "--help") ) { help(stdout, argv0); exit(0); } + if ( !strcmp(arg, "--usage") ) { usage(stdout, argv0); exit(0); } + if ( !strcmp(arg, "--version") ) { version(stdout, argv0); exit(0); } + error(0, 0, "unrecognized option: %s", arg); + usage(stderr, argv0); + exit(1); + } + + if ( !isatty(0) || !isatty(1) ) + { + error(1, errno, "standard output and input must be a tty"); + } + + bool lastwasesc = false; + unsigned termmode = TERMMODE_KBKEY | TERMMODE_UNICODE | TERMMODE_SIGNAL; + if ( settermmode(0, termmode) ) { error(1, errno, "settermmode"); } + while ( true ) + { + uint32_t codepoint; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { break; } + if ( numbytes < 0 ) { break; } + int kbkey = KBKEY_DECODE(codepoint); + if ( kbkey < 0 ) { continue; } + if ( kbkey == KBKEY_UP ) { printf("\e[A"); fflush(stdout); continue; } + if ( kbkey == KBKEY_DOWN ) { printf("\e[B"); fflush(stdout); continue; } + if ( kbkey == KBKEY_RIGHT ) { printf("\e[C"); fflush(stdout); continue; } + if ( kbkey == KBKEY_LEFT ) { printf("\e[D"); fflush(stdout); continue; } + if ( kbkey == KBKEY_ESC ) { printf("\e["); fflush(stdout); lastwasesc = true; continue; } + if ( kbkey ) { continue; } + if ( lastwasesc && codepoint == '[' ) { continue; } + + if ( codepoint >= 0x80 ) { continue; } + + char msg[2]; msg[0] = codepoint; msg[1] = '\0'; + printf(msg); + lastwasesc = false; + fflush(stdout); + } + + return 0; +} +