mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 02:45:41 +00:00
fixed bug that was requiring a ; after a function definition
svn path=/trunk/; revision=6550
This commit is contained in:
parent
261cc33f7f
commit
5cfbea5fee
2 changed files with 144 additions and 50 deletions
|
@ -23,6 +23,16 @@
|
|||
#include "Type.h"
|
||||
#include "Header.h"
|
||||
|
||||
#define TOKASSERT(x) \
|
||||
if(!(x))\
|
||||
{\
|
||||
printf("ASSERT FAILURE: (%s) at %s:%i\n", #x, __FILE__, __LINE__);\
|
||||
printf("WHILE PROCESSING: \n");\
|
||||
for ( int ajf83pfj = 0; ajf83pfj < tokens.size(); ajf83pfj++ )\
|
||||
printf("%s ", tokens[ajf83pfj].c_str() );\
|
||||
printf("\n");\
|
||||
_CrtDbgBreak();\
|
||||
}
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
||||
|
@ -40,21 +50,8 @@ int parse_variable ( const vector<string>& tokens, int off, vector<string>& name
|
|||
int parse_struct ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies );
|
||||
int parse_function ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies );
|
||||
int parse_function_ptr ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies );
|
||||
|
||||
/*
|
||||
#ifndef ASSERT
|
||||
#define ASSERT(x) \
|
||||
do \
|
||||
{ \
|
||||
if ( !(x) ) \
|
||||
{ \
|
||||
printf("%s:%i - ASSERTION FAILURE: \"%s\"\n", __FILE__, __LINE__, #x); \
|
||||
getch(); \
|
||||
exit(0); \
|
||||
} \
|
||||
}while(0)
|
||||
#endif//ASSERT
|
||||
*/
|
||||
int parse_ifwhile ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies );
|
||||
int parse_do ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies );
|
||||
|
||||
bool is_libc_include ( const string& inc )
|
||||
{
|
||||
|
@ -80,6 +77,7 @@ BOOL FileEnumProc ( PWIN32_FIND_DATA pwfd, const char* filename, long lParam )
|
|||
|
||||
void main()
|
||||
{
|
||||
//import_file ( "test.h" );
|
||||
EnumFilesInDirectory ( "c:/cvs/reactos/apps/utils/sdkparse/include", "*.h", FileEnumProc, 0, TRUE, FALSE );
|
||||
}
|
||||
|
||||
|
@ -97,7 +95,7 @@ bool import_file ( const char* filename )
|
|||
if ( !File::LoadIntoString ( s, filename ) )
|
||||
{
|
||||
printf ( "Couldn't load \"%s\" for input.\n", filename );
|
||||
exit(0);
|
||||
ASSERT(0);
|
||||
}
|
||||
|
||||
printf ( "%s\n", filename );
|
||||
|
@ -125,6 +123,8 @@ bool import_file ( const char* filename )
|
|||
if ( *p == '#' )
|
||||
{
|
||||
char* end = strchr ( p, '\n' );
|
||||
while ( end && end[-1] == '\\' )
|
||||
end = strchr ( end+1, '\n' );
|
||||
if ( !end )
|
||||
end = p + strlen(p);
|
||||
string element ( p, end-p );
|
||||
|
@ -144,14 +144,11 @@ bool import_file ( const char* filename )
|
|||
{
|
||||
bool externc = false;
|
||||
char* end = findend ( p, externc );
|
||||
ASSERT(end);
|
||||
if ( externc )
|
||||
h->externc = true;
|
||||
else
|
||||
{
|
||||
if ( !end )
|
||||
end = p + strlen(p);
|
||||
else if ( *end )
|
||||
end++;
|
||||
string element ( p, end-p );
|
||||
|
||||
process_c ( *h, element );
|
||||
|
@ -219,13 +216,17 @@ void process_preprocessor ( const char* filename, Header& h, const string& eleme
|
|||
if ( !headers[i]->done )
|
||||
{
|
||||
printf ( "circular dependency between '%s' and '%s'\n", filename, include_filename.c_str() );
|
||||
exit ( -1 );
|
||||
ASSERT ( 0 );
|
||||
}
|
||||
loaded = true;
|
||||
}
|
||||
}
|
||||
if ( !loaded )
|
||||
{
|
||||
printf ( "(diverting to '%s')\n", include_filename.c_str() );
|
||||
import_file ( include_filename.c_str() );
|
||||
printf ( "(now back to '%s')\n", filename );
|
||||
}
|
||||
h.includes.push_back ( include_filename );
|
||||
}
|
||||
}
|
||||
|
@ -372,6 +373,8 @@ char* skipsemi ( char* p )
|
|||
|
||||
char* findend ( char* p, bool& externc )
|
||||
{
|
||||
if ( !strncmp ( p, "static inline struct _TEB * NtCurrentTeb ( void )", 49 ) )
|
||||
_CrtDbgBreak();
|
||||
// special-case for 'extern "C"'
|
||||
if ( !strncmp ( p, "extern", 6 ) )
|
||||
{
|
||||
|
@ -396,16 +399,21 @@ char* findend ( char* p, bool& externc )
|
|||
return end;
|
||||
}
|
||||
externc = false;
|
||||
for ( ;; )
|
||||
{
|
||||
char* end = strchr ( p, ';' );
|
||||
if ( !end )
|
||||
end = p + strlen(p);
|
||||
char* semi = strchr ( p, '{' );
|
||||
if ( !semi || semi > end )
|
||||
return end;
|
||||
p = skipsemi ( semi );
|
||||
}
|
||||
bool isStruct = false;
|
||||
|
||||
char* end = strchr ( p, ';' );
|
||||
if ( !end )
|
||||
end = p + strlen(p);
|
||||
else
|
||||
end++;
|
||||
char* semi = strchr ( p, '{' );
|
||||
if ( !semi || semi > end )
|
||||
return end;
|
||||
p = skipsemi ( semi );
|
||||
char* p2 = skip_ws ( p );
|
||||
if ( *p2 == ';' )
|
||||
p = p2 + 1;
|
||||
return end;
|
||||
}
|
||||
|
||||
Type identify ( const vector<string>& tokens, int off )
|
||||
|
@ -490,8 +498,13 @@ int parse_type ( Type t, const vector<string>& tokens, int off, vector<string>&
|
|||
return parse_function ( tokens, off, names, dependencies );
|
||||
case T_FUNCTION_PTR:
|
||||
return parse_function_ptr ( tokens, off, names, dependencies );
|
||||
case T_IF:
|
||||
case T_WHILE:
|
||||
return parse_ifwhile ( tokens, off, names, dependencies );
|
||||
case T_DO:
|
||||
return parse_do ( tokens, off, names, dependencies );
|
||||
default:
|
||||
ASSERT(0);
|
||||
TOKASSERT(!"unidentified type in parse_type()");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -526,8 +539,8 @@ void depend ( const string& ident, vector<string>& dependencies )
|
|||
|
||||
int parse_tident ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies )
|
||||
{
|
||||
ASSERT ( tokens[off] == "typedef_tident" );
|
||||
ASSERT ( tokens[off+1] == "(" && tokens[off+3] == ")" );
|
||||
TOKASSERT ( tokens[off] == "typedef_tident" );
|
||||
TOKASSERT ( tokens[off+1] == "(" && tokens[off+3] == ")" );
|
||||
names.push_back ( tokens[off+2] );
|
||||
dependencies.push_back ( "typedef_tident" );
|
||||
return off + 4;
|
||||
|
@ -538,12 +551,11 @@ int parse_variable ( const vector<string>& tokens, int off, vector<string>& name
|
|||
// NOTE - Test with bitfields, I think this code will actually handle them properly...
|
||||
depend ( tokens[off++], dependencies );
|
||||
int done = tokens.size();
|
||||
while ( off < done && tokens[off] != ";" )
|
||||
while ( tokens[off] != ";" )
|
||||
name ( tokens[off++], names );
|
||||
if ( off < done )
|
||||
return off + 1;
|
||||
else
|
||||
return off;
|
||||
TOKASSERT ( tokens[off] == ";" );
|
||||
off++;
|
||||
return off;
|
||||
}
|
||||
|
||||
int parse_struct ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies )
|
||||
|
@ -556,7 +568,7 @@ int parse_struct ( const vector<string>& tokens, int off, vector<string>& names,
|
|||
while ( off < done && tokens[off] != "struct" && tokens[off] != "union" )
|
||||
depend ( tokens[off++], dependencies );
|
||||
|
||||
ASSERT ( tokens[off] == "struct" || tokens[off] == "union" );
|
||||
TOKASSERT ( tokens[off] == "struct" || tokens[off] == "union" );
|
||||
if ( tokens[off] != "struct" && tokens[off] != "union" )
|
||||
return off;
|
||||
off++;
|
||||
|
@ -564,7 +576,7 @@ int parse_struct ( const vector<string>& tokens, int off, vector<string>& names,
|
|||
if ( tokens[off] != "{" )
|
||||
name ( tokens[off++], names );
|
||||
|
||||
ASSERT ( tokens[off] == "{" );
|
||||
TOKASSERT ( tokens[off] == "{" );
|
||||
off++;
|
||||
|
||||
// skip through body of struct - noting any dependencies
|
||||
|
@ -588,6 +600,9 @@ int parse_struct ( const vector<string>& tokens, int off, vector<string>& names,
|
|||
off++;
|
||||
}
|
||||
|
||||
TOKASSERT ( tokens[off] == ";" );
|
||||
off++;
|
||||
|
||||
return off;
|
||||
}
|
||||
|
||||
|
@ -607,13 +622,13 @@ int parse_function ( const vector<string>& tokens, int off, vector<string>& name
|
|||
depend ( tokens[off++], dependencies );
|
||||
name ( tokens[off++], names );
|
||||
|
||||
ASSERT ( tokens[off] == "(" );
|
||||
TOKASSERT ( tokens[off] == "(" );
|
||||
|
||||
while ( tokens[off] != ")" )
|
||||
{
|
||||
off++;
|
||||
off = parse_param ( tokens, off, fauxnames, dependencies );
|
||||
ASSERT ( tokens[off] == "," || tokens[off] == ")" );
|
||||
TOKASSERT ( tokens[off] == "," || tokens[off] == ")" );
|
||||
}
|
||||
|
||||
off++;
|
||||
|
@ -623,7 +638,7 @@ int parse_function ( const vector<string>& tokens, int off, vector<string>& name
|
|||
return off;
|
||||
|
||||
// we have a function body...
|
||||
ASSERT ( tokens[off] == "{" );
|
||||
TOKASSERT ( tokens[off] == "{" );
|
||||
off++;
|
||||
|
||||
while ( tokens[off] != "}" )
|
||||
|
@ -632,6 +647,9 @@ int parse_function ( const vector<string>& tokens, int off, vector<string>& name
|
|||
off = parse_type ( t, tokens, off, fauxnames, dependencies );
|
||||
}
|
||||
|
||||
TOKASSERT ( tokens[off] == "}" );
|
||||
off++;
|
||||
|
||||
return off;
|
||||
}
|
||||
|
||||
|
@ -640,28 +658,89 @@ int parse_function_ptr ( const vector<string>& tokens, int off, vector<string>&
|
|||
while ( tokens[off] != "(" )
|
||||
depend ( tokens[off++], dependencies );
|
||||
|
||||
ASSERT ( tokens[off] == "(" );
|
||||
TOKASSERT ( tokens[off] == "(" );
|
||||
off++;
|
||||
|
||||
while ( tokens[off+1] != ")" )
|
||||
depend ( tokens[off++], dependencies );
|
||||
name ( tokens[off++], names );
|
||||
|
||||
ASSERT ( tokens[off] == ")" );
|
||||
TOKASSERT ( tokens[off] == ")" );
|
||||
|
||||
off++;
|
||||
|
||||
ASSERT ( tokens[off] == "(" );
|
||||
TOKASSERT ( tokens[off] == "(" );
|
||||
|
||||
while ( tokens[off] != ")" )
|
||||
{
|
||||
off++;
|
||||
vector<string> fauxnames;
|
||||
off = parse_param ( tokens, off, fauxnames, dependencies );
|
||||
ASSERT ( tokens[off] == "," || tokens[off] == ")" );
|
||||
TOKASSERT ( tokens[off] == "," || tokens[off] == ")" );
|
||||
}
|
||||
|
||||
off++;
|
||||
ASSERT ( tokens[off] == ";" );
|
||||
TOKASSERT ( tokens[off] == ";" );
|
||||
off++;
|
||||
return off;
|
||||
}
|
||||
|
||||
int parse_ifwhile ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies )
|
||||
{
|
||||
TOKASSERT ( tokens[off] == "if" || tokens[off] == "while" );
|
||||
off++;
|
||||
|
||||
TOKASSERT ( tokens[off] == "(" );
|
||||
off++;
|
||||
|
||||
TOKASSERT ( tokens[off] != ")" );
|
||||
while ( tokens[off] != ")" )
|
||||
off++;
|
||||
|
||||
if ( tokens[off] == "{" )
|
||||
{
|
||||
while ( tokens[off] != "}" )
|
||||
{
|
||||
Type t = identify ( tokens, off );
|
||||
off = parse_type ( t, tokens, off, names, dependencies );
|
||||
}
|
||||
off++;
|
||||
}
|
||||
return off;
|
||||
}
|
||||
|
||||
int parse_do ( const vector<string>& tokens, int off, vector<string>& names, vector<string>& dependencies )
|
||||
{
|
||||
TOKASSERT ( tokens[off] == "do" );
|
||||
off++;
|
||||
|
||||
if ( tokens[off] != "{" )
|
||||
{
|
||||
Type t = identify ( tokens, off );
|
||||
off = parse_type ( t, tokens, off, names, dependencies );
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( tokens[off] != "}" )
|
||||
{
|
||||
Type t = identify ( tokens, off );
|
||||
off = parse_type ( t, tokens, off, names, dependencies );
|
||||
}
|
||||
}
|
||||
|
||||
TOKASSERT ( tokens[off] == "while" );
|
||||
off++;
|
||||
|
||||
TOKASSERT ( tokens[off] == "(" );
|
||||
while ( tokens[off] != ")" )
|
||||
off++;
|
||||
|
||||
TOKASSERT ( tokens[off] == ")" );
|
||||
off++;
|
||||
|
||||
TOKASSERT ( tokens[off] == ";" );
|
||||
off++;
|
||||
|
||||
return off;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: test.h,v 1.2 2003/11/06 02:50:12 royce Exp $
|
||||
/* $Id: test.h,v 1.3 2003/11/06 19:38:23 royce Exp $
|
||||
*/
|
||||
/*
|
||||
* test.h
|
||||
|
@ -22,6 +22,21 @@
|
|||
#ifndef __INTERNAL_PSAPI_H_INCLUDED__
|
||||
#define __INTERNAL_PSAPI_H_INCLUDED__
|
||||
|
||||
static inline struct _TEB * NtCurrentTeb(void)
|
||||
{
|
||||
struct _TEB * pTeb;
|
||||
|
||||
/* FIXME: instead of hardcoded offsets, use offsetof() - if possible */
|
||||
__asm__ __volatile__
|
||||
(
|
||||
"movl %%fs:0x18, %0\n" /* fs:18h == Teb->Tib.Self */
|
||||
: "=r" (pTeb) /* can't have two memory operands */
|
||||
: /* no inputs */
|
||||
);
|
||||
|
||||
return pTeb;
|
||||
}
|
||||
|
||||
typedef struct tagFOO
|
||||
{
|
||||
INT lonibble : 4;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue