SBSPSS/Utils/Libs/GinLib/animheader.cpp
2000-12-02 18:55:49 +00:00

271 lines
5.2 KiB
C++

/*=========================================================================
ANIMHEADER.CPP
Author: Gary Liddon @
Created:
Project:
Purpose:
Copyright (c) 1998 G R Liddon
===========================================================================*/
/*----------------------------------------------------------------------
Includes
-------- */
/* Std Lib
------- */
#include <strstream>
/* Glib
---- */
#include <pcre.h>
#include <gobject.hpp>
/* Local
----- */
#include "animheader.h"
/*----------------------------------------------------------------------
Tyepdefs && Defines
------------------- */
using namespace std;
/*----------------------------------------------------------------------
Structure defintions
-------------------- */
/*----------------------------------------------------------------------
Function Prototypes
------------------- */
static int GetHex(char const * Str);
/*----------------------------------------------------------------------
Vars
---- */
/*----------------------------------------------------------------------
Data
---- */
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
int GetHex(char const * Str)
{
char Buffer[1024];
strcpy(Buffer,Str);
strstream i(Buffer,1024);
int Val;
i>>hex>>Val;
return(Val);
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void MakeAnimHeader( char * line, AnimHeaderItem * item )
{
int len;
int pos;
char anim[1024];
char animno[8];
pos = 0;
len = strlen( line );
if (len > 4)
{
int count = 0;
// FIND ANIM
while(count != 3)
{
while(line[pos] != '_')
{
pos++;
if (pos >= len)
{
GObject::Error(ERR_FATAL,"Header scan overrun line - %s\n", line);
}
}
pos++;
count++;
}
// GET ANIM NAME
count = 0;
while(line[pos] != ' ')
{
anim[count++] = line[pos++];
if (pos > len)
{
GObject::Error(ERR_FATAL,"Header scan overrun line - %s\n", line);
}
}
anim[count] = 0;
// GET ANIM NUMBER
pos += 3;
count = 0;
while(line[pos] != ',')
{
animno[count++] = line[pos++];
if (pos > len)
{
GObject::Error(ERR_FATAL,"Header scan overrun line - %s\n", line);
}
}
animno[count] = 0;
strupr( anim );
item->m_AnimName = anim;
item->m_Frame = atoi( animno );
}
else
{
GObject::Error(ERR_FATAL,"Incorrect header line - %s\n", line);
}
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void readAnimHeaderFile(char const * Name, std::vector<AnimHeaderItem> & Items)
{
char Line[1024];
try
{
ifstream InStream;
InStream.open(Name,ios::in);
if (InStream)
{
InStream.getline(Line,1024); // HEADER GUARD
InStream.getline(Line,1024); // HEADER GUARD
InStream.getline(Line,1024); // ENUM
InStream.getline(Line,1024); // {
InStream.getline(Line,1024); // ANIM COUNT
while (!InStream.eof() && Line[0] != '}')
{
InStream.getline(Line,1024);
if (strlen(Line) && Line[0] != '}')
{
AnimHeaderItem MyItem;
MakeAnimHeader( Line, &MyItem );
InStream.getline(Line,1024); // NUMBER OF FRAMES
Items.push_back( MyItem );
}
}
InStream.close();
}
else
{
throw("Error opening anim header file");
}
}
catch (char const * E)
{
GObject::Error(ERR_FATAL,"Error in AddToTexList : %s",E);
}
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void AnimHeaderFile::load(char const * name)
{
vector<AnimHeaderItem> items;
readAnimHeaderFile(name,items);
int numOfItems;
numOfItems=items.size();
for (int f=0;f<numOfItems;f++)
{
AnimHeaderItem dummyResult;
// if (find(items[f].m_texName,dummyResult))
// GObject::Error(ERR_FATAL,"%s already defined in anim header file database",(char const *)items[f].m_texName);
// makeTexNameCompliant(items[f].m_texName);
// m_strToInfo[items[f].m_texName]=items[f];
}
m_lastLoadedFile=name;
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
void AnimHeaderFile::makeTexNameCompliant(GString & str)
{
str.Lower();
str.Filter("\\",'/');
}
/*----------------------------------------------------------------------
Function:
Purpose:
Params:
Returns:
---------------------------------------------------------------------- */
bool AnimHeaderFile::find(GString const & str,AnimHeaderItem & result)
{
GString srchStr;
map<GString,AnimHeaderItem>::iterator it;
srchStr=str;
makeTexNameCompliant(srchStr);
it=m_strToInfo.find(srchStr);
if (it == m_strToInfo.end())
{
return(false);
}
else
{
result=m_strToInfo[srchStr];
return(true);
}
}
/*===========================================================================
end */