2 Copyright © 1995-2016, The AROS Development Team. All rights reserved.
6 #include "iffparse_intern.h"
8 /*****************************************************************************
11 #include <proto/iffparse.h>
13 AROS_LH4(LONG
, ReadChunkRecords
,
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
),
22 struct Library
*, IFFParseBase
, 12, IFFParse
)
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.
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.
35 actual - (positive) the actual number of whole records read.
36 (negative) IFFERR_#? error code if not successful.
45 ReadChunkBytes(), ParseIFF(), WriteChunkRecords()
49 *****************************************************************************/
53 struct ContextNode
*cn
;
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 */
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
90 /* Return number of records actually read (if no error occured) */
92 /* IFFERR_#? in bytesread */
93 numRecords
= bytesread
;
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
));
107 } /* ReadChunkRecords */