/** * 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)) {