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

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

@ -1,6 +1,5 @@
using System; using System;
using System.IO; using System.IO;
using Cxxi.Passes;
using Cxxi.Types; using Cxxi.Types;
namespace Cxxi.Generators.CLI namespace Cxxi.Generators.CLI
@ -8,11 +7,13 @@ namespace Cxxi.Generators.CLI
public class CLIGenerator : Generator public class CLIGenerator : Generator
{ {
private readonly ITypePrinter typePrinter; private readonly ITypePrinter typePrinter;
private readonly FileHashes fileHashes;
public CLIGenerator(Driver driver) : base(driver) public CLIGenerator(Driver driver) : base(driver)
{ {
typePrinter = new CLITypePrinter(driver); typePrinter = new CLITypePrinter(driver);
Type.TypePrinter = typePrinter; Type.TypePrinter = typePrinter;
fileHashes = FileHashes.Load("hashes.ser");
} }
void WriteTemplate(TextTemplate template) void WriteTemplate(TextTemplate template)
@ -22,11 +23,22 @@ namespace Cxxi.Generators.CLI
+ template.FileExtension; + template.FileExtension;
var path = Path.Combine(Driver.Options.OutputDir, file); var path = Path.Combine(Driver.Options.OutputDir, file);
var fullPath = Path.GetFullPath(path);
template.Generate(); template.Generate();
Console.WriteLine(" Generated '" + file + "'."); 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) public override bool Generate(TranslationUnit unit)

52
src/Generator/Utils/FileHashes.cs

@ -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