/* mpi-scan.c  -  MPI functions
 *	Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
 *
 * This file is part of Libgcrypt.
 *
 * Libgcrypt is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * Libgcrypt 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 */

#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include "mpi-internal.h"
#include "longlong.h"

/****************
 * Scan through an mpi and return byte for byte. a -1 is returned to indicate
 * the end of the mpi. Scanning is done from the lsb to the msb, returned
 * values are in the range of 0 .. 255.
 *
 * FIXME: This code is VERY ugly!
 */
/* int */
/* _gcry_mpi_getbyte( gcry_mpi_t a, unsigned idx ) */
/* { */
/*     int i, j; */
/*     unsigned n; */
/*     mpi_ptr_t ap; */
/*     mpi_limb_t limb; */

/*     ap = a->d; */
/*     for(n=0,i=0; i < a->nlimbs; i++ ) { */
/* 	limb = ap[i]; */
/* 	for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ ) */
/* 	    if( n == idx ) */
/* 		return (limb >> j*8) & 0xff; */
/*     } */
/*     return -1; */
/* } */


/****************
 * Put a value at position IDX into A. idx counts from lsb to msb
 */
/* void */
/* _gcry_mpi_putbyte( gcry_mpi_t a, unsigned idx, int xc ) */
/* { */
/*     int i, j; */
/*     unsigned n; */
/*     mpi_ptr_t ap; */
/*     mpi_limb_t limb, c; */

/*     c = xc & 0xff; */
/*     ap = a->d; */
/*     for(n=0,i=0; i < a->alloced; i++ ) { */
/* 	limb = ap[i]; */
/* 	for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ ) */
/* 	    if( n == idx ) { */
/* 	      #if BYTES_PER_MPI_LIMB == 4 */
/* 		if( j == 0 ) */
/* 		    limb = (limb & 0xffffff00) | c; */
/* 		else if( j == 1 ) */
/* 		    limb = (limb & 0xffff00ff) | (c<<8); */
/* 		else if( j == 2 ) */
/* 		    limb = (limb & 0xff00ffff) | (c<<16); */
/* 		else */
/* 		    limb = (limb & 0x00ffffff) | (c<<24); */
/* 	      #elif BYTES_PER_MPI_LIMB == 8 */
/* 		if( j == 0 ) */
/* 		    limb = (limb & 0xffffffffffffff00) | c; */
/* 		else if( j == 1 ) */
/* 		    limb = (limb & 0xffffffffffff00ff) | (c<<8); */
/* 		else if( j == 2 ) */
/* 		    limb = (limb & 0xffffffffff00ffff) | (c<<16); */
/* 		else if( j == 3 ) */
/* 		    limb = (limb & 0xffffffff00ffffff) | (c<<24); */
/* 		else if( j == 4 ) */
/* 		    limb = (limb & 0xffffff00ffffffff) | (c<<32); */
/* 		else if( j == 5 ) */
/* 		    limb = (limb & 0xffff00ffffffffff) | (c<<40); */
/* 		else if( j == 6 ) */
/* 		    limb = (limb & 0xff00ffffffffffff) | (c<<48); */
/* 		else */
/* 		    limb = (limb & 0x00ffffffffffffff) | (c<<56); */
/* 	      #else */
/* 		 #error please enhance this function, its ugly - i know. */
/* 	      #endif */
/* 		if( a->nlimbs <= i ) */
/* 		    a->nlimbs = i+1; */
/* 		ap[i] = limb; */
/* 		return; */
/* 	    } */
/*     } */
/*     abort(); /\* index out of range *\/ */
/* } */


/****************
 * Count the number of zerobits at the low end of A
 */
unsigned
_gcry_mpi_trailing_zeros( gcry_mpi_t a )
{
    unsigned n, count = 0;

    for(n=0; n < a->nlimbs; n++ ) {
	if( a->d[n] ) {
	    unsigned nn;
	    mpi_limb_t alimb = a->d[n];

	    count_trailing_zeros( nn, alimb );
	    count += nn;
	    break;
	}
	count += BITS_PER_MPI_LIMB;
    }
    return count;

}
