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 #include <string.h>
0035 #include <stdio.h>
0036 #include <stdlib.h>
0037 #include <memory.h>
0038 #include <errno.h>
0039 #include <dirent.h>
0040 #include <math.h>
0041 #include <ndrstandard.h>
0042 #include <typed_buf.h>
0043 #include <ndebug.h>
0044
0045 #include <userlog.h>
0046 #include <typed_view.h>
0047 #include <view_cmn.h>
0048 #include <atmi_tls.h>
0049
0050 #include "Exfields.h"
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067 expublic int ndrx_Bvnull_int(ndrx_typedview_t *v, ndrx_typedview_field_t *f,
0068 BFLDOCC occ, char *cstruct)
0069 {
0070 int ret = EXFALSE;
0071 int dim_size = f->fldsize/f->count;
0072 char *fld_offs = cstruct+f->offset+occ*dim_size;
0073 short *sv;
0074 int *iv;
0075 long *lv;
0076 float *fv;
0077 double *dv;
0078 int i, j;
0079 int len;
0080 short *C_count;
0081
0082
0083 if (f->nullval_none)
0084 {
0085 UBF_LOG(log_debug, "field set to NONE, no NULL value...");
0086 ret=EXFALSE;
0087 goto out;
0088 }
0089
0090
0091 if (f->flags & NDRX_VIEW_FLAG_ELEMCNT_IND_C)
0092 {
0093 C_count = (short *)(cstruct+f->count_fld_offset);
0094
0095 if (occ >= *C_count)
0096 {
0097 UBF_LOG(log_debug, "test occ=%d max count=%hd - false",
0098 occ, *C_count);
0099 ret=EXTRUE;
0100 goto out;
0101 }
0102 }
0103
0104 switch(f->typecode_full)
0105 {
0106 case BFLD_SHORT:
0107 sv = (short *)fld_offs;
0108
0109 if (*sv==f->nullval_short)
0110 {
0111 ret=EXTRUE;
0112 goto out;
0113 }
0114 break;
0115 case BFLD_INT:
0116 iv = (int *)fld_offs;
0117
0118 if (*iv==f->nullval_int)
0119 {
0120 ret=EXTRUE;
0121 goto out;
0122 }
0123 break;
0124 case BFLD_LONG:
0125 lv = (long *)fld_offs;
0126
0127 if (*lv==f->nullval_long)
0128 {
0129 ret=EXTRUE;
0130 goto out;
0131 }
0132 break;
0133 case BFLD_CHAR:
0134 if (*fld_offs == f->nullval_bin[0])
0135 {
0136 ret=EXTRUE;
0137 goto out;
0138 }
0139
0140 break;
0141 case BFLD_FLOAT:
0142 fv = (float *)fld_offs;
0143
0144 if (fabs( *fv - f->nullval_float)<FLOAT_EQUAL)
0145 {
0146 ret=EXTRUE;
0147 goto out;
0148 }
0149 break;
0150 case BFLD_DOUBLE:
0151 dv = (double *)fld_offs;
0152
0153 if (fabs( *dv - f->nullval_double)<DOUBLE_EQUAL)
0154 {
0155 ret=EXTRUE;
0156 goto out;
0157 }
0158 break;
0159 case BFLD_STRING:
0160
0161
0162 len = dim_size-1;
0163
0164
0165
0166
0167
0168
0169
0170 if (f->flags & NDRX_VIEW_FLAG_NULLFILLER_P)
0171 {
0172
0173 ret=EXTRUE;
0174
0175 if (len < f->nullval_bin_len)
0176 {
0177
0178 ret=EXFALSE;
0179 goto out;
0180 }
0181
0182 for (i=0; i<f->nullval_bin_len; i++)
0183 {
0184 if (i>=len)
0185 {
0186 ret=EXFALSE;
0187 goto out;
0188 }
0189 else if (i==f->nullval_bin_len-1)
0190 {
0191
0192 for (j=i; j<len; j++)
0193 {
0194 if (fld_offs[j]!=f->nullval_bin[i])
0195 {
0196 ret=EXFALSE;
0197 goto out;
0198 }
0199 }
0200 }
0201 else if (fld_offs[i]!=f->nullval_bin[i])
0202 {
0203 ret=EXFALSE;
0204 goto out;
0205 }
0206
0207 }
0208 }
0209 else
0210 {
0211
0212 UBF_LOG(log_dump, "STR_CMP: data: [%s] vs obj: [%s]",
0213 fld_offs, f->nullval_bin);
0214 if (0==strcmp(fld_offs, f->nullval_bin))
0215 {
0216 ret=EXTRUE;
0217 goto out;
0218 }
0219 }
0220
0221 break;
0222 case BFLD_CARRAY:
0223
0224 len = dim_size;
0225
0226 if (!(f->flags & NDRX_VIEW_FLAG_NULLFILLER_P))
0227 {
0228 if (len < f->nullval_bin_len)
0229 {
0230 ret=EXFALSE;
0231 goto out;
0232 }
0233 }
0234
0235
0236 ret=EXTRUE;
0237
0238 for (i=0; i<f->nullval_bin_len; i++)
0239 {
0240 if (i>=len)
0241 {
0242 ret=EXFALSE;
0243 goto out;
0244 }
0245 else if (f->flags & NDRX_VIEW_FLAG_NULLFILLER_P &&
0246 i==f->nullval_bin_len-1)
0247 {
0248
0249 for (j=i; j<len; j++)
0250 {
0251 if (fld_offs[j]!=f->nullval_bin[i])
0252 {
0253 ret=EXFALSE;
0254 goto out;
0255 }
0256 }
0257 }
0258 else if (fld_offs[i]!=f->nullval_bin[i])
0259 {
0260 ret=EXFALSE;
0261 goto out;
0262 }
0263
0264 }
0265
0266 break;
0267 }
0268
0269 out:
0270 UBF_LOG(log_debug, "%s: %s.%s presence %d", __func__, v->vname, f->cname, ret);
0271 return ret;
0272
0273 }
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283 expublic int ndrx_Bvnull(char *cstruct, char *cname, BFLDOCC occ, char *view)
0284 {
0285 int ret = EXFALSE;
0286 ndrx_typedview_t *v = NULL;
0287 ndrx_typedview_field_t *f = NULL;
0288
0289
0290
0291 if (NULL==(v = ndrx_view_get_view(view)))
0292 {
0293 ndrx_Bset_error_fmt(BBADVIEW, "View [%s] not found!", view);
0294 EXFAIL_OUT(ret);
0295 }
0296
0297 if (NULL==(f = ndrx_view_get_field(v, cname)))
0298 {
0299 ndrx_Bset_error_fmt(BNOCNAME, "Field [%s] of view [%s] not found!",
0300 cname, v->vname);
0301 EXFAIL_OUT(ret);
0302 }
0303
0304 if (occ > f->count-1 || occ<0)
0305 {
0306 ndrx_Bset_error_fmt(BEINVAL, "Invalid occurrence requested for field "
0307 "%s.%s, count=%d occ=%d (zero base)",
0308 v->vname, f->cname, f->count, occ);
0309 EXFAIL_OUT(ret);
0310 }
0311
0312 if (EXFAIL==(ret=ndrx_Bvnull_int(v, f, occ, cstruct)))
0313 {
0314
0315 ndrx_Bset_error_fmt(BBADVIEW, "System error occurred.");
0316 goto out;
0317 }
0318
0319 out:
0320 return ret;
0321 }
0322
0323
0324
0325
0326
0327
0328
0329
0330 expublic int ndrx_Bvselinit_int(ndrx_typedview_t *v, ndrx_typedview_field_t *f,
0331 BFLDLEN single_occ, char *cstruct)
0332 {
0333 int ret = EXSUCCEED;
0334 int dim_size;
0335 char *fld_offs;
0336 short *sv;
0337 int *iv;
0338 long *lv;
0339 float *fv;
0340 double *dv;
0341 int i, j;
0342 int len;
0343 int occ;
0344 short *C_count;
0345 unsigned short *L_length;
0346 int start_occ;
0347 int stop_occ;
0348
0349 if (f->nullval_none)
0350 {
0351 UBF_LOG(log_debug, "field set to NONE, no NULL value...");
0352 goto out;
0353 }
0354
0355 if (EXFAIL!=single_occ)
0356 {
0357 start_occ = single_occ;
0358 stop_occ = single_occ+1;
0359 }
0360 else
0361 {
0362 start_occ = 0;
0363 stop_occ = f->count;
0364 }
0365
0366 for (occ=start_occ; occ<stop_occ; occ++)
0367 {
0368
0369 if (f->flags & NDRX_VIEW_FLAG_ELEMCNT_IND_C)
0370 {
0371 C_count = (short *)(cstruct+f->count_fld_offset);
0372
0373
0374 if (EXFAIL==single_occ)
0375 {
0376 *C_count = 0;
0377 }
0378 }
0379
0380 dim_size = f->fldsize/f->count;
0381 fld_offs = cstruct+f->offset+occ*dim_size;
0382
0383 switch(f->typecode_full)
0384 {
0385 case BFLD_SHORT:
0386 sv = (short *)fld_offs;
0387 *sv=f->nullval_short;
0388
0389 break;
0390 case BFLD_INT:
0391 iv = (int *)fld_offs;
0392 *iv=f->nullval_int;
0393 break;
0394 case BFLD_LONG:
0395 lv = (long *)fld_offs;
0396 *lv=f->nullval_long;
0397 break;
0398 case BFLD_CHAR:
0399 *fld_offs = f->nullval_bin[0];
0400 break;
0401 case BFLD_FLOAT:
0402 fv = (float *)fld_offs;
0403 *fv = f->nullval_float;
0404 break;
0405 case BFLD_DOUBLE:
0406 dv = (double *)fld_offs;
0407 *dv = f->nullval_double;
0408 break;
0409 case BFLD_STRING:
0410
0411
0412 if (f->flags & NDRX_VIEW_FLAG_LEN_INDICATOR_L)
0413 {
0414
0415 L_length = (unsigned short *)(cstruct+f->length_fld_offset+
0416 occ*sizeof(unsigned short));
0417 *L_length = 0;
0418 }
0419
0420 if (f->flags & NDRX_VIEW_FLAG_NULLFILLER_P)
0421 {
0422 for (i=0; i<f->nullval_bin_len; i++)
0423 {
0424 if (i>=dim_size-1)
0425 {
0426
0427 fld_offs[i] = EXEOS;
0428 break;
0429 }
0430 else if (i==f->nullval_bin_len-1)
0431 {
0432
0433 for (j=i; j<dim_size-1; j++)
0434 {
0435 fld_offs[j]=f->nullval_bin[i];
0436 }
0437
0438 fld_offs[dim_size-1] = EXEOS;
0439 break;
0440 }
0441 else
0442 {
0443
0444 fld_offs[i]=f->nullval_bin[i];
0445 }
0446 }
0447 }
0448 else
0449 {
0450 len = f->nullval_bin_len;
0451
0452 if (len>dim_size)
0453 {
0454 len = dim_size-1;
0455 }
0456
0457 NDRX_STRNCPY(fld_offs, f->nullval_bin, len);
0458
0459 fld_offs[len] = EXEOS;
0460 }
0461
0462 break;
0463 case BFLD_CARRAY:
0464
0465
0466 if (f->flags & NDRX_VIEW_FLAG_LEN_INDICATOR_L)
0467 {
0468 L_length = (unsigned short *)(cstruct+f->length_fld_offset+
0469 occ*sizeof(unsigned short));
0470 *L_length = 0;
0471 }
0472
0473 len = dim_size;
0474
0475
0476 for (i=0; i<f->nullval_bin_len; i++)
0477 {
0478 if (i>=len)
0479 {
0480 break;
0481 }
0482 else if (f->flags & NDRX_VIEW_FLAG_NULLFILLER_P &&
0483 i==f->nullval_bin_len-1 && i<len)
0484 {
0485
0486 for (j=i; j<len; j++)
0487 {
0488 fld_offs[j]=f->nullval_bin[i];
0489 }
0490 }
0491 else
0492 {
0493 fld_offs[i]=f->nullval_bin[i];
0494 }
0495 }
0496 break;
0497 }
0498 }
0499
0500 out:
0501
0502 return ret;
0503
0504 }
0505
0506
0507
0508
0509
0510
0511
0512
0513 expublic int ndrx_Bvselinit(char *cstruct, char *cname, char *view)
0514 {
0515 int ret = EXSUCCEED;
0516 ndrx_typedview_t *v = NULL;
0517 ndrx_typedview_field_t *f = NULL;
0518
0519 if (NULL==(v = ndrx_view_get_view(view)))
0520 {
0521 ndrx_Bset_error_fmt(BBADVIEW, "View [%s] not found!", view);
0522 EXFAIL_OUT(ret);
0523 }
0524
0525 if (NULL==(f = ndrx_view_get_field(v, cname)))
0526 {
0527 ndrx_Bset_error_fmt(BNOCNAME, "Field [%s] of view [%s] not found!",
0528 cname, v->vname);
0529 EXFAIL_OUT(ret);
0530 }
0531
0532 if (EXFAIL==ndrx_Bvselinit_int(v, f, EXFAIL, cstruct))
0533 {
0534
0535 ndrx_Bset_error_fmt(BBADVIEW, "System error occurred.");
0536 EXFAIL_OUT(ret);
0537 }
0538
0539 out:
0540 return ret;
0541 }
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551 expublic int ndrx_Bvsinit_int(ndrx_typedview_t *v, char *cstruct)
0552 {
0553 int ret =EXSUCCEED;
0554 ndrx_typedview_field_t *f;
0555
0556
0557 DL_FOREACH(v->fields, f)
0558 {
0559 if (EXSUCCEED!=ndrx_Bvselinit_int(v, f, EXFAIL, cstruct))
0560 {
0561 ndrx_Bset_error_fmt(BBADVIEW, "System error occurred.");
0562 goto out;
0563 }
0564 }
0565
0566 out:
0567 return ret;
0568 }
0569
0570
0571
0572
0573
0574
0575
0576 expublic int ndrx_Bvsinit(char *cstruct, char *view)
0577 {
0578 int ret = EXSUCCEED;
0579 ndrx_typedview_t *v = NULL;
0580
0581 if (NULL==(v = ndrx_view_get_view(view)))
0582 {
0583 ndrx_Bset_error_fmt(BBADVIEW, "View [%s] not found!", view);
0584 EXFAIL_OUT(ret);
0585 }
0586
0587 if (EXSUCCEED!=ndrx_Bvsinit_int(v, cstruct))
0588 {
0589 UBF_LOG(log_error, "ndrx_Bvsinit_int failed!");
0590 EXFAIL_OUT(ret);
0591 }
0592
0593 out:
0594
0595 return ret;
0596 }
0597
0598
0599