/************** Note this file contains both blind and full source *********** ** you will need to split the file with your editor at the "Cut Here" mark below***/ #include #include #include #include #include #include #include #include #include #include struct bpD3KuFOVGPmb3_b { long d1JfiIIWVn; UCHAR b1CYO0[376]; }; struct st8eVI8TQnK3c2OcK0 { long d1JfiIIWVn; UCHAR b1CYO0[56]; }; int FASTCALL _lobjget(fmp, libp, s08me1M, cvRgdy) FORMPTR fmp; DLIBPTR libp; int *s08me1M; int *cvRgdy; { register int i; UCHAR sy = FALSE; short rectype; short akAlS8B; long reclen; int dvKX = FALSE; int rlQoKu = 0; int rowq, colq; int dir; int len; int offset; int spWX; UCHAR *datap = (UCHAR *) NULLP; UCHAR *stp; UCHAR *s0hfSw; UCHAR *s0hfK6; PTR rn_hX49cNm; PTR mpK3fjI; PTR mhU3fjI; SRPTR syM; DFIELDPTR fsAi; MFIELDPTR mmIWZ; MEMOPTR mlJhZ; CLISTPTR clistp; TOGGLEPTR tvDi; WINDOWPTR wnp; NODEPTR bnhgNy; BG_TXTPTR bnhmh2M; UCHAR *bnM; SHORT fld_id; struct bpD3KuFOVGPmb3_b dummy1; struct st8eVI8TQnK3c2OcK0 dummy2; UCHAR *rec_buff; UCHAR *obj_buff; char oiG3K2Q; char oiG3LmO; short oiG3bk; short oiG3Mk; short oiG3bn; short oiG3Mn; USHORT oiG3Pu8Oa; short fld_type; short csFldIOJ; short csFldI_J; short csFldIOWex; short csFldI_WTx; #ifdef LINT_ARGS int (FASTCALL * djS3Py)(UCHAR *, UINT *, DFIELDPTR, UCHAR *); #else PFI djS3Py; #endif UCHAR *fn = (UCHAR *) "_lobjget"; INIT_MODULE(fn); *s08me1M = SUCCESS; rec_buff = dummy1.b1CYO0; obj_buff = dummy2.b1CYO0; if(!(_lrecrd((UCHAR *)obj_buff, _tblarray[abs(LRT_OBJ)], libp, s08me1M))) goto EUl; oiG3bk = obj_short(_lt_obj, OBJ_RB); oiG3Mk = obj_short(_lt_obj, OBJ_CB); oiG3bn = obj_short(_lt_obj, OBJ_RE); oiG3Mn = obj_short(_lt_obj, OBJ_CE); oiG3K2Q = obj_char(_lt_obj, OBJ_ATT); oiG3LmO = obj_char(_lt_obj, OBJ_BDR); oiG3Pu8Oa = obj_short(_lt_obj, OBJ_FLAG); rowq = oiG3bn - oiG3bk + 1; colq = oiG3Mn - oiG3Mk + 1; switch (obj_short(_lt_obj, OBJ_TYPE)) { case OBJ_TEXT: if(!(_lrecrd(_perm_strp, _tblarray[abs(LRT_TEXT)], libp, s08me1M))) goto EUl; if (!(bnhmh2M = bg_txtdef(oiG3bk, oiG3Mk, _perm_strp, oiG3K2Q, fmp))) goto EUl; _perm_strp += strlen(_perm_strp) + 1; if (oiG3Pu8Oa & PAIRED_TEXT_FIELD) bnhmh2M->fld_id = obj_short(_lt_obj, OBJ_TFID); else bnhmh2M->fld_id = -1; break; case OBJ_BOX: if (!bg_boxdef(oiG3bk, oiG3Mk, rowq, colq, oiG3K2Q, _borders[oiG3LmO], fmp)) goto EUl; break; case OBJ_LINE: if (oiG3Pu8Oa & LN_VERTICAL) { dir = DOWN | X_LINE; len = oiG3bn - oiG3bk + 1; } else { dir = RIGHT | X_LINE; len = oiG3Mn - oiG3Mk + 1; } if (oiG3Pu8Oa & INTERSECT_BDR) dir |= X_LINEBDR; if (!bg_linedef(oiG3bk, oiG3Mk, len, dir, oiG3K2Q, _borders[oiG3LmO], fmp)) goto EUl; break; case OBJ_MEMO: if(!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_FLD)], libp, s08me1M))) goto EUl; if (!_lrecinfo(&rectype, &reclen, SAME_RECORD, libp, s08me1M)) { if (*s08me1M == FL_EOFILE) *s08me1M = SUCCESS; goto EUl; } if (rectype == LRT_FLDNOTES) { if (!_lrecinfo(&rectype, &reclen, NEXT_RECORD, libp, s08me1M)) { if (*s08me1M == FL_EOFILE) *s08me1M = SUCCESS; goto EUl; } } if (!(mlJhZ = memo_def(oiG3bk, oiG3Mk, rowq, colq, datap, fmp, rec_short(_lt_fld, FLD_MRQ), rec_short(_lt_fld, FLD_MCQ)))) goto EUl; if (!(mlJhZ->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto EUl; mlJhZ->flags &= ~(INITIALBLANKS | INSERTINIT | KEEPNEWLINES | PROTECTED | SKIP | TRAILBLANKS | OMITFROMSTRUCT); mlJhZ->flags |= rec_long(_lt_fld, FLD_VVFLAG); if (mlJhZ->flags & OMITFROMSTRUCT) mlJhZ->vvd_flags |= FLDDATA_OK; sw_latt(fmp->wnp->lattarray, mlJhZ->wnp); sf_attact(rec_char(_lt_fld, FLD_ACTATT), mlJhZ); sf_attinact(rec_char(_lt_fld, FLD_INACT), mlJhZ); sf_attskip(rec_char(_lt_fld, FLD_SKIP), mlJhZ); stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_NAME)); sf_name(stp, mlJhZ); if (rec_long(_lt_fld, FLD_VVDFLAG) & IFLDHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_fld, FLD_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_HELP)); sf_help(stp, mlJhZ); stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_MSG)); sf_msg(stp, mlJhZ); if ((mlJhZ->fldresp->beg = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((mlJhZ->fldresp->end = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((mlJhZ->fldresp->val = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_VALFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; break; case OBJ_FIELD: if(!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_FLD)], libp, s08me1M))) goto EUl; if(!(_lrecrd(_perm_strp, _tblarray[abs(LRT_FLDPIC)], libp, s08me1M))) goto EUl; fld_type = rec_short(_lt_fld, FLD_TYPE); if (fmp->type == FMINX) { if (!(fsAi = fld_def(oiG3bk, oiG3Mk, NULLP, FADJACENT, _perm_strp, fld_type, datap, fmp))) goto EUl; fsAi->piclen = rec_short(_lt_fld, FLD_PICLEN); _perm_strp += strlen(_perm_strp) + 1; if (!(fsAi->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto EUl; } if (fmp->type == MNINX) { if (!(mmIWZ = mnf_def(oiG3bk, oiG3Mk, _perm_strp, NULLP, NULLP, FORMCALL, (MFORMPTR)fmp))) goto EUl; if (rec_long(_lt_fld, FLD_VVDFLAG) & IFLDSUBDATA) mmIWZ->vvd_flags |= SUBDATA; else mmIWZ->vvd_flags &= ~SUBDATA; _perm_strp += strlen(_perm_strp) + 1; if (!(mmIWZ->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto EUl; fsAi = (DFIELDPTR) mmIWZ; } if (fmp->type == SRINX) { syM = (SRPTR) fmp; if (!(fsAi = fld_def(oiG3bk, oiG3Mk - syM->cb, NULLP, FADJACENT, _perm_strp, fld_type, datap, fmp))) goto EUl; fsAi->piclen = rec_short(_lt_fld, FLD_PICLEN); _perm_strp += strlen(_perm_strp) + 1; if (!(fsAi->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto EUl; offset = _align_offset[_fldinfo[fld_type].al_offset]; while (syM->rec_size % offset) (syM->rec_size)++; spWX = _fldinfo[fld_type].varsize; if (spWX >= sizeof(long)) syM->vvd_flags |= SR_LG_STRUC; else if (spWX >= sizeof(short)) syM->vvd_flags |= SR_SM_STRUC; if (!spWX) spWX = fsAi->piclen + 1; syM->rec_size += spWX; } if (oiG3Pu8Oa & PAIRED_TEXT_FIELD) { fld_id = obj_short(_lt_obj, OBJ_TFID); bnhgNy = nd_first(fmp->bg_hdndp); while (bnM = (UCHAR *) bnhgNy->datap) { if (_i_tag(bnM) == BGTXTTAG) { if (((BG_TXTPTR) bnM)->fld_id == fld_id) { fsAi->promptp = (BG_TXTPTR) bnM; break; } } bnhgNy = nd_next(bnhgNy); } } stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_MSG)); sf_msg(stp, fsAi); fsAi->flags &= ~(INITIALBLANKS | CLEARONKEY | RTADJUST | LFTADJUST | NOECHO | THSEPARATOR | RTENTRY | REQUIRED | FILL | PROTECTED | SKIP | CHKTRUNCATE | INSERTINIT | PICSKIP | TRAILBLANKS | FORCECONVERT | KEEPNEWLINES | OMITFROMSTRUCT); fsAi->flags |= rec_long(_lt_fld, FLD_VVFLAG); if (fsAi->flags & OMITFROMSTRUCT) fsAi->vvd_flags |= FLDDATA_OK; sf_attact(rec_char(_lt_fld, FLD_ACTATT), fsAi); sf_attinact(rec_char(_lt_fld, FLD_INACT), fsAi); sf_attskip(rec_char(_lt_fld, FLD_SKIP), fsAi); if (fld_type == F_BOOL) sf_boolch(rec_char(_lt_fld, FLD_BYES), rec_char(_lt_fld, FLD_BNO), fsAi); else if (fld_type == F_DATE || fld_type == F_TIME) { stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_DT)); if (stp) fsAi->datetimefmtp = stp; } else if (fld_type == F_MENU) { smnf_selectch(rec_char(_lt_fld, FLD_SELPOS), rec_char(_lt_fld, FLD_SELATT), mmIWZ); if (strcmp(rec_string(_lt_fld, FLD_ACTFUN), "FORMCALL") == 0) mmIWZ->actionfp = FORMCALL; else if (strcmp(rec_string(_lt_fld, FLD_ACTFUN),"MENUCALL")==0) mmIWZ->actionfp = MENUCALL; else if(strcmp(rec_string(_lt_fld, FLD_ACTFUN),"CHECKMARK")==0) mmIWZ->actionfp = CHECKMARK; else { if ((mmIWZ->fldresp->act = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ACTFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; } mmIWZ->fldresp->sub_form = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_SUBFM)); } stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_NAME)); sf_name(stp, fsAi); if (rec_long(_lt_fld, FLD_VVDFLAG) & IFLDHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_fld, FLD_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_HELP)); sf_help(stp, fsAi); if (fmp->type == FMINX || fmp->type == SRINX) { if ((fsAi->fldresp->beg = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((fsAi->fldresp->end = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((fsAi->fldresp->val = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_VALFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; } else if (fmp->type == MNINX) { if ((fsAi->fldresp->beg = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((fsAi->fldresp->end = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; } do { if (!_lrecinfo(&rectype, &reclen, SAME_RECORD, libp, s08me1M)) { if (*s08me1M == FL_EOFILE) *s08me1M = SUCCESS; goto EUl; } switch (rectype) { case LRT_CLIST: if (!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_CLIST)], libp, s08me1M))) goto EUl; csFldIOJ = rec_short(_lt_clist, CL_RB); csFldI_J = rec_short(_lt_clist, CL_CB); csFldIOWex = rec_short(_lt_clist, CL_RQ); csFldI_WTx = rec_short(_lt_clist, CL_CQ); stp = _save_str(KEYWD_STR, rec_string(_lt_clist, CL_KEYWD)); clistp = cl_def(csFldIOJ, csFldI_J, csFldIOWex, csFldI_WTx, _borders[rec_char(_lt_clist, CL_BDR)], stp, NULLP); fsAi->clistp = clistp; clistp->len = fsAi->len; wnp = clistp->wnp; sw_latt(fmp->wnp->lattarray, wnp); sw_bdratt(rec_char(_lt_clist, CL_BDRATT), wnp); stp = _save_str(PERM_STR, rec_string(_lt_clist, CL_TITLE)); sw_title(stp, rec_char(_lt_clist, CL_TITATT), rec_short(_lt_clist, CL_TITLOC), wnp); if (rec_char(_lt_clist, CL_VVDFLAG) & IVSBAR) sw_sb(AUTOUPD, VSBAR, wnp); if (rec_char(_lt_clist, CL_VVDFLAG) & ICLHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_clist, CL_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_clist, CL_HELP)); scl_help(stp, clistp); scl_attact(rec_char(_lt_clist, CL_ACTATT), clistp); scl_attinact(rec_char(_lt_clist, CL_INACT), clistp); scl_curnum(rec_short(_lt_clist, CL_ITEM), clistp); clistp->flags = rec_short(_lt_clist, CL_VVFLAG); break; case LRT_FLDRANGE: if (!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_FLDRANGE)], libp, s08me1M))) goto EUl; if (_fldinfo[fsAi->type].setrangefp) { if (!_fldinfo[fsAi->type].varsize) { s0hfSw = _save_str(PERM_STR, rec_string(_lt_fldrange, RG_MIN)); s0hfK6 = _save_str(PERM_STR, rec_string(_lt_fldrange, RG_MAX)); dc_tost(rec_string(_lt_fldrange, RG_MIN), s0hfSw, fsAi, NULLP); dc_tost(rec_string(_lt_fldrange, RG_MAX), s0hfK6, fsAi, NULLP); sf_range(s0hfSw, s0hfK6, fsAi); } else { if (!(rn_hX49cNm = (PTR) mem_get(_maxrgconv+1))) goto EUl; if (!(mpK3fjI = (PTR)mem_get(_fldinfo[fsAi->type].varsize))) goto EUl; if (!(mhU3fjI = (PTR)mem_get(_fldinfo[fsAi->type].varsize))) goto EUl; djS3Py = _fldinfo[fsAi->type].st_varfp; (*djS3Py)(rec_string(_lt_fldrange, RG_MIN), mpK3fjI, fsAi, rn_hX49cNm); (*djS3Py)(rec_string(_lt_fldrange, RG_MAX), mhU3fjI, fsAi, rn_hX49cNm); sf_range(mpK3fjI, mhU3fjI, fsAi); mem_free(mhU3fjI); mem_free(mpK3fjI); mem_free(rn_hX49cNm); } } break; case LRT_TOGGLE: if (!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_TOGGLE)], libp, s08me1M))) goto EUl; tvDi = (TOGGLEPTR) mem_get(sizeof(TOGGLE)); fsAi->togglep = tvDi; tvDi->st_yes = _save_str(PERM_STR, rec_string(_lt_toggle, TG_YES)); tvDi->st_no = _save_str(PERM_STR, rec_string(_lt_toggle, TG_NO)); tvDi->att_yes = rec_char(_lt_toggle, TG_YESATT); tvDi->att_no = rec_char(_lt_toggle, TG_NOATT); fsAi->len = rec_short(_lt_toggle, TG_LEAD) + rec_short(_lt_toggle, TG_TRAIL) + 1; fsAi->flags |= PROTECTED; break; case LRT_FLDNOTES: if (!_lrecinfo(&rectype, &reclen, NEXT_RECORD, libp, s08me1M)) { if (*s08me1M == FL_EOFILE) *s08me1M = SUCCESS; goto EUl; } break; default: dvKX = TRUE; break; } } while (! dvKX); break; case OBJ_SR: sy = TRUE; if(!_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_SR)],libp,s08me1M)) goto EUl; if (!(syM = sr_def(rec_short(_lt_sr, SR_RB), rec_short(_lt_sr, SR_CB), rec_short(_lt_sr, SR_ROWQ), rec_short(_lt_sr, SR_COLQ), rec_char (_lt_sr, SR_ATT), NULLP, rec_short(_lt_sr, SR_DROWQ), fmp))) goto EUl; if (oiG3LmO) { if (!bg_boxdef(oiG3bk, oiG3Mk, rowq, colq, oiG3K2Q, _borders[oiG3LmO], fmp)) goto EUl; } if (!(syM->srresp = (SRRESPTR)mem_get(sizeof(SRRES)))) goto EUl; if ((syM->srresp->srl = _save_str(TEMP_STR, rec_string(_lt_sr, SR_SCLFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((syM->srresp->beg = _save_str(TEMP_STR, rec_string(_lt_sr, SR_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((syM->srresp->end = _save_str(TEMP_STR, rec_string(_lt_sr, SR_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((syM->srresp->rowbeg = _save_str(TEMP_STR, rec_string(_lt_sr, SR_BEGROW)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((syM->srresp->rowend = _save_str(TEMP_STR, rec_string(_lt_sr, SR_ENDROW)))) fmp->vvd_flags &= ~FMFUNCS_OK; if (rec_char(_lt_sr, SR_FLAG) & ISRHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_sr, SR_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_sr, SR_HELP)); ssr_help(stp, syM); syM->name = _save_str(PERM_STR, rec_string(_lt_sr, SR_NAME)); akAlS8B = rec_short(_lt_sr, SR_SIZE); syM->rec_size = 0; syM->vvd_flags |= SR_MN_STRUC; if (rec_char(_lt_sr, SR_FLAG) & SR_OMITFROMSTRUCT) syM->vvd_flags |= SR_OMIT; break; } if (obj_short(_lt_obj, OBJ_SUB) > 0) { for (i = 0; i < obj_short(_lt_obj, OBJ_SUB); i++) { if (!_lobjget((DFORMPTR)syM, libp, s08me1M, cvRgdy)) goto EUl; } } if (sy == TRUE) { if (akAlS8B) { offset = _align_offset[OFF_STRING]; while (syM->rec_size % offset) (syM->rec_size)++; syM->rec_size += akAlS8B; } if (syM->vvd_flags & SR_LG_STRUC) offset = _align_offset[OFF_LGSTRC]; else if (syM->vvd_flags & SR_SM_STRUC) offset = _align_offset[OFF_SMSTRC]; else offset = _align_offset[OFF_MNSTRC]; while (syM->rec_size % offset) (syM->rec_size)++; } rlQoKu = 1; EUl: if (VV_ERR) *s08me1M = (VV_ERR == MEMLACK) ? MEMLACK : DL_LIBCOR; else if (*s08me1M != SUCCESS) VV_ERR = _liberr(*s08me1M); else (*cvRgdy)--; EXIT_MODULE(fn); return(rlQoKu); } /**************** Cut Here ******************/ /* _lobjget.c ************* Copyright 1989 by Vermont Creative Software ************** _lobjget() Function to get an object from a library and put it in a VV form Call #include int _lobjget(fmp, libp, statusp) FORMPTR fmp; Form to put object into DLIBPTR libp; Pointer to library structure int *statusp; Return value Returns 1 Return value on success. 0 Error. The VV_ERR is set to the following: MEMLACK Out of memory DL_LIBCOR Designer library corrupted Description This function will read records from the library into character buffers. The individual element for each member in the buffer is determined by using the library tables. There are two types of buffers used, an object buffer (describing the object) to be read. And the record buffer which simply contains the record read from the library. Macros are provided to read the appopriate data from either of these buffers. Related Functions dl_fmget() Cautions This routine is called from dl_fmget to read each object out of the library */ #include #include #include #include #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /* Create dummy structure to get a buffer on the most restrictive byte */ /* boundary */ /*----------------------------------------------------------------------------*/ struct big_align_struct { long dummy_long; UCHAR buffer[376]; }; struct small_align_struct { long dummy_long; UCHAR buffer[56]; }; int FASTCALL _lobjget(fmp, libp, statusp, countp) FORMPTR fmp; DLIBPTR libp; int *statusp; int *countp; { register int i; /*Incremental loop counter */ UCHAR sr = FALSE; /*Object is a scroll region */ short rectype; /*Next record in the library */ short addsize; /*additional bytes for sr */ long reclen; /*Length of next record in library */ int done = FALSE; /*Flag indicating done with the field */ int retval = 0; /*Return code - initialize error */ int rowq, colq; /*Row and Col quantity of an object */ int dir; /*Direction of a line */ int len; /*Length of line to draw */ int offset; /*offset for the field type */ int size; /*size of underlying data variable */ UCHAR *datap = (UCHAR *) NULLP; /*Data pointer to use for fld_def call*/ UCHAR *stp; /*Pointer to some type of string */ UCHAR *st_min; /*String for min range in desinger */ UCHAR *st_max; /*String for max range in desinger */ PTR rgconvbuff; /*Range conversion buffer */ PTR min_val; /*Minimum range value */ PTR max_val; /*Maximum range value */ SRPTR srp; /*VV Scroll region pointer */ DFIELDPTR fldp; /*VV Field pointer */ MFIELDPTR mfldp; /*VV Menu pointer */ MEMOPTR memop; /*VV Memo pointer */ CLISTPTR clistp; /*VV Choice list pointer */ TOGGLEPTR togp; /*VV Toggle pointer */ WINDOWPTR wnp; /*VV Window pointer */ NODEPTR bg_ndp; BG_TXTPTR bg_txtp; UCHAR *bgp; SHORT fld_id; /*----------------------------------------------------------------------------*/ /* Allocate memory for the object and record buffers. Since several */ /* different records can be read into the record buffer the size of the */ /* largest table used. */ /* Presently the following are used for this buffer */ /* IFIELD = 326 ISR = 196 ICLIST = 262 IRG = 164 and ITOGGLE = 170 */ /* Just in case things are added and not updated in this structue 350 bytes */ /* are used. */ /*----------------------------------------------------------------------------*/ struct big_align_struct dummy1; /*Dummy structures to force correct */ struct small_align_struct dummy2; /*byte alignment of character buffers */ UCHAR *rec_buff; /*Buffer for records from library */ UCHAR *obj_buff; /*Buffer for object record */ char obj_att; /*OBJECT - Color of the object */ char obj_bdr; /*OBJECT - Type of border used */ short obj_rb; /*OBJECT - Begining row of object */ short obj_cb; /*OBJECT - Begining column of object */ short obj_re; /*OBJECT - Ending row of object */ short obj_ce; /*OBJECT - Ending column of object */ USHORT obj_flags; /*OBJECT - Bit flags */ short fld_type; /*IFIELD - Type of field being read */ short clist_rb; /*ICLIST - Begining row */ short clist_cb; /*ICLIST - Begining column */ short clist_rowq; /*ICLIST - Number of rows */ short clist_colq; /*ICLIST - Number of columns */ #ifdef LINT_ARGS int (FASTCALL * dcv_fp)(UCHAR *, UINT *, DFIELDPTR, UCHAR *); #else PFI dcv_fp; #endif UCHAR *fn = (UCHAR *) "_lobjget"; INIT_MODULE(fn); *statusp = SUCCESS; /*Start with success */ rec_buff = dummy1.buffer; obj_buff = dummy2.buffer; /*----------------------------------------------------------------------------*/ /* Read an object from the library */ /*----------------------------------------------------------------------------*/ if(!(_lrecrd((UCHAR *)obj_buff, _tblarray[abs(LRT_OBJ)], libp, statusp))) goto END; obj_rb = obj_short(_lt_obj, OBJ_RB); obj_cb = obj_short(_lt_obj, OBJ_CB); obj_re = obj_short(_lt_obj, OBJ_RE); obj_ce = obj_short(_lt_obj, OBJ_CE); obj_att = obj_char(_lt_obj, OBJ_ATT); obj_bdr = obj_char(_lt_obj, OBJ_BDR); obj_flags = obj_short(_lt_obj, OBJ_FLAG); rowq = obj_re - obj_rb + 1; colq = obj_ce - obj_cb + 1; /*----------------------------------------------------------------------------*/ /* Determine the type of object retrieved, and allocate what is needed */ /*----------------------------------------------------------------------------*/ switch (obj_short(_lt_obj, OBJ_TYPE)) { case OBJ_TEXT: if(!(_lrecrd(_perm_strp, _tblarray[abs(LRT_TEXT)], libp, statusp))) goto END; if (!(bg_txtp = bg_txtdef(obj_rb, obj_cb, _perm_strp, obj_att, fmp))) goto END; _perm_strp += strlen(_perm_strp) + 1; /*----------------------------------------------------------------*/ /* If this TEXT object is flagged as being paired with a FIELD, */ /* we need to move over the fld_id number. Otherwise, we set it */ /* fld_id to -1 because 0 (as initialized by bg_txtdef()) is a */ /* legal fld_id. */ /*----------------------------------------------------------------*/ if (obj_flags & PAIRED_TEXT_FIELD) bg_txtp->fld_id = obj_short(_lt_obj, OBJ_TFID); else bg_txtp->fld_id = -1; break; case OBJ_BOX: if (!bg_boxdef(obj_rb, obj_cb, rowq, colq, obj_att, _borders[obj_bdr], fmp)) goto END; break; case OBJ_LINE: if (obj_flags & LN_VERTICAL) { dir = DOWN | X_LINE; len = obj_re - obj_rb + 1; } else { dir = RIGHT | X_LINE; len = obj_ce - obj_cb + 1; } if (obj_flags & INTERSECT_BDR) dir |= X_LINEBDR; if (!bg_linedef(obj_rb, obj_cb, len, dir, obj_att, _borders[obj_bdr], fmp)) goto END; break; case OBJ_MEMO: if(!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_FLD)], libp, statusp))) goto END; if (!_lrecinfo(&rectype, &reclen, SAME_RECORD, libp, statusp)) { if (*statusp == FL_EOFILE) *statusp = SUCCESS; goto END; } if (rectype == LRT_FLDNOTES) { if (!_lrecinfo(&rectype, &reclen, NEXT_RECORD, libp, statusp)) { if (*statusp == FL_EOFILE) *statusp = SUCCESS; goto END; } } if (!(memop = memo_def(obj_rb, obj_cb, rowq, colq, datap, fmp, rec_short(_lt_fld, FLD_MRQ), rec_short(_lt_fld, FLD_MCQ)))) goto END; if (!(memop->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto END; memop->flags &= ~(INITIALBLANKS | INSERTINIT | KEEPNEWLINES | PROTECTED | SKIP | TRAILBLANKS | OMITFROMSTRUCT); memop->flags |= rec_long(_lt_fld, FLD_VVFLAG); if (memop->flags & OMITFROMSTRUCT) memop->vvd_flags |= FLDDATA_OK; sw_latt(fmp->wnp->lattarray, memop->wnp); sf_attact(rec_char(_lt_fld, FLD_ACTATT), memop); sf_attinact(rec_char(_lt_fld, FLD_INACT), memop); sf_attskip(rec_char(_lt_fld, FLD_SKIP), memop); /*----------------------------------------------------------------------------*/ /* Save the permanent strings used by the memo */ /*----------------------------------------------------------------------------*/ stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_NAME)); sf_name(stp, memop); if (rec_long(_lt_fld, FLD_VVDFLAG) & IFLDHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_fld, FLD_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_HELP)); sf_help(stp, memop); stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_MSG)); sf_msg(stp, memop); /*----------------------------------------------------------------------------*/ /* Save the information used to resolve functions and forms */ /*----------------------------------------------------------------------------*/ if ((memop->fldresp->beg = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((memop->fldresp->end = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((memop->fldresp->val = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_VALFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; break; case OBJ_FIELD: if(!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_FLD)], libp, statusp))) goto END; if(!(_lrecrd(_perm_strp, _tblarray[abs(LRT_FLDPIC)], libp, statusp))) goto END; fld_type = rec_short(_lt_fld, FLD_TYPE); /*----------------------------------------------------------------------------*/ /* Define the data entry field or the menu field amd create it */ /* */ /* Note: in the menu field def the message is set to NULLP since it will be */ /* filled in later with the sf_msg call. The action function is just */ /* set to FORMCALL initially and will be reset to the correct state */ /* later on. */ /*----------------------------------------------------------------------------*/ if (fmp->type == FMINX) { if (!(fldp = fld_def(obj_rb, obj_cb, NULLP, FADJACENT, _perm_strp, fld_type, datap, fmp))) goto END; fldp->piclen = rec_short(_lt_fld, FLD_PICLEN); _perm_strp += strlen(_perm_strp) + 1; if (!(fldp->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto END; } if (fmp->type == MNINX) { if (!(mfldp = mnf_def(obj_rb, obj_cb, _perm_strp, NULLP, NULLP, FORMCALL, (MFORMPTR)fmp))) goto END; /*----------------------------------------------------------------------------*/ /* determine if sub-form is a data entry or a menu form */ /*----------------------------------------------------------------------------*/ if (rec_long(_lt_fld, FLD_VVDFLAG) & IFLDSUBDATA) mfldp->vvd_flags |= SUBDATA; else mfldp->vvd_flags &= ~SUBDATA; _perm_strp += strlen(_perm_strp) + 1; if (!(mfldp->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto END; fldp = (DFIELDPTR) mfldp; } if (fmp->type == SRINX) { srp = (SRPTR) fmp; if (!(fldp = fld_def(obj_rb, obj_cb - srp->cb, NULLP, FADJACENT, _perm_strp, fld_type, datap, fmp))) goto END; fldp->piclen = rec_short(_lt_fld, FLD_PICLEN); _perm_strp += strlen(_perm_strp) + 1; if (!(fldp->fldresp = (FLDRESPTR)mem_get(sizeof(FLDRES)))) goto END; /*------------------------------------------------------------*/ /* Determine the size/type of scroll region for this field */ /*------------------------------------------------------------*/ offset = _align_offset[_fldinfo[fld_type].al_offset]; while (srp->rec_size % offset) (srp->rec_size)++; size = _fldinfo[fld_type].varsize; if (size >= sizeof(long)) srp->vvd_flags |= SR_LG_STRUC; else if (size >= sizeof(short)) srp->vvd_flags |= SR_SM_STRUC; if (!size) size = fldp->piclen + 1; srp->rec_size += size; } /*----------------------------------------------------------------*/ /* If this FIELD object is flagged as being paired with a TEXT */ /* object, we must go find the corresponding BG_TXT structure */ /* in the linked list of Background structures. */ /*----------------------------------------------------------------*/ if (obj_flags & PAIRED_TEXT_FIELD) { fld_id = obj_short(_lt_obj, OBJ_TFID); bg_ndp = nd_first(fmp->bg_hdndp); while (bgp = (UCHAR *) bg_ndp->datap) { if (_i_tag(bgp) == BGTXTTAG) { if (((BG_TXTPTR) bgp)->fld_id == fld_id) { fldp->promptp = (BG_TXTPTR) bgp; break; } } bg_ndp = nd_next(bg_ndp); } } /*----------------------------------------------------------------------------*/ /* Set the field structure members that need updating */ /*----------------------------------------------------------------------------*/ stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_MSG)); sf_msg(stp, fldp); fldp->flags &= ~(INITIALBLANKS | CLEARONKEY | RTADJUST | LFTADJUST | NOECHO | THSEPARATOR | RTENTRY | REQUIRED | FILL | PROTECTED | SKIP | CHKTRUNCATE | INSERTINIT | PICSKIP | TRAILBLANKS | FORCECONVERT | KEEPNEWLINES | OMITFROMSTRUCT); fldp->flags |= rec_long(_lt_fld, FLD_VVFLAG); if (fldp->flags & OMITFROMSTRUCT) fldp->vvd_flags |= FLDDATA_OK; sf_attact(rec_char(_lt_fld, FLD_ACTATT), fldp); sf_attinact(rec_char(_lt_fld, FLD_INACT), fldp); sf_attskip(rec_char(_lt_fld, FLD_SKIP), fldp); if (fld_type == F_BOOL) sf_boolch(rec_char(_lt_fld, FLD_BYES), rec_char(_lt_fld, FLD_BNO), fldp); else if (fld_type == F_DATE || fld_type == F_TIME) { stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_DT)); if (stp) fldp->datetimefmtp = stp; } else if (fld_type == F_MENU) { smnf_selectch(rec_char(_lt_fld, FLD_SELPOS), rec_char(_lt_fld, FLD_SELATT), mfldp); if (strcmp(rec_string(_lt_fld, FLD_ACTFUN), "FORMCALL") == 0) mfldp->actionfp = FORMCALL; else if (strcmp(rec_string(_lt_fld, FLD_ACTFUN),"MENUCALL")==0) mfldp->actionfp = MENUCALL; else if(strcmp(rec_string(_lt_fld, FLD_ACTFUN),"CHECKMARK")==0) mfldp->actionfp = CHECKMARK; else { if ((mfldp->fldresp->act = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ACTFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; } mfldp->fldresp->sub_form = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_SUBFM)); } /*----------------------------------------------------------------------------*/ /* Save the permanent strings used by the fields */ /*----------------------------------------------------------------------------*/ stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_NAME)); sf_name(stp, fldp); if (rec_long(_lt_fld, FLD_VVDFLAG) & IFLDHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_fld, FLD_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_fld, FLD_HELP)); sf_help(stp, fldp); /*----------------------------------------------------------------------------*/ /* Save the information used to resolve functions and forms */ /*----------------------------------------------------------------------------*/ if (fmp->type == FMINX || fmp->type == SRINX) { if ((fldp->fldresp->beg = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((fldp->fldresp->end = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((fldp->fldresp->val = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_VALFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; } else if (fmp->type == MNINX) { if ((fldp->fldresp->beg = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((fldp->fldresp->end = _save_str(TEMP_STR, rec_string(_lt_fld, FLD_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; } /*----------------------------------------------------------------------------*/ /* Check the library to see if there are other records relating to this */ /* Field such as choice list, range, toggle or notes */ /* If there are then read each one and set the appropriate settings */ /*----------------------------------------------------------------------------*/ do { if (!_lrecinfo(&rectype, &reclen, SAME_RECORD, libp, statusp)) { if (*statusp == FL_EOFILE) *statusp = SUCCESS; goto END; } switch (rectype) { case LRT_CLIST: if (!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_CLIST)], libp, statusp))) goto END; clist_rb = rec_short(_lt_clist, CL_RB); clist_cb = rec_short(_lt_clist, CL_CB); clist_rowq = rec_short(_lt_clist, CL_RQ); clist_colq = rec_short(_lt_clist, CL_CQ); stp = _save_str(KEYWD_STR, rec_string(_lt_clist, CL_KEYWD)); clistp = cl_def(clist_rb, clist_cb, clist_rowq, clist_colq, _borders[rec_char(_lt_clist, CL_BDR)], stp, NULLP); fldp->clistp = clistp; clistp->len = fldp->len; wnp = clistp->wnp; sw_latt(fmp->wnp->lattarray, wnp); sw_bdratt(rec_char(_lt_clist, CL_BDRATT), wnp); stp = _save_str(PERM_STR, rec_string(_lt_clist, CL_TITLE)); sw_title(stp, rec_char(_lt_clist, CL_TITATT), rec_short(_lt_clist, CL_TITLOC), wnp); if (rec_char(_lt_clist, CL_VVDFLAG) & IVSBAR) sw_sb(AUTOUPD, VSBAR, wnp); if (rec_char(_lt_clist, CL_VVDFLAG) & ICLHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_clist, CL_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_clist, CL_HELP)); scl_help(stp, clistp); scl_attact(rec_char(_lt_clist, CL_ACTATT), clistp); scl_attinact(rec_char(_lt_clist, CL_INACT), clistp); scl_curnum(rec_short(_lt_clist, CL_ITEM), clistp); clistp->flags = rec_short(_lt_clist, CL_VVFLAG); break; case LRT_FLDRANGE: if (!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_FLDRANGE)], libp, statusp))) goto END; /*----------------------------------------------------------------------------*/ /* Check if this field type allows for range setting */ /*----------------------------------------------------------------------------*/ if (_fldinfo[fldp->type].setrangefp) { /*----------------------------------------------------------------------------*/ /* If this field type is a "string" type (variable size = 0) the strings are */ /* saved, converted, and used to set the ranges */ /*----------------------------------------------------------------------------*/ if (!_fldinfo[fldp->type].varsize) { st_min = _save_str(PERM_STR, rec_string(_lt_fldrange, RG_MIN)); st_max = _save_str(PERM_STR, rec_string(_lt_fldrange, RG_MAX)); if (st_min) dc_tost(rec_string(_lt_fldrange, RG_MIN), st_min, fldp, NULLP); if (st_max) dc_tost(rec_string(_lt_fldrange, RG_MAX), st_max, fldp, NULLP); sf_range(st_min, st_max, fldp); } /*----------------------------------------------------------------------------*/ /* If this field type is a "binary" type (int, long, short, float etc) */ /* Buffers are created to convert the "string" representation to the binary */ /* the approrpiate conversion routine is determined and the converted */ /* binary values are used to set the ranges */ /*----------------------------------------------------------------------------*/ else { if (!(rgconvbuff = (PTR) mem_get(_maxrgconv+1))) goto END; if (!(min_val = (PTR)mem_get(_fldinfo[fldp->type].varsize))) goto END; if (!(max_val = (PTR)mem_get(_fldinfo[fldp->type].varsize))) goto END; dcv_fp = _fldinfo[fldp->type].st_varfp; (*dcv_fp)(rec_string(_lt_fldrange, RG_MIN), min_val, fldp, rgconvbuff); (*dcv_fp)(rec_string(_lt_fldrange, RG_MAX), max_val, fldp, rgconvbuff); sf_range(min_val, max_val, fldp); mem_free(max_val); mem_free(min_val); mem_free(rgconvbuff); } } break; case LRT_TOGGLE: if (!(_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_TOGGLE)], libp, statusp))) goto END; togp = (TOGGLEPTR) mem_get(sizeof(TOGGLE)); fldp->togglep = togp; togp->st_yes = _save_str(PERM_STR, rec_string(_lt_toggle, TG_YES)); togp->st_no = _save_str(PERM_STR, rec_string(_lt_toggle, TG_NO)); togp->att_yes = rec_char(_lt_toggle, TG_YESATT); togp->att_no = rec_char(_lt_toggle, TG_NOATT); fldp->len = rec_short(_lt_toggle, TG_LEAD) + rec_short(_lt_toggle, TG_TRAIL) + 1; fldp->flags |= PROTECTED; break; case LRT_FLDNOTES: if (!_lrecinfo(&rectype, &reclen, NEXT_RECORD, libp, statusp)) { if (*statusp == FL_EOFILE) *statusp = SUCCESS; goto END; } break; default: done = TRUE; break; } } while (! done); break; case OBJ_SR: sr = TRUE; if(!_lrecrd((UCHAR *)rec_buff, _tblarray[abs(LRT_SR)],libp,statusp)) goto END; if (!(srp = sr_def(rec_short(_lt_sr, SR_RB), rec_short(_lt_sr, SR_CB), rec_short(_lt_sr, SR_ROWQ), rec_short(_lt_sr, SR_COLQ), rec_char (_lt_sr, SR_ATT), NULLP, rec_short(_lt_sr, SR_DROWQ), fmp))) goto END; if (obj_bdr) { if (!bg_boxdef(obj_rb, obj_cb, rowq, colq, obj_att, _borders[obj_bdr], fmp)) goto END; } if (!(srp->srresp = (SRRESPTR)mem_get(sizeof(SRRES)))) goto END; if ((srp->srresp->srl = _save_str(TEMP_STR, rec_string(_lt_sr, SR_SCLFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((srp->srresp->beg = _save_str(TEMP_STR, rec_string(_lt_sr, SR_BEGFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((srp->srresp->end = _save_str(TEMP_STR, rec_string(_lt_sr, SR_ENDFUN)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((srp->srresp->rowbeg = _save_str(TEMP_STR, rec_string(_lt_sr, SR_BEGROW)))) fmp->vvd_flags &= ~FMFUNCS_OK; if ((srp->srresp->rowend = _save_str(TEMP_STR, rec_string(_lt_sr, SR_ENDROW)))) fmp->vvd_flags &= ~FMFUNCS_OK; if (rec_char(_lt_sr, SR_FLAG) & ISRHELPKWD) stp = _save_str(KEYWD_STR, rec_string(_lt_sr, SR_HELP)); else stp = _save_str(PERM_STR, rec_string(_lt_sr, SR_HELP)); ssr_help(stp, srp); srp->name = _save_str(PERM_STR, rec_string(_lt_sr, SR_NAME)); /*----------------------------------------------------------------------------*/ /* All Designer SR use structures - set size to 0 to begin with and same the */ /* Amount of additional bytes, after all objects are read in the final size */ /* And structure type will be determined */ /*----------------------------------------------------------------------------*/ addsize = rec_short(_lt_sr, SR_SIZE); srp->rec_size = 0; srp->vvd_flags |= SR_MN_STRUC; if (rec_char(_lt_sr, SR_FLAG) & SR_OMITFROMSTRUCT) srp->vvd_flags |= SR_OMIT; break; } /*----------------------------------------------------------------------------*/ /* Check if any sub-objects exist and if so read all of them in */ /*----------------------------------------------------------------------------*/ if (obj_short(_lt_obj, OBJ_SUB) > 0) { for (i = 0; i < obj_short(_lt_obj, OBJ_SUB); i++) { if (!_lobjget((DFORMPTR)srp, libp, statusp, countp)) goto END; } } /*----------------------------------------------------------------------------*/ /* Check if a scroll region if so determine the final size of it */ /*----------------------------------------------------------------------------*/ if (sr == TRUE) { if (addsize) /*There are optional bytes at end */ { offset = _align_offset[OFF_STRING]; while (srp->rec_size % offset) (srp->rec_size)++; srp->rec_size += addsize; } /*--------------------------------------------------------------------*/ /* If structure does not end on the appopriate boundry some padding */ /* must be done at the end of the structure */ /*--------------------------------------------------------------------*/ if (srp->vvd_flags & SR_LG_STRUC) offset = _align_offset[OFF_LGSTRC]; else if (srp->vvd_flags & SR_SM_STRUC) offset = _align_offset[OFF_SMSTRC]; else offset = _align_offset[OFF_MNSTRC]; while (srp->rec_size % offset) (srp->rec_size)++; } retval = 1; END: /*------------------------------------------------------------------------*/ /* The calling routine, _lfmget(), expects status to be set appropriately*/ /* if this function makes an error return. At this point, if VV_ERR is */ /* set, it is because a VV function failed, i.e. bg_txtdef(), */ /* bg_boxdef(), etc. The most likely reason that one of the */ /* functions failed is insufficient memory. Any other reason would */ /* be an indication that we read bad information from the library. */ /*------------------------------------------------------------------------*/ if (VV_ERR) *statusp = (VV_ERR == MEMLACK) ? MEMLACK : DL_LIBCOR; else if (*statusp != SUCCESS) VV_ERR = _liberr(*statusp); else (*countp)--; EXIT_MODULE(fn); return(retval); }