error append

This commit is contained in:
vrd
2023-10-09 14:04:57 +03:00
parent d7aafbeb71
commit 105d9e5802
5 changed files with 130 additions and 104 deletions
+17 -1
View File
@@ -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 <cppipe/commands.hpp>
HOW TO EXECUTE A CPPIPE PROGRAM:
In terminal use:
cppipe my_cppipe_program.cpp
+13 -1
View File
@@ -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<PendingCmd&>(ccmd);
assert(cmd.in == 0 || !"ERROR: Input is already redirected!");
cmd.in = fd;
return cmd;
}
+7 -4
View File
@@ -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<char> /* todo: allocator */
class LeakStr: public std::basic_string<char> /* todo: allocator */
{
public:
using std::basic_string<char>::basic_string;
@@ -155,6 +158,6 @@ public:
shell:
var=$(ls)
becomes:
string var = $(ls);
auto var = $(ls);
*/
str $(const PendingCmd&);
LeakStr $(const PendingCmd&);
+93 -93
View File
@@ -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;
}
-5
View File
@@ -3,13 +3,8 @@
#include <sys/wait.h>
#include <iostream>
// tab vs space
// shaded obj?
// fix warning
/* close files on destruction ?*/
/* -> for error ? */
// check if processes normal_exit
using namespace std;
int main()
{