| 
									
										
										
										
											2011-02-23 10:52:22 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							| 
									
										
										
										
											2008-04-16 22:40:48 +00:00
										 |  |  |  * of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							| 
									
										
										
										
											2010-02-12 13:34:04 +00:00
										 |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 08:08:12 +11:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup imbdds | 
					
						
							| 
									
										
										
										
											2011-02-27 20:23:21 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | #include <Stream.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | #include <stdio.h>   // printf
 | 
					
						
							|  |  |  | #include <string.h>  // memcpy
 | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-09 04:23:01 +11:00
										 |  |  | static const char *msg_error_seek = "DDS: trying to seek beyond end of stream (corrupt file?)"; | 
					
						
							|  |  |  | static const char *msg_error_read = "DDS: trying to read beyond end of stream (corrupt file?)"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | unsigned int Stream::seek(unsigned int p) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (p > size) { | 
					
						
							|  |  |  |     set_failed(msg_error_seek); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							|  |  |  |     pos = p; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   return pos; | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | unsigned int mem_read(Stream &mem, unsigned long long &i) | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (mem.pos + 8 > mem.size) { | 
					
						
							|  |  |  |     mem.set_failed(msg_error_seek); | 
					
						
							|  |  |  |     return (0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   memcpy(&i, mem.mem + mem.pos, 8);  // @@ todo: make sure little endian
 | 
					
						
							|  |  |  |   mem.pos += 8; | 
					
						
							|  |  |  |   return (8); | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | unsigned int mem_read(Stream &mem, unsigned int &i) | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (mem.pos + 4 > mem.size) { | 
					
						
							|  |  |  |     mem.set_failed(msg_error_read); | 
					
						
							|  |  |  |     return (0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   memcpy(&i, mem.mem + mem.pos, 4);  // @@ todo: make sure little endian
 | 
					
						
							|  |  |  |   mem.pos += 4; | 
					
						
							|  |  |  |   return (4); | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | unsigned int mem_read(Stream &mem, unsigned short &i) | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (mem.pos + 2 > mem.size) { | 
					
						
							|  |  |  |     mem.set_failed(msg_error_read); | 
					
						
							|  |  |  |     return (0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   memcpy(&i, mem.mem + mem.pos, 2);  // @@ todo: make sure little endian
 | 
					
						
							|  |  |  |   mem.pos += 2; | 
					
						
							|  |  |  |   return (2); | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | unsigned int mem_read(Stream &mem, unsigned char &i) | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (mem.pos + 1 > mem.size) { | 
					
						
							|  |  |  |     mem.set_failed(msg_error_read); | 
					
						
							|  |  |  |     return (0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   i = (mem.mem + mem.pos)[0]; | 
					
						
							|  |  |  |   mem.pos += 1; | 
					
						
							|  |  |  |   return (1); | 
					
						
							| 
									
										
										
										
											2007-06-25 19:50:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | unsigned int mem_read(Stream &mem, unsigned char *i, unsigned int cnt) | 
					
						
							| 
									
										
										
										
											2007-10-12 16:09:59 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (mem.pos + cnt > mem.size) { | 
					
						
							|  |  |  |     mem.set_failed(msg_error_read); | 
					
						
							|  |  |  |     return (0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   memcpy(i, mem.mem + mem.pos, cnt); | 
					
						
							|  |  |  |   mem.pos += cnt; | 
					
						
							|  |  |  |   return (cnt); | 
					
						
							| 
									
										
										
										
											2007-10-12 16:09:59 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-04-16 03:39:29 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void Stream::set_failed(const char *msg) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  |   if (!failed) { | 
					
						
							|  |  |  |     puts(msg); | 
					
						
							|  |  |  |     failed = true; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-16 03:39:29 +02:00
										 |  |  | } |