/*------------------------------------------------------------------------- * Function: _lite_PD_mk_descriptor * * Purpose: Build a member descriptor out of the given string. * * Return: Success: * * Failure: * * Programmer: Adapted from PACT PDB * Mar 5, 1996 2:06 PM EST * * Modifications: * Eric Brugger, Tue Dec 8 15:16:07 PST 1998 * Remove unnecessary calls to lite_SC_mark, since reference count now * set when allocated. * *------------------------------------------------------------------------- */ memdes * _lite_PD_mk_descriptor (char *member, int defoff) { memdes *desc; char *ms, *ts, *bs, *ns, *p; dimdes *nd; desc = FMAKE(memdes, "_PD_MK_DESCRIPTOR:desc"); /* * Get rid of any leading white space. */ for (p = member; strchr(" \t\n\r\f", *p) != NULL; p++) /*void*/ ; ms = lite_SC_strsavef(p, "char*:_PD_MK_DESCRIPTOR:member"); ts = _lite_PD_member_type(p); bs = _lite_PD_member_base_type(p); ns = _lite_PD_member_name(p); nd = _lite_PD_ex_dims(p, defoff, FALSE); desc->member = ms; desc->type = ts; desc->base_type = bs; desc->name = ns; desc->dimensions = nd; desc->number = _lite_PD_comp_num(desc->dimensions); desc->member_offs = -1L; desc->cast_offs = -1L; desc->cast_memb = NULL; desc->next = NULL; return(desc); }
static syment * _PD_write (PDBfile *file, char *name, char *intype, char *outtype, lite_SC_byte *vr, dimdes *dims, int appnd) { int reset; syment *ep; long number, addr; char bf[MAXLINE], fullpath[MAXLINE], *lname; _append_flag = FALSE; ep = NULL; switch (setjmp(_lite_PD_write_err)) { case ABORT : return(NULL); case ERR_FREE : return(ep); default : memset(lite_PD_err, 0, MAXLINE); break; } if (file->mode == PD_OPEN) { lite_PD_error("FILE OPENED IN READ-ONLY MODE - _PD_WRITE", PD_WRITE); } strcpy(fullpath, _lite_PD_fixname(file, name)); /* * Append a new block to an existing entry if TRUE. */ if (appnd) { strcpy(bf, fullpath); /* * Do this so that things such as a[20:20].b work properly * NOTE: this also implies that a[20:20].b.c works while * a.b[20:20].c doesn't * for now this defines the semantics of append (10/6/93) */ lname = lite_SC_firsttok(bf, ".()[]"); ep = lite_PD_inquire_entry(file, lname, FALSE, NULL); if (ep == NULL) { lite_PD_error("CAN'T APPEND TO NON-EXISTING ENTRY - _PD_WRITE", PD_WRITE); } _lite_PD_adj_dimensions(file, fullpath, ep); /* * Extend the syment. */ _lite_PD_add_block(file, ep, dims); } addr = file->chrtaddr; ep = _lite_PD_effective_ep(file, fullpath, FALSE, NULL); if (ep != NULL) { /* * If the variable already exists use the existing file info. */ addr = PD_entry_address(ep); _lite_PD_rl_dimensions(dims); lname = fullpath; reset = FALSE; } else { /* * If the variable doesn't exist define it to the file. */ number = _lite_PD_comp_num(dims); ep = _lite_PD_mk_syment(outtype, number, addr, NULL, dims); strcpy(bf, fullpath); lname = lite_SC_firsttok(bf, ".([ "); _lite_PD_e_install(lname, ep, file->symtab); reset = TRUE; } if (file->virtual_internal) { SC_address ad; ad.memaddr = vr; ep->blocks->diskaddr = ad.diskaddr; lite_SC_mark(vr, 1); ep = lite_PD_copy_syment(ep); } else { if (outtype == NULL) outtype = PD_entry_type(ep); if (intype == NULL) intype = outtype; /* * Go to the correct address. */ if (io_seek(file->stream, addr, SEEK_SET)) { lite_PD_error("FSEEK FAILED TO FIND CURRENT ADDRESS - _PD_WRITE", PD_WRITE); } /* * Do the low level write. */ if (!_lite_PD_hyper_write(file, lname, ep, vr, intype)) { lite_PD_error("CAN'T WRITE VARIABLE - _PD_WRITE", PD_WRITE); } /* * If the variable didn't previously exist we're at the end * of the file. */ if (reset) { file->chrtaddr = io_tell(file->stream); if (file->chrtaddr == -1L) { lite_PD_error("CAN'T FIND ADDRESS OF NEXT VARIABLE - _PD_WRITE", PD_WRITE); } /* * Make a releasable copy of the entry * SX depends on this critically!! */ ep = lite_PD_copy_syment(ep); } } return(ep); }