File: File.cc

package info (click to toggle)
exactimage 1.2.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,040 kB
  • sloc: cpp: 35,940; ansic: 1,952; xml: 1,447; makefile: 338; perl: 138; sh: 110; python: 45; php: 37; ruby: 12
file content (135 lines) | stat: -rw-r--r-- 3,500 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * --- GSMP-COPYRIGHT-NOTE-BEGIN ---
 * 
 * This copyright note is auto-generated by ./scripts/Create-CopyPatch.
 * Please add additional copyright information _after_ the line containing
 * the GSMP-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by
 * the ./scripts/Create-CopyPatch script. Do not edit this copyright text!
 * 
 * GSMP: utility/src/File.cc
 * General Sound Manipulation Program is Copyright (C) 2000 - 2004
 *   Valentin Ziegler and René Rebe
 * 
 * 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; version 2. A copy of the GNU General
 * Public License can be found in the file LICENSE.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANT-
 * ABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 * 
 * --- GSMP-COPYRIGHT-NOTE-END ---
 */

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include <iostream>

#include "File.hh"

Utility::File::File () {
  c_stat_valid = false;
}

Utility::File::File (const std::string& str) {
  filename = str;
  c_stat_valid = false;
}

Utility::File::~File () {
}

void Utility::File::SetFile (const std::string& str) {
  if (str != filename) {
    reset();
    filename = str;
  }
}

const std::string& Utility::File::Dirname ()
{
  // this is slightly unoptimal if we really do not have a dirname
  // but since this is rare we keep this simple
  if (dirname == "")
    updateDirBaseExt ();
  return dirname;
}

const std::string& Utility::File::Basename ()
{
  // we always have a basename - a leading dot forms a hidden Unix file ....
  if (basename == "")
    updateDirBaseExt ();
  return basename;
}

std::string Utility::File::BasenameWOExtension ()
{
  // we always have a basename - a leading dot forms a hidden Unix file ....
  if (basename == "")
    updateDirBaseExt ();

  std::string::size_type idx = extension.size(); if (idx) ++idx;
  std::string bwoe = basename.substr(0, basename.size() - idx);
  return bwoe;
}

const std::string& Utility::File::Extension ()
{
  // this is slightly unoptimal if we really do not have an extension
  // but since this is rare we keep this simple
  if (extension == "")
    updateDirBaseExt ();
  return extension;
}

const Utility::FileType Utility::File::Type ()
{
  updateStat();
  return FileType(c_stat.st_mode);
}

void Utility::File::reset () {
  basename.clear();
  extension.clear();
  c_stat_valid = false;
}

bool Utility::File::updateStat () {
  if (c_stat_valid)
    return true;
  
  return stat (filename.c_str(), &c_stat) == 0;
}

void Utility::File::updateDirBaseExt () {
  // parse the filename extension
  std::string::size_type idx_ext = filename.rfind ('.');
  std::string::size_type idx_base = filename.rfind ('/');
  
  // ignore leading dots - they mark hidden Unix files ...
  if (idx_ext && idx_ext != std::string::npos) {
    extension = filename.substr (idx_ext + 1);
  }
  else {
    extension.clear ();
  }

  if (idx_base == std::string::npos) {
    dirname.clear ();
    basename = filename.substr (0, std::string::npos);
  }
  else {
    dirname = filename.substr (0, idx_base);
    basename = filename.substr (idx_base + 1, std::string::npos);
  }
}

std::ostream& Utility::operator<< (std::ostream& os, const File& file) {
  os << file.Name ();
  return os;
}