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