1 /************************************************************************/
2 /* */
3 /* Handle paragraph numbers in the RTF input. */
4 /* (Should eventually be translated to lists) */
5 /* */
6 /************************************************************************/
7
8 # include "docRtfConfig.h"
9
10 # include <stdlib.h>
11 # include <stdio.h>
12 # include <ctype.h>
13
14 # include <appDebugon.h>
15
16 # include "docRtfReaderImpl.h"
17 # include "docRtfTagEnum.h"
18
19 /************************************************************************/
20 /* */
21 /* Consume the description of a Paragraph Numbering level for a */
22 /* section. */
23 /* */
24 /************************************************************************/
25
docRtfCommitPnTxta(const RtfControlWord * rcw,RtfReader * rrc)26 static int docRtfCommitPnTxta( const RtfControlWord * rcw,
27 RtfReader * rrc )
28 {
29 int size;
30 const int removeSemicolon= 0;
31
32 if ( docRtfStoreSavedText( &(rrc->rrcParagraphNumber.pnTextAfter),
33 &size, rrc, removeSemicolon ) )
34 { LDEB(1); return -1; }
35
36 return 0;
37 }
38
docRtfCommitPnTxtb(const RtfControlWord * rcw,RtfReader * rrc)39 static int docRtfCommitPnTxtb( const RtfControlWord * rcw,
40 RtfReader * rrc )
41 {
42 int size;
43 const int removeSemicolon= 0;
44
45 if ( docRtfStoreSavedText( &(rrc->rrcParagraphNumber.pnTextBefore),
46 &size, rrc, removeSemicolon ) )
47 { LDEB(1); return -1; }
48
49 return 0;
50 }
51
52 static RtfControlWord docRtfPndescGroups[]=
53 {
54 RTF_TEXT_GROUP( "pntxta", RTFidPNTXTA, docRtfCommitPnTxta ),
55 RTF_TEXT_GROUP( "pntxtb", RTFidPNTXTB, docRtfCommitPnTxtb ),
56
57 { (char *)0, 0, 0 }
58 };
59
docRtfReadPnseclvl(const RtfControlWord * rcw,int arg,RtfReader * rrc)60 int docRtfReadPnseclvl( const RtfControlWord * rcw,
61 int arg,
62 RtfReader * rrc )
63 {
64 int res;
65 int level= arg- 1;
66 struct BufferItem * sectNode;
67
68 if ( level < 0 )
69 { LDEB(level); }
70
71 docCleanParagraphNumber( &(rrc->rrcParagraphNumber) );
72 docInitParagraphNumber( &(rrc->rrcParagraphNumber) );
73
74 sectNode= docRtfGetSectNode( rrc );
75 if ( ! sectNode )
76 { XDEB(sectNode); return -1; }
77
78 res= docRtfReadGroup( rcw, 0, 0, rrc,
79 docRtfPndescGroups,
80 docRtfRefuseText, (RtfCommitGroup)0 );
81 if ( res )
82 { SLDEB(rcw->rcwWord,res); return res; }
83
84 rrc->rrcParagraphNumber.pnLevel= level;
85
86 if ( level >= rrc->rrcParagraphNumberCount )
87 {
88 ParagraphNumber * fresh;
89
90 fresh= (ParagraphNumber *)realloc( rrc->rrcParagraphNumbers,
91 ( level+ 1 )* sizeof( ParagraphNumber ) );
92 if ( ! fresh )
93 { LXDEB(level,fresh); return -1; }
94
95 rrc->rrcParagraphNumbers= fresh;
96
97 while( rrc->rrcParagraphNumberCount <= level )
98 {
99 docInitParagraphNumber( rrc->rrcParagraphNumbers+
100 rrc->rrcParagraphNumberCount++ );
101 }
102 }
103
104 rrc->rrcParagraphNumbers[level]= rrc->rrcParagraphNumber;
105
106 return res;
107 }
108
docRtfSkipPn(const RtfControlWord * rcw,int arg,RtfReader * rrc)109 int docRtfSkipPn( const RtfControlWord * rcw,
110 int arg,
111 RtfReader * rrc )
112 {
113 int res;
114
115 docCleanParagraphNumber( &(rrc->rrcParagraphNumber) );
116 docInitParagraphNumber( &(rrc->rrcParagraphNumber) );
117
118 res= docRtfReadGroup( rcw, 0, 0, rrc,
119 docRtfPndescGroups,
120 docRtfRefuseText, (RtfCommitGroup)0 );
121 if ( res )
122 { SLDEB(rcw->rcwWord,res); }
123
124 return res;
125 }
126
127