librostlab 1.0.20
Loading...
Searching...
No Matches
rostlab_stdlib.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2011 Laszlo Kajan, Technical University of Munich, Germany
3
4 This file is part of librostlab.
5
6 librostlab is free software: you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18*/
19#ifndef ROSTLAB_STDLIB
20#define ROSTLAB_STDLIB 1
21
22#include <errno.h>
23#include <stdexcept>
24#include <stdarg.h>
25#include <stdlib.h>
26#include <string>
27#include <sstream>
28#include <string.h>
29#include <sys/stat.h>
30#include <sys/types.h>
31#include <sys/wait.h>
32#include <unistd.h>
33#include <vector>
34
35namespace rostlab {
36
37typedef std::vector<std::string>
39
40inline argvec_type
41 mkargvec( const char* __path, ... );
42inline bool file_exists( const std::string& __path );
43inline int system( const char* __path, ... );
44inline int system( const std::vector<std::string>& __args );
45inline std::string tolower( std::string __str );
46
47
48inline bool file_exists( const std::string& __path )
49{
50 struct stat buf;
51 if( stat( __path.c_str(), &buf ) ) return false;
52 return true;
53}
54
55
56inline argvec_type
57 mkargvec( const char* __path, ... )
58{
59 std::vector<std::string> argvec;
60 argvec.push_back( __path );
61
62 va_list listPointer;
63 va_start( listPointer, __path );
64
65 char* arg;
66 while( ( arg = va_arg( listPointer, char* ) ) != NULL )
67 {
68 argvec.push_back( arg );
69 }
70 va_end( listPointer );
71
72 return argvec;
73}
74
75
76inline int system( const char* __path, ... )
77{
78 std::vector<std::string> argvec;
79 argvec.push_back( __path );
80
81 va_list listPointer;
82 va_start( listPointer, __path );
83
84 char* arg;
85 while( ( arg = va_arg( listPointer, char* ) ) != NULL )
86 {
87 argvec.push_back( arg );
88 }
89 va_end( listPointer );
90
91 return system( argvec );
92}
93
94inline int system( const std::vector<std::string>& __args )
95{
96 pid_t pid = fork();
97 if( pid == -1 ) throw runtime_error( strerror( errno ) );
98 if( !pid )
99 {
100 char* argv[ __args.size()+1 ];
101 for( size_t i = 0; i < __args.size(); ++i ) argv[i] = const_cast<char*>( __args[i].c_str() );
102 argv[__args.size()] = NULL;
103
104 if( execvp( argv[0], argv ) ) throw runtime_error( strerror( errno ) );
105 exit(0);
106 }
107 int status;
108 if( !waitpid( pid, &status, 0 ) ) throw runtime_error( strerror( errno ) );
109 if( !WIFEXITED(status) ) throw runtime_error( "child exited abnormally" );
110 return status;
111}
112
113
114inline std::string tolower( std::string __str )
115{
116 for( std::string::iterator s_i = __str.begin(); s_i != __str.end(); ++s_i ) *s_i = ::tolower( *s_i );
117 return __str;
118}
119
120} // namespace rostlab
121
122#endif // ROSTLAB_STDLIB
123// vim:et:ts=4:ai:
std::string tolower(std::string __str)
argvec_type mkargvec(const char *__path,...)
bool file_exists(const std::string &__path)
int system(const char *__path,...)
std::vector< std::string > argvec_type