openmohaa/code/qcommon/script.h

182 lines
5 KiB
C
Raw Permalink Normal View History

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)
2023-07-05 21:23:39 +02:00
# include "../fgame/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')
2023-07-05 21:23:39 +02:00
#define TOKENSPACE (' ')
#define TOKENSPECIAL ('$')
2023-02-04 19:56:06 +01:00
2023-07-05 21:23:39 +02:00
#define SCRIPT_MAXTOKEN 512
2023-02-04 19:56:06 +01:00
typedef struct {
qboolean tokenready;
2023-07-05 21:23:39 +02:00
int offset;
int line;
char token[SCRIPT_MAXTOKEN];
2023-02-04 19:56:06 +01:00
} 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-07-05 21:23:39 +02:00
str filename;
const char *script_p;
const char *end_p;
Container<macro *> macrolist;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
int line;
char token[SCRIPT_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);
2023-07-05 21:23:39 +02:00
void CheckOverflow(void);
2016-03-27 11:49:47 +02:00
2023-02-04 19:56:06 +01:00
public:
2023-07-05 21:23:39 +02:00
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();
2023-07-05 21:23:39 +02:00
Script(const char *filename);
2023-02-04 19:56:06 +01:00
Script();
2023-07-05 21:23:39 +02:00
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);
2023-02-04 19:56:06 +01:00
qboolean EndOfFile();
qboolean isValid(void);
2023-07-05 21:23:39 +02:00
Container<macro *> *GetMacroList() { return &macrolist; }
void AddMacro(const char *name, const char *value);
2023-02-04 19:56:06 +01:00
};
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