output.cc revision 2665
12330SN/A/* 22330SN/A * Copyright (c) 2005 The Regents of The University of Michigan 32330SN/A * All rights reserved. 42330SN/A * 52330SN/A * Redistribution and use in source and binary forms, with or without 62330SN/A * modification, are permitted provided that the following conditions are 72330SN/A * met: redistributions of source code must retain the above copyright 82330SN/A * notice, this list of conditions and the following disclaimer; 92330SN/A * redistributions in binary form must reproduce the above copyright 102330SN/A * notice, this list of conditions and the following disclaimer in the 112330SN/A * documentation and/or other materials provided with the distribution; 122330SN/A * neither the name of the copyright holders nor the names of its 132330SN/A * contributors may be used to endorse or promote products derived from 142330SN/A * this software without specific prior written permission. 152330SN/A * 162330SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172330SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182330SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192330SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202330SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212330SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222330SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232330SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242330SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252330SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262330SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272689Sktlim@umich.edu * 282689Sktlim@umich.edu * Authors: Nathan Binkert 292330SN/A */ 302292SN/A 312292SN/A#include <errno.h> 322292SN/A#include <limits.h> 332292SN/A#include <stdlib.h> 342683Sktlim@umich.edu#include <sys/stat.h> 352680Sktlim@umich.edu#include <sys/types.h> 362292SN/A 372678Sktlim@umich.edu#include <fstream> 382683Sktlim@umich.edu 392678Sktlim@umich.edu#include "base/misc.hh" 402683Sktlim@umich.edu#include "base/output.hh" 412678Sktlim@umich.edu 422678Sktlim@umich.eduusing namespace std; 432292SN/A 442292SN/AOutputDirectory simout; 452292SN/A 462292SN/A/** 472330SN/A * 482330SN/A */ 492330SN/AOutputDirectory::OutputDirectory() 502292SN/A{} 512292SN/A 522330SN/AOutputDirectory::~OutputDirectory() 532330SN/A{} 542330SN/A 552330SN/Avoid 562330SN/AOutputDirectory::setDirectory(const string &d) 572330SN/A{ 582292SN/A if (!dir.empty()) 592683Sktlim@umich.edu panic("Output directory already set!\n"); 602683Sktlim@umich.edu 612292SN/A dir = d; 622683Sktlim@umich.edu 632292SN/A if (dir != ".") { 642678Sktlim@umich.edu if (mkdir(dir.c_str(), 0777) < 0 && errno != EEXIST) 652683Sktlim@umich.edu panic("couldn't make output dir %s: %s\n", 662292SN/A dir, strerror(errno)); 672683Sktlim@umich.edu } 682683Sktlim@umich.edu 692683Sktlim@umich.edu // guarantee that directory ends with a '/' 702683Sktlim@umich.edu if (dir[dir.size() - 1] != '/') 712683Sktlim@umich.edu dir += "/"; 722683Sktlim@umich.edu} 732683Sktlim@umich.edu 742683Sktlim@umich.educonst string & 752683Sktlim@umich.eduOutputDirectory::directory() 762683Sktlim@umich.edu{ 772683Sktlim@umich.edu if (dir.empty()) 782683Sktlim@umich.edu panic("Output directory not set!"); 792683Sktlim@umich.edu 802683Sktlim@umich.edu return dir; 812683Sktlim@umich.edu} 822683Sktlim@umich.edu 832683Sktlim@umich.edustring 842683Sktlim@umich.eduOutputDirectory::resolve(const string &name) 852683Sktlim@umich.edu{ 862683Sktlim@umich.edu return (name[0] != '/') ? dir + name : name; 872683Sktlim@umich.edu} 882683Sktlim@umich.edu 892683Sktlim@umich.eduostream * 902683Sktlim@umich.eduOutputDirectory::create(const string &name) 912690Sktlim@umich.edu{ 922690Sktlim@umich.edu if (name == "cerr" || name == "stderr") 932683Sktlim@umich.edu return &cerr; 942683Sktlim@umich.edu 952690Sktlim@umich.edu if (name == "cout" || name == "stdout") 962690Sktlim@umich.edu return &cout; 972683Sktlim@umich.edu 982683Sktlim@umich.edu ofstream *file = new ofstream(resolve(name).c_str(), ios::trunc); 992683Sktlim@umich.edu if (!file->is_open()) 1002683Sktlim@umich.edu panic("Cannot open file %s", name); 1012683Sktlim@umich.edu 1022683Sktlim@umich.edu return file; 1032683Sktlim@umich.edu} 1042683Sktlim@umich.edu 1052683Sktlim@umich.eduostream * 1062683Sktlim@umich.eduOutputDirectory::find(const string &name) 1072678Sktlim@umich.edu{ 1082292SN/A if (name == "cerr" || name == "stderr") 1092683Sktlim@umich.edu return &cerr; 1102683Sktlim@umich.edu 1112292SN/A if (name == "cout" || name == "stdout") 1122683Sktlim@umich.edu return &cout; 1132683Sktlim@umich.edu 1142683Sktlim@umich.edu string filename = resolve(name); 1152683Sktlim@umich.edu map_t::iterator i = files.find(filename); 1162683Sktlim@umich.edu if (i != files.end()) 1172683Sktlim@umich.edu return (*i).second; 1182683Sktlim@umich.edu 1192683Sktlim@umich.edu ofstream *file = new ofstream(filename.c_str(), ios::trunc); 1202683Sktlim@umich.edu if (!file->is_open()) 1212683Sktlim@umich.edu panic("Cannot open file %s", filename); 1222683Sktlim@umich.edu 1232683Sktlim@umich.edu files[filename] = file; 1242683Sktlim@umich.edu return file; 1252683Sktlim@umich.edu} 1262683Sktlim@umich.edu 1272683Sktlim@umich.edubool 1282683Sktlim@umich.eduOutputDirectory::isFile(const std::ostream *os) 1292683Sktlim@umich.edu{ 1302683Sktlim@umich.edu return os && os != &cerr && os != &cout; 1312683Sktlim@umich.edu} 1322683Sktlim@umich.edu