ftp.nice.ch/pub/next/developer/resources/classes/CompSim.s.tar.gz#/CompSim/utility.c

This is utility.c in view mode; [Download] [Up]

#import "utility.h"
#import <stdio.h>


#define UTIL_DEBUG


//
// getbits()
//
// Return n bits of x that begin at p.
//
// i.e. getbits(x, 4, 3) returns a byte with bits 4, 3 and 2 right-adjusted.
//

long getbits(long x, long p, long n)
{
    if((p > HIGHBIT) || (n > (p + 1)) || (p < 0) || (n < 0))
        return 0L;
	
    return (x >> (p+1-n)) & ~(~0 << n);
}


//
// getnibble()
//
// Get a nibble (right-adjusted).
//

long getnibble(long b, long n)
{
    if((n > HIGHNIBBLE) || (n < 0))
        return 0L;

    return getbits(b, (((n+1)*4)-1), 4);
}


//
// getbit()
//
// Get a bit from a byte.
//

long getbit(long b, long n)
{
    if((n > HIGHBIT) || (n < 0))
        return 0L;
	
    return getbits(b, n, 1);
}


//
// getbyte()
//
// Get a byte from a word.
//

long getbyte(long w, long n)
{
    if((n > HIGHBYTE) || (n < 0))
        return 0L;

    return getbits(w, (((n+1)*8)-1), 8);
}


//
// add()
//

long add(long a, long b)
{
    long carry[5];
    long tempsum[4];
    long sum[4];
    long value;
    long niba, nibb;
    long loop;
    
    carry[0] = 0;
    for(loop = 0; loop < 4; loop++) {
	niba = getnibble(a, loop);
	nibb = getnibble(b, loop);
    
	tempsum[loop] = niba + nibb + carry[loop];
	carry[loop+1] = tempsum[loop] / 16;
	tempsum[loop] = tempsum[loop] % 16;
	sum[loop] = tempsum[loop] + carry[loop];
    }
    value = sum[0] + (16 * sum[1]) + (256 * sum[2]) + (4096 * sum[3]);

#ifdef UTIL_DEBUG
printf("Util:  Sum of %04X and %04X is %04X.\n", a, b, value);
#endif    

    return value;
}


//
// readline()
//
// return of
//   0		: No problems.
//  -1		: End of file.
//

int readline(FILE *file, char *buffer)
{
    long count = 0;
    char c = '\0';
    
    while(1) {
	c = fgetc(file);
	switch(c) {
	    case '\n':
		buffer[count] = '\0';
		return 0;
	        break;
	    case EOF:
	        buffer[count] = '\0';
		return -1;
	    	break;
	    default:
		buffer[count] = c;
	        count++;
	        break;
	}
    }
    
    return 1;
}



//
// End of file.
//

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.