summaryrefslogtreecommitdiff
path: root/src/input/vcd/libvcd/info_private.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/vcd/libvcd/info_private.c')
-rw-r--r--src/input/vcd/libvcd/info_private.c62
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