126a83229728c099f5572edb65dedce7163dbff71Elliott Hughes/* $OpenBSD: imaxdiv.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */ 226a83229728c099f5572edb65dedce7163dbff71Elliott Hughes/* 326a83229728c099f5572edb65dedce7163dbff71Elliott Hughes * Copyright (c) 1990 Regents of the University of California. 426a83229728c099f5572edb65dedce7163dbff71Elliott Hughes * All rights reserved. 526a83229728c099f5572edb65dedce7163dbff71Elliott Hughes * 626a83229728c099f5572edb65dedce7163dbff71Elliott Hughes * This code is derived from software contributed to Berkeley by 726a83229728c099f5572edb65dedce7163dbff71Elliott Hughes * Chris Torek. 8aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * 9aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * Redistribution and use in source and binary forms, with or without 10aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * modification, are permitted provided that the following conditions 11aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * are met: 12aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * 1. Redistributions of source code must retain the above copyright 13aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * notice, this list of conditions and the following disclaimer. 14aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * 2. Redistributions in binary form must reproduce the above copyright 15aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * notice, this list of conditions and the following disclaimer in the 16aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * documentation and/or other materials provided with the distribution. 17aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * 3. Neither the name of the University nor the names of its contributors 18aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * may be used to endorse or promote products derived from this software 19aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * without specific prior written permission. 20aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * 21aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes * SUCH DAMAGE. 32aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes */ 33aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes 3426a83229728c099f5572edb65dedce7163dbff71Elliott Hughes#include <inttypes.h> /* imaxdiv_t */ 35aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes 3626a83229728c099f5572edb65dedce7163dbff71Elliott Hughesimaxdiv_t 3726a83229728c099f5572edb65dedce7163dbff71Elliott Hughesimaxdiv(intmax_t num, intmax_t denom) 38aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes{ 3926a83229728c099f5572edb65dedce7163dbff71Elliott Hughes imaxdiv_t r; 4026a83229728c099f5572edb65dedce7163dbff71Elliott Hughes 4126a83229728c099f5572edb65dedce7163dbff71Elliott Hughes /* see div.c for comments */ 4226a83229728c099f5572edb65dedce7163dbff71Elliott Hughes 4326a83229728c099f5572edb65dedce7163dbff71Elliott Hughes r.quot = num / denom; 4426a83229728c099f5572edb65dedce7163dbff71Elliott Hughes r.rem = num % denom; 4526a83229728c099f5572edb65dedce7163dbff71Elliott Hughes if (num >= 0 && r.rem < 0) { 4626a83229728c099f5572edb65dedce7163dbff71Elliott Hughes r.quot++; 4726a83229728c099f5572edb65dedce7163dbff71Elliott Hughes r.rem -= denom; 4826a83229728c099f5572edb65dedce7163dbff71Elliott Hughes } 4926a83229728c099f5572edb65dedce7163dbff71Elliott Hughes return (r); 50aec2ffbc5a7b45368ceab3663265fbb659968fe7Elliott Hughes} 51