Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Aug 2012 23:02:44 -0000
From:      Stephen Montgomery-Smith <stephen@missouri.edu>
To:        Peter Jeremy <peter@rulingia.com>
Cc:        Diane Bruce <db@db.net>, Bruce Evans <brde@optusnet.com.au>, John Baldwin <jhb@freebsd.org>, David Chisnall <theraven@freebsd.org>, Bruce Evans <bde@freebsd.org>, Steve Kargl <sgk@troutmask.apl.washington.edu>, David Schultz <das@freebsd.org>, Warner Losh <imp@bsdimp.com>
Subject:   Re: Use of C99 extra long double math functions after r236148
Message-ID:  <500DAD41.5030104@missouri.edu>
Resent-Message-ID: <20120812230235.GC20453@server.rulingia.com>
In-Reply-To: <20120722121219.GC73662@server.rulingia.com>
References:  <20120717084457.U3890@besplex.bde.org> <5004A5C7.1040405@missouri.edu> <5004DEA9.1050001@missouri.edu> <20120717040118.GA86840@troutmask.apl.washington.edu> <20120717042125.GF66913@server.rulingia.com> <20120717043848.GB87001@troutmask.apl.washington.edu> <20120717225328.GA86902@server.rulingia.com> <20120717232740.GA95026@troutmask.apl.washington.edu> <20120718001337.GA87817@server.rulingia.com> <20120718123627.D1575@besplex.bde.org> <20120722121219.GC73662@server.rulingia.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------060606060301090803040905
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

I just realized that catan(z) = reverse( catanh(reverse (z))), just like 
casin relates to casinh (remember reverse(x+I*y) = y+I*x).  This is a 
consequence of catan and catanh being odd functions, as well as the 
standard relation catan(z) = -I*catanh(I*z).

So I would modify Peter's code by taking out the minus signs.

Maybe it would make a difference if the answers involved -0.

On 07/22/12 07:12, Peter Jeremy wrote:

> /*
>   * Arc-tangent of a complex argument z = x + I*y.
>   *
>   * catan(z) = reverse( catanh(reverse (z)))
>   *
>   */
> double complex
> catan(double complex z)
> {
> 	double complex r;
>
> 	r = catanh(cpack(cimag(z), creal(z)));
> 	return (cpack(cimag(r), creal(r)));
> }
>


I am attaching code that computes all six arc-trig-hyp functions.  Peter 
made a remark that catanh(z) would be hard to compute when |z|=1. 
Fortunately that is not the case, because when |z|=1, the imaginary part 
of catanh(z) is plus or minus PI/4.  So we won't face the same problems 
that clog(z) has.

I feel that I am done with these functions for now.  I tried to change 
my comments to conform to the style given to me by Bruce.  However 
spacing inside mathematical expressions is something where I am 
inconsistent.

The functions still need a lot of work to handle -0, infs and NaNs 
correctly.  I will leave that to you guys, because you seem so much 
better at it than me.  I still don't understand why the proper test is 
"if (x!=x) return(x+x)" rather than "if (isnan(x)) return(NAN)".

However, I think you might find that a lot of the handling when the 
input or output is infinity works without any changes.  For example, 
catanh(1) seems to produce the correct answer, and maybe even 
catanh(1-0*I) will work better than expected.

I am also attaching the test code.  I run it like this, so that only 
ULPs greater than 3 appear:

./test3 | perl -lne '@a=split " ",$_;print if $a[2]>3 || $a[3]>3'

and get outputs like this:

21987 atanh 3.13643 0.299452 0.443282 0.0665108 0.473296 0.0824781
67013 atan 0.377411 3.03922 -0.0170315 -0.442191 -0.0211662 -0.474753
70044 acosh 0.883474 3.23108 1.06353 0.107343 0.433696 0.242278
70044 acos 3.23108 0.883474 1.06353 0.107343 0.242278 -0.433696
96124 atan 0.509279 3.21631 -0.0346851 -0.461121 -0.0440054 -0.497841

The first example is the count of which example I am trying.  The third 
and fourth entries are the ULPs of the real and imaginary parts of the 
answer.  The 5th and 6th entries are the real and imaginary parts of the 
input, and the 7th and 8th entries are the real and imaginary parts of 
the answer.

I use the unuran port to generate data where the x and y values of the 
inputs are normally distributed N(0,1).  As you can see from the parts I 
commented out, I tried many variations (mostly to check edge cases: 
close to zero, very large, or close to branch cuts).  In particular, if 
you want random data on the unit disk, use h=hypot(x,y); x/=h; y/=h;

