summaryrefslogtreecommitdiffstats
path: root/Source/cmCacheManager.cxx
blob: f1682a907a19a5e9cd2a0eeb3d4c74657afa1b11 (plain)
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
/*=========================================================================

  Program:   Insight Segmentation & Registration Toolkit
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$


  Copyright (c) 2000 National Library of Medicine
  All rights reserved.

  See COPYRIGHT.txt for copyright details.

=========================================================================*/

#include "cmCacheManager.h"
#include "cmSystemTools.h"
#include "cmCacheManager.h"
#include "cmMakefile.h"

const char* cmCacheManagerTypes[] = 
{ "BOOL",
  "PATH",
  "FILEPATH",
  "STRING",
  0
};

cmCacheManager::CacheEntryType cmCacheManager::StringToType(const char* s)
{
  int i = 0;
  while(cmCacheManagerTypes[i])
    {
    if(strcmp(s, cmCacheManagerTypes[i]) == 0)
      {
      return static_cast<CacheEntryType>(i);
      }
    ++i;
    }
  return STRING;
}

    
cmCacheManager* cmCacheManager::s_Instance = 0;

cmCacheManager* cmCacheManager::GetInstance()
{
  if(!cmCacheManager::s_Instance)
    {
    cmCacheManager::s_Instance = new cmCacheManager;
    }
  return cmCacheManager::s_Instance;
}



bool cmCacheManager::LoadCache(cmMakefile* mf)
{
  std::string cacheFile = mf->GetHomeOutputDirectory();
  cacheFile += "/CMakeCache.txt";
  // clear the old cache
  m_Cache.clear();
  std::ifstream fin(cacheFile.c_str());
  if(!fin)
    {
    return false;
    }
  const int bsize = 4096;
  char buffer[bsize];
  std::string inputLine;
  while(fin)
    {
    // Format is key:type=value
    CacheEntry e;
    std::string key;
    fin.getline(buffer, bsize, ':');
    key = buffer;
    fin.getline(buffer, bsize, '=');
    e.m_Type = cmCacheManager::StringToType(buffer);
    fin.getline(buffer, bsize); // last token is separated by a newline
    e.m_Value = buffer;
    if(fin)
      {
      m_Cache[key] = e;
      }
    }
  return true;
}

bool cmCacheManager::SaveCache(cmMakefile* mf)
{
  std::string cacheFile = mf->GetHomeOutputDirectory();
  cacheFile += "/CMakeCache.txt";
  std::ofstream fout(cacheFile.c_str());
  if(!fout)
    {
    cmSystemTools::Error("Unable to open cache file for save. ", 
                         cacheFile.c_str());
    return false;
    }
  for( std::map<std::string, CacheEntry>::iterator i = m_Cache.begin();
       i != m_Cache.end(); ++i)
    {
    CacheEntryType t = (*i).second.m_Type;
    // Format is key:type=value
    fout << (*i).first.c_str() << ":"
         << cmCacheManagerTypes[t] << "="
         << (*i).second.m_Value << "\n";
    }
  fout << "\n";
  return true;
}

void cmCacheManager::AddCacheEntry(const char* key, 
				   const char* value, 
				   CacheEntryType type)
{
  CacheEntry e;
  e.m_Value = value;
  e.m_Type = type;
  m_Cache[key] = e;
}

const char* cmCacheManager::GetCacheValue(const char* key)
{
  if(m_Cache.count(key))
    {
    return m_Cache[key].m_Value.c_str();
    }
  return 0;
}