/*$Id: c_system.cc,v 26.18 2007/03/03 06:08:43 al Exp $ -*- C++ -*- * Copyright (C) 2001 Albert Davis * Author: Albert Davis * * This file is part of "Gnucap", the Gnu Circuit Analysis Package * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. *------------------------------------------------------------------ * system calls: change directory, invoke another program, invoke editor, etc. */ //testing=none 2006.07.17 #include "io_.h" #include "ap.h" #include "c_comand.h" #include "l_dispatcher.h" extern DISPATCHER command_dispatcher; /*--------------------------------------------------------------------------*/ namespace { /*--------------------------------------------------------------------------*/ /* cmd_edit: (command) invoke user defined editor on the netlist * if command has an argument, it edits that file instead * else actually edits a temporary file, and reads it back. */ class CMD_EDIT : public CMD { public: void do_it(CS& cmd) {itested(); std::string editor(OS::getenv("EDITOR")); if (editor.empty()) { error(bERROR, "no editor defined\n" "You need to set the EDITOR environment variable."); }else{ if (cmd.more()) { OS::system(editor + ' ' + cmd.tail()); }else{ //std::string temp_file(::tmpnam(0)); std::string temp_file("/tmp/foo"); if (temp_file.empty()) { error(bERROR, "cannot create temp file\n"); }else{ cmdproc("save " + temp_file + " quiet"); OS::system(editor + ' ' + temp_file); cmdproc("get " + temp_file + " quiet"); OS::remove(temp_file); } } } } } p1; DISPATCHER::INSTALL d1(&command_dispatcher, "edit", &p1); /*--------------------------------------------------------------------------*/ class CMD_SYSTEM : public CMD { public: void do_it(CS& cmd) {itested(); if (cmd.more()) { OS::system(cmd.tail()); }else{ OS::system(SHELL); } } } p2; DISPATCHER::INSTALL d2(&command_dispatcher, "system,!", &p2); /*--------------------------------------------------------------------------*/ class CMD_CHDIR : public CMD { public: void do_it(CS& cmd) {itested(); if (cmd.more()) { OS::chdir(cmd.ctos("")); }else{ } IO::mstdout << OS::getcwd() << '\n'; } } p3; DISPATCHER::INSTALL d3(&command_dispatcher, "chdir,cd", &p3); /*--------------------------------------------------------------------------*/ } /*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/