2016-03-27 11:49:47 +02:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
Copyright (C) 2015 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
|
|
|
|
===========================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
// script.h: C++ implementation of tokenization/interpretation.
|
|
|
|
|
|
|
|
#ifndef __SCRIPT_H__
|
|
|
|
#define __SCRIPT_H__
|
|
|
|
|
|
|
|
#include "class.h"
|
|
|
|
#include "vector.h"
|
|
|
|
#include "str.h"
|
2023-01-29 20:59:31 +01:00
|
|
|
|
|
|
|
#if defined(ARCHIVE_SUPPORTED)
|
2016-03-27 11:49:47 +02:00
|
|
|
#include "archive.h"
|
2023-01-29 20:59:31 +01:00
|
|
|
#endif
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
#define TOKENCOMMENT (';')
|
|
|
|
#define TOKENCOMMENT2 ('#')
|
|
|
|
#define TOKENEOL ('\n')
|
|
|
|
// #define TOKENNULL ('\0')
|
|
|
|
#define TOKENSPACE (' ')
|
|
|
|
#define TOKENSPECIAL ('$')
|
|
|
|
|
|
|
|
#define MAXTOKEN 512
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
qboolean tokenready;
|
|
|
|
int offset;
|
|
|
|
int line;
|
|
|
|
char token[MAXTOKEN];
|
|
|
|
} scriptmarker_t;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
// const char *macroName;
|
|
|
|
// const char *macroText;
|
|
|
|
str macroName;
|
|
|
|
str macroText;
|
|
|
|
} macro;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
class Script : public Class
|
2023-02-04 19:56:06 +01:00
|
|
|
{
|
|
|
|
protected:
|
|
|
|
qboolean tokenready;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
str filename;
|
|
|
|
const char* script_p;
|
|
|
|
const char* end_p;
|
|
|
|
Container<macro*> macrolist;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
int line;
|
|
|
|
char token[MAXTOKEN];
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
qboolean releaseBuffer;
|
|
|
|
qboolean hasError;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
qboolean AtComment(void);
|
|
|
|
void CheckOverflow(void);
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
public:
|
|
|
|
const char* buffer;
|
|
|
|
size_t length;
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
CLASS_PROTOTYPE(Script);
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-01-29 20:59:31 +01:00
|
|
|
#if defined(ARCHIVE_SUPPORTED)
|
2023-02-04 19:56:06 +01:00
|
|
|
void Archive(Archiver& arc) override;
|
2023-01-29 20:59:31 +01:00
|
|
|
#endif
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
~Script();
|
|
|
|
Script(const char* filename);
|
|
|
|
Script();
|
|
|
|
|
|
|
|
void Close(void);
|
|
|
|
const char* Filename(void);
|
|
|
|
int GetLineNumber(void);
|
|
|
|
void Reset(void);
|
|
|
|
void MarkPosition(scriptmarker_t* mark);
|
|
|
|
void RestorePosition(const scriptmarker_t* mark);
|
|
|
|
qboolean SkipToEOL(void);
|
|
|
|
void SkipWhiteSpace(qboolean crossline);
|
|
|
|
void SkipNonToken(qboolean crossline);
|
|
|
|
qboolean TokenAvailable(qboolean crossline);
|
|
|
|
qboolean CommentAvailable(qboolean crossline);
|
|
|
|
void UnGetToken(void);
|
|
|
|
qboolean AtString(qboolean crossline);
|
|
|
|
qboolean AtOpenParen(qboolean crossline);
|
|
|
|
qboolean AtCloseParen(qboolean crossline);
|
|
|
|
qboolean AtComma(qboolean crossline);
|
|
|
|
qboolean AtDot(qboolean crossline);
|
|
|
|
qboolean AtAssignment(qboolean crossline);
|
|
|
|
const char* GetToken(qboolean crossline);
|
|
|
|
const char* GetLine(qboolean crossline);
|
|
|
|
const char* GetRaw(void);
|
|
|
|
const char* GetString(qboolean crossline);
|
|
|
|
qboolean GetSpecific(const char* string);
|
|
|
|
qboolean GetBoolean(qboolean crossline);
|
|
|
|
int GetInteger(qboolean crossline);
|
|
|
|
double GetDouble(qboolean crossline);
|
|
|
|
float GetFloat(qboolean crossline);
|
|
|
|
Vector GetVector(qboolean crossline);
|
|
|
|
int LinesInFile(void);
|
|
|
|
void Parse(const char* data, size_t length, const char* name);
|
|
|
|
void LoadFile(const char* name);
|
|
|
|
void LoadFile(const char* name, int length, const char* buf);
|
|
|
|
const char* Token(void);
|
|
|
|
void AddMacroDefinition(qboolean crossline);
|
|
|
|
const char* GetMacroString(const char* theMacroName);
|
|
|
|
char* EvaluateMacroString(const char* theMacroString);
|
|
|
|
float EvaluateMacroMath(float value, float newval, char oper);
|
|
|
|
const char* GetExprToken(const char* ptr, char* token);
|
|
|
|
const char* GrabNextToken(qboolean crossline);
|
|
|
|
qboolean isMacro(void);
|
|
|
|
|
|
|
|
qboolean EndOfFile();
|
|
|
|
qboolean isValid(void);
|
|
|
|
|
|
|
|
Container<macro*>* GetMacroList() { return ¯olist; }
|
|
|
|
void AddMacro(const char* name, const char* value);
|
|
|
|
};
|
2016-03-27 11:49:47 +02:00
|
|
|
|
2023-01-29 20:59:31 +01:00
|
|
|
#if defined(ARCHIVE_SUPPORTED)
|
|
|
|
|
2023-02-04 19:56:06 +01:00
|
|
|
inline void Script::Archive(Archiver& arc)
|
|
|
|
{
|
|
|
|
int pos;
|
|
|
|
|
|
|
|
arc.ArchiveBoolean(&tokenready);
|
|
|
|
|
|
|
|
arc.ArchiveString(&filename);
|
|
|
|
if (arc.Loading()) {
|
|
|
|
//
|
|
|
|
// load the file in
|
|
|
|
//
|
|
|
|
LoadFile(filename.c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!arc.Loading()) {
|
|
|
|
//
|
|
|
|
// save out current pointer as an offset
|
|
|
|
//
|
|
|
|
pos = script_p - buffer;
|
|
|
|
}
|
|
|
|
arc.ArchiveInteger(&pos);
|
|
|
|
if (arc.Loading()) {
|
|
|
|
//
|
|
|
|
// restore the script pointer
|
|
|
|
//
|
|
|
|
script_p = buffer + pos;
|
|
|
|
}
|
|
|
|
|
|
|
|
// const char *end_p;
|
|
|
|
// Container<macro *> macrolist;
|
|
|
|
|
|
|
|
arc.ArchiveInteger(&line);
|
|
|
|
arc.ArchiveRaw(&token, sizeof(token));
|
|
|
|
|
|
|
|
// qboolean releaseBuffer;
|
|
|
|
}
|
2023-01-29 20:59:31 +01:00
|
|
|
#endif
|
2016-03-27 11:49:47 +02:00
|
|
|
|
|
|
|
#endif
|