/** * get structure's label * * @param[in] structures a structre def tree containing structure definitions * @param[in] s the Structure to return the name for * @returns char * pointing to label * * <b>Examples (from test suite):</b> * @snippet spec/def_spec.h testStructureGetName */ char *_d_get_structure_name(T *structures,Structure s) { if (is_sys_structure(s)) { if (s.id == 0) return "NULL_STRUCTURE"; structures = G_sys_defs.structures; } if (structures) { T *def = _t_child(structures,s.id); T *l = _t_child(def,1); return (char *)_t_surface(l); } sprintf(__d_extra_buf,"<unknown structure:%d.%d.%d>",s.context,s.flags,s.id); return __d_extra_buf; }
/** * get the size of a structure * * @param[in] symbols a symbol def tree containing symbol definitions * @param[in] structures a structure def tree containing structure definitions * @param[in] s the structure * @param[in] surface the surface of the structure (may be necessary beause some structures have length info in the data) * @returns size of the structure * * <b>Examples (from test suite):</b> * @snippet spec/def_spec.h testGetSize */ size_t _d_get_structure_size(T *symbols,T *structures,Structure s,void *surface) { size_t size = 0; if (is_sys_structure(s)) { size = _sys_structure_size(s.id,surface); if (size == -1) { raise_error2("DON'T HAVE A SIZE FOR STRUCTURE '%s' (%d)",_d_get_structure_name(structures,s),s.id); } } else { T *structure = _t_child(structures,s.id); T *parts = _t_child(structure,2); DO_KIDS(parts, T *p = _t_child(parts,i); size += _d_get_symbol_size(symbols,structures,*(Symbol *)_t_surface(p),surface +size); ); }
/** * get the size of a structure * * @param[in] sem is the semantic table where symbols and structures are defined * @param[in] s the structure * @param[in] surface the surface of the structure (may be necessary beause some structures have length info in the data) * @returns size of the structure * * <b>Examples (from test suite):</b> * @snippet spec/def_spec.h testGetSize */ size_t _d_get_structure_size(SemTable *sem,Structure s,void *surface) { size_t size = 0; T *structures = _sem_get_defs(sem,s); if (is_sys_structure(s)) { size = _sys_structure_size(s.id,surface); if (size == -1) { raise_error("DON'T HAVE A SIZE FOR STRUCTURE '%s' (%d)",_sem_get_name(sem,s),s.id); } } else { T *structure = _t_child(structures,s.id); T *parts = _t_child(structure,2); if (semeq(_t_symbol(parts),STRUCTURE_SEQUENCE)) { DO_KIDS(parts, T *p = _t_child(parts,i); if (!semeq(_t_symbol(p),STRUCTURE_SYMBOL)) { raise_error("CAN'T GET SIZE FOR VARIABLE STRUCTURES '%s' (%d)",_sem_get_name(sem,s),s.id); } size += _d_get_symbol_size(sem,*(Symbol *)_t_surface(p),surface +size); ); } else if (semeq(_t_symbol(parts),STRUCTURE_SYMBOL)) {
// internal check to see if a structure is valid void __d_validate_structure(SemTable *sem,Structure s,char *n) { if (!is_structure(s)) raise_error("Bad structure in %s def: semantic type not SEM_TYPE_STRUCTURE",n); if (is_sys_structure(s) && (s.id == 0)) return; // NULL_STRUCTURE ok T *structures = _sem_get_defs(sem,s); if(s.id && !_t_child(structures,s.id)) {raise_error("Unknown structure <%d.%d.%d> in declaration of %s",s.context,s.semtype,s.id,n);} }