00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_TOOLS_OUT_DISPLAY_HXX
00018 # define VCSN_TOOLS_OUT_DISPLAY_HXX
00019
00028 namespace vcsn {
00029
00030 namespace tools {
00031
00032 template <class S, class T>
00033 bool
00034 out_display(const AutomataBase<S>&,
00035 const T&,
00036 const Element<S, T>& a,
00037 const std::string& name,
00038 const bool bg,
00039 char *const argv[],
00040 void (*function)(std::ostream& o,
00041 const Element<S, T>& a,
00042 const std::string& name))
00043
00044 {
00045 int filedes[2];
00046 if (pipe(filedes))
00047 return false;
00048
00049 pid_t child_pid = fork();
00050 if (child_pid)
00051 {
00052 close(filedes[0]);
00053 if (child_pid == -1)
00054 {
00055 close(filedes[1]);
00056 return false;
00057 }
00058 else
00059 {
00060
00061 {
00062 std::cout.flush();
00063 int old = dup(STDOUT_FILENO);
00064 if (old != -1)
00065 dup2(filedes[1], STDOUT_FILENO);
00066 close(filedes[1]);
00067
00068 function(std::cout, a, name);
00069
00070 if (old != -1)
00071 {
00072 dup2(old, STDOUT_FILENO);
00073 close(old);
00074 }
00075 }
00076 return bg or waitpid(child_pid, NULL, 0) == child_pid;
00077 }
00078 }
00079 else
00080 {
00081 close(filedes[1]);
00082 dup2(filedes[0], STDIN_FILENO);
00083 close(filedes[0]);
00084 execvp(argv[0], argv);
00085 return false;
00086 }
00087 }
00088
00089 }
00090
00091 }
00092
00093 #endif // ! VCSN_TOOLS_OUT_DISPLAY_HXX