1 /************************************************************************/
2 /*									*/
3 /*  Buffer administration routines.					*/
4 /*									*/
5 /************************************************************************/
6 
7 #   include	"docBufConfig.h"
8 
9 #   include	<appDebugon.h>
10 
11 #   include	"docBuf.h"
12 #   include	"docField.h"
13 #   include	"docEvalField.h"
14 #   include	"docRecalculateFields.h"
15 #   include	<docMergeField.h>
16 
17 /************************************************************************/
18 /*									*/
19 /*  Evaluate fields to merge in external data.				*/
20 /*									*/
21 /************************************************************************/
22 
23 #   define	FIC_COUNT	15
24 
25 /************************************************************************/
26 /*									*/
27 /*  Calculate the value for a database merge field.			*/
28 /*									*/
29 /************************************************************************/
30 
docCalculateMergefieldFieldString(int * pCalculated,MemoryBuffer * mbResult,const DocumentField * df,const RecalculateFields * rf)31 static int docCalculateMergefieldFieldString(
32 				int *				pCalculated,
33 				MemoryBuffer *			mbResult,
34 				const DocumentField *		df,
35 				const RecalculateFields *	rf )
36     {
37     int				rval= 0;
38     MergeField			mf;
39 
40     docInitMergeField( &mf );
41 
42     if  ( docGetMergeField( &mf, df ) )
43 	{ LDEB(1); *pCalculated= 0; goto ready;	}
44 
45     if  ( rf->rfFieldDataProvider )
46 	{
47 	int		ret= 0;
48 	const char *	fieldName= utilMemoryBufferGetString( &(mf.mfFieldName) );
49 
50 	ret= (*rf->rfFieldDataProvider)( pCalculated, mbResult,
51 					    fieldName, rf->rfMergeThrough );
52 	if  ( ret )
53 	    { LDEB(ret); *pCalculated= 0;	}
54 	}
55     else{ *pCalculated= 0;	}
56 
57   ready:
58     docCleanMergeField( &mf );
59 
60     return rval;
61     }
62 
docRecalculateMergeField(int * pCalculated,int * pPartShift,int * pStroffShift,struct BufferItem * paraBi,int part,int partCount,DocumentField * df,const RecalculateFields * rf)63 int docRecalculateMergeField(
64 				int *				pCalculated,
65 				int *				pPartShift,
66 				int *				pStroffShift,
67 				struct BufferItem *		paraBi,
68 				int				part,
69 				int				partCount,
70 				DocumentField *			df,
71 				const RecalculateFields *	rf )
72     {
73     int					rval= 0;
74     MemoryBuffer			mbResult;
75     int					calculated= 0;
76 
77     const FieldKindInformation *	fki= DOC_FieldKinds+ df->dfKind;
78 
79     utilInitMemoryBuffer( &mbResult );
80 
81     if  ( docCalculateMergefieldFieldString( &calculated, &mbResult, df, rf ) )
82 	{ SDEB(fki->fkiLabel); rval= -1; goto ready;	}
83 
84     if  ( ! calculated )
85 	{
86 	*pCalculated= 0;
87 	*pPartShift= 0;
88 	/* NO! *pStroffShift= 0; */
89 	goto ready;
90 	}
91 
92     if  ( docRecalculateFieldParticulesFromString(
93 				    pCalculated, pPartShift, pStroffShift,
94 				    paraBi, part, partCount, &mbResult, rf ) )
95 	{ LDEB(1); rval= -1; goto ready;	}
96 
97   ready:
98 
99     utilCleanMemoryBuffer( &mbResult );
100 
101     return rval;
102     }
103 
104 
105 /*
106 if  ( targetSize < 1+ namelen+ 1 )
107     { LLDEB(namelen,targetSize); *pCalculated= 0; return 0; }
108 
109 size= 0;
110 target[size++]= ISO1_guillemotleft;
111 memcpy( target+ size, value, namelen ); size += namelen;
112 target[size++]= ISO1_guillemotright;
113 target[size]= '\0';
114 */
115 
116