btparser/cparser/tests/exp_lex/PDFTemplate.bt

566 lines
19 KiB
Plaintext

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: local int iCOLOR = 0x95E8FF ;
30:
31: enum int { TYPE_UNKNOWN , TYPE_HEADER , TYPE_TRAILER , TYPE_OBJ , TYPE_ENDOBJ } ;
32:
33:
34:
35: local int iKeywordCount ;
36: local int iStructureCount ;
37: local TFindResults tfrHeaders ;
38: local TFindResults tfrTrailers ;
39: local TFindResults tfrObjs ;
40: local TFindResults tfrEndobjs ;
41:
42: local int iPDFHeaderCount = 0 ;
43: local int iPDFTrailerCount = 0 ;
44: local int iPDFUnknownCount = 0 ;
45: local int iPDFCommentCount = 0 ;
46: local int iPDFWhitespaceCount = 0 ;
47: local int iPDFXrefCount = 0 ;
48: local int iPDFObjectCount = 0 ;
49:
50:
51:
52: local int iIndexLength ;
53: local int iWhiteSpace1Length ;
54: local int iVersionLength ;
55: local int iWhiteSpace2Length ;
56: local int iDataLength ;
57: local int iFoundEndobj ;
58: local int iWhiteSpace3Length ;
59: typedef struct {
60: BYTE Index [ iIndexLength ] ;
61: BYTE WhiteSpace1 [ iWhiteSpace1Length ] ;
62: BYTE Version [ iVersionLength ] ;
63: BYTE WhiteSpace2 [ iWhiteSpace2Length ] ;
64: BYTE Object [ 3 ] ;
65: BYTE Data [ iDataLength ] ;
66: if ( iFoundEndobj )
67: BYTE EndObject [ 6 ] ;
68: BYTE WhiteSpace3 [ iWhiteSpace3Length ] ;
69: } PDFObj < read = ReadPDFObj > ;
70:
71: string ReadPDFObj ( PDFObj & sPDFObj )
72: {
73: local string sResult ;
74: SPrintf ( sResult , "%s %s obj %s" , sPDFObj . Index , sPDFObj . Version , sPDFObj . Data ) ;
75: return sResult ;
76: }
77:
78: local int iHeaderSize ;
79: typedef struct {
80: BYTE Header [ iHeaderSize ] ;
81: } PDFHeader ;
82:
83: local int iTrailerSize ;
84: typedef struct {
85: BYTE Trailer [ iTrailerSize ] ;
86: } PDFTrailer ;
87:
88: local int iUnknownSize ;
89: typedef struct {
90: BYTE Data [ iUnknownSize ] ;
91: } PDFUnknown ;
92:
93: local int iCommentSize ;
94: typedef struct {
95: BYTE Comment [ iCommentSize ] ;
96: } PDFComment ;
97:
98: local int iWhitespaceSize ;
99: typedef struct {
100: BYTE Whitespace [ iWhitespaceSize ] ;
101: } PDFWhitespace ;
102:
103: local int iXrefSize ;
104: typedef struct {
105: BYTE Data [ iXrefSize ] ;
106: } PDFXref ;
107:
108:
109:
110: int64 FindStartOfObj ( int64 iStart , int & iIndexLength , int & iWhiteSpace1Length , int & iVersionLength , int & iWhiteSpace2Length )
111: {
112: local int iIter ;
113: local BYTE bChar ;
114: local int64 iIndex ;
115: local int64 iStartIndex = - 1 ;
116: local int64 iEndIndex = - 1 ;
117: local int64 iStartVersion = - 1 ;
118: local int64 iEndVersion = - 1 ;
119:
120: for ( iIter = 1 ; iIter <= 20 ; iIter ++ )
121: {
122: iIndex = iStart - iIter ;
123: if ( iIndex < 0 )
124: break ;
125: bChar = ReadByte ( iIndex ) ;
126: if ( iEndVersion == - 1 )
127: {
128: if ( bChar == ' ' )
129: ;
130: else if ( bChar >= '0' && bChar <= '9' )
131: iEndVersion = iIndex ;
132: else
133: break ;
134: }
135: else if ( iStartVersion == - 1 )
136: {
137: if ( bChar >= '0' && bChar <= '9' )
138: ;
139: else if ( bChar == ' ' )
140: iStartVersion = iIndex + 1 ;
141: else
142: break ;
143: }
144: else if ( iEndIndex == - 1 )
145: {
146: if ( bChar == ' ' )
147: ;
148: else if ( bChar >= '0' && bChar <= '9' )
149: iEndIndex = iIndex ;
150: else
151: break ;
152: }
153: else if ( iStartIndex == - 1 )
154: {
155: if ( bChar < '0' || bChar > '9' )
156: {
157: iStartIndex = iIndex + 1 ;
158: break ;
159: }
160: }
161: }
162:
163: if ( iEndIndex != - 1 && iStartVersion != - 1 && iEndVersion != - 1 )
164: {
165: if ( iStartIndex == - 1 )
166: {
167: if ( iIndex == - 1 )
168: iStartIndex = 0 ;
169: else
170: return - 1 ;
171: }
172: iIndexLength = iEndIndex - iStartIndex + 1 ;
173: iWhiteSpace1Length = iStartVersion - iEndIndex - 1 ;
174: iVersionLength = iEndVersion - iStartVersion + 1 ;
175: iWhiteSpace2Length = iStart - iEndVersion ;
176: return iStartIndex ;
177: }
178: else
179: return - 1 ;
180: }
181:
182: int64 FindEOL ( int64 iStart )
183: {
184: local int64 iIter ;
185: for ( iIter = iStart ; iIter < FileSize ( ) ; iIter ++ )
186: if ( ReadByte ( iIter ) == 0xD && iIter + 1 < FileSize ( ) && ReadByte ( iIter + 1 ) == 0xA )
187: return iIter + 1 ;
188: else if ( ReadByte ( iIter ) == 0xD || ReadByte ( iIter ) == 0xA )
189: return iIter ;
190: return - 1 ;
191: }
192:
193: void FindAllKeywords ( void )
194: {
195: tfrHeaders = FindAll ( "%PDF" ) ;
196: tfrTrailers = FindAll ( "%%EOF" ) ;
197: tfrObjs = FindAll ( " obj" ) ;
198: tfrEndobjs = FindAll ( "endobj" ) ;
199: iKeywordCount = tfrHeaders . count + tfrTrailers . count + tfrObjs . count + tfrEndobjs . count ;
200: }
201:
202: int MergeKeywords ( int iMerge1Size , int iMerge2Size )
203: {
204: local int64 iIndex1 = 0 ;
205: local int64 iIndex2 = 0 ;
206: local int64 iIndex3 = 0 ;
207:
208: while ( true )
209: {
210: if ( iIndex1 == iMerge1Size )
211: {
212: while ( iIndex2 < iMerge2Size )
213: {
214: aiMerge3KeywordType [ iIndex3 ] = aiMerge2KeywordType [ iIndex2 ] ;
215: aiMerge3KeywordStart [ iIndex3 ] = aiMerge2KeywordStart [ iIndex2 ] ;
216: aiMerge3KeywordSize [ iIndex3 ] = aiMerge2KeywordSize [ iIndex2 ] ;
217: iIndex2 ++ ;
218: iIndex3 ++ ;
219: }
220: break ;
221: }
222: if ( iIndex2 == iMerge2Size )
223: {
224: while ( iIndex1 < iMerge1Size )
225: {
226: aiMerge3KeywordType [ iIndex3 ] = aiMerge1KeywordType [ iIndex1 ] ;
227: aiMerge3KeywordStart [ iIndex3 ] = aiMerge1KeywordStart [ iIndex1 ] ;
228: aiMerge3KeywordSize [ iIndex3 ] = aiMerge1KeywordSize [ iIndex1 ] ;
229: iIndex1 ++ ;
230: iIndex3 ++ ;
231: }
232: break ;
233: }
234: if ( aiMerge1KeywordStart [ iIndex1 ] < aiMerge2KeywordStart [ iIndex2 ] )
235: {
236: aiMerge3KeywordType [ iIndex3 ] = aiMerge1KeywordType [ iIndex1 ] ;
237: aiMerge3KeywordStart [ iIndex3 ] = aiMerge1KeywordStart [ iIndex1 ] ;
238: aiMerge3KeywordSize [ iIndex3 ] = aiMerge1KeywordSize [ iIndex1 ] ;
239: iIndex1 ++ ;
240: iIndex3 ++ ;
241: }
242: else
243: {
244: aiMerge3KeywordType [ iIndex3 ] = aiMerge2KeywordType [ iIndex2 ] ;
245: aiMerge3KeywordStart [ iIndex3 ] = aiMerge2KeywordStart [ iIndex2 ] ;
246: aiMerge3KeywordSize [ iIndex3 ] = aiMerge2KeywordSize [ iIndex2 ] ;
247: iIndex2 ++ ;
248: iIndex3 ++ ;
249: }
250: }
251: for ( iIndex1 = 0 ; iIndex1 < iMerge1Size + iMerge2Size ; iIndex1 ++ )
252: {
253: aiMerge1KeywordType [ iIndex1 ] = aiMerge3KeywordType [ iIndex1 ] ;
254: aiMerge1KeywordStart [ iIndex1 ] = aiMerge3KeywordStart [ iIndex1 ] ;
255: aiMerge1KeywordSize [ iIndex1 ] = aiMerge3KeywordSize [ iIndex1 ] ;
256: }
257: return iMerge1Size + iMerge2Size ;
258: }
259:
260: void MergeAndFilterAllKeywords ( void )
261: {
262: local int iIter ;
263: local int iIter2 ;
264: local int iTempCount ;
265:
266: for ( iIter = 0 ; iIter < tfrHeaders . count ; iIter ++ )
267: {
268: aiMerge1KeywordType [ iIter ] = TYPE_HEADER ;
269: aiMerge1KeywordStart [ iIter ] = tfrHeaders . start [ iIter ] ;
270: aiMerge1KeywordSize [ iIter ] = tfrHeaders . size [ iIter ] ;
271: }
272: for ( iIter = 0 ; iIter < tfrTrailers . count ; iIter ++ )
273: {
274: aiMerge2KeywordType [ iIter ] = TYPE_TRAILER ;
275: aiMerge2KeywordStart [ iIter ] = tfrTrailers . start [ iIter ] ;
276: aiMerge2KeywordSize [ iIter ] = tfrTrailers . size [ iIter ] ;
277: }
278: iTempCount = MergeKeywords ( tfrHeaders . count , tfrTrailers . count ) ;
279: iIter2 = 0 ;
280: for ( iIter = 0 ; iIter < tfrObjs . count ; iIter ++ )
281: {
282: if ( - 1 != FindStartOfObj ( tfrObjs . start [ iIter ] , iIndexLength , iWhiteSpace1Length , iVersionLength , iWhiteSpace2Length ) )
283: {
284: aiMerge2KeywordType [ iIter2 ] = TYPE_OBJ ;
285: aiMerge2KeywordStart [ iIter2 ] = tfrObjs . start [ iIter ] ;
286: aiMerge2KeywordSize [ iIter2 ] = tfrObjs . size [ iIter ] ;
287: iIter2 ++ ;
288: }
289: }
290: iTempCount = MergeKeywords ( iTempCount , iIter2 ) ;
291: for ( iIter = 0 ; iIter < tfrEndobjs . count ; iIter ++ )
292: {
293: aiMerge2KeywordType [ iIter ] = TYPE_ENDOBJ ;
294: aiMerge2KeywordStart [ iIter ] = tfrEndobjs . start [ iIter ] ;
295: aiMerge2KeywordSize [ iIter ] = tfrEndobjs . size [ iIter ] ;
296: }
297: iKeywordCount = MergeKeywords ( iTempCount , tfrEndobjs . count ) ;
298: }
299:
300: int CalculateSizeWithEOL ( int64 iStart )
301: {
302: local int64 iIndexEOL ;
303:
304: iIndexEOL = FindEOL ( iStart ) ;
305: if ( iIndexEOL == - 1 )
306: return - 1 ;
307: else
308: return iIndexEOL - iStart + 1 ;
309: }
310:
311: void PrepareStructures ( void )
312: {
313: local int iIter ;
314: local int64 iEndPreviousStructure = 0 ;
315: local int iSize ;
316: local int64 iStartIndirectObject ;
317: local BYTE bRead ;
318: local int iWhitespaceCount ;
319: iStructureCount = 0 ;
320:
321: for ( iIter = 0 ; iIter < iKeywordCount ; iIter ++ )
322: {
323: if ( aiMerge1KeywordType [ iIter ] == TYPE_OBJ )
324: iStartIndirectObject = FindStartOfObj ( aiMerge1KeywordStart [ iIter ] , iIndexLength , iWhiteSpace1Length , iVersionLength , iWhiteSpace2Length ) ;
325: else
326: iStartIndirectObject = aiMerge1KeywordStart [ iIter ] ;
327:
328: if ( iStartIndirectObject != iEndPreviousStructure && aiMerge1KeywordType [ iIter ] != TYPE_ENDOBJ )
329: {
330: aiStructureType [ iStructureCount ] = TYPE_UNKNOWN ;
331: aiStructureStart [ iStructureCount ] = iEndPreviousStructure ;
332: aiStructureSize [ iStructureCount ] = iStartIndirectObject - iEndPreviousStructure ;
333: iStructureCount ++ ;
334: }
335:
336: if ( aiMerge1KeywordType [ iIter ] == TYPE_HEADER )
337: {
338: iSize = CalculateSizeWithEOL ( aiMerge1KeywordStart [ iIter ] ) ;
339: if ( iSize == - 1 )
340: iSize = aiMerge1KeywordSize [ iIter ] ;
341: aiStructureType [ iStructureCount ] = TYPE_HEADER ;
342: aiStructureStart [ iStructureCount ] = aiMerge1KeywordStart [ iIter ] ;
343: aiStructureSize [ iStructureCount ] = iSize ;
344: iEndPreviousStructure = aiStructureStart [ iStructureCount ] + aiStructureSize [ iStructureCount ] ;
345: iStructureCount ++ ;
346: }
347: else if ( aiMerge1KeywordType [ iIter ] == TYPE_TRAILER )
348: {
349: iSize = CalculateSizeWithEOL ( aiMerge1KeywordStart [ iIter ] ) ;
350: if ( iSize == - 1 )
351: iSize = aiMerge1KeywordSize [ iIter ] ;
352: aiStructureType [ iStructureCount ] = TYPE_TRAILER ;
353: aiStructureStart [ iStructureCount ] = aiMerge1KeywordStart [ iIter ] ;
354: aiStructureSize [ iStructureCount ] = iSize ;
355: iEndPreviousStructure = aiStructureStart [ iStructureCount ] + aiStructureSize [ iStructureCount ] ;
356: iStructureCount ++ ;
357: }
358: else if ( aiMerge1KeywordType [ iIter ] == TYPE_OBJ )
359: {
360: iSize = aiMerge1KeywordStart [ iIter + 1 ] - iStartIndirectObject ;
361: if ( aiMerge1KeywordType [ iIter + 1 ] == TYPE_ENDOBJ )
362: iSize += 6 ;
363: iWhitespaceCount = 0 ;
364: bRead = ReadByte ( iStartIndirectObject + iSize ) ;
365: while ( bRead == 0xD || bRead == 0xA || bRead == 0x20 )
366: {
367: iWhitespaceCount ++ ;
368: bRead = ReadByte ( iStartIndirectObject + iSize + iWhitespaceCount ) ;
369: }
370: iSize += iWhitespaceCount ;
371: aiStructureType [ iStructureCount ] = TYPE_OBJ ;
372: aiStructureStart [ iStructureCount ] = iStartIndirectObject ;
373: aiStructureSize [ iStructureCount ] = iSize ;
374: aiStructureExtraParameter1 [ iStructureCount ] = iIndexLength ;
375: aiStructureExtraParameter2 [ iStructureCount ] = iWhiteSpace1Length ;
376: aiStructureExtraParameter3 [ iStructureCount ] = iVersionLength ;
377: aiStructureExtraParameter4 [ iStructureCount ] = iWhiteSpace2Length ;
378: aiStructureExtraParameter5 [ iStructureCount ] = aiMerge1KeywordType [ iIter + 1 ] == TYPE_ENDOBJ ;
379: aiStructureExtraParameter6 [ iStructureCount ] = iWhitespaceCount ;
380: iEndPreviousStructure = aiStructureStart [ iStructureCount ] + aiStructureSize [ iStructureCount ] ;
381: iStructureCount ++ ;
382: }
383: }
384:
385:
386: if ( FileSize ( ) - aiStructureStart [ iStructureCount - 1 ] - aiStructureSize [ iStructureCount - 1 ] != 0 )
387: {
388: aiStructureType [ iStructureCount ] = TYPE_UNKNOWN ;
389: aiStructureStart [ iStructureCount ] = aiStructureStart [ iStructureCount - 1 ] + aiStructureSize [ iStructureCount - 1 ] ;
390: aiStructureSize [ iStructureCount ] = FileSize ( ) - aiStructureStart [ iStructureCount - 1 ] - aiStructureSize [ iStructureCount - 1 ] ;
391: iStructureCount ++ ;
392: }
393: }
394:
395: void CreatePDFHeader ( int64 iStart , int iSize )
396: {
397: iPDFHeaderCount ++ ;
398: FSeek ( iStart ) ;
399: iHeaderSize = iSize ;
400: PDFHeader sPDFHeader ;
401: }
402:
403: void CreatePDFTrailer ( int64 iStart , int iSize )
404: {
405: iPDFTrailerCount ++ ;
406: FSeek ( iStart ) ;
407: iTrailerSize = iSize ;
408: PDFTrailer sPDFTrailer ;
409: }
410:
411: void CreatePDFUnknown ( int64 iStart , int iSize )
412: {
413: iPDFUnknownCount ++ ;
414: FSeek ( iStart ) ;
415: iUnknownSize = iSize ;
416: PDFUnknown sPDFUnknown ;
417: }
418:
419: void CreatePDFComment ( int64 iStart , int iSize )
420: {
421: iPDFCommentCount ++ ;
422: FSeek ( iStart ) ;
423: iCommentSize = iSize ;
424: PDFComment sPDFComment ;
425: }
426:
427: int IsWhitespace ( int64 iStart , int iSize )
428: {
429: local int64 iIter ;
430: local BYTE bRead ;
431:
432: for ( iIter = iStart ; iIter < iStart + iSize ; iIter ++ )
433: {
434: bRead = ReadByte ( iIter ) ;
435: if ( bRead != 0x9 && bRead != 0xA && bRead != 0xD && bRead != 0x20 )
436: return false ;
437: }
438: return true ;
439: }
440:
441: void CreatePDFWhitespace ( int64 iStart , int iSize )
442: {
443: iPDFWhitespaceCount ++ ;
444: FSeek ( iStart ) ;
445: iWhitespaceSize = iSize ;
446: PDFWhitespace sPDFWhitespace ;
447: }
448:
449: int StartsWith ( int64 iStart , int iSize , string sData )
450: {
451: local int64 iIter ;
452:
453: if ( Strlen ( sData ) > iSize )
454: return false ;
455:
456: for ( iIter = 0 ; iIter < Strlen ( sData ) ; iIter ++ )
457: if ( ReadByte ( iStart + iIter ) != sData [ iIter ] )
458: return false ;
459: return true ;
460: }
461:
462: void CreatePDFXref ( int64 iStart , int iSize )
463: {
464: iPDFXrefCount ++ ;
465: FSeek ( iStart ) ;
466: iXrefSize = iSize ;
467: PDFXref sPDFXref ;
468: }
469:
470: void CreatePDFObject ( int64 iStart , int iSize , int iIndexLengthArg , int iWhiteSpace1LengthArg , int iVersionLengthArg , int iWhiteSpace2LengthArg , int iFoundEndobjArg , int iWhiteSpace3LengthArg )
471: {
472: iPDFObjectCount ++ ;
473: iIndexLength = iIndexLengthArg ;
474: iWhiteSpace1Length = iWhiteSpace1LengthArg ;
475: iVersionLength = iVersionLengthArg ;
476: iWhiteSpace2Length = iWhiteSpace2LengthArg ;
477: iFoundEndobj = iFoundEndobjArg ;
478: iWhiteSpace3Length = iWhiteSpace3LengthArg ;
479: FSeek ( iStart ) ;
480: iDataLength = iSize - iIndexLength - iWhiteSpace1Length - iVersionLength - iWhiteSpace2Length - 6 - 3 - iWhiteSpace3LengthArg ;
481: PDFObj sPDFObj ;
482: }
483:
484: local int iToggleColor = iCOLOR ;
485: void ToggleBackColor ( )
486: {
487: if ( iToggleColor == iCOLOR )
488: iToggleColor = cNone ;
489: else
490: iToggleColor = iCOLOR ;
491: SetBackColor ( iToggleColor ) ;
492: }
493:
494: void CreatePDFStructures ( void )
495: {
496: local int iIter ;
497: for ( iIter = 0 ; iIter < iStructureCount ; iIter ++ )
498: {
499: ToggleBackColor ( ) ;
500: if ( aiStructureType [ iIter ] == TYPE_UNKNOWN && StartsWith ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] , "%" ) )
501: CreatePDFComment ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] ) ;
502: else if ( aiStructureType [ iIter ] == TYPE_UNKNOWN && StartsWith ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] , "xref" ) )
503: CreatePDFXref ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] ) ;
504: else if ( aiStructureType [ iIter ] == TYPE_UNKNOWN && IsWhitespace ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] ) )
505: CreatePDFWhitespace ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] ) ;
506: else if ( aiStructureType [ iIter ] == TYPE_UNKNOWN )
507: CreatePDFUnknown ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] ) ;
508: else if ( aiStructureType [ iIter ] == TYPE_HEADER )
509: CreatePDFHeader ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] ) ;
510: else if ( aiStructureType [ iIter ] == TYPE_TRAILER )
511: CreatePDFTrailer ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] ) ;
512: else if ( aiStructureType [ iIter ] == TYPE_OBJ )
513: CreatePDFObject ( aiStructureStart [ iIter ] , aiStructureSize [ iIter ] , aiStructureExtraParameter1 [ iIter ] , aiStructureExtraParameter2 [ iIter ] , aiStructureExtraParameter3 [ iIter ] , aiStructureExtraParameter4 [ iIter ] , aiStructureExtraParameter5 [ iIter ] , aiStructureExtraParameter6 [ iIter ] ) ;
514: }
515: SetBackColor ( cNone ) ;
516: }
517:
518: void PrintPDFCounters ( void )
519: {
520: Printf ( "Structure counts:\n" ) ;
521: Printf ( " PDFHeader = %5d\n" , iPDFHeaderCount ) ;
522: Printf ( " PDFTrailer = %5d\n" , iPDFTrailerCount ) ;
523: Printf ( " PDFObject = %5d\n" , iPDFObjectCount ) ;
524: Printf ( " PDFComment = %5d\n" , iPDFCommentCount ) ;
525: Printf ( " PDFXref = %5d\n" , iPDFXrefCount ) ;
526: Printf ( " PDFWhitespace = %5d\n" , iPDFWhitespaceCount ) ;
527: Printf ( " PDFUnknown = %5d\n" , iPDFUnknownCount ) ;
528: }
529:
530:
531:
532: FindAllKeywords ( ) ;
533: if ( iKeywordCount == 0 )
534: {
535: Printf ( "Keywords not found, not a PDF file!\n" ) ;
536: return ;
537: }
538:
539: local int aiMerge1KeywordType [ iKeywordCount ] ;
540: local int64 aiMerge1KeywordStart [ iKeywordCount ] ;
541: local int aiMerge1KeywordSize [ iKeywordCount ] ;
542: local int aiMerge2KeywordType [ iKeywordCount ] ;
543: local int64 aiMerge2KeywordStart [ iKeywordCount ] ;
544: local int aiMerge2KeywordSize [ iKeywordCount ] ;
545: local int aiMerge3KeywordType [ iKeywordCount ] ;
546: local int64 aiMerge3KeywordStart [ iKeywordCount ] ;
547: local int aiMerge3KeywordSize [ iKeywordCount ] ;
548:
549: MergeAndFilterAllKeywords ( ) ;
550:
551: local int aiStructureType [ iKeywordCount * 2 + 1 ] ;
552: local int64 aiStructureStart [ iKeywordCount * 2 + 1 ] ;
553: local int aiStructureSize [ iKeywordCount * 2 + 1 ] ;
554: local int aiStructureExtraParameter1 [ iKeywordCount * 2 + 1 ] ;
555: local int aiStructureExtraParameter2 [ iKeywordCount * 2 + 1 ] ;
556: local int aiStructureExtraParameter3 [ iKeywordCount * 2 + 1 ] ;
557: local int aiStructureExtraParameter4 [ iKeywordCount * 2 + 1 ] ;
558: local int aiStructureExtraParameter5 [ iKeywordCount * 2 + 1 ] ;
559: local int aiStructureExtraParameter6 [ iKeywordCount * 2 + 1 ] ;
560:
561: PrepareStructures ( ) ;
562:
563: CreatePDFStructures ( ) ;
564:
565: PrintPDFCounters ( ) ;
566: tok_eof