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