mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
7.4 KiB
213 lines
7.4 KiB
#define MULTIPLIER sizeof(ULONG)
|
|
#define MAX_LINE_SIZE 64*MULTIPLIER
|
|
#define MAX_SECTION_DESC_SIZE 64*MULTIPLIER
|
|
#define MAX_RESULTS_COUNT 32
|
|
#define UCHAR_REMAINDER (MULTIPLIER-sizeof(UCHAR))
|
|
|
|
|
|
#define SECTION_START 0
|
|
#define SECTION_END 1
|
|
#define OPTIONALS 2
|
|
#define TOKEN_MATCH 3
|
|
#define SECTION_DESC 4
|
|
|
|
#define LINE_TYPE_SECTION_START ((UCHAR)1)
|
|
#define LINE_TYPE_SECTION_END ((UCHAR)2)
|
|
#define LINE_TYPE_REGULAR ((UCHAR)3)
|
|
|
|
|
|
#define SECTIONHDR_SECTIONHDR ((UCHAR)1)
|
|
#define SECTIONHDR_SECTIONEND ((UCHAR)2)
|
|
#define SECTIONHDR_REGLINE ((UCHAR)3)
|
|
#define SECTIONEND_SECTIONEND ((UCHAR)4)
|
|
#define SECTIONEND_REGLINE ((UCHAR)5)
|
|
#define REGLINE_REGLINE ((UCHAR)6)
|
|
|
|
|
|
#define COMPARE_SUCCESS 0x0UL
|
|
#define COMPARE_EQUAL_LAST 0x1UL
|
|
#define COMPARE_LINE 0x2UL
|
|
#define COMPARE_START 0x3UL
|
|
#define COMPARE_END 0x4UL
|
|
#define COMPARE_TOKEN 0x5UL
|
|
#define COMPARE_BETWEEN_VALUES 0x6UL
|
|
|
|
#define RESULTS_EQUAL ((UCHAR)0)
|
|
#define RESULTS_UNEQUAL ((UCHAR)1)
|
|
#define RESULTS_NOT_PRESENT ((UCHAR)2)
|
|
#define RESULTS_MINMAX ((UCHAR)3)
|
|
|
|
|
|
#define TOKEN_MATCHING_ALL 0xFFFFFFFF
|
|
#define TOKEN_UNMATCHED 0x0UL
|
|
#define TOKEN_MATCHED 0x1UL
|
|
|
|
|
|
#if !( defined(lint) || defined(_lint) )
|
|
#if i386
|
|
#pragma warning(disable:4103)
|
|
#endif
|
|
#pragma pack(1)
|
|
#endif
|
|
|
|
|
|
typedef ULONG RESULT;
|
|
typedef double DOUBLE;
|
|
|
|
typedef struct _MFILE {
|
|
|
|
ULONG CurrentFileLine;
|
|
PCHAR FileName;
|
|
FILE *FileP ;
|
|
|
|
} MFILE, *PMFILE;
|
|
|
|
|
|
typedef struct _LINE {
|
|
|
|
UINT NormalLineSize ;
|
|
UINT CompressedLineSize ;
|
|
|
|
CHAR NormalLine[MAX_LINE_SIZE] ;
|
|
CHAR CompressedLine[MAX_LINE_SIZE];
|
|
|
|
UCHAR LineType ;
|
|
UCHAR Padding[UCHAR_REMAINDER] ;
|
|
|
|
} LINE, *PLINE;
|
|
|
|
|
|
typedef struct _TOKEN_LIST {
|
|
|
|
ULONG LinePosition ;
|
|
ULONG FileLinePosition ;
|
|
ULONG TokenState ;
|
|
|
|
struct _TOKEN_LIST *NextToken ;
|
|
|
|
CHAR NormalToken[MAX_LINE_SIZE] ;
|
|
CHAR CompressedToken[MAX_LINE_SIZE];
|
|
|
|
} TOKEN_LIST, *PTOKEN_LIST;
|
|
|
|
typedef struct _SECTION_CONTROL {
|
|
|
|
ULONG SectionLineCount ;
|
|
ULONG TokenMatchStartLine;
|
|
ULONG TokenMatchStopLine ;
|
|
|
|
PTOKEN_LIST HeadUnmatchedTokens;
|
|
|
|
DOUBLE SectionIdentifier ;
|
|
|
|
BOOLEAN OptionalMatching ;
|
|
BOOLEAN TokenMatching ;
|
|
BOOLEAN BaseControlSection ;
|
|
BOOLEAN Padding ;
|
|
|
|
} SECTION_CONTROL, *PSECTION_CONTROL;
|
|
|
|
typedef struct _SECTION {
|
|
|
|
RESULT LastResults[MAX_RESULTS_COUNT] ;
|
|
RESULT CurrentResults[MAX_RESULTS_COUNT] ;
|
|
ULONG NumberOfLastResults ;
|
|
ULONG NumberOfCurrentResults ;
|
|
UCHAR ResultsError[MAX_RESULTS_COUNT] ;
|
|
|
|
RESULT MinimumValue ;
|
|
RESULT MaximumValue ;
|
|
|
|
PMFILE File;
|
|
PLINE CurrentLine;
|
|
|
|
SECTION_CONTROL Control;
|
|
|
|
CHAR SectionDescription[MAX_SECTION_DESC_SIZE];
|
|
|
|
|
|
} SECTION, *PSECTION;
|
|
|
|
|
|
typedef struct _FUNCTION_ELEMENTS {
|
|
|
|
ULONG ErrorCount ;
|
|
|
|
PSECTION NewFirstSection ;
|
|
PSECTION NewSecondSection ;
|
|
|
|
DOUBLE FirstSectionID ;
|
|
DOUBLE SecondSectionID ;
|
|
|
|
BOOLEAN FirstSectionSynchronize ;
|
|
BOOLEAN SecondSectionSynchronize ;
|
|
BOOLEAN SectionEndsNotSynchronized;
|
|
BOOLEAN SkipLine ;
|
|
|
|
LINE FirstSectionCurrentLine ;
|
|
LINE SecondSectionCurrentLine ;
|
|
|
|
UCHAR CombinedLineVariation ;
|
|
UCHAR Padding[UCHAR_REMAINDER] ;
|
|
|
|
} FUNCTION_ELEMENTS, *PFUNCTION_ELEMENTS;
|
|
|
|
#if !( defined(lint) || defined(_lint) )
|
|
#if i386
|
|
#pragma warning(disable:4103)
|
|
#endif
|
|
#pragma pack()
|
|
#endif
|
|
|
|
|
|
|
|
|
|
//
|
|
// MACROS
|
|
//
|
|
#define CloseFiles( a, b ) { \
|
|
if ( a.FileP != (FILE *)NULL ) fclose( a.FileP ); \
|
|
if ( b.FileP != (FILE *)NULL ) fclose( b.FileP ); \
|
|
}
|
|
|
|
#define CreateSection() calloc( 1, sizeof( SECTION ) )
|
|
#define DestroySection( a ) free( a )
|
|
#define ClearAndSetLine( a, b ) { memset( (b), 0, sizeof( LINE ) ); (a)->CurrentLine = (b); }
|
|
#define CreateFunctionElements() calloc( 1, sizeof( FUNCTION_ELEMENTS ) )
|
|
#define DestroyFunctionElements( a ) free( a )
|
|
|
|
#define InsertToken( a, b ) { \
|
|
a->NextToken = b; \
|
|
b = a; \
|
|
}
|
|
#define DestroyToken( a ) free( a )
|
|
|
|
|
|
|
|
//
|
|
// Function definitions
|
|
//
|
|
VOID _cdecl main ( INT , CHAR ** );
|
|
VOID Usage ( VOID );
|
|
BOOLEAN GetFilePair ( PCHAR * , PCHAR * , PCHAR );
|
|
BOOLEAN CompareFiles ( PMFILE , PMFILE , FILE * , ULONG * );
|
|
BOOLEAN OpenFiles ( PMFILE , PCHAR , PMFILE , PCHAR );
|
|
BOOLEAN CompareFiles ( PMFILE , PMFILE , FILE * , PULONG );
|
|
BOOLEAN CompareSections ( PSECTION, PSECTION, FILE * , PULONG );
|
|
BOOLEAN GetNextLine ( PSECTION );
|
|
BOOLEAN DoNotSkipThisLine ( PSECTION );
|
|
VOID LineType ( PSECTION );
|
|
BOOLEAN ExtractResults ( PSECTION );
|
|
BOOLEAN ExtractBetweenValues ( PSECTION );
|
|
BOOLEAN CombinedVariation ( PSECTION, PSECTION, PUCHAR );
|
|
RESULT CompareLines ( PSECTION, PSECTION );
|
|
BOOLEAN InitializeSectionControl ( PSECTION, PSECTION );
|
|
VOID PrintComparisonResults ( PSECTION, PSECTION, RESULT , ULONG , FILE * );
|
|
VOID PrintSectionInformation ( PSECTION, FILE * );
|
|
DOUBLE ExtractSectionIDFromLine ( PSECTION );
|
|
BOOLEAN CheckSectionIDFromCurrentLines ( PSECTION, PSECTION );
|
|
BOOLEAN CompareLinesAndPrintResults ( PSECTION, PSECTION, PULONG , FILE * );
|
|
VOID TokenInsertInSection ( PSECTION );
|
|
RESULT MatchTopToken ( PTOKEN_LIST, PTOKEN_LIST );
|
|
VOID CompareTokensAndPrintResults ( PSECTION, PSECTION, PULONG , FILE * );
|
|
BOOLEAN MayDifferExistsInOneOrMoreLines( PSECTION, PSECTION );
|