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