/* ***************************************************************************** * utils/skip.c -- skip some bytes (useful for debugging). * Copyright (C) 2017 Thomas "Cakeisalie5" Touhey * * This file is part of libg1m. * libg1m is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 3.0 of the License, * or (at your option) any later version. * * libg1m 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libg1m; if not, see . * ************************************************************************** */ #include /** * g1m_skip: * Skip some bytes. * * @arg buffer the buffer from which to read. * @arg size the size to skip. * @arg checksum pointer to the checksum variable if there is one. */ int g1m_skip(g1m_buffer_t *buffer, size_t size, uint32_t *checksum) { uint8_t buf[1024]; int err; uint32_t add = 0; #if LOGLEVEL <= ll_error size_t orig = size; #endif while (size) { /* read that much */ size_t curlen = min(size, 1024); size -= curlen; buffer->g1m_buffer_offset += curlen; if ((err = (*buffer->g1m_buffer_read)(buffer->g1m_buffer_cookie, buf, curlen))) { log_error("Skipping has failed after %" PRIuSIZE " bytes", orig - size); return (err); } /* feed the checksum */ add = g1m_checksum32(buf, curlen, add); } /* add to checksum */ if (checksum) *checksum += add; /* no error */ return (0); }