/* ***************************************************************************** * encode/mcs/list.c -- encode an MCS list. * 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_announce_mcs_list: * Announce a list's size. * * @arg handle the handle to make the size out of. * @arg sz the size to contribute to. * @return the error code (0 if ok). */ int g1m_announce_mcs_list(const g1m_mcsfile_t *handle, size_t *sz) { /* base size of the list */ size_t content_size = handle->head.height * sizeof(mcs_bcd_t); *sz += sizeof(struct mcs_listheader) + content_size; /* check if there's at least one complex */ for (unsigned int i = 0; i < handle->head.height; i++) if (g1m_bcd_has_special(&handle->cells[i][0].real)) { *sz += content_size; return (0); } /* no error! */ return (0); } /** * g1m_encode_mcs_list: * Encode a list. * * @arg handle the handle to make. * @arg buffer the buffer to write to. * @return the error code (0 if ok). */ int g1m_encode_mcs_list(const g1m_mcsfile_t *handle, g1m_buffer_t *buffer) { /* make the header */ struct mcs_listheader hd = { .element_count = htobe16(handle->head.height), .undocumented = {0}}; DWRITE(hd) /* write the real parts */ int one_imgn = 0; for (unsigned int i = 0; i < handle->head.height; i++) { mcs_bcd_t rawbcd; g1m_bcd_tomcs(&handle->cells[i][0].real, &rawbcd); DWRITE(rawbcd) one_imgn |= g1m_bcd_has_special(&handle->cells[i][0].real); } /* write the imaginary parts */ if (one_imgn) for (unsigned int i = 0; i < handle->head.height; i++) { mcs_bcd_t rawbcd; g1m_bcd_tomcs(&handle->cells[i][0].imgn, &rawbcd); DWRITE(rawbcd) } /* no error */ return (0); }