1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
#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 );
|