4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* $NetBSD: dmisc.c,v 1.2.4.1.4.1 2008/04/08 21:10:55 jdc Exp $ */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/****************************************************************
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe author of this software is David M. Gay.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (C) 1998 by Lucent Technologies
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAll Rights Reserved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPermission to use, copy, modify, and distribute this software and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncits documentation for any purpose and without fee is hereby
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgranted, provided that the above copyright notice appear in all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccopies and that both that the copyright notice and this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncpermission notice and warranty disclaimer appear in supporting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdocumentation, and that the name of Lucent or any of its entities
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnot be used in advertising or publicity pertaining to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdistribution of the software without specific, written prior
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncpermission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHIS SOFTWARE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync****************************************************************/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Please send bug reports to David M. Gay (dmg at acm dot org,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * with " at " changed at "@" and " dot " changed to "."). */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <LibConfig.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "gdtoaimp.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef MULTIPLE_THREADS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *dtoa_result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef KR_headers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncrv_alloc(i) size_t i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncrv_alloc(size_t i)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t j;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int k, *r;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync j = sizeof(ULong);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for(k = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync j <<= 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync k++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync r = (int*)(void*)Balloc(k);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (r == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *r = k;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef MULTIPLE_THREADS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dtoa_result =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (char *)(void *)(r+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef KR_headers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnrv_alloc(s, rve, n) CONST char *s; char **rve; size_t n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnrv_alloc(CONST char *s, char **rve, size_t n)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync char *rv, *t;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t = rv = rv_alloc(n);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (t == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while((*t = *s++) !=0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync t++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (rve)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *rve = t;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return rv;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* freedtoa(s) must be used to free values s returned by dtoa
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * when MULTIPLE_THREADS is #defined. It should be used in all cases,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * but for consistency with earlier versions of dtoa, it is optional
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * when MULTIPLE_THREADS is not defined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef KR_headers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfreedtoa(s) char *s;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfreedtoa(char *s)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bigint *b = (Bigint *)(void *)((int *)(void *)s - 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b->maxwds = 1 << (b->k = *(int*)(void*)b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bfree(b);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef MULTIPLE_THREADS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (s == dtoa_result)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dtoa_result = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncquorem
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef KR_headers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (b, S) Bigint *b, *S;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Bigint *b, Bigint *S)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULong *bx, *bxe, q, *sx, *sxe;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef ULLong
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULLong borrow, carry, y, ys;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULong borrow, carry, y, ys;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef Pack_32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ULong si, z, zs;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync n = S->wds;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DEBUG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*debug*/ if (b->wds > n)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*debug*/ Bug("oversize b in quorem");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (b->wds < n)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sx = S->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sxe = sx + --n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bx = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bxe = bx + n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DEBUG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*debug*/ if (q > 9)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*debug*/ Bug("oversized quotient in quorem");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (q) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef ULLong
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ys = *sx++ * (ULLong)q + carry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = ys >> 32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* LINTED conversion */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync y = *bx - (ys & 0xffffffffUL) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = y >> 32 & 1UL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* LINTED conversion */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bx++ = (UINT32)(y & 0xffffffffUL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef Pack_32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync si = *sx++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ys = (si & 0xffff) * q + carry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync zs = (si >> 16) * q + (ys >> 16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = zs >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = (y & 0x10000) >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync z = (*bx >> 16) - (zs & 0xffff) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = (z & 0x10000) >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Storeinc(bx, z, y);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ys = *sx++ * q + carry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = ys >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync y = *bx - (ys & 0xffff) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = (y & 0x10000) >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bx++ = y & 0xffff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(sx <= sxe);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!*bxe) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bx = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(--bxe > bx && !*bxe)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync --n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b->wds = n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (cmp(b, S) >= 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync q++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bx = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sx = S->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef ULLong
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ys = *sx++ + carry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = ys >> 32;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* LINTED conversion */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync y = *bx - (ys & 0xffffffffUL) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = y >> 32 & 1UL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* LINTED conversion */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bx++ = (UINT32)(y & 0xffffffffUL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef Pack_32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync si = *sx++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ys = (si & 0xffff) + carry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync zs = (si >> 16) + (ys >> 16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = zs >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = (y & 0x10000) >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync z = (*bx >> 16) - (zs & 0xffff) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = (z & 0x10000) >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Storeinc(bx, z, y);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ys = *sx++ + carry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync carry = ys >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync y = *bx - (ys & 0xffff) - borrow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync borrow = (y & 0x10000) >> 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *bx++ = y & 0xffff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(sx <= sxe);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bx = b->x;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bxe = bx + n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!*bxe) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(--bxe > bx && !*bxe)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync --n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b->wds = n;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (int)q;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }