Patch title: Release 85 bulk changes
Abstract:
File: /pliant/language/type/number/int.c
Key:
    Removed line
    Added line
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// version 2 along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

/*
abstract
  [Pliant 'Int' data type]
doc
  [The Pliant 'Int' data type size always has the same number of bytes as the processor it's running on: on a i386 processor, it's 32 bits, and on an alpha processor it's 64 bits.]
*/


INLINE Int minimum(Int a,Int b) {
  return a<=b ? a : b; }


INLINE Int maximum(Int a,Int b) {
  return a>=b ? a : b; }


INLINE Int abs(Int i) {
  return i>=0 ? i : -i; }


FUNCTION Int or_Int(Int a,Int b) {
  return (a | b); }

FUNCTION Int and_Int(Int a,Int b) {
  return (a & b); }

FUNCTION Int not_Int(Int a) {
  return ~a; }


/*
doc
  ['Int_str2' function will cast 'i' to a string, and store the result in the memory area pointed by 'buf'. The result is the number of bytes that are used in the string representation of 'i'.]
*/

FUNCTION Int Int_str2(Int i,Int base,Char *buf) {
  Char buffer[16];
  Bool neg; Char *b;
  Int d;
  if(i==int_bad) {
    *buf='?'; return 1;
  orif(i==0)
    *buf='0'; return 1;
  other
    if(i<0) neg=true,i=-i; else neg=false;
    b=buffer+sizeof(buffer);
    for(; i!=0; i/=base) {
      d=i%base;
      *--b=(Char)( d<10 ? '0'+d : 'A'+(d-10) ); }
    if(neg) *--b='-';
    memory_copy(b,buf,buffer+sizeof(buffer)-b);
    return (Int)(integer_from_address(address_translate(buffer,sizeof(buffer)))-integer_from_address(b)); } }


INLINE uInt round_down(uInt i,uInt modulus) {
  return i&-modulus; }


INLINE uInt round_up(uInt i,uInt modulus) {
  return (i+modulus-1)&-modulus; }


FUNCTION Int compare_int(Int i1,Int i2) {
  return i1<i2 ? compare_inferior : (i1>i2 ? compare_superior : compare_equal); }