Browse Source

Serializes generated file hashes so files are only overwrite on change.

pull/1/head
marcos henrich 12 years ago
parent
commit
7273145e69
  1. 2
      src/Generator/Driver.cs
  2. 16
      src/Generator/Generators/CLI/CLIGenerator.cs
  3. 52
      src/Generator/Utils/FileHashes.cs

2
src/Generator/Driver.cs

@ -177,6 +177,7 @@ namespace Cxxi @@ -177,6 +177,7 @@ namespace Cxxi
GeneratorKind = LanguageGeneratorKind.CSharp;
GenerateLibraryNamespace = true;
GenerateFunctionTemplates = false;
WriteOnlyWhenChanged = false;
}
public bool Verbose = false;
@ -200,5 +201,6 @@ namespace Cxxi @@ -200,5 +201,6 @@ namespace Cxxi
public string IncludePrefix;
public string WrapperSuffix;
public LanguageGeneratorKind GeneratorKind;
public bool WriteOnlyWhenChanged;
}
}

16
src/Generator/Generators/CLI/CLIGenerator.cs

@ -1,6 +1,5 @@ @@ -1,6 +1,5 @@
using System;
using System.IO;
using Cxxi.Passes;
using Cxxi.Types;
namespace Cxxi.Generators.CLI
@ -8,11 +7,13 @@ namespace Cxxi.Generators.CLI @@ -8,11 +7,13 @@ namespace Cxxi.Generators.CLI
public class CLIGenerator : Generator
{
private readonly ITypePrinter typePrinter;
private readonly FileHashes fileHashes;
public CLIGenerator(Driver driver) : base(driver)
{
typePrinter = new CLITypePrinter(driver);
Type.TypePrinter = typePrinter;
fileHashes = FileHashes.Load("hashes.ser");
}
void WriteTemplate(TextTemplate template)
@ -22,11 +23,22 @@ namespace Cxxi.Generators.CLI @@ -22,11 +23,22 @@ namespace Cxxi.Generators.CLI
+ template.FileExtension;
var path = Path.Combine(Driver.Options.OutputDir, file);
var fullPath = Path.GetFullPath(path);
template.Generate();
Console.WriteLine(" Generated '" + file + "'.");
File.WriteAllText(Path.GetFullPath(path), template.ToString());
var str = template.ToString();
if(Driver.Options.WriteOnlyWhenChanged)
{
var updated = fileHashes.UpdateHash(path, str.GetHashCode());
if(File.Exists(fullPath) && !updated)
return;
}
File.WriteAllText(fullPath,str);
}
public override bool Generate(TranslationUnit unit)

52
src/Generator/Utils/FileHashes.cs

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable]
class FileHashes
{
private string serializedFile;
private Dictionary<string, int> fileHashes = new Dictionary<string, int>();
public bool UpdateHash(string file, int hash)
{
if(!fileHashes.ContainsKey(file))
{
fileHashes.Add(file, hash);
Save(this, serializedFile);
return true;
}
var oldHash = fileHashes[file];
fileHashes[file] = hash;
Save(this, serializedFile);
return oldHash != hash;
}
public static FileHashes Load(string file)
{
var stream = File.Open(file, FileMode.OpenOrCreate);
var bformatter = new BinaryFormatter();
FileHashes obj;
if(stream.Length>0)
obj = (FileHashes)bformatter.Deserialize(stream);
else
obj = new FileHashes();
obj.serializedFile = file;
stream.Close();
return obj;
}
public static void Save(FileHashes obj, string file)
{
Stream stream = File.Open(file, FileMode.Create);
BinaryFormatter bformatter = new BinaryFormatter();
bformatter.Serialize(stream, obj);
stream.Close();
}
}
Loading…
Cancel
Save