diff --git a/README b/README index becd930..35f427c 100644 --- a/README +++ b/README @@ -1,2 +1,18 @@ -Library for easy shell like syntax and command execution in C++. +Cppipe allows you to write and execute script like C++ programs. +It offers a shell like synthax for seamless command execution. + +In this way your scripts can benefit from increased control and speed, while +maintaining a lot of the potential for simple command callsynthax. + +INSTALLATION: +In terminal use: +sudo ./install.sh + +HOW TO WRITE A CPPIPE PROGRAM: +Just include + +HOW TO EXECUTE A CPPIPE PROGRAM: +In terminal use: +cppipe my_cppipe_program.cpp + diff --git a/commands.cpp b/commands.cpp index 5d6ba7c..62f1942 100644 --- a/commands.cpp +++ b/commands.cpp @@ -130,7 +130,8 @@ str $(const PendingCmd& cmd) // check output size (not portable?) int pipe_size; - int rc = ioctl(p.out, FIONREAD, &pipe_size); assert(rc==0); + // int rc = ioctl(p.out, FIONREAD, &pipe_size); assert(rc==0); + ioctl(p.out, FIONREAD, &pipe_size); // write to the string directly, todo: find a better way str output; @@ -244,6 +245,16 @@ PendingCmd& operator>=(const PendingCmd& ccmd, fd_t fd) return cmd; } +PendingCmd& operator>>=(const PendingCmd& cmd, const char* file) +{ + fd_t fd = open_or_die(file, O_WRONLY | O_CREAT | O_APPEND); + return cmd >= fd; +} +PendingCmd& operator>>=(const PendingCmd& cmd, fd_t fd) +{ + return cmd >= fd; +} + PendingCmd& operator<(const PendingCmd& cmd, const char* file) { fd_t fd = open_or_die(file, O_RDONLY); @@ -253,6 +264,7 @@ PendingCmd& operator<(const PendingCmd& ccmd, fd_t fd) { auto& cmd = const_cast(ccmd); assert(cmd.in == 0 || !"ERROR: Input is already redirected!"); + cmd.in = fd; return cmd; } diff --git a/commands.hpp b/commands.hpp index 652a135..d200f07 100644 --- a/commands.hpp +++ b/commands.hpp @@ -125,10 +125,13 @@ PendingCmd& operator>(const PendingCmd&, fd_t); /* Same but append rather then truncate the file */ PendingCmd& operator>>(const PendingCmd&, const char* file); PendingCmd& operator>>(const PendingCmd&, fd_t); + /* Redirect errors to file */ PendingCmd& operator>=(const PendingCmd&, const char* file); PendingCmd& operator>=(const PendingCmd&, fd_t); -/* todo >>= */ +/* Same but append rather then truncate the file */ +PendingCmd& operator>>=(const PendingCmd&, const char* file); +PendingCmd& operator>>=(const PendingCmd&, fd_t); /* Shell oprator < use file as input */ PendingCmd& operator<(const PendingCmd&, const char* file); @@ -144,7 +147,7 @@ PendingCmd operator&(const PendingCmd&, const Cmd&); to allow for simpler synthax, speed and safety e.g: echo + some_string rather then: echo + some_string.c_str() */ -class str: public std::basic_string /* todo: allocator */ +class LeakStr: public std::basic_string /* todo: allocator */ { public: using std::basic_string::basic_string; @@ -155,6 +158,6 @@ public: shell: var=$(ls) becomes: - string var = $(ls); + auto var = $(ls); */ -str $(const PendingCmd&); +LeakStr $(const PendingCmd&); diff --git a/cppipe.cpp b/cppipe.cpp index c3b90a2..c5220fd 100644 --- a/cppipe.cpp +++ b/cppipe.cpp @@ -13,116 +13,116 @@ static bool compile_file(const char* file, path cache, bool debug); // return tr int main(int argc, char* argv[]) { - if(argc < 2) - { - cout << "Usage: cppipe [-g] FILE [ARGUMENTS]...\n"; - return 1; - } - if(!strcmp(argv[1], "--help")) - { - cout << "Usage: cppipe [-g] FILE [ARGUMENTS]...\n" - << "Compile and run C++ source FILE that uses the cppipe library.\n" - "Pass the ARGUMENTS to he compiled binary.\n" - "The binaries are cached and recompiled only if the source is newer.\n" - "-g debug the binary, asserts are also enabled\n"; - return 0; + if(argc < 2) + { + cout << "Usage: cppipe [-g] FILE [ARGUMENTS]...\n"; + return 1; + } + if(!strcmp(argv[1], "--help")) + { + cout << "Usage: cppipe [-g] FILE [ARGUMENTS]...\n" + << "Compile and run C++ source FILE that uses the cppipe library.\n" + "Pass the ARGUMENTS to he compiled binary.\n" + "The binaries are cached and recompiled only if the source is newer.\n" + "-g debug the binary, asserts are also enabled\n"; + return 0; - } + } - bool debug = false; - int file_arg = 1; - if(!strcmp(argv[1], "-g")) - { - if(argc < 3) - { - cout << "Usage: cppipe [-g] FILE [ARGUMENTS]...\n"; - return 1; - } + bool debug = false; + int file_arg = 1; + if(!strcmp(argv[1], "-g")) + { + if(argc < 3) + { + cout << "Usage: cppipe [-g] FILE [ARGUMENTS]...\n"; + return 1; + } - debug = true; - file_arg = 2; - } + debug = true; + file_arg = 2; + } - const char* file = argv[file_arg]; - if( !exists(file) ) - { - cerr << "File: " << file << " doesn't exist\n"; - exit(1); - } + const char* file = argv[file_arg]; + if( !exists(file) ) + { + cerr << "File: " << file << " doesn't exist\n"; + exit(1); + } - path cache( get_cache_path(file) ); // cache bins to avoid recompiles + path cache( get_cache_path(file) ); // cache bins to avoid recompiles - if(debug) - cache += "_dbg"; + if(debug) + cache += "_dbg"; - // Compile the passed file - if( !compile_file(file, cache, debug) ) - return 1; + // Compile the passed file + if( !compile_file(file, cache, debug) ) + return 1; - // Run the file without forking - Cmd run; - if(debug) // debug it with gdb - { - run += "gdb"; - run += "--args"; - } + // Run the file without forking + Cmd run; + if(debug) // debug it with gdb + { + run += "gdb"; + run += "--args"; + } - run += cache.c_str(); - for(int i = file_arg; i < argc; ++i) - run += argv[i]; - exec(run); + run += cache.c_str(); + for(int i = file_arg; i < argc; ++i) + run += argv[i]; + exec(run); } static path get_cache_path(const char* file) { - path cache; - if(char* xdg_cache = getenv("XDG_CACHE_HOME")) - { - cache = xdg_cache; - cache /= "cppipe"; - } - else - { - char* home( getenv("HOME") ); - cache = home; - cache /= ".cache/cppipe"; - } - cache += absolute(file); - create_directories(cache.parent_path()); - return cache; + path cache; + if(char* xdg_cache = getenv("XDG_CACHE_HOME")) + { + cache = xdg_cache; + cache /= "cppipe"; + } + else + { + char* home( getenv("HOME") ); + cache = home; + cache /= ".cache/cppipe"; + } + cache += absolute(file); + create_directories(cache.parent_path()); + return cache; } static bool compile_file(const char* file, path cache, bool debug) { - // Only compile if the source is newer then the bin or we are in debug - error_code ec; - if(last_write_time(file) > last_write_time(cache, ec)) - { - Cmd compile( - "g++", - "-o", cache.c_str(), - "-pipe", "-std=c++17", "-march=native", - // "-Wall", "-Wextra", "-Wno-parentheses", - file, - "-lcppipe" - ); + // Only compile if the source is newer then the bin or we are in debug + error_code ec; + if(last_write_time(file) > last_write_time(cache, ec)) + { + Cmd compile( + "g++", + "-o", cache.c_str(), + "-pipe", "-std=c++17", "-march=native", + // "-Wall", "-Wextra", "-Wno-parentheses", + file, + "-lcppipe" + ); - if(debug) - { - compile.append_args({ - "-g", - "-Wall", "-Wextra", "-Wno-parentheses" - }); - } - else - { - compile.append_args({ - "-Ofast", "-flto", "-DNDEBUG", "-s" - }); - } + if(debug) + { + compile.append_args({ + "-g", + "-Wall", "-Wextra", "-Wno-parentheses" + }); + } + else + { + compile.append_args({ + "-Ofast", "-flto", "-DNDEBUG", "-s" + }); + } - if( !compile() ) // if failed to compile - return false; - } - return true; + if( !compile() ) // if failed to compile + return false; + } + return true; } diff --git a/test.cpp b/test.cpp index 2953579..0478174 100644 --- a/test.cpp +++ b/test.cpp @@ -3,13 +3,8 @@ #include #include -// tab vs space // shaded obj? -// fix warning /* close files on destruction ?*/ -/* -> for error ? */ -// check if processes normal_exit - using namespace std; int main() {