My next project will be to get clog(z) to work well when |z|=1.

Stephen

--------------060606060301090803040905
Content-Type: text/plain; charset=us-ascii;
 name="catrig.c"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="catrig.c"

I2luY2x1ZGUgPGNvbXBsZXguaD4KI2luY2x1ZGUgPGZsb2F0Lmg+CiNpbmNsdWRlIDxtYXRo
Lmg+CgojaW5jbHVkZSAibWF0aF9wcml2YXRlLmgiCgovKgogKiBnY2MgZG9lc24ndCBpbXBs
ZW1lbnQgY29tcGxleCBtdWx0aXBsaWNhdGlvbiBvciBkaXZpc2lvbiBjb3JyZWN0bHksCiAq
IHNvIHdlIG5lZWQgdG8gaGFuZGxlIGluZmluaXRpZXMgc3BlY2lhbGx5LiBXZSB0dXJuIG9u
IHRoaXMgcHJhZ21hIHRvCiAqIG5vdGlmeSBjb25mb3JtaW5nIGM5OSBjb21waWxlcnMgdGhh
dCB0aGUgZmFzdC1idXQtaW5jb3JyZWN0IGNvZGUgdGhhdAogKiBnY2MgZ2VuZXJhdGVzIGlz
IGFjY2VwdGFibGUsIHNpbmNlIHRoZSBzcGVjaWFsIGNhc2VzIGhhdmUgYWxyZWFkeSBiZWVu
CiAqIGhhbmRsZWQuCiAqLwojcHJhZ21hCVNUREMgQ1hfTElNSVRFRF9SQU5HRQlPTgoKY29t
cGxleCBkb3VibGUgY2xvZyhjb21wbGV4IGRvdWJsZSB6KTsKCnN0YXRpYyBjb25zdCBkb3Vi
bGUKb25lID0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwLCAvKiAweDNGRjAwMDAwLCAw
eDAwMDAwMDAwICovCmh1Z2U9ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwZSszMDA7CgovKgog
KiBUZXN0aW5nIGluZGljYXRlcyB0aGF0IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlIGFjY3Vy
YXRlIHVwIHRvIDQgVUxQLgogKi8KCi8qCiAqIFRoZSBhbGdvcml0aG0gaXMgdmVyeSBjbG9z
ZSB0byB0aGF0IGluICJJbXBsZW1lbnRpbmcgdGhlIGNvbXBsZXggYXJjc2luZQogKiBhbmQg
YXJjY29zaW5lIGZ1bmN0aW9ucyB1c2luZyBleGNlcHRpb24gaGFuZGxpbmciIGJ5IFQuIEUu
IEh1bGwsCiAqIFRob21hcyBGLiBGYWlyZ3JpZXZlLCBhbmQgUGluZyBUYWsgUGV0ZXIgVGFu
ZywgcHVibGlzaGVkIGluIEFDTQogKiBUcmFuc2FjdGlvbnMgb24gTWF0aGVtYXRpY2FsIFNv
ZnR3YXJlLCBWb2x1bWUgMjMgSXNzdWUgMywgMTk5NywgUGFnZXMKICogMjk5LTMzNSwgaHR0
cDovL2RsLmFjbS5vcmcvY2l0YXRpb24uY2ZtP2lkPTI3NTMyNAogKgogKiBjYXNpbmgoeCtp
eSkgPSBzaWduKHgpKmxvZyhBK3NxcnQoQSpBLTEpKSArIHNpZ24oeSkqSSphc2luKEIpCiAq
IHdoZXJlCiAqIEEgPSAwLjUofHorSXwgKyB8ei1JfCkgPSBmKHgsMSt5KSArIGYoeCwxLXkp
ICsgMQogKiBCID0gMC41KHx6K0l8IC0gfHotSXwpCiAqIHogPSB4K0kqeQogKiBmKHgseSkg
PSAwLjUqKGh5cG90KHgseSkteSkKICogV2UgYWxzbyB1c2UKICogYXNpbihCKSA9IGF0YW4y
KHNxcnQoQSpBLXkqeSkseSkKICogQS15ID0gZih4LHkrMSkgKyBmKHgseS0xKS4KICoKICog
TXVjaCBvZiB0aGUgZGlmZmljdWx0eSBjb21lcyBiZWNhdXNlIGNvbXB1dGluZyBmKHgseSkg
bWF5IHByb2R1Y2UKICogdW5kZXJmbG93cy4KICovCgovKgogKiBSZXR1cm5zIDAuNSooaHlw
b3QoeCx5KS15KS4gIEl0IGFzc3VtZXMgeCBpcyBwb3NpdGl2ZSwgYW5kIHRoYXQgeSBkb2Vz
CiAqIG5vdCBzYXRpc2Z5IHRoZSBpbmVxdWFsaXRpZXMgMCA8IGZhYnMoeSkgPCAxZS0yMC4K
ICogSWYgcmVwb3J0aW5nIHRoZSBhbnN3ZXIgcmlza3MgYW4gdW5kZXJmbG93LCB0aGUgdW5k
ZXJmbG93IGZsYWcgaXMgc2V0LAogKmFuZCBpdCByZXR1cm5zIDAuNSooaHlwb3QoeCx5KS15
KS94L3guCiAqLwpzdGF0aWMgZG91YmxlIGYoZG91YmxlIHgsIGRvdWJsZSB5LCBpbnQgKnVu
ZGVyZmxvdykgewoJaWYgKHg9PTApIHsKCQkqdW5kZXJmbG93ID0gMDsKCQlpZiAoeSA+IDAp
CgkJCXJldHVybiAwOwoJCXJldHVybiAteTsKCX0KCWlmICh5PT0wKSB7CgkJKnVuZGVyZmxv
dyA9IDA7CgkJcmV0dXJuIDAuNSp4OwoJfQoJaWYgKHggPCAxZS0xMDAgJiYgeCA8IHkpIHsK
CQkqdW5kZXJmbG93ID0gMTsKCQlyZXR1cm4gMC41LyhoeXBvdCh4LHkpK3kpOwoJfQoJaWYg
KHggPCB5KSB7CgkJKnVuZGVyZmxvdyA9IDA7CgkJcmV0dXJuIDAuNSp4KngvKGh5cG90KHgs
eSkreSk7Cgl9CgkqdW5kZXJmbG93ID0gMDsKCXJldHVybiAwLjUqKGh5cG90KHgseSkteSk7
Cn0KCi8qCiAqIEFsbCB0aGUgaGFyZCB3b3JrIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGZ1bmN0
aW9uLgogKiBVcG9uIHJldHVybjoKICogcnggPSBSZShjYXNpbmgoeCtJKnkpKQogKiBCX2dv
b2QgaXMgc2V0IHRvIDEgaWYgdGhlIHZhbHVlIG9mIEIgaXMgdXNhYmxlLgogKiBJZiBCX2dv
b2QgaXMgc2V0IHRvIDAsIEEybXkyID0gQSpBLXkqeS4KICovCnN0YXRpYyB2b2lkIGRvX2hh
cmRfd29yayhkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSAqcngsIGludCAqQl9nb29kLCBk
b3VibGUgKkIsIGRvdWJsZSAqQTJteTIpCnsKCWRvdWJsZSBSLCBTLCBBLCBmcCwgZm07Cglp
bnQgZnB1ZiwgZm11ZjsKCglSID0gaHlwb3QoeCx5KzEpOwoJUyA9IGh5cG90KHgseS0xKTsK
CUEgPSAwLjUqKFIgKyBTKTsKCglpZiAoQSA8IDEwKSB7CgkJZnAgPSBmKHgsMSt5LCZmcHVm
KTsKCQlmbSA9IGYoeCwxLXksJmZtdWYpOwoJCWlmIChmcHVmID09IDEgJiYgZm11ZiA9PSAx
KSB7CgkJCWlmIChodWdlK3g+b25lKSAvKiBzZXQgaW5leGFjdCBmbGFnLiAqLwoJCQkJKnJ4
ID0gbG9nMXAoeCpzcXJ0KChmcCtmbSkqKEErMSkpKTsKCQl9IGVsc2UgaWYgKGZtdWYgPT0g
MSkgewoJCQkvKiBPdmVyZmxvdyBub3QgcG9zc2libGUgYmVjYXVzZSBmcCA8IDFlNTAgYW5k
IHggPiAxZS0xMDAuCgkJCSAgIFVuZGVyZmxvdyBub3QgcG9zc2libGUgYmVjYXVzZSBlaXRo
ZXIgZm09MCBvciBmbQoJCQkgICBhcHByb3hpbWF0ZWx5IGJpZ2dlciB0aGFuIDFlLTIwMC4g
Ki8KCQkJaWYgKGh1Z2UreD5vbmUpIC8qIHNldCBpbmV4YWN0IGZsYWcuICovCgkJCQkqcngg
PSBsb2cxcChmcCtzcXJ0KHgpKnNxcnQoKGZwL3grZm0qeCkqKEErMSkpKTsKCQl9IGVsc2Ug
aWYgKGZwdWYgPT0gMSkgewoJCQkvKiBTaW1pbGFyIGFyZ3VtZW50cyBhZ2FpbnN0IG92ZXIv
dW5kZXJmbG93LiAqLwoJCQlpZiAoaHVnZSt4Pm9uZSkgLyogc2V0IGluZXhhY3QgZmxhZy4g
Ki8KCQkJCSpyeCA9IGxvZzFwKGZtK3NxcnQoeCkqc3FydCgoZm0veCtmcCp4KSooQSsxKSkp
OwoJCX0gZWxzZSB7CgkJCSpyeCA9IGxvZzFwKGZwICsgZm0gKyBzcXJ0KChmcCtmbSkqKEEr
MSkpKTsKCQl9Cgl9IGVsc2UKCQkqcnggPSBsb2coQSArIHNxcnQoQSpBLTEpKTsKCgkqQiA9
IHkvQTsgLyogPSAwLjUqKFIgLSBTKSAqLwoJKkJfZ29vZCA9IDE7CgoJaWYgKCpCID4gMC41
KSB7CgkJKkJfZ29vZCA9IDA7CgkJZnAgPSBmKHgseSsxLCZmcHVmKTsKCQlmbSA9IGYoeCx5
LTEsJmZtdWYpOwoJCWlmIChmcHVmID09IDEgJiYgZm11ZiA9PSAxKQoJCQkqQTJteTIgPXgq
c3FydCgoQSt5KSooZnArZm0pKTsKCQllbHNlIGlmIChmbXVmID09IDEpCgkJCS8qIE92ZXJm
bG93IG5vdCBwb3NzaWJsZSBiZWNhdXNlIGZwIDwgMWU1MCBhbmQgeCA+IDFlLTEwMC4KCQkJ
ICAgVW5kZXJmbG93IG5vdCBwb3NzaWJsZSBiZWNhdXNlIGVpdGhlciBmbT0wIG9yIGZtCgkJ
CSAgIGFwcHJveGltYXRlbHkgYmlnZ2VyIHRoYW4gMWUtMjAwLiAqLwoJCQkqQTJteTIgPSBz
cXJ0KHgpKnNxcnQoKEEreSkqKGZwL3grZm0qeCkpOwoJCWVsc2UgaWYgKGZwdWYgPT0gMSkK
CQkJLyogU2ltaWxhciBhcmd1bWVudHMgYWdhaW5zdCBvdmVyL3VuZGVyZmxvdy4gKi8KCQkJ
KkEybXkyID0gc3FydCh4KSpzcXJ0KChBK3kpKihmbS94K2ZwKngpKTsKCQllbHNlCgkJCSpB
Mm15MiA9IHNxcnQoKEEreSkqKGZwK2ZtKSk7Cgl9Cn0KCmRvdWJsZSBjb21wbGV4CmNhc2lu
aChkb3VibGUgY29tcGxleCB6KQp7Cglkb3VibGUgeCwgeSwgcngsIHJ5LCBCLCBBMm15MjsK
CWludCBzeCwgc3k7CglpbnQgQl9nb29kOwoKCXggPSBjcmVhbCh6KTsKCXkgPSBjaW1hZyh6
KTsKCXN4ID0gc2lnbmJpdCh4KTsKCXN5ID0gc2lnbmJpdCh5KTsKCXggPSBmYWJzKHgpOwoJ
eSA9IGZhYnMoeSk7CgoJaWYgKGNhYnMoeikgPiAxZTIwKSB7CgkJaWYgKGh1Z2UreD5vbmUp
IHsgLyogc2V0IGluZXhhY3QgZmxhZy4gKi8KCQkJaWYgKHN4ID09IDApIHJldHVybiBjbG9n
KDIqeik7CgkJCWlmIChzeCA9PSAxKSByZXR1cm4gLWNsb2coLTIqeik7CgkJfQoJfQoKCWlm
IChjYWJzKHopIDwgMWUtMjApCgkJaWYgKGh1Z2UreD5vbmUpIC8qIHNldCBpbmV4YWN0IGZs
YWcuICovCgkJCXJldHVybiB6OwoKCWRvX2hhcmRfd29yayh4LCB5LCAmcngsICZCX2dvb2Qs
ICZCLCAmQTJteTIpOwoJaWYgKEJfZ29vZCkKCQlyeSA9IGFzaW4oQik7CgllbHNlCgkJcnkg
PSBhdGFuMih5LEEybXkyKTsKCglpZiAoc3ggPT0gMSkgcnggPSAtcng7CglpZiAoc3kgPT0g
MSkgcnkgPSAtcnk7CgoJcmV0dXJuIGNwYWNrKHJ4LHJ5KTsKfQoKLyoKICogY2FzaW4oeikg
PSByZXZlcnNlKGNhc2luaChyZXZlcnNlKHopKSkKICogd2hlcmUgcmV2ZXJzZSh4K0kqeSkg
PSB5K3gqSSA9IEkqY29uaih4K0kqeSkuCiAqLwoKZG91YmxlIGNvbXBsZXgKY2FzaW4oZG91
YmxlIGNvbXBsZXggeikKewoJY29tcGxleCByZXN1bHQ7CgoJcmVzdWx0ID0gY2FzaW5oKGNw
YWNrKGNpbWFnKHopLGNyZWFsKHopKSk7CglyZXR1cm4gY3BhY2soY2ltYWcocmVzdWx0KSxj
cmVhbChyZXN1bHQpKTsKfQoKLyoKICogY2Fjb3MoeikgPSBQSS8yIC0gY2FzaW4oeikKICog
YnV0IGRvIHRoZSBjb21wdXRhdGlvbiBjYXJlZnVsbHkgc28gY2Fjb3MoeikgaXMgYWNjdXJh
dGUgd2hlbiB6IGlzIGNsb3NlIHRvIDEuCiAqLwoKZG91YmxlIGNvbXBsZXgKY2Fjb3MoZG91
YmxlIGNvbXBsZXggeikKewoJZG91YmxlIHgsIHksIHJ4LCByeSwgQiwgQTJteTI7CglpbnQg
c3gsIHN5OwoJaW50IEJfZ29vZDsKCWNvbXBsZXggdzsKCgl4ID0gY3JlYWwoeik7Cgl5ID0g
Y2ltYWcoeik7CglzeCA9IHNpZ25iaXQoeCk7CglzeSA9IHNpZ25iaXQoeSk7Cgl4ID0gZmFi
cyh4KTsKCXkgPSBmYWJzKHkpOwoKCWlmIChjYWJzKHopID4gMWUyMCkgewoJCWlmIChodWdl
K3g+b25lKSB7IC8qIHNldCBpbmV4YWN0IGZsYWcuICovCgkJCXcgPSBjbG9nKDIqeik7CgkJ
CWlmIChzaWduYml0KGNpbWFnKHcpKSA9PSAwKQoJCQkJcmV0dXJuIGNwYWNrKGNpbWFnKHcp
LC1jcmVhbCh3KSk7CgkJCXJldHVybiBjcGFjaygtY2ltYWcodyksY3JlYWwodykpOwoJCX0K
CX0KCglpZiAoY2Ficyh6KSA8IDFlLTEwKQoJCWlmIChodWdlK3g+b25lKSAvKiBzZXQgaW5l
eGFjdCBmbGFnLiAqLwoJCQlyZXR1cm4gY3BhY2soTV9QSV8yLWNyZWFsKHopLC1jaW1hZyh6
KSk7CgoJZG9faGFyZF93b3JrKHksIHgsICZyeSwgJkJfZ29vZCwgJkIsICZBMm15Mik7Cglp
ZiAoQl9nb29kKSB7CgkJaWYgKHN4PT0wKQoJCQlyeCA9IGFjb3MoQik7CgkJZWxzZQoJCQly
eCA9IGFjb3MoLUIpOwoJfSBlbHNlIHsKCQlpZiAoc3g9PTApCgkJCXJ4ID0gYXRhbjIoQTJt
eTIseCk7CgkJZWxzZQoJCQlyeCA9IGF0YW4yKEEybXkyLC14KTsKCX0KCglpZiAoc3k9PTAp
IHJ5ID0gLXJ5OwoKCXJldHVybiBjcGFjayhyeCxyeSk7Cn0KCi8qCiAqIGNhY29zaCh6KSA9
IEkqY2Fjb3Moeikgb3IgLUkqY2Fjb3MoeikKICogd2hlcmUgdGhlIHNpZ24gaXMgY2hvc2Vu
IHNvIFJlKGNhY29zaCh6KSkgPj0gMCAuCiAqLwoKZG91YmxlIGNvbXBsZXgKY2Fjb3NoKGRv
dWJsZSBjb21wbGV4IHopCnsKCWNvbXBsZXggZG91YmxlIHc7CgoJdyA9IGNhY29zKHopOwoJ
aWYgKHNpZ25iaXQoY2ltYWcodykpID09IDApCgkJcmV0dXJuIGNwYWNrKGNpbWFnKHcpLC1j
cmVhbCh3KSk7CgllbHNlCgkJcmV0dXJuIGNwYWNrKC1jaW1hZyh3KSxjcmVhbCh3KSk7Cn0K
Ci8qIAogKiBjYXRhbmgoeikgPSAwLjI1ICogbG9nKCh6KzEpLyh6LTEpKQogKiAgICAgICAg
ICAgPSAwLjI1ICogbG9nKHx6KzF8L3x6LTF8KSArIDAuNSAqIEkgKiBhdGFuMigyeS8oMS14
KngteSp5KSkKICovCgpkb3VibGUgY29tcGxleApjYXRhbmgoZG91YmxlIGNvbXBsZXggeikK
ewoJZG91YmxlIHgsIHksIHJ4LCByeSwgaHAsIGhtOwoKCXggPSBjcmVhbCh6KTsKCXkgPSBj
aW1hZyh6KTsKCglpZiAoY2Ficyh6KSA8IDFlLTIwKQoJCWlmIChodWdlK3g+b25lKSAvKiBz
ZXQgaW5leGFjdCBmbGFnLiAqLwoJCQlyZXR1cm4gejsKCglpZiAoY2Ficyh6KSA+IDFlMjAp
CgkJaWYgKGh1Z2UreD5vbmUpIHsgLyogc2V0IGluZXhhY3QgZmxhZy4gKi8KCQkJaWYgKHNp
Z25iaXQoeCkgPT0gMCkKCQkJCXJldHVybiBjcGFjaygwLE1fUElfMik7CgkJCXJldHVybiBj
cGFjaygwLC1NX1BJXzIpOwoJfQoKCWlmIChmYWJzKHkpIDwgMWUtMTAwKSB7CgkJaHAgPSAo
eCsxKSooeCsxKTsKCQlobSA9ICh4LTEpKih4LTEpOwoJfSBlbHNlIHsKCQlocCA9ICh4KzEp
Kih4KzEpK3kqeTsgLyogfHorMXwgKi8KCQlobSA9ICh4LTEpKih4LTEpK3kqeTsgLyogfHot
MXwgKi8KCX0KCglpZiAoaHAgPCAwLjUgfHwgaG0gPCAwLjUpCgkJcnggPSAwLjI1Kihsb2co
aHAvaG0pKTsKCWVsc2UgaWYgKHggPiAwKQoJCXJ4ID0gMC4yNSpsb2cxcCg0KngvaG0pOwoJ
ZWxzZQoJCXJ4ID0gLTAuMjUqbG9nMXAoLTQqeC9ocCk7CgoJaWYgKHg9PTEgfHwgeD09LTEp
IHsKCQlpZiAoc2lnbmJpdCh5KSA9PSAwKQoJCQlyeSA9IGF0YW4yKDIsIC15KS8yOwoJCWVs
c2UKCQkJcnkgPSBhdGFuMigtMiwgeSkvMjsKCX0gZWxzZSBpZiAoZmFicyh5KSA8IDFlLTEw
MCkgewoJCWlmIChodWdlK3g+b25lKSAvKiBzZXQgaW5leGFjdCBmbGFnLiAqLwoJCQlyeSA9
IGF0YW4yKDIqeSwgKDEteCkqKDEreCkpLzI7Cgl9IGVsc2UKCQlyeSA9IGF0YW4yKDIqeSwg
KDEteCkqKDEreCkteSp5KS8yOwoKCXJldHVybiBjcGFjayhyeCxyeSk7Cn0KCi8qCiAqIGNh
dGFuKHopID0gcmV2ZXJzZShjYXRhbmgocmV2ZXJzZSh6KSkpCiAqIHdoZXJlIHJldmVyc2Uo
eCtJKnkpID0geSt4KkkgPSBJKmNvbmooeCtJKnkpLgogKi8KCmRvdWJsZSBjb21wbGV4CmNh
dGFuKGRvdWJsZSBjb21wbGV4IHopCnsKCWNvbXBsZXggcmVzdWx0OwoKCXJlc3VsdCA9IGNh
dGFuaChjcGFjayhjaW1hZyh6KSxjcmVhbCh6KSkpOwoJcmV0dXJuIGNwYWNrKGNpbWFnKHJl
c3VsdCksY3JlYWwocmVzdWx0KSk7Cn0K
--------------060606060301090803040905
Content-Type: text/plain; charset=us-ascii;
 name="test3.c"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="test3.c"

