diff options
Diffstat (limited to 'src/input/vcd/libvcd/info_private.c')
-rw-r--r-- | src/input/vcd/libvcd/info_private.c | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/src/input/vcd/libvcd/info_private.c b/src/input/vcd/libvcd/info_private.c index e0297d344..bf86d9b89 100644 --- a/src/input/vcd/libvcd/info_private.c +++ b/src/input/vcd/libvcd/info_private.c @@ -1,5 +1,5 @@ /* - $Id: info_private.c,v 1.1 2003/10/13 11:47:12 f1rmb Exp $ + $Id: info_private.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $ Copyright (C) 2003 Rocky Bernstein <rocky@panix.com> @@ -55,13 +55,13 @@ #include <libvcd/info.h> /* Private headers */ -#include "assert.h" +#include "vcd_assert.h" #include "bytesex.h" #include "data_structures.h" #include "info_private.h" #include "pbc.h" -static const char _rcsid[] = "$Id: info_private.c,v 1.1 2003/10/13 11:47:12 f1rmb Exp $"; +static const char _rcsid[] = "$Id: info_private.c,v 1.2 2004/04/11 12:20:32 miguelfreitas Exp $"; /* This fills in unassigned LIDs in the offset table. Due to @@ -118,20 +118,23 @@ vcdinf_update_offset_list(struct _vcdinf_pbc_ctx *obj, bool extended) /*! Calls recursive routine to populate obj->offset_list or obj->offset_x_list by going through LOT. + + Returns false if there was some error. */ -void +bool vcdinf_visit_lot (struct _vcdinf_pbc_ctx *obj) { const LotVcd *lot = obj->extended ? obj->lot_x : obj->lot; unsigned int n, tmp; + bool ret=true; if (obj->extended) { - if (!obj->psd_x_size) return; - } else if (!obj->psd_size) return; + if (!obj->psd_x_size) return false; + } else if (!obj->psd_size) return false; for (n = 0; n < LOT_VCD_OFFSETS; n++) if ((tmp = vcdinf_get_lot_offset(lot, n)) != PSD_OFS_DISABLED) - vcdinf_visit_pbc (obj, n + 1, tmp, true); + ret &= vcdinf_visit_pbc (obj, n + 1, tmp, true); _vcd_list_sort (obj->extended ? obj->offset_x_list : obj->offset_list, (_vcd_list_cmp_func) vcdinf_lid_t_cmp); @@ -140,13 +143,16 @@ vcdinf_visit_lot (struct _vcdinf_pbc_ctx *obj) might obviate the need for vcdinf_visit_pbc() or some of it which is more complex. */ vcdinf_update_offset_list(obj, obj->extended); + return ret; } /*! Recursive routine to populate obj->offset_list or obj->offset_x_list by reading playback control entries referred to via lid. + + Returns false if there was some error. */ -void +bool vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, bool in_lot) { @@ -156,6 +162,7 @@ vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, const uint8_t *psd = obj->extended ? obj->psd_x : obj->psd; unsigned int _rofs = offset * obj->offset_mult; VcdList *offset_list; + bool ret=true; vcd_assert (psd_size % 8 == 0); @@ -164,7 +171,7 @@ vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, case PSD_OFS_DISABLED: case PSD_OFS_MULTI_DEF: case PSD_OFS_MULTI_DEF_NO_NUM: - return; + return true; default: break; @@ -173,15 +180,13 @@ vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, if (_rofs >= psd_size) { if (obj->extended) - vcd_error ("psd offset out of range in extended PSD" - " (try --no-ext-psd option)"); + vcd_warn ("psd offset out of range in extended PSD (%d >= %d)", + _rofs, psd_size); else vcd_warn ("psd offset out of range (%d >= %d)", _rofs, psd_size); - return; + return false; } - vcd_assert (_rofs < psd_size); - if (!obj->offset_list) obj->offset_list = _vcd_list_new (); @@ -212,7 +217,7 @@ vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, ofs->ext = obj->extended; - return; /* already been there... */ + return true; /* already been there... */ } } @@ -239,9 +244,10 @@ vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, vcd_warn ("LOT entry assigned LID %d, but descriptor has LID %d", ofs->lid, lid); - vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_prev_offset(d), false); - vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_next_offset(d), false); - vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_return_offset(d), false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_prev_offset(d), false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_next_offset(d), false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_pld_get_return_offset(d), + false); } break; @@ -261,15 +267,18 @@ vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, vcd_warn ("LOT entry assigned LID %d, but descriptor has LID %d", ofs->lid, uint16_from_be (d->lid) & 0x7fff); - vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_prev_offset(d), false); - vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_next_offset(d), false); - vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_return_offset(d), false); - vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_default_offset(d), false); - vcdinf_visit_pbc (obj, 0, uint16_from_be (d->timeout_ofs), false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_prev_offset(d), false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_next_offset(d), false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_return_offset(d), + false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_default_offset(d), + false); + ret &= vcdinf_visit_pbc (obj, 0, uint16_from_be (d->timeout_ofs), + false); for (idx = 0; idx < vcdinf_get_num_selections(d); idx++) - vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_offset(d, idx), - false); + ret &= vcdinf_visit_pbc (obj, 0, vcdinf_psd_get_offset(d, idx), + false); } break; @@ -280,9 +289,10 @@ vcdinf_visit_pbc (struct _vcdinf_pbc_ctx *obj, lid_t lid, unsigned int offset, default: vcd_warn ("corrupt PSD???????"); free (ofs); - return; + return false; break; } + return ret; } /*! Return the starting LBA (logical block address) for sequence |