openmohaa/code/skeletor/skeletor_utilities.cpp
2024-09-20 23:08:53 +02:00

324 lines
6.9 KiB
C++

/*
===========================================================================
Copyright (C) 2024 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code 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.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// skeletor.cpp : Skeletor
#include "q_shared.h"
#include "skeletor.h"
void SKEL_Message(const char *fmt, ...)
{
static char msg[32000];
va_list va;
va_start(va, fmt);
Q_vsnprintf(msg, sizeof(msg), fmt, va);
va_end(va);
Skel_DPrintf(msg);
}
void SKEL_Warning(const char *fmt, ...)
{
char msg[1024];
va_list va;
va_start(va, fmt);
Q_vsnprintf(msg, sizeof(msg), fmt, va);
va_end(va);
Skel_DPrintf(msg);
}
void SKEL_Error(const char *fmt, ...)
{
char msg[1024];
va_list va;
va_start(va, fmt);
Q_vsnprintf(msg, sizeof(msg), fmt, va);
va_end(va);
Skel_DPrintf(msg);
}
int FileLength(FILE *pFile)
{
int iPos;
int iEnd;
iPos = ftell(pFile);
fseek(pFile, 0, SEEK_END);
iEnd = ftell(pFile);
fseek(pFile, iPos, SEEK_SET);
return iEnd;
}
int skelChannelList_s::GlobalChannel(int localchannel) const
{
assert(localchannel < MAX_GLOBAL_FROM_LOCAL);
return m_chanGlobalFromLocal[localchannel];
}
int skelChannelList_s::LocalChannel(int channel) const
{
return GetLocalFromGlobal(channel);
}
int skelChannelList_s::GetLocalFromGlobal(int globalChannel) const
{
if (!m_chanLocalFromGlobal) {
return -1;
}
if (globalChannel >= m_numLocalFromGlobal) {
return -1;
}
return m_chanLocalFromGlobal[globalChannel];
}
void skelChannelList_s::SetLocalFromGlobal(int channel, int localchannel)
{
m_chanLocalFromGlobal[channel] = localchannel;
}
int skelChannelList_s::NumChannels(void) const
{
return m_numChannels;
}
void skelChannelList_s::ZeroChannels()
{
int i;
m_numChannels = 0;
m_chanLocalFromGlobal = (short *)Skel_Alloc(MAX_SKELETOR_CHANNELS * sizeof(short));
m_numLocalFromGlobal = MAX_SKELETOR_CHANNELS;
for (i = 0; i < MAX_SKELETOR_CHANNELS; i++) {
m_chanLocalFromGlobal[i] = -1;
}
}
void skelChannelList_s::PackChannels()
{
m_numLocalFromGlobal = MAX_SKELETOR_CHANNELS - 1;
for (m_numLocalFromGlobal = MAX_SKELETOR_CHANNELS - 1; m_numLocalFromGlobal >= 0; m_numLocalFromGlobal--) {
if (m_chanLocalFromGlobal[m_numLocalFromGlobal] != -1) {
break;
}
}
if (m_numLocalFromGlobal < MAX_SKELETOR_CHANNELS) {
m_numLocalFromGlobal++;
}
if (m_numLocalFromGlobal > 0) {
short *old_array = m_chanLocalFromGlobal;
int i;
m_chanLocalFromGlobal = (short *)Skel_Alloc(m_numLocalFromGlobal * sizeof(m_chanLocalFromGlobal[0]));
for (i = 0; i < m_numLocalFromGlobal; i++) {
m_chanLocalFromGlobal[i] = old_array[i];
}
Skel_Free(old_array);
} else {
Skel_Free(m_chanLocalFromGlobal);
m_chanLocalFromGlobal = NULL;
m_numLocalFromGlobal = -1;
}
}
void skelChannelList_s::CleanUpChannels()
{
if (m_chanLocalFromGlobal) {
Skel_Free(m_chanLocalFromGlobal);
m_chanLocalFromGlobal = NULL;
}
m_numLocalFromGlobal = 0;
}
void skelChannelList_s::InitChannels()
{
m_chanLocalFromGlobal = NULL;
m_numLocalFromGlobal = 0;
}
int skelChannelList_s::AddChannel(int newGlobalChannelNum)
{
short int iLocalChannel;
if (newGlobalChannelNum == -1) {
// Fixed in 2.0
// Set the global from local to -1
m_chanGlobalFromLocal[m_numChannels] = -1;
return m_numChannels++;
}
iLocalChannel = GetLocalFromGlobal(newGlobalChannelNum);
if (iLocalChannel < 0) {
iLocalChannel = m_numChannels++;
m_chanGlobalFromLocal[iLocalChannel] = newGlobalChannelNum;
SetLocalFromGlobal(newGlobalChannelNum, iLocalChannel);
}
return iLocalChannel;
}
qboolean skelChannelList_s::HasChannel(ChannelNameTable *nameTable, const char *channelName) const
{
short int iGlobalChannel = nameTable->FindNameLookup(channelName);
return iGlobalChannel >= 0 && LocalChannel(iGlobalChannel) >= 0;
}
const char *skelChannelList_s::ChannelName(ChannelNameTable *nameTable, int localChannelNum) const
{
if (localChannelNum >= this->m_numChannels || localChannelNum < 0) {
return NULL;
}
if (m_chanGlobalFromLocal[localChannelNum] < 0) {
return 0;
}
return nameTable->FindName(m_chanGlobalFromLocal[localChannelNum]);
}
void Skel_ExtractFilePath(const char *path, char *dest)
{
const char *src = path + strlen(path);
while (src != path) {
if (*(src - 1) == '\\') {
break;
}
if (*(src - 1) == '/') {
break;
}
src--;
}
memcpy(dest, src, src - path);
dest[src - path] = 0;
}
void Skel_ExtractFileBase(const char *path, char *dest)
{
const char *src = path + strlen(path);
const char *dot = src;
while (src != path) {
if (*(src - 1) == '\\') {
break;
}
if (*(src - 1) == '/') {
break;
}
src--;
}
while (dot != src) {
if (*(dot - 1) != '.') {
break;
}
dot--;
}
if (dot == src) {
*dest = 0;
return;
}
memcpy(dest, src, dot - src);
dest[dot - src] = 0;
}
void Skel_ExtractFileExtension(const char *path, char *dest)
{
const char *src = path + strlen(path);
while (src != path) {
if (*(src - 1) == '.') {
break;
}
src--;
}
if (src == path) {
*dest = 0;
return;
}
strcpy(dest, src);
}
const char *Skel_ExtractFileExtension(const char *in)
{
static char exten[8];
int i;
for (i = 0; in[i] != 0; i++) {
if (in[i] == '.') {
i++;
break;
}
}
if (!in[i]) {
return "";
}
strncpy(exten, &in[i], sizeof(exten));
return exten;
}
void Skel_ExtractFileName(const char *path, char *dest)
{
const char *src = path + strlen(path);
while (src != path) {
if (*(src - 1) == '\\') {
break;
}
if (*(src - 1) == '/') {
break;
}
src--;
}
strcpy(dest, src);
}