third-party-mirror / mingw-w64 / 79951edef1e76a79d7ce0fa1cf94391b2f6b3d94 / . / mingw-w64-crt / gdtoa / gmisc.c

/**************************************************************** | |

The author of this software is David M. Gay. | |

Copyright (C) 1998 by Lucent Technologies | |

All Rights Reserved | |

Permission to use, copy, modify, and distribute this software and | |

its documentation for any purpose and without fee is hereby | |

granted, provided that the above copyright notice appear in all | |

copies and that both that the copyright notice and this | |

permission notice and warranty disclaimer appear in supporting | |

documentation, and that the name of Lucent or any of its entities | |

not be used in advertising or publicity pertaining to | |

distribution of the software without specific, written prior | |

permission. | |

LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | |

INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. | |

IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY | |

SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |

WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER | |

IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, | |

ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF | |

THIS SOFTWARE. | |

****************************************************************/ | |

/* Please send bug reports to David M. Gay (dmg at acm dot org, | |

* with " at " changed at "@" and " dot " changed to "."). */ | |

#include "gdtoaimp.h" | |

void rshift (Bigint *b, int k) | |

{ | |

ULong *x, *x1, *xe, y; | |

int n; | |

x = x1 = b->x; | |

n = k >> kshift; | |

if (n < b->wds) { | |

xe = x + b->wds; | |

x += n; | |

if (k &= kmask) { | |

n = ULbits - k; | |

y = *x++ >> k; | |

while(x < xe) { | |

*x1++ = (y | (*x << n)) & ALL_ON; | |

y = *x++ >> k; | |

} | |

if ((*x1 = y) !=0) | |

x1++; | |

} | |

else | |

while(x < xe) | |

*x1++ = *x++; | |

} | |

if ((b->wds = x1 - b->x) == 0) | |

b->x[0] = 0; | |

} | |

int trailz (Bigint *b) | |

{ | |

ULong L, *x, *xe; | |

int n = 0; | |

x = b->x; | |

xe = x + b->wds; | |

for(n = 0; x < xe && !*x; x++) | |

n += ULbits; | |

if (x < xe) { | |

L = *x; | |

n += lo0bits(&L); | |

} | |

return n; | |

} |