File: tiki_script.h

package info (click to toggle)
openmohaa 0.81.1%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: trixie
  • size: 29,124 kB
  • sloc: ansic: 270,865; cpp: 250,173; sh: 234; asm: 141; xml: 64; makefile: 7
file content (152 lines) | stat: -rw-r--r-- 4,527 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
===========================================================================
Copyright (C) 2023 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
===========================================================================
*/

// tiki_script.h : TIKI script

#pragma once

#define TOKENCOMMENT  (';')
#define TOKENCOMMENT2 ('#')
#define TOKENEOL      ('\n')
//#define TOKENNULL			('\0')
#define TOKENSPACE     (' ')
#define TOKENSPECIAL   ('$')

#define TIKI_MAXTOKEN  256

#define TIKI_MAXMACROS 48

typedef struct {
    char name[TIKI_MAXTOKEN];
    char macro[TIKI_MAXTOKEN];
} tiki_macro_t;

typedef struct {
    const char *mark_script_p;
    qboolean    mark_tokenready;
    char        mark_token[TIKI_MAXTOKEN];
} tiki_mark_t;

#ifdef __cplusplus

class TikiScript
{
protected:
    qboolean          error;
    qboolean          tokenready;
    class TikiScript *include;
    class TikiScript *parent;
    char              filename[TIKI_MAXTOKEN];
    const char       *script_p;
    const char       *end_p;
    tiki_macro_t      macros[TIKI_MAXMACROS];
    int               nummacros;
    int               line;
    char              token[TIKI_MAXTOKEN];
    qboolean          releaseBuffer;
    tiki_mark_t       mark[64];
    int               mark_pos;

public:
    char                    *buffer;
    int                      length;
    char                     path[MAX_QPATH];
    static class TikiScript *currentScript;

protected:
    qboolean    AtComment();
    qboolean    AtExtendedComment();
    qboolean    AtCommand();
    qboolean    AtString(qboolean crossline);
    qboolean    ProcessCommand(qboolean crossline);
    qboolean    Completed();
    qboolean    SafeCheckOverflow();
    void        CheckOverflow();
    void        Uninclude();
    const char *FindMacro(const char *macro);
    void        AddMacro(const char *macro, const char *expansion);
    qboolean    SkipToEOL();
    void        SkipWhiteSpace(qboolean crossline);
    void        SkipNonToken(qboolean crossline);
    qboolean    CommentAvailable(qboolean crossline);
    void        SkipExtendedComment();

public:
    TikiScript();
    ~TikiScript();

    void        Close();
    const char *Filename();
    int         GetLineNumber();
    void        Reset();
    qboolean    TokenAvailable(qboolean crossline);
    void        UnGetToken();
    const char *GetToken(qboolean crossline);
    const char *GetLine(qboolean crossline);
    const char *GetAndIgnoreLine(qboolean crossline);
    const char *GetRaw();
    const char *GetString(qboolean crossline);
    qboolean    GetSpecific(const char *string);
    int         GetInteger(qboolean crossline);
    double      GetDouble(qboolean crossline);
    float       GetFloat(qboolean crossline);
    void        GetVector(qboolean crossline, float *vec);
    int         LinesInFile();
    void        Parse(char *data, int length, const char *name);
    qboolean    LoadFile(const char *name, qboolean quiet);
    const char *Token();
    void        MarkPos();
    void        ReturnToMark();
    void        ReplaceLineWithWhitespace(bool deleteFromStartOfLine);
    void        Exclude();
    const char *GetParentToken();
};

class TikiSwitchKey
{
public:
    str            sKeyName;
    str            sKeyValue;
    TikiSwitchKey *pNextKey;

    TikiSwitchKey();
};

class TikiSwitcher
{
    TikiSwitchKey *m_pSwitchKeys;

private:
    TikiSwitchKey *GetSwitchKey(const char *);
    void           RemoveUnwantedSwitchOptions(TikiScript *);

public:
    TikiSwitcher();

    void AddSwitchKey(const char *, const char *);
    void ChangeSwitchKey(const char *, const char *);
    void AddOrChangeSwitchKey(const char *, const char *);
    str& GetSwitchKeyValue(const char *);
    void PrecompileTikiScript(TikiScript *);
};

#endif