1/* pngrio.c - functions for data input2*3* Last changed in libpng 1.6.24 [August 4, 2016]4* Copyright (c) 1998-2002,2004,2006-2016 Glenn Randers-Pehrson5* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)6* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)7*8* This code is released under the libpng license.9* For conditions of distribution and use, see the disclaimer10* and license in png.h11*12* This file provides a location for all input. Users who need13* special handling are expected to write a function that has the same14* arguments as this and performs a similar function, but that possibly15* has a different input method. Note that you shouldn't change this16* function, but rather write a replacement function and then make17* libpng use it at run time with png_set_read_fn(...).18*/1920#include "pngpriv.h"2122#ifdef PNG_READ_SUPPORTED2324/* Read the data from whatever input you are using. The default routine25* reads from a file pointer. Note that this routine sometimes gets called26* with very small lengths, so you should implement some kind of simple27* buffering if you are using unbuffered reads. This should never be asked28* to read more than 64K on a 16-bit machine.29*/30void /* PRIVATE */31png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length)32{33png_debug1(4, "reading %d bytes", (int)length);3435if (png_ptr->read_data_fn != NULL)36(*(png_ptr->read_data_fn))(png_ptr, data, length);3738else39png_error(png_ptr, "Call to NULL read function");40}4142#ifdef PNG_STDIO_SUPPORTED43/* This is the function that does the actual reading of data. If you are44* not reading from a standard C stream, you should create a replacement45* read_data function and use it at run time with png_set_read_fn(), rather46* than changing the library.47*/48void PNGCBAPI49png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)50{51png_size_t check;5253if (png_ptr == NULL)54return;5556/* fread() returns 0 on error, so it is OK to store this in a png_size_t57* instead of an int, which is what fread() actually returns.58*/59check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr));6061if (check != length)62png_error(png_ptr, "Read Error");63}64#endif6566/* This function allows the application to supply a new input function67* for libpng if standard C streams aren't being used.68*69* This function takes as its arguments:70*71* png_ptr - pointer to a png input data structure72*73* io_ptr - pointer to user supplied structure containing info about74* the input functions. May be NULL.75*76* read_data_fn - pointer to a new input function that takes as its77* arguments a pointer to a png_struct, a pointer to78* a location where input data can be stored, and a 32-bit79* unsigned int that is the number of bytes to be read.80* To exit and output any fatal error messages the new write81* function should call png_error(png_ptr, "Error msg").82* May be NULL, in which case libpng's default function will83* be used.84*/85void PNGAPI86png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr,87png_rw_ptr read_data_fn)88{89if (png_ptr == NULL)90return;9192png_ptr->io_ptr = io_ptr;9394#ifdef PNG_STDIO_SUPPORTED95if (read_data_fn != NULL)96png_ptr->read_data_fn = read_data_fn;9798else99png_ptr->read_data_fn = png_default_read_data;100#else101png_ptr->read_data_fn = read_data_fn;102#endif103104#ifdef PNG_WRITE_SUPPORTED105/* It is an error to write to a read device */106if (png_ptr->write_data_fn != NULL)107{108png_ptr->write_data_fn = NULL;109png_warning(png_ptr,110"Can't set both read_data_fn and write_data_fn in the"111" same structure");112}113#endif114115#ifdef PNG_WRITE_FLUSH_SUPPORTED116png_ptr->output_flush_fn = NULL;117#endif118}119#endif /* READ */120121122