/* ** Copyright (C) 2012 Chris Roberts ** Copyright (C) 2006-2013 Erik de Castro Lopo ** Copyright (C) 2006 Paul Davis ** ** This program 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 2.1 of the License, or ** (at your option) any later version. ** ** 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 Lesser General Public License for more details. ** ** You should have received a copy of the GNU Lesser General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "sfconfig.h" #include #include #include #include #include "common.h" static inline size_t cart_min_size (const SF_CART_INFO* info) { if (info == NULL) return 0 ; return offsetof (SF_CART_INFO, tag_text) + info->tag_text_size ; } /* cart_min_size */ SF_CART_INFO_16K* cart_var_alloc (void) { SF_CART_INFO_16K* thing ; thing = malloc (sizeof (SF_CART_INFO_16K)) ; return thing ; } /* cart_var_alloc */ int cart_var_set (SF_PRIVATE *psf, const SF_CART_INFO * info, size_t datasize) { size_t len ; if (info == NULL) return SF_FALSE ; if (cart_min_size (info) > datasize) { psf->error = SFE_BAD_CART_INFO_SIZE ; return SF_FALSE ; } ; if (datasize >= sizeof (SF_CART_INFO_16K)) { psf->error = SFE_BAD_CART_INFO_TOO_BIG ; return SF_FALSE ; } ; if (psf->cart_16k == NULL) { if ((psf->cart_16k = cart_var_alloc ()) == NULL) { psf->error = SFE_MALLOC_FAILED ; return SF_FALSE ; } ; } ; memcpy (psf->cart_16k, info, offsetof (SF_CART_INFO, tag_text)) ; psf_strlcpy_crlf (psf->cart_16k->tag_text, info->tag_text, sizeof (psf->cart_16k->tag_text), datasize - offsetof (SF_CART_INFO, tag_text)) ; len = strlen (psf->cart_16k->tag_text) ; if (len > 0 && psf->cart_16k->tag_text [len - 1] != '\n') psf_strlcat (psf->cart_16k->tag_text, sizeof (psf->cart_16k->tag_text), "\r\n") ; /* Force tag_text_size to be even. */ len = strlen (psf->cart_16k->tag_text) ; len += (len & 1) ? 1 : 2 ; psf->cart_16k->tag_text_size = (uint32_t) len ; return SF_TRUE ; } /* cart_var_set */ int cart_var_get (SF_PRIVATE *psf, SF_CART_INFO * data, size_t datasize) { size_t size ; if (psf->cart_16k == NULL) return SF_FALSE ; size = SF_MIN (datasize, cart_min_size ((const SF_CART_INFO *) psf->cart_16k)) ; memcpy (data, psf->cart_16k, size) ; return SF_TRUE ; } /* cart_var_get */