Merge branch 'master' of ssh://rexy712.chickenkiller.com:1995/var/git/repos/rexy712/roflcat

This commit is contained in:
rexy712 2020-04-09 15:20:44 -07:00
commit 9e1e01bb62
4 changed files with 84 additions and 44 deletions

View File

@ -6,15 +6,26 @@ Currently I can only confirm it runs on a linux system and I have no desire to e
To keep compatability with both GNU cat and lolcat, I wanted all command line options from both to either be implemented or ignored. However there are a few conflicts between the two, namely -s -t and -v. For these I will be implementing the GNU cat functionality.
Current version is 0.1a as of writing this, so if the version is much newer, remind me to update this readme :)
![alt text](https://i.postimg.cc/1tYmJzxd/roflcat-usage.png "Screenshot of --help output")
Current version is 1.1 as of writing this, so if the version is much newer, remind me to update this readme :)
![alt text](https://i.postimg.cc/0Qk6k34j/roflcat-usage.png "Screenshot of --help output")
## Dependencies
ncurses
cmake
## Building
There is no release right now. There is only the debug build which will produce an executable called 'tester'.
To build just run `make`.
```
mkdir build
cd build
cmake ..
make
```
## Installing
I would not recommend installing at this time. There is no install target in the makefile.
From within the build directory:
```
make install
```
## More Screenshots
Some test outputs on a file filled with laughing cat emojis

1
TODO
View File

@ -1 +1,2 @@
move GNU cat logic out of printer class to make it more modular
fix ^` not printing

View File

@ -25,7 +25,7 @@
#include <cstdlib> //atol
cmd_args::cmd_args(void)noexcept:
truecol(0), color(0), number(0), ends(0), squeeze(0), tabs(0), nonprinting(0), error(0), usage(0), version(0){}
truecol(0), color(0), number(0), ends(0), squeeze(0), tabs(0), nonprinting(0), treatbinary(0), error(0), usage(0), version(0){}
void cmd_args::clear_gnu_options(void){
number = PRINT_LINE_NEVER;
ends = squeeze = tabs = nonprinting = 0;

View File

@ -34,8 +34,10 @@
#include <chrono> //std::chrono::*
#include <cstdlib> //srand
#include <string> //char_traits
#include <sys/types.h> //struct stat
#include <sys/stat.h> //struct stat
constexpr const char version_string[] = "roflcat version 1.0.4";
constexpr const char version_string[] = "roflcat version 1.1";
static constexpr size_t constexpr_strlen(const char* str){
size_t i = 0;
@ -92,6 +94,7 @@ constexpr void print_usage(Printer&& p){
p.print(L'\n');
}
p.print(L"\nroflcat Copyright (C) 2019 rexy712\n");
p.print(L"Source code can be found at https://gitlab.com/rexy712/roflcat\n");
p.print(L"This program comes with ABSOLUTELY NO WARRANTY\n");
p.print(L"This is free software, and you are welcome to redistribute it\n");
p.print(L"under certain conditions; see the GNU GPLv3 for details.\n");
@ -135,11 +138,32 @@ void nonprinting_notation(int in, char* dest){
}
}
bool is_directory(const char* file){
struct stat st;
if(stat(file, &st) != 0){
return false;
}
return S_ISDIR(st.st_mode);
}
bool file_exists(const char* file){
struct stat st;
return stat(file, &st) == 0;
}
FILE* open_file(const char* file, const char* mode){
if(is_directory(file)){
fflush(stdout);
fprintf(stderr, "Unable to open file \"%s\": Is a directory \n", file);
return nullptr;
}
if(!file_exists(file)){
fflush(stdout);
fprintf(stderr, "Unable to open file \"%s\": No such file\n", file);
return nullptr;
}
FILE* fp = fopen(file, mode);
if(!fp){
fflush(stdout);
fprintf(stderr, "Unable to open file %s\n", file);
fprintf(stderr, "Unable to open file for reading: \"%s\"\n", file);
}
return fp;
}
@ -158,47 +182,52 @@ template<class Printer>
int real_print_files(const cmd_args& args){
int ret = 0;
Printer p(args);
if(args.treatbinary){ //binary files
for(size_t i = 0;i < args.filenames.size();++i){
if(!strcmp(args.filenames[i], "-")){ //stdin
do_stdin<char>(p, fgetc);
}else{ //everything besides stdin
FILE* fp = open_file(args.filenames[i], "rb");
if(!fp){
ret = 2;
continue;
}
if(args.nonprinting){
for(char in;(in = fgetc(fp)) != EOF;){
char tmp[5];
nonprinting_notation(in, tmp);
p.print(tmp);
}
}else{
for(char in;(in = fgetc(fp)) != EOF;)
p.print(in);
}
if(args.treatbinary){
//Don't check if buf is empty because that's not how GNU cat handles Ctrl+D in middle of line
for(int in;(in = fgetc(stdin)) != EOF;){
p.print(static_cast<char>(in));
if(in == L'\n') //Only reset on newline to save print overhead
p.reset();
fclose(fp);
}
}
}else{ //non binary files
for(size_t i = 0;i < args.filenames.size();++i){
if(!strcmp(args.filenames[i], "-")){
do_stdin<wchar_t>(p, fgetwc);
}else{
for(wint_t in;(in = fgetwc(stdin)) != WEOF;){
p.print(static_cast<wchar_t>(in));
if(in == L'\n')
p.reset();
}
}
clearerr(stdin);
}else{ //everything besides stdin
FILE* fp = open_file(args.filenames[i], "r");
if(!fp){
ret = 2;
continue;
}
for(wchar_t in;(in = fgetwc(fp)) != WEOF;){
p.print(in);
if(args.treatbinary){
if(args.nonprinting){
for(int in;(in = fgetc(fp)) != EOF;){
char tmp[5];
nonprinting_notation(in, tmp);
p.print(tmp);
}
}else{
for(int in;(in = fgetc(fp)) != EOF;)
p.print(static_cast<char>(in));
}
}else{
//set to wide character mode before anything
fwide(fp, 1);
for(wint_t in;(in = fgetwc(fp)) != WEOF;)
p.print(static_cast<wchar_t>(in));
}
p.reset();
fclose(fp);
}
}
}
p.reset();
@ -247,6 +276,5 @@ int main(int argc, char** argv){
}else if(avail_colors == 256){
return print_files<basic_color_printer<256>>(args);
}
return 0;
}