mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-17 01:11:45 +00:00
move the script parser from qfbsp into libQFutil and correct a spelling error
This is an imperfect revision of history.
This commit is contained in:
parent
33bc7858f7
commit
25484f415b
6 changed files with 352 additions and 174 deletions
|
@ -7,9 +7,9 @@ nobase_pkginclude_HEADERS = \
|
||||||
llist.h locs.h mathlib.h mdfour.h model.h modelgen.h msg.h object.h pak.h \
|
llist.h locs.h mathlib.h mdfour.h model.h modelgen.h msg.h object.h pak.h \
|
||||||
pakfile.h pcx.h png.h plugin.h pr_comp.h pr_debug.h pr_obj.h progs.h \
|
pakfile.h pcx.h png.h plugin.h pr_comp.h pr_debug.h pr_obj.h progs.h \
|
||||||
qargs.h qdefs.h qendian.h qfplist.h qtypes.h quakefs.h quakeio.h render.h \
|
qargs.h qdefs.h qendian.h qfplist.h qtypes.h quakefs.h quakeio.h render.h \
|
||||||
riff.h ruamoko.h screen.h sizebuf.h skin.h sound.h spritegn.h sys.h \
|
riff.h ruamoko.h screen.h script.h sizebuf.h skin.h sound.h spritegn.h \
|
||||||
teamplay.h tga.h uint32.h va.h ver_check.h vid.h view.h wad.h wadfile.h \
|
sys.h teamplay.h tga.h uint32.h va.h ver_check.h vid.h view.h wad.h \
|
||||||
zone.h \
|
wadfile.h zone.h \
|
||||||
\
|
\
|
||||||
GL/ati.h GL/defines.h GL/extensions.h GL/funcs.h GL/qf_explosions.h \
|
GL/ati.h GL/defines.h GL/extensions.h GL/funcs.h GL/qf_explosions.h \
|
||||||
GL/qf_funcs_list.h GL/qf_lightmap.h GL/qf_noisetextures.h \
|
GL/qf_funcs_list.h GL/qf_lightmap.h GL/qf_noisetextures.h \
|
||||||
|
|
96
include/QF/script.h
Normal file
96
include/QF/script.h
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program 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.
|
||||||
|
|
||||||
|
This program 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 this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
See file, 'COPYING', for details.
|
||||||
|
*/
|
||||||
|
#ifndef __QF_script_h
|
||||||
|
#define __QF_script_h
|
||||||
|
|
||||||
|
/** \addtogroup utils */
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** \defgroup script Scripts
|
||||||
|
Line oriented script parsing. Multiple scripts being parsed at the same
|
||||||
|
time is supported.
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
|
||||||
|
#include "QF/qtypes.h"
|
||||||
|
|
||||||
|
typedef struct script_s {
|
||||||
|
/// The current (or next when unget is true) token
|
||||||
|
struct dstring_s *token;
|
||||||
|
/// True if the last token has been pushed back.
|
||||||
|
qboolean unget;
|
||||||
|
/// current position within the script
|
||||||
|
const char *p;
|
||||||
|
/// name of the file being processed. used only for error reporting
|
||||||
|
const char *file;
|
||||||
|
/// line number of the file being processed. used only for error reporting
|
||||||
|
/// but updated internally.
|
||||||
|
int line;
|
||||||
|
/// if set, will be called instead of the internal error handler
|
||||||
|
void (*error)(struct script_s *script, const char *msg);
|
||||||
|
/// if set, multi line quoted tokens will be treated as errors
|
||||||
|
int no_quote_lines;
|
||||||
|
} script_t;
|
||||||
|
|
||||||
|
/** Return a new script_t object.
|
||||||
|
\return A new, blank, script object. Use Script_Start() to initialize.
|
||||||
|
*/
|
||||||
|
script_t *Script_New (void);
|
||||||
|
|
||||||
|
/** Delete a script_t object.
|
||||||
|
\param script The script_t object to be deleted
|
||||||
|
Does not free the memory passed to Script_Start().
|
||||||
|
*/
|
||||||
|
void Script_Delete (script_t *script);
|
||||||
|
|
||||||
|
/** Prepare a script_t object for parsing.
|
||||||
|
The caller is responsible for freeing the memory associated with file and
|
||||||
|
data when parsing is complete.
|
||||||
|
\param script The script_t object being parsed
|
||||||
|
\param file Name of the file being parsed. used only for error reporting
|
||||||
|
\param data The script to be parsed
|
||||||
|
*/
|
||||||
|
void Script_Start (script_t *script, const char *file, const char *data);
|
||||||
|
|
||||||
|
/** Check if a new token is available.
|
||||||
|
\param script The script_t object being parsed
|
||||||
|
\param crossline True to allow passing \n
|
||||||
|
\return True if a token is available, false if end of file
|
||||||
|
or end of line (if crossline is false) has been hit
|
||||||
|
*/
|
||||||
|
qboolean Script_TokenAvailable (script_t *script, qboolean crossline);
|
||||||
|
|
||||||
|
/** Get the next token. Generates an error and exits the program if no token
|
||||||
|
is available and crossline is false.
|
||||||
|
\param script The script_t object being parsed
|
||||||
|
\param crossline True to allow passing \n
|
||||||
|
\return True on success, false on failure (no token available)
|
||||||
|
*/
|
||||||
|
qboolean Script_GetToken (script_t *script, qboolean crossline);
|
||||||
|
|
||||||
|
/** Unget the current token. Only one level of unget is supported.
|
||||||
|
\param script The script_t object being parsed
|
||||||
|
*/
|
||||||
|
void Script_UngetToken (script_t *script);
|
||||||
|
|
||||||
|
//@}
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#endif//__QF_script_h
|
|
@ -38,7 +38,7 @@ libQFutil_la_SOURCES= \
|
||||||
bspfile.c buildnum.c cbuf.c checksum.c cmd.c crc.c cvar.c dstring.c \
|
bspfile.c buildnum.c cbuf.c checksum.c cmd.c crc.c cvar.c dstring.c \
|
||||||
fendian.c hash.c idparse.c info.c link.c llist.c \
|
fendian.c hash.c idparse.c info.c link.c llist.c \
|
||||||
mathlib.c mdfour.c msg.c pakfile.c plugin.c qargs.c qendian.c \
|
mathlib.c mdfour.c msg.c pakfile.c plugin.c qargs.c qendian.c \
|
||||||
qfplist.c quakefs.c quakeio.c riff.c sizebuf.c string.c sys.c \
|
qfplist.c quakefs.c quakeio.c riff.c script.c sizebuf.c string.c sys.c \
|
||||||
va.c ver_check.c wad.c wadfile.c zone.c $(fnmatch) $(getopt)
|
va.c ver_check.c wad.c wadfile.c zone.c $(fnmatch) $(getopt)
|
||||||
|
|
||||||
EXTRA_DIST= $(fnmatch_src) $(getopt_src)
|
EXTRA_DIST= $(fnmatch_src) $(getopt_src)
|
||||||
|
|
173
libs/util/script.c
Normal file
173
libs/util/script.c
Normal file
|
@ -0,0 +1,173 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program 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.
|
||||||
|
|
||||||
|
This program 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 this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
See file, 'COPYING', for details.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static __attribute__ ((unused)) const char rcsid[] =
|
||||||
|
"$Id$";
|
||||||
|
|
||||||
|
#ifdef HAVE_STRING_H
|
||||||
|
# include <string.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_STRINGS_H
|
||||||
|
# include <strings.h>
|
||||||
|
#endif
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "QF/dstring.h"
|
||||||
|
#include "QF/script.h"
|
||||||
|
|
||||||
|
static void __attribute__ ((format (printf, 2, 3), noreturn))
|
||||||
|
script_error (script_t *script, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
va_start (args, fmt);
|
||||||
|
fprintf (stderr, "%s:%d: ", script->file, script->line);
|
||||||
|
vfprintf (stderr, fmt, args);
|
||||||
|
fprintf (stderr, "\n");
|
||||||
|
va_end (args);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
script_t *
|
||||||
|
Script_New (void)
|
||||||
|
{
|
||||||
|
script_t *script = calloc (1, sizeof (script_t));
|
||||||
|
script->token = dstring_newstr ();
|
||||||
|
return script;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Script_Delete (script_t *script)
|
||||||
|
{
|
||||||
|
dstring_delete (script->token);
|
||||||
|
free (script);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Script_Start (script_t *script, const char *file, const char *data)
|
||||||
|
{
|
||||||
|
script->line = 1;
|
||||||
|
script->file = file;
|
||||||
|
script->p = data;
|
||||||
|
script->unget = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
qboolean
|
||||||
|
Script_TokenAvailable (script_t *script, qboolean crossline)
|
||||||
|
{
|
||||||
|
if (script->unget)
|
||||||
|
return true;
|
||||||
|
skipspace:
|
||||||
|
while (isspace ((unsigned char) *script->p)) {
|
||||||
|
if (*script->p == '\n') {
|
||||||
|
if (!crossline)
|
||||||
|
return false;
|
||||||
|
script->line++;
|
||||||
|
}
|
||||||
|
script->p++;
|
||||||
|
}
|
||||||
|
if (!*script->p)
|
||||||
|
return false;
|
||||||
|
if (*script->p == 26 || *script->p == 4) {
|
||||||
|
// end of file characters
|
||||||
|
script->p++;
|
||||||
|
goto skipspace;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (script->p[0] == '/' && script->p[1] == '/') {
|
||||||
|
// comment field
|
||||||
|
while (*script->p && *script->p != '\n')
|
||||||
|
script->p++;
|
||||||
|
if (!*script->p)
|
||||||
|
return false;
|
||||||
|
if (!crossline)
|
||||||
|
return false;
|
||||||
|
goto skipspace;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
qboolean
|
||||||
|
Script_GetToken (script_t *script, qboolean crossline)
|
||||||
|
{
|
||||||
|
const char *token_p;
|
||||||
|
|
||||||
|
if (script->unget) { // is a token allready waiting?
|
||||||
|
script->unget = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Script_TokenAvailable (script, crossline)) {
|
||||||
|
if (!crossline) {
|
||||||
|
if (script->error)
|
||||||
|
script->error (script, "line is incomplete");
|
||||||
|
else
|
||||||
|
script_error (script, "line is incomplete");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy token
|
||||||
|
if (*script->p == '"') {
|
||||||
|
int start_line = script->line;
|
||||||
|
script->p++;
|
||||||
|
token_p = script->p;
|
||||||
|
while (*script->p != '"') {
|
||||||
|
if (!*script->p) {
|
||||||
|
script->line = start_line;
|
||||||
|
if (script->error)
|
||||||
|
script->error (script, "EOF inside quoted token");
|
||||||
|
else
|
||||||
|
script_error (script, "EOF inside quoted token");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (*script->p == '\n') {
|
||||||
|
if (script->no_quote_lines) {
|
||||||
|
if (script->error)
|
||||||
|
script->error (script, "EOL inside quoted token");
|
||||||
|
else
|
||||||
|
script_error (script, "EOL inside quoted token");
|
||||||
|
}
|
||||||
|
script->line++;
|
||||||
|
}
|
||||||
|
script->p++;
|
||||||
|
}
|
||||||
|
dstring_copysubstr (script->token, token_p, script->p - token_p);
|
||||||
|
script->p++;
|
||||||
|
} else {
|
||||||
|
token_p = script->p;
|
||||||
|
while (*script->p && !isspace ((unsigned char) *script->p))
|
||||||
|
script->p++;
|
||||||
|
dstring_copysubstr (script->token, token_p, script->p - token_p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Script_UngetToken (script_t *script)
|
||||||
|
{
|
||||||
|
script->unget = true;
|
||||||
|
}
|
|
@ -287,7 +287,7 @@ CopyFacesToOutside (brush_t *b)
|
||||||
/*
|
/*
|
||||||
CSGFaces
|
CSGFaces
|
||||||
|
|
||||||
Returns a list of surfaces containing aall of the faces
|
Returns a list of surfaces containing all of the faces
|
||||||
*/
|
*/
|
||||||
surface_t *
|
surface_t *
|
||||||
CSGFaces (brushset_t *bs)
|
CSGFaces (brushset_t *bs)
|
||||||
|
|
|
@ -36,6 +36,7 @@ static __attribute__ ((unused)) const char rcsid[] =
|
||||||
|
|
||||||
#include "QF/dstring.h"
|
#include "QF/dstring.h"
|
||||||
#include "QF/quakefs.h"
|
#include "QF/quakefs.h"
|
||||||
|
#include "QF/script.h"
|
||||||
#include "QF/sys.h"
|
#include "QF/sys.h"
|
||||||
#include "QF/va.h"
|
#include "QF/va.h"
|
||||||
|
|
||||||
|
@ -53,11 +54,7 @@ char miptex[MAX_MAP_TEXINFO][16];
|
||||||
|
|
||||||
int numdetailbrushes;
|
int numdetailbrushes;
|
||||||
|
|
||||||
dstring_t token = {&dstring_default_mem};
|
script_t *map;
|
||||||
qboolean unget;
|
|
||||||
char *script_p;
|
|
||||||
const char *script_file;
|
|
||||||
int script_line;
|
|
||||||
|
|
||||||
static void __attribute__ ((format (printf, 1, 2), noreturn))
|
static void __attribute__ ((format (printf, 1, 2), noreturn))
|
||||||
map_error (const char *fmt, ...)
|
map_error (const char *fmt, ...)
|
||||||
|
@ -65,7 +62,7 @@ map_error (const char *fmt, ...)
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
va_start (args, fmt);
|
va_start (args, fmt);
|
||||||
fprintf (stderr, "%s:%d: ", script_file, script_line);
|
fprintf (stderr, "%s:%d: ", map->file, map->line);
|
||||||
vfprintf (stderr, fmt, args);
|
vfprintf (stderr, fmt, args);
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
va_end (args);
|
va_end (args);
|
||||||
|
@ -133,95 +130,6 @@ FindTexinfo (texinfo_t *t)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
StartTokenParsing (char *data)
|
|
||||||
{
|
|
||||||
script_line = 1;
|
|
||||||
script_p = data;
|
|
||||||
unget = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static qboolean
|
|
||||||
TokenAvailable (qboolean crossline)
|
|
||||||
{
|
|
||||||
if (unget)
|
|
||||||
return true;
|
|
||||||
skipspace:
|
|
||||||
while (isspace ((unsigned char) *script_p)) {
|
|
||||||
if (*script_p == '\n') {
|
|
||||||
if (!crossline)
|
|
||||||
return false;
|
|
||||||
script_line++;
|
|
||||||
}
|
|
||||||
script_p++;
|
|
||||||
}
|
|
||||||
if (!*script_p)
|
|
||||||
return false;
|
|
||||||
if (*script_p == 26 || *script_p == 4) { // end of file characters
|
|
||||||
script_p++;
|
|
||||||
goto skipspace;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (script_p[0] == '/' && script_p[1] == '/') { // comment field
|
|
||||||
while (*script_p && *script_p != '\n')
|
|
||||||
script_p++;
|
|
||||||
if (!*script_p)
|
|
||||||
return false;
|
|
||||||
if (!crossline)
|
|
||||||
return false;
|
|
||||||
goto skipspace;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static qboolean
|
|
||||||
GetToken (qboolean crossline)
|
|
||||||
{
|
|
||||||
char *token_p;
|
|
||||||
|
|
||||||
if (unget) { // is a token allready waiting?
|
|
||||||
unget = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!TokenAvailable (crossline)) {
|
|
||||||
if (!crossline)
|
|
||||||
map_error ("line is incomplete");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// copy token
|
|
||||||
if (*script_p == '"') {
|
|
||||||
script_p++;
|
|
||||||
token_p = script_p;
|
|
||||||
while (*script_p != '"') {
|
|
||||||
if (!*script_p)
|
|
||||||
map_error ("EOF inside quoted token");
|
|
||||||
if (*script_p == '\n')
|
|
||||||
script_line++;
|
|
||||||
script_p++;
|
|
||||||
}
|
|
||||||
dstring_copysubstr (&token, token_p, script_p - token_p);
|
|
||||||
script_p++;
|
|
||||||
} else {
|
|
||||||
token_p = script_p;
|
|
||||||
while (*script_p && !isspace ((unsigned char) *script_p))
|
|
||||||
script_p++;
|
|
||||||
dstring_copysubstr (&token, token_p, script_p - token_p);
|
|
||||||
}
|
|
||||||
|
|
||||||
*token_p = 0;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
UngetToken (void)
|
|
||||||
{
|
|
||||||
unget = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
entity_t *mapent;
|
entity_t *mapent;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -234,9 +142,9 @@ ParseEpair (void)
|
||||||
e->next = mapent->epairs;
|
e->next = mapent->epairs;
|
||||||
mapent->epairs = e;
|
mapent->epairs = e;
|
||||||
|
|
||||||
e->key = strdup (token.str);
|
e->key = strdup (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
e->value = strdup (token.str);
|
e->value = strdup (map->token->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3_t baseaxis[18] = {
|
vec3_t baseaxis[18] = {
|
||||||
|
@ -275,18 +183,18 @@ ParseVerts (int *n_verts)
|
||||||
vec3_t *verts;
|
vec3_t *verts;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (token.str[0] != ':')
|
if (map->token->str[0] != ':')
|
||||||
map_error ("parsing brush");
|
map_error ("parsing brush");
|
||||||
*n_verts = atoi (token.str + 1);
|
*n_verts = atoi (map->token->str + 1);
|
||||||
verts = malloc (sizeof (vec3_t) * *n_verts);
|
verts = malloc (sizeof (vec3_t) * *n_verts);
|
||||||
|
|
||||||
for (i = 0; i < *n_verts; i++) {
|
for (i = 0; i < *n_verts; i++) {
|
||||||
GetToken (true);
|
Script_GetToken (map, true);
|
||||||
verts[i][0] = atof (token.str);
|
verts[i][0] = atof (map->token->str);
|
||||||
GetToken (true);
|
Script_GetToken (map, true);
|
||||||
verts[i][1] = atof (token.str);
|
verts[i][1] = atof (map->token->str);
|
||||||
GetToken (true);
|
Script_GetToken (map, true);
|
||||||
verts[i][2] = atof (token.str);
|
verts[i][2] = atof (map->token->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
return verts;
|
return verts;
|
||||||
|
@ -312,45 +220,45 @@ ParseBrush (void)
|
||||||
b->next = mapent->brushes;
|
b->next = mapent->brushes;
|
||||||
mapent->brushes = b;
|
mapent->brushes = b;
|
||||||
|
|
||||||
GetToken (true);
|
Script_GetToken (map, true);
|
||||||
if (strcmp (token.str, "(") != 0) {
|
if (strcmp (map->token->str, "(") != 0) {
|
||||||
verts = ParseVerts (&n_verts);
|
verts = ParseVerts (&n_verts);
|
||||||
} else {
|
} else {
|
||||||
UngetToken ();
|
Script_UngetToken (map);
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (!GetToken (true))
|
if (!Script_GetToken (map, true))
|
||||||
break;
|
break;
|
||||||
if (!strcmp (token.str, "}"))
|
if (!strcmp (map->token->str, "}"))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (verts) {
|
if (verts) {
|
||||||
int n_v, v;
|
int n_v, v;
|
||||||
n_v = atoi (token.str);
|
n_v = atoi (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
for (i = 0; i < n_v; i++) {
|
for (i = 0; i < n_v; i++) {
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
v = atof (token.str);
|
v = atof (map->token->str);
|
||||||
if (i < 3)
|
if (i < 3)
|
||||||
VectorCopy (verts[v], planepts[i]);
|
VectorCopy (verts[v], planepts[i]);
|
||||||
}
|
}
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
} else {
|
} else {
|
||||||
// read the three point plane definition
|
// read the three point plane definition
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3; i++) {
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
GetToken (true);
|
Script_GetToken (map, true);
|
||||||
if (strcmp (token.str, "("))
|
if (strcmp (map->token->str, "("))
|
||||||
map_error ("parsing brush");
|
map_error ("parsing brush");
|
||||||
|
|
||||||
for (j = 0; j < 3; j++) {
|
for (j = 0; j < 3; j++) {
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
planepts[i][j] = atof (token.str);
|
planepts[i][j] = atof (map->token->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
if (strcmp (token.str, ")"))
|
if (strcmp (map->token->str, ")"))
|
||||||
map_error ("parsing brush");
|
map_error ("parsing brush");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -364,53 +272,53 @@ ParseBrush (void)
|
||||||
|
|
||||||
// read the texturedef
|
// read the texturedef
|
||||||
memset (&tx, 0, sizeof (tx));
|
memset (&tx, 0, sizeof (tx));
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
tx.miptex = FindMiptex (token.str);
|
tx.miptex = FindMiptex (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
if ((hltexdef = !strcmp (token.str, "["))) {
|
if ((hltexdef = !strcmp (map->token->str, "["))) {
|
||||||
// S vector
|
// S vector
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[0][0] = atof (token.str);
|
vecs[0][0] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[0][1] = atof (token.str);
|
vecs[0][1] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[0][2] = atof (token.str);
|
vecs[0][2] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[0][3] = atof (token.str);
|
vecs[0][3] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
if (strcmp (token.str, "]"))
|
if (strcmp (map->token->str, "]"))
|
||||||
map_error ("missing ]");
|
map_error ("missing ]");
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
if (strcmp (token.str, "["))
|
if (strcmp (map->token->str, "["))
|
||||||
map_error ("missing [");
|
map_error ("missing [");
|
||||||
// T vector
|
// T vector
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[1][0] = atof (token.str);
|
vecs[1][0] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[1][1] = atof (token.str);
|
vecs[1][1] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[1][2] = atof (token.str);
|
vecs[1][2] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[1][3] = atof (token.str);
|
vecs[1][3] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
if (strcmp (token.str, "]"))
|
if (strcmp (map->token->str, "]"))
|
||||||
map_error ("missing ]");
|
map_error ("missing ]");
|
||||||
} else {
|
} else {
|
||||||
vecs[0][3] = atof (token.str);
|
vecs[0][3] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
vecs[1][3] = atof (token.str);
|
vecs[1][3] = atof (map->token->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
rotate = atof (token.str);
|
rotate = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
scale[0] = atof (token.str);
|
scale[0] = atof (map->token->str);
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
scale[1] = atof (token.str);
|
scale[1] = atof (map->token->str);
|
||||||
|
|
||||||
while (TokenAvailable (false)) {
|
while (Script_TokenAvailable (map, false)) {
|
||||||
GetToken (false);
|
Script_GetToken (map, false);
|
||||||
if (!strcmp (token.str, "detail"))
|
if (!strcmp (map->token->str, "detail"))
|
||||||
b->detail = 1;
|
b->detail = 1;
|
||||||
else
|
else
|
||||||
map_error ("parse error");
|
map_error ("parse error");
|
||||||
|
@ -435,7 +343,7 @@ ParseBrush (void)
|
||||||
|
|
||||||
if (DotProduct (plane.normal, plane.normal) < 0.1) {
|
if (DotProduct (plane.normal, plane.normal) < 0.1) {
|
||||||
printf ("WARNING: brush plane with no normal on line %d\n",
|
printf ("WARNING: brush plane with no normal on line %d\n",
|
||||||
script_line);
|
map->line);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -509,10 +417,10 @@ ParseBrush (void)
|
||||||
static qboolean
|
static qboolean
|
||||||
ParseEntity (void)
|
ParseEntity (void)
|
||||||
{
|
{
|
||||||
if (!GetToken (true))
|
if (!Script_GetToken (map, true))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (strcmp (token.str, "{"))
|
if (strcmp (map->token->str, "{"))
|
||||||
map_error ("ParseEntity: { not found");
|
map_error ("ParseEntity: { not found");
|
||||||
|
|
||||||
if (num_entities == MAX_MAP_ENTITIES)
|
if (num_entities == MAX_MAP_ENTITIES)
|
||||||
|
@ -522,11 +430,11 @@ ParseEntity (void)
|
||||||
num_entities++;
|
num_entities++;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (!GetToken (true))
|
if (!Script_GetToken (map, true))
|
||||||
map_error ("ParseEntity: EOF without closing brace");
|
map_error ("ParseEntity: EOF without closing brace");
|
||||||
if (!strcmp (token.str, "}"))
|
if (!strcmp (map->token->str, "}"))
|
||||||
break;
|
break;
|
||||||
if (!strcmp (token.str, "{"))
|
if (!strcmp (map->token->str, "{"))
|
||||||
ParseBrush ();
|
ParseBrush ();
|
||||||
else
|
else
|
||||||
ParseEpair ();
|
ParseEpair ();
|
||||||
|
@ -572,15 +480,16 @@ LoadMapFile (const char *filename)
|
||||||
buf[bytes] = 0;
|
buf[bytes] = 0;
|
||||||
Qclose (file);
|
Qclose (file);
|
||||||
|
|
||||||
script_file = filename;
|
map = Script_New ();
|
||||||
|
Script_Start (map, filename, buf);
|
||||||
StartTokenParsing (buf);
|
|
||||||
|
|
||||||
num_entities = 0;
|
num_entities = 0;
|
||||||
|
|
||||||
while (ParseEntity ()) {
|
while (ParseEntity ()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Script_Delete (map);
|
||||||
|
map = 0;
|
||||||
free (buf);
|
free (buf);
|
||||||
|
|
||||||
qprintf ("--- LoadMapFile ---\n");
|
qprintf ("--- LoadMapFile ---\n");
|
||||||
|
|
Loading…
Reference in a new issue