Changeset 2906


Ignore:
Timestamp:
Dec 15, 2012, 7:29:55 AM (9 years ago)
Author:
Peter
Message:

New functions chdir, chmod, copy_file, fnmatch, remove, rename, and replace
refs #717

Location:
trunk/yat/utility
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/yat/utility/utility.cc

    r2892 r2906  
    2626#include "utility.h"
    2727
     28#include "Exception.h"
    2829#include "FileUtil.h"
    2930#include "stl_utility.h"
    3031
     32#include <fnmatch.h>
     33#include <fstream>
    3134#include <sstream>
    3235#include <string>
     
    5053
    5154
     55  void chdir(const std::string& dir)
     56  {
     57    if (::chdir(dir.c_str()) )
     58      throw errno_error("chdir: " + dir + ":");
     59  }
     60
     61
     62  void chmod(const std::string& filename, mode_t mode)
     63  {
     64    if (::chmod(filename.c_str(), mode))
     65      throw errno_error("chmod: ");
     66  }
     67
     68
     69  void copy_file(const std::string& source, const std::string& target)
     70  {
     71    std::ifstream is;
     72    std::ofstream os;
     73
     74    is.open(source.c_str(), std::ios::in | std::ios::binary);
     75    os.open(target.c_str(), std::ios::out | std::ios::binary);
     76    os << is.rdbuf();
     77    if (!os.good()) {
     78      std::ostringstream ss;
     79      ss << "copy_file failed writing to '" << target << "'\n";
     80      throw runtime_error(ss.str());
     81    }
     82    if (is.bad() || is.fail()) {
     83      std::ostringstream ss;
     84      ss << "copy_file failed reading from '" << source << "'\n";
     85      throw runtime_error(ss.str());
     86    }
     87    is.close();
     88    os.close();
     89
     90    // copy permissions
     91    struct stat nodestat;
     92    stat(source.c_str(), &nodestat);
     93    chmod(target.c_str(), nodestat.st_mode);
     94  }
     95
     96
    5297  std::string dirname(const std::string& path)
    5398  {
     
    65110      return "/";
    66111    return path.substr(0,pos);
     112  }
     113
     114
     115  bool fnmatch(const std::string& pattern, const std::string& str)
     116  {
     117    int res = ::fnmatch(pattern.c_str(), str.c_str(), 0);
     118    if (res==0)
     119      return true;
     120    if (res!=FNM_NOMATCH) {
     121      std::stringstream ss;
     122      ss << "fnmatch(" << pattern << ", " << str << ")";
     123      throw runtime_error(ss.str());
     124    }
     125    return false;
    67126  }
    68127
  • trunk/yat/utility/utility.h

    r2892 r2906  
    5757  /**
    5858     \return everything after last '/'
     59
     60     \since New in yat 0.10
    5961   */
    6062  std::string basename(const std::string& fn);
     
    7577
    7678  /**
     79     wrapper around GNU C Library function chdir
     80
     81     \throw if underlying chdir call does not return 0
     82
     83     \since New in yat 0.10
     84   */
     85  void chdir(const std::string& dir);
     86
     87  /**
     88     \since New in yat 0.10
     89   */
     90  void chmod(const std::string& filename, mode_t mode);
     91
     92  /**
    7793     \brief convert T to a string
    7894
     
    93109
    94110  /**
     111     @brief Copy file \a source to \a target.
     112
     113     @throw std::runtime_error when read error of \a source or write
     114     error for \a target is encountered.
     115  */
     116  void copy_file(const std::string& source, const std::string& target);
     117
     118  /**
    95119     \return everything prior last '/'.
     120
     121     \since New in yat 0.10
    96122   */
    97123  std::string dirname(const std::string& fn);
     124
     125  /**
     126     \return true if \a str matches \a pattern
     127
     128     \see fnmatch(3)
     129
     130     \since New in yat 0.10
     131  */
     132  bool fnmatch(const std::string& pattern, const std::string& str);
    98133
    99134  /**
     
    285320   */
    286321  void mkdir_p(const std::string& dir);
     322
     323  /**
     324     same as C function remove but throws errno_error at failure
     325
     326     \see man remove
     327   */
     328  void remove(const std::string& fn);
     329
     330  /**
     331     same as rename(2) but throws errno_error if error is encountered
     332
     333     \see man rename
     334
     335     \since New in yat 0.10
     336   */
     337  void rename(const std::string& from, const std::string to);
     338
     339  /**
     340     In \a full_str replace every sub-string \a old_str with \a
     341     new_str;
     342   */
     343  void replace(std::string& full_str, std::string old_str, std::string new_str);
    287344
    288345  // template implementations
     
    385442      pusher(element, vec);
    386443    }
    387   }           
    388 
     444  }
    389445
    390446namespace detail {
Note: See TracChangeset for help on using the changeset viewer.