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 #include <stdio.h>
0037 #include <stdlib.h>
0038 
0039 
0040 #include <string.h>
0041 #include <stdio.h>
0042 #include <stdlib.h>
0043 #include <memory.h>
0044 
0045 #include <ubf.h>
0046 #include <ubf_int.h>    /* Internal headers for UBF... */
0047 #include <fdatatype.h>
0048 #include <ferror.h>
0049 #include <fieldtable.h>
0050 #include <ndrstandard.h>
0051 #include <ndebug.h>
0052 #include <cf.h>
0053 
0054 
0055 
0056 
0057 
0058 
0059 
0060 
0061 
0062 
0063 
0064 
0065 
0066 
0067 
0068 
0069 
0070 
0071 expublic char * ndrx_Bgetalloc (UBFH * p_ub, BFLDID bfldid,
0072                             BFLDOCC occ, BFLDLEN *extralen)
0073 {
0074     int data_type = (bfldid>>EFFECTIVE_BITS);
0075     BFLDLEN tmp_len = 0;
0076     char *fb_data;
0077     char *alloc_buf=NULL;
0078     int alloc_size = 0;
0079     char fn[]="_Bgetalloc";
0080     char *ret=NULL;
0081     char *p_fld=NULL;
0082     dtype_str_t *dtype_str = &G_dtype_str_map[data_type];
0083 
0084     #ifdef UBF_API_DEBUG
0085     dtype_ext1_t *__dbg_dtype_ext1 = &G_dtype_ext1_map[data_type];
0086     #endif
0087 
0088 
0089     fb_data=ndrx_Bfind (p_ub, bfldid, occ, &tmp_len, &p_fld);
0090 
0091     if (NULL!=fb_data)
0092     {
0093         
0094         if (NULL==(ret=ndrx_ubf_get_cbuf(data_type,data_type,
0095                         NULL, fb_data, tmp_len,
0096                         &alloc_buf,
0097                         &alloc_size,
0098                         CB_MODE_ALLOC,
0099                         extralen!=NULL?(*extralen):0)))
0100         {
0101             UBF_LOG(log_error, "%s: get_cbuf failed!", fn);
0102         }
0103         else
0104         {
0105             
0106             if (EXSUCCEED!=dtype_str->p_get_data(dtype_str, p_fld, ret, &tmp_len))
0107             {
0108                 NDRX_FREE(ret); 
0109                 ret=NULL;
0110             }
0111             else
0112             {
0113                 
0114                 if (NULL!=extralen)
0115                     *extralen = tmp_len;
0116             }
0117         }
0118     }
0119     else
0120     {
0121         ret=NULL;
0122     }
0123 
0124     
0125 
0126 
0127 
0128 
0129     #ifdef UBF_API_DEBUG
0130     if (NULL!=ret)
0131     {
0132         __dbg_dtype_ext1->p_dump_data(__dbg_dtype_ext1, "_Bgetalloc got data", ret, &tmp_len);
0133     }
0134     #endif
0135 
0136 
0137     return ret;
0138 }
0139 
0140 
0141 
0142 
0143 
0144 
0145 
0146 
0147 
0148 
0149 expublic int ndrx_Bget (UBFH * p_ub, BFLDID bfldid, BFLDOCC occ,
0150                             char * buf, BFLDLEN * len)
0151 {
0152     int ret=EXSUCCEED;
0153     dtype_str_t *dtype;
0154     char *p;
0155     char *last_checked=NULL;
0156     int last_occ=-1;
0157     char fnname[] = "_Bget";
0158     
0159 
0160     #ifdef UBF_API_DEBUG
0161     dtype_ext1_t *__dbg_dtype_ext1;
0162     #endif
0163 
0164 
0165     UBF_LOG(log_debug, "%s: bfldid: %x, occ: %d", fnname, bfldid, occ);
0166 
0167     if (UBF_BINARY_SEARCH_OK(bfldid))
0168     {
0169         p=get_fld_loc_binary_search(p_ub, bfldid, occ, &dtype, 
0170                 UBF_BINSRCH_GET_LAST_NONE, NULL, NULL, NULL);
0171     }
0172     else
0173     {
0174         p=get_fld_loc(p_ub, bfldid, occ, &dtype, &last_checked, 
0175                 NULL, &last_occ, NULL);
0176     }
0177     
0178     
0179     if (NULL!=p)
0180     {
0181         if (NULL!=buf)
0182         {
0183             ret=dtype->p_get_data(dtype, (char *)p, buf, len);
0184         }
0185         else
0186         {
0187             UBF_LOG(log_debug, "%s: buf=NULL, not returning data!", fnname);
0188         }
0189     }
0190     else
0191     {
0192         ndrx_Bset_error(BNOTPRES);
0193         ret=EXFAIL;
0194     }
0195 
0196     #ifdef UBF_API_DEBUG
0197     if (EXSUCCEED==ret)
0198     {
0199         __dbg_dtype_ext1 = &G_dtype_ext1_map[bfldid>>EFFECTIVE_BITS];
0200         __dbg_dtype_ext1->p_dump_data(__dbg_dtype_ext1, "_Bget got data", buf, len);
0201     }
0202     #endif
0203 
0204     UBF_LOG(log_debug, "%s: ret: %d", fnname, ret);
0205 
0206     return ret;
0207 }
0208 
0209 
0210 
0211 
0212 
0213 
0214 
0215 
0216 
0217 
0218 expublic int ndrx_Bgetlast (UBFH *p_ub, BFLDID bfldid,
0219                         BFLDOCC *occ, char *buf, BFLDLEN *len)
0220 {
0221     int ret=EXSUCCEED;
0222     dtype_str_t *dtype;
0223     char *p;
0224     char *last_checked = NULL;
0225     char *last_match = NULL;
0226     int last_occ=-1;
0227     char fnname[] = "_Bgetlast";
0228 
0229     #ifdef UBF_API_DEBUG
0230     dtype_ext1_t *__dbg_dtype_ext1;
0231     #endif
0232 
0233 
0234     UBF_LOG(log_debug, "%s: bfldid: %x", fnname, bfldid);
0235     if (UBF_BINARY_SEARCH_OK(bfldid))
0236     {
0237         get_fld_loc_binary_search(p_ub, bfldid, EXFAIL, &dtype, 
0238                     UBF_BINSRCH_GET_LAST, &last_occ, NULL, &last_match);
0239     }
0240     else
0241     {
0242         get_fld_loc(p_ub, bfldid, -2, &dtype, &last_checked, &last_match, &last_occ, NULL);
0243     }
0244 
0245     if (EXFAIL!=last_occ && !ndrx_Bis_error()) 
0246     {
0247         
0248         dtype = &G_dtype_str_map[bfldid>>EFFECTIVE_BITS];
0249         if (NULL!=buf)
0250         {
0251             ret=dtype->p_get_data(dtype, (char *)last_match, buf, len);
0252         }
0253         else
0254         {
0255             UBF_LOG(log_debug, "%s: buf=NULL, not returning data!", fnname);
0256         }
0257 
0258         if (NULL!=occ)
0259         {
0260             *occ = last_occ;
0261             UBF_LOG(log_debug, "%s: Got occ %d!", fnname, *occ);
0262         }
0263         else
0264         {
0265             UBF_LOG(log_debug, "%s: occ=NULL, not returning occ!", fnname);
0266         }
0267     }
0268     else
0269     {
0270         ndrx_Bset_error(BNOTPRES); 
0271         ret=EXFAIL;
0272     }
0273 
0274     #ifdef UBF_API_DEBUG
0275     if (EXSUCCEED==ret && NULL!=buf)
0276     {
0277         __dbg_dtype_ext1 = &G_dtype_ext1_map[bfldid>>EFFECTIVE_BITS];
0278         __dbg_dtype_ext1->p_dump_data(__dbg_dtype_ext1, "_Bget got data", buf, len);
0279     }
0280     #endif
0281 
0282     UBF_LOG(log_debug, "%s: ret: %d", fnname, ret);
0283 
0284     return ret;
0285 }
0286 
0287