0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 #include <string.h>
0040 #include <stdio.h>
0041 #include <stdlib.h>
0042 #include <memory.h>
0043
0044 #include <ubf.h>
0045 #include <ubf_int.h> /* Internal headers for UBF... */
0046 #include <fdatatype.h>
0047 #include <ferror.h>
0048 #include <fieldtable.h>
0049 #include <ndrstandard.h>
0050 #include <ndebug.h>
0051 #include <cf.h>
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068 expublic int ndrx_Bupdate (UBFH *p_ub_dst, UBFH *p_ub_src)
0069 {
0070 int ret=EXSUCCEED;
0071 UBF_header_t *hdr = (UBF_header_t *)p_ub_dst;
0072 char *p_fld;
0073 BFLDID bfldid = BFIRSTFLDID;
0074 BFLDOCC occ = 0;
0075 BFLDLEN len=0;
0076 Bnext_state_t state;
0077 int nxt_stat;
0078 Bfld_loc_info_t chg_state;
0079 memset(&chg_state, 0, sizeof(chg_state));
0080 memset(&state, 0, sizeof(state));
0081 chg_state.last_checked = &hdr->bfldid;
0082
0083 while(EXSUCCEED==ret &&
0084 1==(nxt_stat=ndrx_Bnext(&state, p_ub_src, &bfldid, &occ, NULL, &len, &p_fld)))
0085 {
0086
0087
0088
0089 if (EXSUCCEED!=(ret=ndrx_Bchg(p_ub_dst, bfldid, occ, p_fld, len, &chg_state, EXFALSE)))
0090 {
0091 UBF_LOG(log_debug, "Failed to set %s[%d]",
0092 ndrx_Bfname_int(bfldid), occ);
0093 }
0094 }
0095
0096 if (EXFAIL==nxt_stat)
0097 ret=EXFAIL;
0098
0099 return ret;
0100 }
0101
0102
0103
0104
0105
0106
0107
0108 expublic int ndrx_Bconcat (UBFH *p_ub_dst, UBFH *p_ub_src)
0109 {
0110 int ret=EXSUCCEED;
0111 UBF_header_t *hdr = (UBF_header_t *)p_ub_dst;
0112 char *p_fld;
0113 BFLDID bfldid = BFIRSTFLDID;
0114 BFLDOCC occ = 0;
0115 BFLDLEN len=0;
0116 Bnext_state_t state;
0117 int nxt_stat;
0118 Bfld_loc_info_t add_state;
0119
0120
0121 memset(&add_state, 0, sizeof(add_state));
0122 add_state.last_checked = &hdr->bfldid;
0123
0124 memset(&state, 0, sizeof(state));
0125
0126 while(EXSUCCEED==ret &&
0127 1==(nxt_stat=ndrx_Bnext(&state, p_ub_src, &bfldid, &occ, NULL, &len, &p_fld)))
0128 {
0129
0130
0131
0132
0133 if (EXSUCCEED!=(ret=ndrx_Badd(p_ub_dst, bfldid, p_fld, len,
0134 &add_state, NULL)))
0135 {
0136 UBF_LOG(log_debug, "Failed to set %s[%d]",
0137 ndrx_Bfname_int(bfldid), occ);
0138 }
0139 }
0140
0141 if (EXFAIL==nxt_stat)
0142 ret=EXFAIL;
0143
0144 return ret;
0145 }
0146
0147
0148
0149
0150
0151
0152
0153 expublic int ndrx_Bjoin (UBFH *dest, UBFH *src)
0154 {
0155 int ret=EXSUCCEED;
0156 UBF_header_t *hdr = (UBF_header_t *)dest;
0157 char *p_fld;
0158 BFLDID bfldid = BFIRSTFLDID;
0159 BFLDOCC occ = 0;
0160 BFLDLEN len=0;
0161 Bnext_state_t state;
0162 int nxt_stat;
0163 Bfld_loc_info_t chg_state;
0164 memset(&chg_state, 0, sizeof(chg_state));
0165 memset(&state, 0, sizeof(state));
0166 chg_state.last_checked = &hdr->bfldid;
0167
0168 while(EXSUCCEED==ret &&
0169 1==(nxt_stat=ndrx_Bnext(&state, src, &bfldid, &occ, NULL, &len, &p_fld)))
0170 {
0171
0172
0173
0174 if (EXSUCCEED!=ndrx_Bchg(dest, bfldid, occ, p_fld, len, &chg_state, EXTRUE))
0175 {
0176 UBF_LOG(log_debug, "Failed to set %s[%d]",
0177 ndrx_Bfname_int(bfldid), occ);
0178 EXFAIL_OUT(ret);
0179 }
0180 }
0181
0182 if (EXFAIL==nxt_stat)
0183 {
0184 EXFAIL_OUT(ret);
0185 }
0186 UBF_LOG(log_debug, "Delete fields from destination buffer which not have in source buffer");
0187 repeat:
0188 memset(&state, 0, sizeof(state));
0189 bfldid= BFIRSTFLDID;
0190
0191 while(EXSUCCEED==ret &&
0192 1==(nxt_stat=ndrx_Bnext(&state, dest, &bfldid, &occ, NULL, &len, NULL)))
0193 {
0194
0195
0196
0197 if (EXTRUE != _Bpres(src, bfldid, occ))
0198 {
0199 if (EXSUCCEED!=(ret=Bdel(dest, bfldid, occ)))
0200 {
0201 UBF_LOG(log_debug, "Failed to delete %s[%d]",
0202 ndrx_Bfname_int(bfldid), occ);
0203 EXFAIL_OUT(ret);
0204 }
0205 goto repeat;
0206 }
0207
0208 }
0209
0210 out:
0211 return ret;
0212 }
0213
0214
0215
0216
0217
0218
0219
0220 expublic int ndrx_Bojoin (UBFH *dest, UBFH *src)
0221 {
0222 int ret=EXSUCCEED;
0223 UBF_header_t *hdr = (UBF_header_t *)dest;
0224 char *p_fld;
0225 BFLDID bfldid = BFIRSTFLDID;
0226 BFLDOCC occ = 0;
0227 BFLDLEN len=0;
0228 Bnext_state_t state;
0229 int nxt_stat;
0230 Bfld_loc_info_t chg_state;
0231 memset(&chg_state, 0, sizeof(chg_state));
0232 memset(&state, 0, sizeof(state));
0233 chg_state.last_checked = &hdr->bfldid;
0234
0235 while(EXSUCCEED==ret &&
0236 1==(nxt_stat=ndrx_Bnext(&state, src, &bfldid, &occ, NULL, &len, &p_fld)))
0237 {
0238
0239
0240
0241 if (EXSUCCEED!=ndrx_Bchg(dest, bfldid, occ, p_fld, len, &chg_state, EXTRUE))
0242 {
0243 UBF_LOG(log_debug, "Failed to set %s[%d]",
0244 ndrx_Bfname_int(bfldid), occ);
0245 EXFAIL_OUT(ret);
0246 }
0247 }
0248
0249 if (EXFAIL==nxt_stat)
0250 {
0251 ret=EXFAIL;
0252 }
0253
0254 out:
0255 return ret;
0256 }
0257