Пользователь
Регистрация: 07.06.2009
Сообщений: 43
|
Функции, используемые:
Код:
BOOL CreateReadFileView(
IN LPCTSTR FileName,
OUT PHANDLE phFile,
OUT PHANDLE phFileMapping,
OUT PVOID *ppFileView,
OUT PDWORD pFileLength)
{
HANDLE hFile;
HANDLE hFileMapping;
PVOID pFileView;
hFile = CreateFile(
FileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING, 0,
NULL);
if( INVALID_HANDLE_VALUE == hFile )
return FALSE;
hFileMapping = CreateFileMapping(
hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL);
if(hFileMapping == NULL)
goto CLOSE_FILE;
pFileView = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
if(pFileView == NULL)
goto CLOSE_FILE_MAPPING;
*phFile = hFile;
*phFileMapping = hFileMapping;
*ppFileView = pFileView;
*pFileLength = GetFileSize( hFile, NULL );
return TRUE;
CLOSE_FILE_MAPPING:
CloseHandle( hFileMapping );
CLOSE_FILE:
CloseHandle( hFile );
return FALSE;
}
//Функция закрывает образ файла в памяти
VOID
CloseFileView(
IN PHANDLE phFile,
IN PHANDLE phFileMapping,
IN PVOID *ppFileView
)
{
if( *ppFileView != NULL ) { UnmapViewOfFile( *ppFileView );
*ppFileView = NULL;
}
if( *phFileMapping != NULL ) {
CloseHandle( *phFileMapping );
*phFileMapping = NULL;
}
if( *phFile != INVALID_HANDLE_VALUE ) {
SetEndOfFile( *phFile );
CloseHandle( *phFile );
*phFile = INVALID_HANDLE_VALUE;
}
}
Типы данных:
Код:
typedef enum {
C_UNKNOWN,
//Значения ключевых слов
C_ASM,
C_AUTO,
C_BASED,
C_BREAK,
C_CASE,
C_CDECL,
C_CHAR,
C_CONST,
C_CONTINUE,
C_DECLSPEC,
C_DEFAULT,
C_DLLEXPORT,
C_DLLIMPORT,
C_DO,
C_DOUBLE,
C_ELSE,
C_ENUM,
C_EXCEPT,
C_EXTERN,
C_FASTCALL,
C_FINALLY,
C_FLOAT,
C_FOR,
C_GOTO,
C_IF,
C_INLINE,
C_INT,
C_INT16,
C_INT32,
C_INT64,
C_INT8,
C_LONG,
C_NAKED,
C_REGISTER,
C_RETURN,
C_SHORT,
C_SIGNED,
C_SIZEOF,
C_STATIC,
C_STDCALL,
C_STRUCT,
C_SWITCH,
C_THREAD,
C_TRY,
C_TYPEDEF,
C_UNION,
C_UNSIGNED,
C_VOID,
C_VOLATILE,
C_WHILE,
//Значения констант
C_OCTAL,
C_DECIMAL,
C_HEXADECIMAL,
//Значения лексем операций
C_FIELD_MEMBER, // .
C_FIELD_PTR, // ->
C_INCREMENT, // ++
C_DECREMENT, // --
C_AND, // &
C_MUL, // *
C_ADD, // +
C_SUB, // -
C_NOT, // ~
C_LNOT, // !
C_DIV, // /
C_REMN, // %
C_LEFT_SHIFT, // <<
C_RIGHT_SHIFT, // >>
C_LESS, // <
C_GREAT, // >
C_LESS_EQUAL, // <=
C_GREAT_EQUAL, // >=
C_EQUAL, // ==
C_NOT_EQUAL, // !=
C_XOR, // ^
C_OR, // |
C_LAND, // &&
C_LOR, // ||
C_QUESTION, // ?
C_COLON, // :
C_ASSIGN, // =
C_MUL_ASSIGN, // *=
C_DIV_ASSIGN, // /=
C_REMN_ASSIGN, // %=
C_ADD_ASSIGN, // +=
C_SUB_ASSIGN, // -=
C_LEFT_SHIFT_ASSIGN, // <<=
C_RIGHT_SHIFT_ASSIGN, // >>=
C_AND_ASSIGN, // &=
C_XOR_ASSIGN, // ^=
C_OR_ASSIGN, // |=
C_POUND, // #
C_DOUBLE_POUND, // ##
//Значения лексем пунктуации
C_LEFT_PARENTHESIS, // (
C_RIGHT_PARENTHESIS, // )
C_COMMA, // ,
C_SEMICOLON, // ;
C_LEFT_SQUARE_BRACKET, // [
C_RIGHT_SQUARE_BRACKET, // ]
C_LEFT_BRACE, // {
C_RIGHT_BRACE, // }
C_THREE_PERIOD // ...
// C_DOUBLE_QUOTATION_MARK,// "
} C_VALUE;
typedef struct _TOKEN {
PCSTR Buffer;
ULONG Length;
} TOKEN, *PTOKEN;
typedef struct _LEXEME {
TOKEN Token;
ULONG nLine;
ULONG Class;
ULONG Subclass;
ULONG Value;
} LEXEME, *PLEXEME;
//Определение классов, подклассов и значений лексем
typedef enum {
C_CLASS_UNKNOWN,
C_CLASS_ERROR, //Обозначает лексему, не относящуюся к данному языку
C_CLASS_IDENTIFIER,
C_CLASS_CONSTANT,
C_CLASS_PUNCTUATOR,
C_CLASS_OPERATION,
C_CLASS_HEADER,
C_STRING_LITERAL
} C_CLASS;
typedef enum {
C_SUBCLASS_IDENTIFIER,
C_SUBCLASS_STANDARD, //Стандартные лексемы keyword
C_SUBCLASS_EXTENDED, //Дополнительные лексемы keyword
C_SUBCLASS_FLOATING_POINT, //Вещественные константы
C_SUBCLASS_INTEGER, //Целочисленные константы
C_SUBCLASS_CHARACTER //Символьные константы
} C_SUBCLASS;
//Функция создает образ файла в памяти
|