wip prep commit in lieu of gfx subsystem update changes.
[AROS.git] / workbench / libs / iffparse / readchunkrecords.c
blob884331774e6fe12b07d048d83da243dc1944ba30
1 /*
2 Copyright © 1995-2016, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #include "iffparse_intern.h"
8 /*****************************************************************************
10 NAME */
11 #include <proto/iffparse.h>
13 AROS_LH4(LONG, ReadChunkRecords,
15 /* SYNOPSIS */
16 AROS_LHA(struct IFFHandle *, iff, A0),
17 AROS_LHA(APTR , buf, A1),
18 AROS_LHA(LONG , bytesPerRecord, D0),
19 AROS_LHA(LONG , numRecords, D1),
21 /* LOCATION */
22 struct Library *, IFFParseBase, 12, IFFParse)
24 /* FUNCTION
25 Read a number of records with the given size from the current chunk
26 into a buffer. Attempts to read past the end of the chunk will be truncated.
28 INPUTS
29 iff - pointer to IFFHandle struct.
30 buf - pointer to a buffer into which the data will be placed.
31 bytesPerRecord - number of bytes per record.
32 numRecords - number of records to read.
34 RESULT
35 actual - (positive) the actual number of whole records read.
36 (negative) IFFERR_#? error code if not successful.
38 NOTES
40 EXAMPLE
42 BUGS
44 SEE ALSO
45 ReadChunkBytes(), ParseIFF(), WriteChunkRecords()
47 INTERNALS
49 *****************************************************************************/
51 AROS_LIBFUNC_INIT
53 struct ContextNode *cn;
55 LONG bytestoread,
56 lefttoread,
57 bytesread;
59 DEBUG_READCHUNKRECORDS(dprintf("ReadChunkRecords: iff %p buf %p bytesPerRecord %ld numRecords %ld\n",
60 iff, buf, bytesPerRecord, numRecords));
62 /* Get pointer to top contextnode */
63 cn = TopChunk(iff);
65 lefttoread = cn->cn_Size - cn->cn_Scan;
67 bytestoread = bytesPerRecord * numRecords;
69 /* If bytestoread > lefttoread then we must truncate the readoperation */
70 if (bytestoread > lefttoread)
72 bytestoread = lefttoread;
75 /* See to it that we only read whole records */
76 bytestoread -= (lefttoread % bytesPerRecord);
79 /* Beware: bytestoread is 0 now if bytesPerRecord > lefttoread */
81 bytesread = ReadStream
83 iff,
84 buf,
85 bytestoread,
86 IPB(IFFParseBase)
90 /* Return number of records actually read (if no error occured) */
91 if (bytesread < 0)
92 /* IFFERR_#? in bytesread */
93 numRecords = bytesread;
94 else
96 /* calculate the actual number of records written */
97 numRecords = bytesread / bytesPerRecord;
99 /* Update number of bytes read */
100 cn->cn_Scan += bytesread;
103 DEBUG_READCHUNKRECORDS(dprintf("ReadChunkRecords: return %ld\n", numRecords));
104 return (numRecords);
106 AROS_LIBFUNC_EXIT
107 } /* ReadChunkRecords */