diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 351f74ff4..9fa78bba4 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,17 @@ April 8, 2008 (Changes by Graf Zahl) +- Changed XlatParseContext::FindToken to do a binary search over the + valid token names. +- Fixed: The check arrays for BlockThingsIterators were not properly + freed and each iterator allocated a new one as a result. +- Split the Xlat parser context class into a generic part that can be + used for other Lemon-based parsers in the future and a smaller + Xlat-specific part. +- Changed: P_TeleportMove now always sets BlockingLine to NULL and + P_FindFloorCeiling doesn't set it at all. The way it was set in + PIT_FindFloorCeiling didn't look correct. (Note: It's amazing how + easy it is to break P_TryMove et.al. with DECORATE if you just know + which combinations of code pointers will cause problems. This definitely + needs to be addressed.) - Changed P_FindFloorCeiling so that it doesn't need global variables anymore. I also moved the code to set the calling actor's information into this function because that's all it is used for. This also fixes diff --git a/src/p_local.h b/src/p_local.h index 7be09824b..36ba27f88 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -270,7 +270,7 @@ class FBlockThingsIterator FBlockNode *block; - static BTChecked *GetCheckArray(); + BTChecked *GetCheckArray(); void FreeCheckArray(); void StartBlock(int x, int y); diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 94723ab2d..046c00a9b 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -816,6 +816,7 @@ TDeletingArray< FBlockThingsIterator::BTChecked* > FBlockThingsIterator::FreeBTC FBlockThingsIterator::BTChecked *FBlockThingsIterator::GetCheckArray() { + dontfreecheck = false; if (FreeBTChecked.Size() != 0) { BTChecked *ret; diff --git a/src/parsecontext.cpp b/src/parsecontext.cpp new file mode 100644 index 000000000..3a801d517 --- /dev/null +++ b/src/parsecontext.cpp @@ -0,0 +1,349 @@ +/* +** parsecontext.cpp +** Base class for Lemon-based parsers +** +**--------------------------------------------------------------------------- +** Copyright 1998-2008 Randy Heit +** Copyright 2008 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include +#include +#include "w_wad.h" +#include "parsecontext.h" +#include "p_lnspec.h" + + +//========================================================================== +// +// +// +//========================================================================== +void FParseContext::AddSym (char *sym, int val) +{ + FParseSymbol syme; + syme.Value = val; + strncpy (syme.Sym, sym, 79); + syme.Sym[79]=0; + symbols.Push(syme); +} + +//========================================================================== +// +// +// +//========================================================================== +bool FParseContext::FindSym (char *sym, FParseSymbol **val) +{ + for(unsigned i=0;i= 'a' && c <= 'f') + { + buildup = (buildup<<4) + c - 'a' + 10; + } + else if (c >= 'A' && c <= 'F') + { + buildup = (buildup<<4) + c - 'A' + 10; + } + else + { + sourcep--; + yylval->val = buildup; + return TokenTrans[NUM]; + } + } + } + else + { + sourcep--; + } + } + while (isdigit (c = *sourcep++)) + { + buildup = buildup*10 + c - '0'; + } + sourcep--; + yylval->val = buildup; + return TokenTrans[NUM]; + } + if (isalpha (c)) + { + int buildup = 0; + + token[0] = c; + toksize = 1; + while (toksize < 79 && (isalnum (c = *sourcep++) || c == '_')) + { + token[toksize++] = c; + } + token[toksize] = 0; + if (toksize == 79 && isalnum (c)) + { + while (isalnum (c = *sourcep++)) + ; + } + sourcep--; + if (FindToken (token, &buildup)) + { + return buildup; + } + if (FindSym (token, &yylval->symval)) + { + return TokenTrans[SYMNUM]; + } + if ((yylval->val = P_FindLineSpecial(token)) != 0) + { + return TokenTrans[NUM]; + } + strcpy (yylval->sym, token); + return TokenTrans[SYM]; + } + if (c == '/') + { + c = *sourcep++;; + if (c == '*') + { + for (;;) + { + while ((c = *sourcep++) != '*' && c != 0) + { + if (c == '\n') + SourceLine++; + } + if (c == 0) + return 0; + if ((c = *sourcep++) == '/') + goto loop; + if (c == 0) + return 0; + sourcep--; + } + } + else if (c == '/') + { + while ((c = *sourcep++) != '\n' && c != 0) + ; + if (c == '\n') + SourceLine++; + else if (c == EOF) + return 0; + goto loop; + } + else + { + sourcep--; + return TokenTrans[DIVIDE]; + } + } + if (c == '"') + { + int tokensize = 0; + while ((c = *sourcep++) != '"' && c != 0) + { + yylval->string[tokensize++] = c; + } + yylval->string[tokensize] = 0; + return TokenTrans[STRING]; + } + if (c == '|') + { + c = *sourcep++; + if (c == '=') + return TokenTrans[OR_EQUAL]; + sourcep--; + return TokenTrans[OR]; + } + if (c == '<') + { + c = *sourcep++; + if (c == '<') + { + c = *sourcep++; + if (c == '=') + { + return TokenTrans[LSHASSIGN]; + } + sourcep--; + return 0; + } + c--; + return 0; + } + if (c == '>') + { + c = *sourcep++; + if (c == '>') + { + c = *sourcep++; + if (c == '=') + { + return TokenTrans[RSHASSIGN]; + } + sourcep--; + return 0; + } + c--; + return 0; + } + switch (c) + { + case '^': return TokenTrans[XOR]; + case '&': return TokenTrans[AND]; + case '-': return TokenTrans[MINUS]; + case '+': return TokenTrans[PLUS]; + case '*': return TokenTrans[MULTIPLY]; + case '(': return TokenTrans[LPAREN]; + case ')': return TokenTrans[RPAREN]; + case ',': return TokenTrans[COMMA]; + case '{': return TokenTrans[LBRACE]; + case '}': return TokenTrans[RBRACE]; + case '=': return TokenTrans[EQUALS]; + case ';': return TokenTrans[SEMICOLON]; + case ':': return TokenTrans[COLON]; + case '[': return TokenTrans[LBRACKET]; + case ']': return TokenTrans[RBRACKET]; + default: return 0; + } +} + +//========================================================================== +// +// +// +//========================================================================== +int FParseContext::PrintError (const char *s) +{ + if (SourceFile != NULL) + Printf ("%s, line %d: %s\n", SourceFile, SourceLine, s); + else + Printf ("%s\n", s); + return 0; +} + + +//========================================================================== +// +// +// +//========================================================================== + +void FParseContext::ParseLump(const char *lumpname) +{ + int tokentype; + int SavedSourceLine = SourceLine; + const char *SavedSourceFile = SourceFile; + FParseToken token; + + int lumpno = Wads.CheckNumForFullName(lumpname, true); + + if (lumpno == -1) + { + Printf ("%s, line %d: Lump '%s' not found\n", SourceFile, SourceLine, lumpname); + return; + } + + // Read the lump into a buffer and add a 0-terminator + int lumplen = Wads.LumpLength(lumpno); + char *lumpdata = new char[lumplen+1]; + Wads.ReadLump(lumpno, lumpdata); + lumpdata[lumplen] = 0; + + SourceLine = 0; + SourceFile = lumpname; + + char *sourcep = lumpdata; + while ( (tokentype = GetToken(sourcep, &token)) ) + { + // It is much easier to handle include statements outside the main parser. + if (tokentype == TokenTrans[INCLUDE]) + { + if (GetToken(sourcep, &token) != TokenTrans[STRING]) + { + Printf("%s, line %d: Include: String parameter expected\n", SourceFile, SourceLine); + return; + } + ParseLump(token.string); + } + else + { + Parse(pParser, tokentype, token, this); + } + } + delete [] lumpdata; + SourceLine = SavedSourceLine; + SourceFile = SavedSourceFile; +} + diff --git a/src/parsecontext.h b/src/parsecontext.h new file mode 100644 index 000000000..06ecb7539 --- /dev/null +++ b/src/parsecontext.h @@ -0,0 +1,150 @@ +/* +** parsecontext.h +** Base class for Lemon-based parsers +** +**--------------------------------------------------------------------------- +** Copyright 2008 Christoph Oelckers +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#ifndef __PARSECONTEST__H_ +#define __PARSECONTEST__H_ + +#include "tarray.h" + +// The basic tokens the parser requires the grammar to understand +enum +{ + OR =1, + XOR , + AND , + MINUS , + PLUS , + MULTIPLY , + DIVIDE , + NUM , + SYMNUM , + LPAREN , + RPAREN , + SYM , + RBRACE , + LBRACE , + COMMA , + EQUALS , + LBRACKET , + RBRACKET , + OR_EQUAL , + COLON , + SEMICOLON, + LSHASSIGN, + RSHASSIGN, + STRING , + INCLUDE , +}; + +#define DEFINE_TOKEN_TRANS(prefix) \ + static int TokenTrans[] = { \ + 0, \ + prefix##OR, \ + prefix##XOR, \ + prefix##AND, \ + prefix##MINUS, \ + prefix##PLUS, \ + prefix##MULTIPLY, \ + prefix##DIVIDE, \ + prefix##NUM, \ + prefix##SYMNUM, \ + prefix##LPAREN, \ + prefix##RPAREN, \ + prefix##SYM, \ + prefix##RBRACE, \ + prefix##LBRACE, \ + prefix##COMMA, \ + prefix##EQUALS, \ + prefix##LBRACKET, \ + prefix##RBRACKET, \ + prefix##OR_EQUAL, \ + prefix##COLON, \ + prefix##SEMICOLON, \ + prefix##LSHASSIGN, \ + prefix##RSHASSIGN, \ + prefix##STRING, \ + prefix##INCLUDE, \ + }; + + +struct FParseSymbol +{ + int Value; + char Sym[80]; +}; + +union FParseToken +{ + int val; + char sym[80]; + char string[80]; + FParseSymbol *symval; +}; + + +struct FParseContext; + +typedef void (*ParseFunc)(void *pParser, int tokentype, FParseToken token, FParseContext *context); + +struct FParseContext +{ + TArray symbols; + int SourceLine; + const char *SourceFile; + int EnumVal; + int *TokenTrans; + void *pParser; + ParseFunc Parse; + + FParseContext(void *parser, ParseFunc parse, int *tt) + { + SourceLine = 0; + SourceFile = NULL; + pParser = parser; + Parse = parse; + TokenTrans = tt; + } + + virtual ~FParseContext() {} + + void AddSym (char *sym, int val); + bool FindSym (char *sym, FParseSymbol **val); + virtual bool FindToken (char *tok, int *type) = 0; + int GetToken (char *&sourcep, FParseToken *yylval); + int PrintError (const char *s); + void ParseLump(const char *lumpname); +}; + + +#endif \ No newline at end of file diff --git a/src/xlat/parse_xlat.cpp b/src/xlat/parse_xlat.cpp index a5472f887..998fb1161 100644 --- a/src/xlat/parse_xlat.cpp +++ b/src/xlat/parse_xlat.cpp @@ -41,9 +41,21 @@ #include "p_lnspec.h" #include "info.h" #include "gi.h" +#include "parsecontext.h" #include "xlat_parser.h" #include "xlat.h" + +// Token types not used in the grammar +enum +{ + XLAT_INCLUDE=128, + XLAT_STRING, +}; + +DEFINE_TOKEN_TRANS(XLAT_) + + static FString LastTranslator; TAutoGrowArray SimpleLineTranslations; FBoomTranslator Boomish[MAX_BOOMISH]; @@ -51,27 +63,6 @@ int NumBoomish; TAutoGrowArray SectorTranslations; TArray SectorMasks; -// Token types not used in the grammar -enum -{ - INCLUDE=128, - STRING, -}; - - -struct Symbol -{ - int Value; - char Sym[80]; -}; - -union XlatToken -{ - int val; - char sym[80]; - char string[80]; - Symbol *symval; -}; struct SpecialArgs { @@ -105,49 +96,11 @@ struct ParseBoomArg }; -struct XlatParseContext +struct XlatParseContext : public FParseContext { - TArray symbols; - int SourceLine; - const char *SourceFile; - int EnumVal; - - XlatParseContext() + XlatParseContext(void *parser, ParseFunc parse, int *tt) + : FParseContext(parser, parse, tt) { - SourceLine = 0; - SourceFile = NULL; - } - - //========================================================================== - // - // - // - //========================================================================== - void AddSym (char *sym, int val) - { - Symbol syme; - syme.Value = val; - strncpy (syme.Sym, sym, 79); - syme.Sym[79]=0; - symbols.Push(syme); - } - - //========================================================================== - // - // - // - //========================================================================== - bool FindSym (char *sym, Symbol **val) - { - for(unsigned i=0;i= 0; i--) - { - if (strcmp (tok, tokens[i]) == 0) - { - *type = types[i]; - return 1; - } - } - return 0; - } + int min = 0, max = sizeof(tokens)/sizeof(tokens[0]) - 1; - //========================================================================== - // - // - // - //========================================================================== - int GetToken (char *&sourcep, XlatToken *yylval) - { - char token[80]; - int toksize; - int c; - - loop: - while (isspace (c = *sourcep++) && c != 0) + while (min <= max) { - if (c == '\n') - SourceLine++; - } - - if (c == 0) - { - return 0; - } - if (isdigit (c)) - { - int buildup = c - '0'; - if (c == '0') + int mid = (min + max) / 2; + int lexval = stricmp (tok, tokens[mid]); + if (lexval == 0) { - c = *sourcep++; - if (c == 'x' || c == 'X') - { - for (;;) - { - c = *sourcep++; - if (isdigit (c)) - { - buildup = (buildup<<4) + c - '0'; - } - else if (c >= 'a' && c <= 'f') - { - buildup = (buildup<<4) + c - 'a' + 10; - } - else if (c >= 'A' && c <= 'F') - { - buildup = (buildup<<4) + c - 'A' + 10; - } - else - { - sourcep--; - yylval->val = buildup; - return NUM; - } - } - } - else - { - sourcep--; - } + *type = types[mid]; + return true; } - while (isdigit (c = *sourcep++)) + else if (lexval > 0) { - buildup = buildup*10 + c - '0'; - } - sourcep--; - yylval->val = buildup; - return NUM; - } - if (isalpha (c)) - { - int buildup = 0; - - token[0] = c; - toksize = 1; - while (toksize < 79 && (isalnum (c = *sourcep++) || c == '_')) - { - token[toksize++] = c; - } - token[toksize] = 0; - if (toksize == 79 && isalnum (c)) - { - while (isalnum (c = *sourcep++)) - ; - } - sourcep--; - if (FindToken (token, &buildup)) - { - return buildup; - } - if (FindSym (token, &yylval->symval)) - { - return SYMNUM; - } - if ((yylval->val = P_FindLineSpecial(token)) != 0) - { - return NUM; - } - strcpy (yylval->sym, token); - return SYM; - } - if (c == '/') - { - c = *sourcep++;; - if (c == '*') - { - for (;;) - { - while ((c = *sourcep++) != '*' && c != 0) - { - if (c == '\n') - SourceLine++; - } - if (c == 0) - return 0; - if ((c = *sourcep++) == '/') - goto loop; - if (c == 0) - return 0; - sourcep--; - } - } - else if (c == '/') - { - while ((c = *sourcep++) != '\n' && c != 0) - ; - if (c == '\n') - SourceLine++; - else if (c == EOF) - return 0; - goto loop; + min = mid + 1; } else { - sourcep--; - return DIVIDE; + max = mid - 1; } } - if (c == '"') - { - int tokensize = 0; - while ((c = *sourcep++) != '"' && c != 0) - { - yylval->string[tokensize++] = c; - } - yylval->string[tokensize] = 0; - return STRING; - } - if (c == '|') - { - c = *sourcep++; - if (c == '=') - return OR_EQUAL; - sourcep--; - return OR; - } - if (c == '<') - { - c = *sourcep++; - if (c == '<') - { - c = *sourcep++; - if (c == '=') - { - return LSHASSIGN; - } - sourcep--; - return 0; - } - c--; - return 0; - } - if (c == '>') - { - c = *sourcep++; - if (c == '>') - { - c = *sourcep++; - if (c == '=') - { - return RSHASSIGN; - } - sourcep--; - return 0; - } - c--; - return 0; - } - switch (c) - { - case '^': return XOR; - case '&': return AND; - case '-': return MINUS; - case '+': return PLUS; - case '*': return MULTIPLY; - case '(': return LPAREN; - case ')': return RPAREN; - case ',': return COMMA; - case '{': return LBRACE; - case '}': return RBRACE; - case '=': return EQUALS; - case ';': return SEMICOLON; - case ':': return COLON; - case '[': return LBRACKET; - case ']': return RBRACKET; - default: return 0; - } + return false; } - - int PrintError (const char *s) - { - if (SourceFile != NULL) - Printf ("%s, line %d: %s\n", SourceFile, SourceLine, s); - else - Printf ("%s\n", s); - return 0; - } - - }; #include "xlat_parser.c" -//========================================================================== -// -// -// -//========================================================================== - -void ParseXlatLump(const char *lumpname, void *pParser, XlatParseContext *context) -{ - int tokentype; - int SavedSourceLine = context->SourceLine; - const char *SavedSourceFile = context->SourceFile; - XlatToken token; - - int lumpno = Wads.CheckNumForFullName(lumpname, true); - - if (lumpno == -1) - { - Printf ("%s, line %d: Lump '%s' not found\n", context->SourceFile, context->SourceLine, lumpname); - return; - } - - // Read the lump into a buffer and add a 0-terminator - int lumplen = Wads.LumpLength(lumpno); - char *lumpdata = new char[lumplen+1]; - Wads.ReadLump(lumpno, lumpdata); - lumpdata[lumplen] = 0; - - context->SourceLine = 0; - context->SourceFile = lumpname; - - char *sourcep = lumpdata; - while ( (tokentype = context->GetToken(sourcep, &token)) ) - { - // It is much easier to handle include statements outside the main parser. - if (tokentype == INCLUDE) - { - if (context->GetToken(sourcep, &token) != STRING) - { - Printf("%s, line %d: Include: String parameter expected\n", context->SourceFile, context->SourceLine); - return; - } - ParseXlatLump(token.string, pParser, context); - } - else - { - XlatParse(pParser, tokentype, token, context); - } - } - delete [] lumpdata; - context->SourceLine = SavedSourceLine; - context->SourceFile = SavedSourceFile; -} - //========================================================================== // @@ -476,10 +169,10 @@ void P_LoadTranslator(const char *lumpname) void *pParser = XlatParseAlloc(malloc); - XlatParseContext context; + XlatParseContext context(pParser, XlatParse, TokenTrans); - ParseXlatLump(lumpname, pParser, &context); - XlatToken tok; + context.ParseLump(lumpname); + FParseToken tok; tok.val=0; XlatParse(pParser, 0, tok, &context); XlatParseFree(pParser, free); diff --git a/src/xlat/xlat_parser.y b/src/xlat/xlat_parser.y index c43d54562..1d35ab587 100644 --- a/src/xlat/xlat_parser.y +++ b/src/xlat/xlat_parser.y @@ -1,8 +1,9 @@ -%token_type {XlatToken} +%token_prefix XLAT_ +%token_type {FParseToken} %token_destructor {} // just to avoid a compiler warning %name XlatParse -%extra_argument { XlatParseContext *context } +%extra_argument { FParseContext *context } %syntax_error { context->PrintError("syntax error");} diff --git a/zdoom.vcproj b/zdoom.vcproj index ce49f3b04..56998c3d7 100644 --- a/zdoom.vcproj +++ b/zdoom.vcproj @@ -1,7 +1,7 @@ + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + @@ -920,16 +924,6 @@ Outputs=""src/$(InputName).h"" /> - - - @@ -940,6 +934,16 @@ Outputs=""src/$(InputName).h"" /> + + + @@ -1404,6 +1408,10 @@ RelativePath=".\src\p_trace.h" > + + @@ -1530,16 +1538,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -1550,6 +1548,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + @@ -1574,16 +1582,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -1594,6 +1592,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + @@ -1618,16 +1626,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -1638,6 +1636,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + @@ -1662,16 +1670,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -1682,6 +1680,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + @@ -1706,16 +1714,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -1726,6 +1724,16 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + @@ -1886,14 +1894,6 @@ Outputs="$(IntDir)\$(InputName).obj" /> - - - @@ -1904,6 +1904,14 @@ Outputs="$(IntDir)\$(InputName).obj" /> + + + - - - @@ -2770,6 +2770,14 @@ AdditionalIncludeDirectories="src\win32;$(NoInherit)" /> + + + @@ -2928,7 +2936,7 @@ />