UltimateZoneBuilder/Source/Core/ZDoom/TexturesParser.cs
boris_i f66980b60f - Fixed a bug that allowed to use texture names longer than 8 characters, making the WAD file unusable after saving
@ added a texturenamelength config var. Setting it to higher than 8 may result in unexpected behaviour due to the speed optimizations relying on 8 char texture names and should not be changed for now.
2009-06-08 18:52:56 +00:00

157 lines
4.2 KiB
C#

#region ================== Copyright (c) 2007 Pascal vd Heiden
/*
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
* This program is released under GNU General Public License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#endregion
#region ================== Namespaces
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using CodeImp.DoomBuilder.IO;
using CodeImp.DoomBuilder.Data;
using System.IO;
using System.Diagnostics;
using CodeImp.DoomBuilder.Compilers;
#endregion
namespace CodeImp.DoomBuilder.ZDoom
{
public sealed class TexturesParser : ZDTextParser
{
#region ================== Delegates
#endregion
#region ================== Constants
#endregion
#region ================== Variables
private List<TextureStructure> textures;
private List<TextureStructure> sprites;
#endregion
#region ================== Properties
public ICollection<TextureStructure> Textures { get { return textures; } }
public ICollection<TextureStructure> Sprites { get { return sprites; } }
#endregion
#region ================== Constructor / Disposer
// Constructor
public TexturesParser()
{
// Syntax
whitespace = "\n \t\r";
specialtokens = ",{}\n";
// Initialize
textures = new List<TextureStructure>();
sprites = new List<TextureStructure>();
}
#endregion
#region ================== Parsing
// This parses the given stream
// Returns false on errors
public override bool Parse(Stream stream, string sourcefilename)
{
base.Parse(stream, sourcefilename);
// Continue until at the end of the stream
while(SkipWhitespace(true))
{
// Read a token
string objdeclaration = ReadToken();
if(objdeclaration != null)
{
objdeclaration = objdeclaration.ToLowerInvariant();
if(objdeclaration == "texture")
{
// Read texture structure
TextureStructure tx = new TextureStructure(this);
if(this.HasError) break;
// if a limit for the texture name length is set make sure that it's not exceeded
if ((General.Map.Config.MaxTextureNamelength > 0) && (tx.Name.Length > General.Map.Config.MaxTextureNamelength))
{
General.ErrorLogger.Add(ErrorType.Error, "Texture name \"" + tx.Name + "\" too long. Texture names must have a length of " + General.Map.Config.MaxTextureNamelength.ToString() + " characters or less");
}
else
{
// Add the texture
textures.Add(tx);
}
}
else if(objdeclaration == "sprite")
{
// Read sprite structure
TextureStructure tx = new TextureStructure(this);
if(this.HasError) break;
// if a limit for the sprite name length is set make sure that it's not exceeded
if ((General.Map.Config.MaxTextureNamelength > 0) && (tx.Name.Length > General.Map.Config.MaxTextureNamelength))
{
General.ErrorLogger.Add(ErrorType.Error, "Sprite name \"" + tx.Name + "\" too long. Sprite names must have a length of " + General.Map.Config.MaxTextureNamelength.ToString() + " characters or less");
}
else
{
// Add the sprite
sprites.Add(tx);
}
}
else
{
// Unknown structure!
// Best we can do now is just find the first { and then
// follow the scopes until the matching } is found
string token2;
do
{
if(!SkipWhitespace(true)) break;
token2 = ReadToken();
if(token2 == null) break;
}
while(token2 != "{");
int scopelevel = 1;
do
{
if(!SkipWhitespace(true)) break;
token2 = ReadToken();
if(token2 == null) break;
if(token2 == "{") scopelevel++;
if(token2 == "}") scopelevel--;
}
while(scopelevel > 0);
}
}
}
// Return true when no errors occurred
return (ErrorDescription == null);
}
#endregion
}
}