I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN5cy9j
ZGVmcy5oPgojaW5jbHVkZSA8ZmxvYXQuaD4KI2luY2x1ZGUgPGZlbnYuaD4KI2luY2x1ZGUg
ImNvbXBsZXguaCIKI2luY2x1ZGUgIm1hdGguaCIKI2luY2x1ZGUgIm1hdGhfcHJpdmF0ZS5o
IgojaW5jbHVkZSAibXBmci5oIgojaW5jbHVkZSAibXBjLmgiCiNpbmNsdWRlIDx1bnVyYW4u
aD4KCmNvbXBsZXggZG91YmxlIGNhc2luaChjb21wbGV4IGRvdWJsZSB6KTsKY29tcGxleCBk
b3VibGUgY2FzaW4oY29tcGxleCBkb3VibGUgeik7CmNvbXBsZXggZG91YmxlIGNhY29zaChj
b21wbGV4IGRvdWJsZSB6KTsKY29tcGxleCBkb3VibGUgY2Fjb3MoY29tcGxleCBkb3VibGUg
eik7CmNvbXBsZXggZG91YmxlIGNhdGFuaChjb21wbGV4IGRvdWJsZSB6KTsKY29tcGxleCBk
b3VibGUgY2F0YW4oY29tcGxleCBkb3VibGUgeik7CgptcGNfdCB6eiwgcnI7Cm1wZnJfdCBy
eHgsIHJ5eSwgZXh4LCBleXk7Cgp2b2lkIGV2YWwoZG91YmxlIHgsZG91YmxlIHksY29tcGxl
eCBkb3VibGUgKCpmKShjb21wbGV4IGRvdWJsZSksdm9pZCAoKm1wY19mKShtcGNfdCxtcGNf
dCxtcGNfcm5kX3QpLGRvdWJsZSAqcngsZG91YmxlICpyeSxkb3VibGUgKmV4LGRvdWJsZSAq
ZXkpIHsKICBjb21wbGV4IGRvdWJsZSByZXN1bHQ7CgogIHJlc3VsdCA9IGYoY3BhY2soeCx5
KSk7CiAgKnJ4ID0gY3JlYWwocmVzdWx0KTsKICAqcnkgPSBjaW1hZyhyZXN1bHQpOwoKICBt
cGNfc2V0X2RfZCh6eiwgeCwgeSwgTVBDX1JORE5OKTsKICBtcGNfZihyciwgenosIE1QQ19S
TkROTik7CgovKgogIG1wY19vdXRfc3RyKHN0ZG91dCwgMTAsIDEwMCwgenosIE1QQ19STkRO
Tik7CiAgcHV0cygiIik7CiAgbXBjX291dF9zdHIoc3Rkb3V0LCAxMCwgMTAwLCByciwgTVBD
X1JORE5OKTsKICBwdXRzKCIiKTsKKi8KCiAgbXBjX3JlYWwocnh4LCByciwgTVBGUl9STkRO
KTsKICBtcGZyX3N1Yl9kKGV4eCxyeHgsKnJ4LE1QRlJfUk5ETik7CiAgbXBmcl9hYnMoZXh4
LGV4eCxNUEZSX1JORE4pOwogIG1wZnJfbXVsXzJzaShleHgsZXh4LC0gbXBmcl9nZXRfZXhw
KHJ4eCkrREJMX01BTlRfRElHLE1QRlJfUk5ETik7CiAgKmV4ID0gbXBmcl9nZXRfZChleHgs
TVBGUl9STkROKTsKCiAgbXBjX2ltYWcocnl5LCByciwgTVBGUl9STkROKTsKICBtcGZyX3N1
Yl9kKGV5eSxyeXksKnJ5LE1QRlJfUk5ETik7CiAgbXBmcl9hYnMoZXl5LGV5eSxNUEZSX1JO
RE4pOwogIG1wZnJfbXVsXzJzaShleXksZXl5LC0gbXBmcl9nZXRfZXhwKHJ5eSkrREJMX01B
TlRfRElHLE1QRlJfUk5ETik7CiAgKmV5ID0gbXBmcl9nZXRfZChleXksTVBGUl9STkROKTsK
fQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgZG91YmxlIHgseSxyeCxy
eSxleCxleSxoOwogIFVOVVJfRElTVFIgKmRpc3RyOwogIFVOVVJfUEFSICpwYXI7CiAgVU5V
Ul9HRU4gKmdlbjsKICBpbnQgY291bnQgPSAwOwoKICBkaXN0ciA9IHVudXJfZGlzdHJfbm9y
bWFsKE5VTEwsMCk7CiAgcGFyID0gdW51cl9hdXRvX25ldyhkaXN0cik7CiAgZ2VuID0gdW51
cl9pbml0KHBhcik7CgogIG1wY19pbml0Mih6eiwzMDApOwogIG1wY19pbml0MihyciwzMDAp
OwoKICBtcGZyX3NldF9kZWZhdWx0X3ByZWMoMzAwKTsKICBtcGZyX2luaXQocnh4KTsKICBt
cGZyX2luaXQocnl5KTsKICBtcGZyX2luaXQoZXh4KTsKICBtcGZyX2luaXQoZXl5KTsKCiAg
d2hpbGUgKDEpIHsKICAgIHggPSB1bnVyX3NhbXBsZV9jb250KGdlbik7CiAgICB5ID0gdW51
cl9zYW1wbGVfY29udChnZW4pOwovKgogICAgaCA9IGh5cG90KHgseSk7CiAgICB4ID0geC9o
OwogICAgeSA9IHkvaDsKCiAgICB4ID0gMDsKICAgIHkgPSAxOwoKICAgIHggKz0gMWUtMjAw
KnVudXJfc2FtcGxlX2NvbnQoZ2VuKTsKICAgIHkgKz0gMWUtMjAwKnVudXJfc2FtcGxlX2Nv
bnQoZ2VuKTsKKi8KCiAgICBjb3VudCsrOwogICAgZXZhbCh4LHksY2FzaW5oLG1wY19hc2lu
aCwmcngsJnJ5LCZleCwmZXkpOwogICAgcHJpbnRmKCIlZCBhc2luaCAlZyAlZyAlZyAlZyAl
ZyAlZ1xuIixjb3VudCxleCxleSx4LHkscngscnkpOwogICAgZXZhbCh4LHksY2Fjb3NoLG1w
Y19hY29zaCwmcngsJnJ5LCZleCwmZXkpOwogICAgcHJpbnRmKCIlZCBhY29zaCAlZyAlZyAl
ZyAlZyAlZyAlZ1xuIixjb3VudCxleCxleSx4LHkscngscnkpOwogICAgZXZhbCh4LHksY2F0
YW5oLG1wY19hdGFuaCwmcngsJnJ5LCZleCwmZXkpOwogICAgcHJpbnRmKCIlZCBhdGFuaCAl
ZyAlZyAlZyAlZyAlZyAlZ1xuIixjb3VudCxleCxleSx4LHkscngscnkpOwogICAgZXZhbCh4
LHksY2FzaW4sbXBjX2FzaW4sJnJ4LCZyeSwmZXgsJmV5KTsKICAgIHByaW50ZigiJWQgYXNp
biAlZyAlZyAlZyAlZyAlZyAlZ1xuIixjb3VudCxleCxleSx4LHkscngscnkpOwogICAgZXZh
bCh4LHksY2Fjb3MsbXBjX2Fjb3MsJnJ4LCZyeSwmZXgsJmV5KTsKICAgIHByaW50ZigiJWQg
YWNvcyAlZyAlZyAlZyAlZyAlZyAlZ1xuIixjb3VudCxleCxleSx4LHkscngscnkpOwogICAg
ZXZhbCh4LHksY2F0YW4sbXBjX2F0YW4sJnJ4LCZyeSwmZXgsJmV5KTsKICAgIHByaW50Zigi
JWQgYXRhbiAlZyAlZyAlZyAlZyAlZyAlZ1xuIixjb3VudCxleCxleSx4LHkscngscnkpOwog
IH0KfQo=
--------------060606060301090803040905--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?500DAD41.5030104>