error append
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user