1 /*
2 FUNCTION
3 <<ldiv>>---divide two long integers
4 
5 INDEX
6 	ldiv
7 
8 ANSI_SYNOPSIS
9 	#include <stdlib.h>
10 	ldiv_t ldiv(long <[n]>, long <[d]>);
11 
12 TRAD_SYNOPSIS
13 	#include <stdlib.h>
14 	ldiv_t ldiv(<[n]>, <[d]>)
15 	long <[n]>, <[d]>;
16 
17 DESCRIPTION
18 Divide
19 @tex
20 $n/d$,
21 @end tex
22 @ifnottex
23 <[n]>/<[d]>,
24 @end ifnottex
25 returning quotient and remainder as two long integers in a structure <<ldiv_t>>.
26 
27 RETURNS
28 The result is represented with the structure
29 
30 . typedef struct
31 . {
32 .  long quot;
33 .  long rem;
34 . } ldiv_t;
35 
36 where the <<quot>> field represents the quotient, and <<rem>> the
37 remainder.  For nonzero <[d]>, if `<<<[r]> = ldiv(<[n]>,<[d]>);>>' then
38 <[n]> equals `<<<[r]>.rem + <[d]>*<[r]>.quot>>'.
39 
40 To divide <<int>> rather than <<long>> values, use the similar
41 function <<div>>.
42 
43 PORTABILITY
44 <<ldiv>> is ANSI.
45 
46 No supporting OS subroutines are required.
47 */
48 
49 
50 /*
51  * Copyright (c) 1990 Regents of the University of California.
52  * All rights reserved.
53  *
54  * This code is derived from software contributed to Berkeley by
55  * Chris Torek.
56  *
57  * Redistribution and use in source and binary forms, with or without
58  * modification, are permitted provided that the following conditions
59  * are met:
60  * 1. Redistributions of source code must retain the above copyright
61  *    notice, this list of conditions and the following disclaimer.
62  * 2. Redistributions in binary form must reproduce the above copyright
63  *    notice, this list of conditions and the following disclaimer in the
64  *    documentation and/or other materials provided with the distribution.
65  * 3. All advertising materials mentioning features or use of this software
66  *    must display the following acknowledgement:
67  *	This product includes software developed by the University of
68  *	California, Berkeley and its contributors.
69  * 4. Neither the name of the University nor the names of its contributors
70  *    may be used to endorse or promote products derived from this software
71  *    without specific prior written permission.
72  *
73  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
74  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
75  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
76  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
77  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
78  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
79  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
80  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
81  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
82  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
83  * SUCH DAMAGE.
84  */
85 
86 #include <_ansi.h>
87 #include <stdlib.h>		/* ldiv_t */
88 
89 ldiv_t
90 _DEFUN (ldiv, (num, denom),
91         long num _AND
92         long denom)
93 {
94 	ldiv_t r;
95 
96 	/* see div.c for comments */
97 
98 	r.quot = num / denom;
99 	r.rem = num % denom;
100 	if (num >= 0 && r.rem < 0) {
101 		++r.quot;
102 		r.rem -= denom;
103 	}
104 	else if (num < 0 && r.rem > 0) {
105 		--r.quot;
106 		r.rem += denom;
107 	}
108 	return (r);
109 }
110