11919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah/* 2ecff6554d3c3be05df7416c780ddec219da72a3dStefan Krah * Copyright (c) 2008-2016 Stefan Krah. All rights reserved. 31919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 41919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * Redistribution and use in source and binary forms, with or without 51919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * modification, are permitted provided that the following conditions 61919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * are met: 71919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 81919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 1. Redistributions of source code must retain the above copyright 91919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * notice, this list of conditions and the following disclaimer. 101919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 111919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 2. Redistributions in binary form must reproduce the above copyright 121919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * notice, this list of conditions and the following disclaimer in the 131919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * documentation and/or other materials provided with the distribution. 141919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * 151919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND 161919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 171919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 181919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 191919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 201919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 211919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 221919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 231919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 241919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 251919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah * SUCH DAMAGE. 261919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah */ 271919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 281919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 291919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#include "mpdecimal.h" 301919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#include <stdio.h> 311919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#include <string.h> 321919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah#include <signal.h> 331919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 341919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 351919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid 361919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_dflt_traphandler(mpd_context_t *ctx UNUSED) 371919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 387cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah raise(SIGFPE); 391919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 401919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 411919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid (* mpd_traphandler)(mpd_context_t *) = mpd_dflt_traphandler; 421919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 431919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 441919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah/* Set guaranteed minimum number of coefficient words. The function may 451919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah be used once at program start. Setting MPD_MINALLOC to out-of-bounds 461919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah values is a catastrophic error, so in that case the function exits rather 471919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah than relying on the user to check a return value. */ 481919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid 491919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_setminalloc(mpd_ssize_t n) 501919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 517cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah static int minalloc_is_set = 0; 527cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah 537cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (minalloc_is_set) { 547cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah mpd_err_warn("mpd_setminalloc: ignoring request to set " 557cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah "MPD_MINALLOC a second time\n"); 567cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return; 577cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 587cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (n < MPD_MINALLOC_MIN || n > MPD_MINALLOC_MAX) { 597cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah mpd_err_fatal("illegal value for MPD_MINALLOC"); /* GCOV_NOT_REACHED */ 607cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 617cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah MPD_MINALLOC = n; 627cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah minalloc_is_set = 1; 631919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 641919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 651919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid 661919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_init(mpd_context_t *ctx, mpd_ssize_t prec) 671919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 687cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah mpd_ssize_t ideal_minalloc; 691919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 707cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah mpd_defaultcontext(ctx); 711919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 727cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (!mpd_qsetprec(ctx, prec)) { 737cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah mpd_addstatus_raise(ctx, MPD_Invalid_context); 747cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return; 757cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 761919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 777cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ideal_minalloc = 2 * ((prec+MPD_RDIGITS-1) / MPD_RDIGITS); 787cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (ideal_minalloc < MPD_MINALLOC_MIN) ideal_minalloc = MPD_MINALLOC_MIN; 797cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (ideal_minalloc > MPD_MINALLOC_MAX) ideal_minalloc = MPD_MINALLOC_MAX; 801919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 817cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah mpd_setminalloc(ideal_minalloc); 821919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 831919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 841919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid 851919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_maxcontext(mpd_context_t *ctx) 861919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 877cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->prec=MPD_MAX_PREC; 887cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emax=MPD_MAX_EMAX; 897cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emin=MPD_MIN_EMIN; 907cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->round=MPD_ROUND_HALF_EVEN; 917cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->traps=MPD_Traps; 927cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->status=0; 937cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->newtrap=0; 947cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->clamp=0; 957cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->allcr=1; 961919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 971919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 981919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid 991919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_defaultcontext(mpd_context_t *ctx) 1001919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1017cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->prec=2*MPD_RDIGITS; 1027cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emax=MPD_MAX_EMAX; 1037cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emin=MPD_MIN_EMIN; 1047cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->round=MPD_ROUND_HALF_UP; 1057cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->traps=MPD_Traps; 1067cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->status=0; 1077cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->newtrap=0; 1087cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->clamp=0; 1097cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->allcr=1; 1101919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1111919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1121919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid 1131919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_basiccontext(mpd_context_t *ctx) 1141919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1157cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->prec=9; 1167cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emax=MPD_MAX_EMAX; 1177cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emin=MPD_MIN_EMIN; 1187cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->round=MPD_ROUND_HALF_UP; 1197cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->traps=MPD_Traps|MPD_Clamped; 1207cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->status=0; 1217cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->newtrap=0; 1227cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->clamp=0; 1237cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->allcr=1; 1241919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1251919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1261919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 1271919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_ieee_context(mpd_context_t *ctx, int bits) 1281919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1297cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (bits <= 0 || bits > MPD_IEEE_CONTEXT_MAX_BITS || bits % 32) { 1307cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return -1; 1317cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 1327cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah 1337cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->prec = 9 * (bits/32) - 2; 1347cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emax = 3 * ((mpd_ssize_t)1<<(bits/16+3)); 1357cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emin = 1 - ctx->emax; 1367cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->round=MPD_ROUND_HALF_EVEN; 1377cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->traps=0; 1387cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->status=0; 1397cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->newtrap=0; 1407cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->clamp=1; 1417cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->allcr=1; 1427cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah 1437cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 1441919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1451919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1461919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_ssize_t 1471919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_getprec(const mpd_context_t *ctx) 1481919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1497cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->prec; 1501919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1511919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1521919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_ssize_t 1531919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_getemax(const mpd_context_t *ctx) 1541919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1557cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->emax; 1561919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1571919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1581919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_ssize_t 1591919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_getemin(const mpd_context_t *ctx) 1601919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1617cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->emin; 1621919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1631919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1641919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 1651919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_getround(const mpd_context_t *ctx) 1661919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1677cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->round; 1681919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1691919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1701919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahuint32_t 1711919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_gettraps(const mpd_context_t *ctx) 1721919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1737cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->traps; 1741919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1751919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1761919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahuint32_t 1771919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_getstatus(const mpd_context_t *ctx) 1781919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1797cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->status; 1801919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1811919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1821919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 1831919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_getclamp(const mpd_context_t *ctx) 1841919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1857cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->clamp; 1861919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1871919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1881919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 1891919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_getcr(const mpd_context_t *ctx) 1901919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1917cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return ctx->allcr; 1921919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 1931919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1941919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 1951919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 1961919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsetprec(mpd_context_t *ctx, mpd_ssize_t prec) 1971919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 1987cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (prec <= 0 || prec > MPD_MAX_PREC) { 1997cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2007cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2017cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->prec = prec; 2027cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2031919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2041919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2051919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 2061919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsetemax(mpd_context_t *ctx, mpd_ssize_t emax) 2071919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2087cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (emax < 0 || emax > MPD_MAX_EMAX) { 2097cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2107cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2117cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emax = emax; 2127cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2131919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2141919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2151919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 2161919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsetemin(mpd_context_t *ctx, mpd_ssize_t emin) 2171919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2187cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (emin > 0 || emin < MPD_MIN_EMIN) { 2197cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2207cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2217cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->emin = emin; 2227cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2231919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2241919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2251919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 2261919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsetround(mpd_context_t *ctx, int round) 2271919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2287cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (!(0 <= round && round < MPD_ROUND_GUARD)) { 2297cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2307cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2317cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->round = round; 2327cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2331919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2341919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2351919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 2361919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsettraps(mpd_context_t *ctx, uint32_t traps) 2371919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2387cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (traps > MPD_Max_status) { 2397cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2407cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2417cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->traps = traps; 2427cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2431919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2441919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2451919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 2461919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsetstatus(mpd_context_t *ctx, uint32_t flags) 2471919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2487cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (flags > MPD_Max_status) { 2497cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2507cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2517cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->status = flags; 2527cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2531919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2541919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2551919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 2561919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsetclamp(mpd_context_t *ctx, int c) 2571919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2587cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (c != 0 && c != 1) { 2597cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2607cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2617cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->clamp = c; 2627cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2631919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2641919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2651919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahint 2661919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_qsetcr(mpd_context_t *ctx, int c) 2671919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2687cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (c != 0 && c != 1) { 2697cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 0; 2707cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2717cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->allcr = c; 2727cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah return 1; 2731919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2741919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2751919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2761919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahvoid 2771919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krahmpd_addstatus_raise(mpd_context_t *ctx, uint32_t flags) 2781919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah{ 2797cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->status |= flags; 2807cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah if (flags&ctx->traps) { 2817cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah ctx->newtrap = (flags&ctx->traps); 2827cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah mpd_traphandler(ctx); 2837cc5521d402316cd4faaa9442f323b3a946ad44bStefan Krah } 2841919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah} 2851919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 2861919b7e72bc43315b32f38a6f5f01e8c717907f4Stefan Krah 287