summaryrefslogtreecommitdiff
path: root/src/botlib/l_struct.c
diff options
context:
space:
mode:
authorTim Angus <tim@ngus.net>2006-05-16 20:41:57 +0000
committerTim Angus <tim@ngus.net>2006-05-16 20:41:57 +0000
commit5c0efda0ef811b2bafedb2b4f53b083a9b90e1b4 (patch)
tree972db3bf7fabe5293b383bb51fcb1aa74cc0e309 /src/botlib/l_struct.c
parentf68a49a146f20c7b6fc8e19dd1c4e6d58cf473e9 (diff)
* Removal of bot code
* Refactored botlib parsing code into qcommon
Diffstat (limited to 'src/botlib/l_struct.c')
-rw-r--r--src/botlib/l_struct.c463
1 files changed, 0 insertions, 463 deletions
diff --git a/src/botlib/l_struct.c b/src/botlib/l_struct.c
deleted file mode 100644
index 0dd38f58..00000000
--- a/src/botlib/l_struct.c
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
-===========================================================================
-Copyright (C) 1999-2005 Id Software, Inc.
-Copyright (C) 2000-2006 Tim Angus
-
-This file is part of Tremulous.
-
-Tremulous 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.
-
-Tremulous 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 Tremulous; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-===========================================================================
-*/
-
-/*****************************************************************************
- * name: l_struct.c
- *
- * desc: structure reading / writing
- *
- * $Archive: /MissionPack/CODE/botlib/l_struct.c $
- *
- *****************************************************************************/
-
-#ifdef BOTLIB
-#include "../qcommon/q_shared.h"
-#include "botlib.h" //for the include of be_interface.h
-#include "l_script.h"
-#include "l_precomp.h"
-#include "l_struct.h"
-#include "l_utils.h"
-#include "be_interface.h"
-#endif //BOTLIB
-
-#ifdef BSPC
-//include files for usage in the BSP Converter
-#include "../bspc/qbsp.h"
-#include "../bspc/l_log.h"
-#include "../bspc/l_mem.h"
-#include "l_precomp.h"
-#include "l_struct.h"
-
-#define qtrue true
-#define qfalse false
-#endif //BSPC
-
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-fielddef_t *FindField(fielddef_t *defs, char *name)
-{
- int i;
-
- for (i = 0; defs[i].name; i++)
- {
- if (!strcmp(defs[i].name, name)) return &defs[i];
- } //end for
- return NULL;
-} //end of the function FindField
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-qboolean ReadNumber(source_t *source, fielddef_t *fd, void *p)
-{
- token_t token;
- int negative = qfalse;
- long int intval, intmin = 0, intmax = 0;
- double floatval;
-
- if (!PC_ExpectAnyToken(source, &token)) return 0;
-
- //check for minus sign
- if (token.type == TT_PUNCTUATION)
- {
- if (fd->type & FT_UNSIGNED)
- {
- SourceError(source, "expected unsigned value, found %s", token.string);
- return 0;
- } //end if
- //if not a minus sign
- if (strcmp(token.string, "-"))
- {
- SourceError(source, "unexpected punctuation %s", token.string);
- return 0;
- } //end if
- negative = qtrue;
- //read the number
- if (!PC_ExpectAnyToken(source, &token)) return 0;
- } //end if
- //check if it is a number
- if (token.type != TT_NUMBER)
- {
- SourceError(source, "expected number, found %s", token.string);
- return 0;
- } //end if
- //check for a float value
- if (token.subtype & TT_FLOAT)
- {
- if ((fd->type & FT_TYPE) != FT_FLOAT)
- {
- SourceError(source, "unexpected float");
- return 0;
- } //end if
- floatval = token.floatvalue;
- if (negative) floatval = -floatval;
- if (fd->type & FT_BOUNDED)
- {
- if (floatval < fd->floatmin || floatval > fd->floatmax)
- {
- SourceError(source, "float out of range [%f, %f]", fd->floatmin, fd->floatmax);
- return 0;
- } //end if
- } //end if
- *(float *) p = (float) floatval;
- return 1;
- } //end if
- //
- intval = token.intvalue;
- if (negative) intval = -intval;
- //check bounds
- if ((fd->type & FT_TYPE) == FT_CHAR)
- {
- if (fd->type & FT_UNSIGNED) {intmin = 0; intmax = 255;}
- else {intmin = -128; intmax = 127;}
- } //end if
- if ((fd->type & FT_TYPE) == FT_INT)
- {
- if (fd->type & FT_UNSIGNED) {intmin = 0; intmax = 65535;}
- else {intmin = -32768; intmax = 32767;}
- } //end else if
- if ((fd->type & FT_TYPE) == FT_CHAR || (fd->type & FT_TYPE) == FT_INT)
- {
- if (fd->type & FT_BOUNDED)
- {
- intmin = Maximum(intmin, fd->floatmin);
- intmax = Minimum(intmax, fd->floatmax);
- } //end if
- if (intval < intmin || intval > intmax)
- {
- SourceError(source, "value %d out of range [%d, %d]", intval, intmin, intmax);
- return 0;
- } //end if
- } //end if
- else if ((fd->type & FT_TYPE) == FT_FLOAT)
- {
- if (fd->type & FT_BOUNDED)
- {
- if (intval < fd->floatmin || intval > fd->floatmax)
- {
- SourceError(source, "value %d out of range [%f, %f]", intval, fd->floatmin, fd->floatmax);
- return 0;
- } //end if
- } //end if
- } //end else if
- //store the value
- if ((fd->type & FT_TYPE) == FT_CHAR)
- {
- if (fd->type & FT_UNSIGNED) *(unsigned char *) p = (unsigned char) intval;
- else *(char *) p = (char) intval;
- } //end if
- else if ((fd->type & FT_TYPE) == FT_INT)
- {
- if (fd->type & FT_UNSIGNED) *(unsigned int *) p = (unsigned int) intval;
- else *(int *) p = (int) intval;
- } //end else
- else if ((fd->type & FT_TYPE) == FT_FLOAT)
- {
- *(float *) p = (float) intval;
- } //end else
- return 1;
-} //end of the function ReadNumber
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-qboolean ReadChar(source_t *source, fielddef_t *fd, void *p)
-{
- token_t token;
-
- if (!PC_ExpectAnyToken(source, &token)) return 0;
-
- //take literals into account
- if (token.type == TT_LITERAL)
- {
- StripSingleQuotes(token.string);
- *(char *) p = token.string[0];
- } //end if
- else
- {
- PC_UnreadLastToken(source);
- if (!ReadNumber(source, fd, p)) return 0;
- } //end if
- return 1;
-} //end of the function ReadChar
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-int ReadString(source_t *source, fielddef_t *fd, void *p)
-{
- token_t token;
-
- if (!PC_ExpectTokenType(source, TT_STRING, 0, &token)) return 0;
- //remove the double quotes
- StripDoubleQuotes(token.string);
- //copy the string
- strncpy((char *) p, token.string, MAX_STRINGFIELD);
- //make sure the string is closed with a zero
- ((char *)p)[MAX_STRINGFIELD-1] = '\0';
- //
- return 1;
-} //end of the function ReadString
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-int ReadStructure(source_t *source, structdef_t *def, char *structure)
-{
- token_t token;
- fielddef_t *fd;
- void *p;
- int num;
-
- if (!PC_ExpectTokenString(source, "{")) return 0;
- while(1)
- {
- if (!PC_ExpectAnyToken(source, &token)) return qfalse;
- //if end of structure
- if (!strcmp(token.string, "}")) break;
- //find the field with the name
- fd = FindField(def->fields, token.string);
- if (!fd)
- {
- SourceError(source, "unknown structure field %s", token.string);
- return qfalse;
- } //end if
- if (fd->type & FT_ARRAY)
- {
- num = fd->maxarray;
- if (!PC_ExpectTokenString(source, "{")) return qfalse;
- } //end if
- else
- {
- num = 1;
- } //end else
- p = (void *)(structure + fd->offset);
- while (num-- > 0)
- {
- if (fd->type & FT_ARRAY)
- {
- if (PC_CheckTokenString(source, "}")) break;
- } //end if
- switch(fd->type & FT_TYPE)
- {
- case FT_CHAR:
- {
- if (!ReadChar(source, fd, p)) return qfalse;
- p = (char *) p + sizeof(char);
- break;
- } //end case
- case FT_INT:
- {
- if (!ReadNumber(source, fd, p)) return qfalse;
- p = (char *) p + sizeof(int);
- break;
- } //end case
- case FT_FLOAT:
- {
- if (!ReadNumber(source, fd, p)) return qfalse;
- p = (char *) p + sizeof(float);
- break;
- } //end case
- case FT_STRING:
- {
- if (!ReadString(source, fd, p)) return qfalse;
- p = (char *) p + MAX_STRINGFIELD;
- break;
- } //end case
- case FT_STRUCT:
- {
- if (!fd->substruct)
- {
- SourceError(source, "BUG: no sub structure defined");
- return qfalse;
- } //end if
- ReadStructure(source, fd->substruct, (char *) p);
- p = (char *) p + fd->substruct->size;
- break;
- } //end case
- } //end switch
- if (fd->type & FT_ARRAY)
- {
- if (!PC_ExpectAnyToken(source, &token)) return qfalse;
- if (!strcmp(token.string, "}")) break;
- if (strcmp(token.string, ","))
- {
- SourceError(source, "expected a comma, found %s", token.string);
- return qfalse;
- } //end if
- } //end if
- } //end while
- } //end while
- return qtrue;
-} //end of the function ReadStructure
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-int WriteIndent(FILE *fp, int indent)
-{
- while(indent-- > 0)
- {
- if (fprintf(fp, "\t") < 0) return qfalse;
- } //end while
- return qtrue;
-} //end of the function WriteIndent
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-int WriteFloat(FILE *fp, float value)
-{
- char buf[128];
- int l;
-
- sprintf(buf, "%f", value);
- l = strlen(buf);
- //strip any trailing zeros
- while(l-- > 1)
- {
- if (buf[l] != '0' && buf[l] != '.') break;
- if (buf[l] == '.')
- {
- buf[l] = 0;
- break;
- } //end if
- buf[l] = 0;
- } //end while
- //write the float to file
- if (fprintf(fp, "%s", buf) < 0) return 0;
- return 1;
-} //end of the function WriteFloat
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-int WriteStructWithIndent(FILE *fp, structdef_t *def, char *structure, int indent)
-{
- int i, num;
- void *p;
- fielddef_t *fd;
-
- if (!WriteIndent(fp, indent)) return qfalse;
- if (fprintf(fp, "{\r\n") < 0) return qfalse;
-
- indent++;
- for (i = 0; def->fields[i].name; i++)
- {
- fd = &def->fields[i];
- if (!WriteIndent(fp, indent)) return qfalse;
- if (fprintf(fp, "%s\t", fd->name) < 0) return qfalse;
- p = (void *)(structure + fd->offset);
- if (fd->type & FT_ARRAY)
- {
- num = fd->maxarray;
- if (fprintf(fp, "{") < 0) return qfalse;
- } //end if
- else
- {
- num = 1;
- } //end else
- while(num-- > 0)
- {
- switch(fd->type & FT_TYPE)
- {
- case FT_CHAR:
- {
- if (fprintf(fp, "%d", *(char *) p) < 0) return qfalse;
- p = (char *) p + sizeof(char);
- break;
- } //end case
- case FT_INT:
- {
- if (fprintf(fp, "%d", *(int *) p) < 0) return qfalse;
- p = (char *) p + sizeof(int);
- break;
- } //end case
- case FT_FLOAT:
- {
- if (!WriteFloat(fp, *(float *)p)) return qfalse;
- p = (char *) p + sizeof(float);
- break;
- } //end case
- case FT_STRING:
- {
- if (fprintf(fp, "\"%s\"", (char *) p) < 0) return qfalse;
- p = (char *) p + MAX_STRINGFIELD;
- break;
- } //end case
- case FT_STRUCT:
- {
- if (!WriteStructWithIndent(fp, fd->substruct, structure, indent)) return qfalse;
- p = (char *) p + fd->substruct->size;
- break;
- } //end case
- } //end switch
- if (fd->type & FT_ARRAY)
- {
- if (num > 0)
- {
- if (fprintf(fp, ",") < 0) return qfalse;
- } //end if
- else
- {
- if (fprintf(fp, "}") < 0) return qfalse;
- } //end else
- } //end if
- } //end while
- if (fprintf(fp, "\r\n") < 0) return qfalse;
- } //end for
- indent--;
-
- if (!WriteIndent(fp, indent)) return qfalse;
- if (fprintf(fp, "}\r\n") < 0) return qfalse;
- return qtrue;
-} //end of the function WriteStructWithIndent
-//===========================================================================
-//
-// Parameter: -
-// Returns: -
-// Changes Globals: -
-//===========================================================================
-int WriteStructure(FILE *fp, structdef_t *def, char *structure)
-{
- return WriteStructWithIndent(fp, def, structure, 0);
-} //end of the function WriteStructure
-