/* Copyright (c) 1997 by Steffen Beyer. All rights reserved. This package is free software; you can redistribute it and/or modify it under the same terms as Perl itself. */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "lib_defs.h" static N_char BIT_byte; static N_char LSB_byte = 1; static N_char MSB_byte; static N_short BIT_short; static N_short LSB_short = 1; static N_short MSB_short; static N_int BIT_int; static N_int LSB_int = 1; static N_int MSB_int; static N_long BIT_long; static N_long LSB_long = 1; static N_long MSB_long; void config_byte(void) { N_char sample = LSB_byte; BIT_byte = 0; while (sample <<= 1) BIT_byte++; /* determine # of bits */ MSB_byte = (LSB_byte << BIT_byte++); } void config_short(void) { N_short sample = LSB_short; BIT_short = 0; while (sample <<= 1) BIT_short++; /* determine # of bits */ MSB_short = (LSB_short << BIT_short++); } void config_int(void) { N_int sample = LSB_int; BIT_int = 0; while (sample <<= 1) BIT_int++; /* determine # of bits */ MSB_int = (LSB_int << BIT_int++); } void config_long(void) { N_long sample = LSB_long; BIT_long = 0; while (sample <<= 1) BIT_long++; /* determine # of bits */ MSB_long = (LSB_long << BIT_long++); } MODULE = Bit::ShiftReg PACKAGE = Bit::ShiftReg PROTOTYPES: DISABLE BOOT: { config_byte(); config_short(); config_int(); config_long(); } void Version() PPCODE: { EXTEND(sp,1); PUSHs(sv_2mortal(newSVpv("2.0",0))); } N_char bits_of_byte() CODE: { RETVAL = BIT_byte; } OUTPUT: RETVAL N_short bits_of_short() CODE: { RETVAL = BIT_short; } OUTPUT: RETVAL N_int bits_of_int() CODE: { RETVAL = BIT_int; } OUTPUT: RETVAL N_long bits_of_long() CODE: { RETVAL = BIT_long; } OUTPUT: RETVAL boolean LSB_byte(value) N_char value CODE: { RETVAL = ((value AND LSB_byte) != 0); } OUTPUT: RETVAL boolean MSB_byte(value) N_char value CODE: { RETVAL = ((value AND MSB_byte) != 0); } OUTPUT: RETVAL boolean LSB_short(value) N_short value CODE: { RETVAL = ((value AND LSB_short) != 0); } OUTPUT: RETVAL boolean MSB_short(value) N_short value CODE: { RETVAL = ((value AND MSB_short) != 0); } OUTPUT: RETVAL boolean LSB_int(value) N_int value CODE: { RETVAL = ((value AND LSB_int) != 0); } OUTPUT: RETVAL boolean MSB_int(value) N_int value CODE: { RETVAL = ((value AND MSB_int) != 0); } OUTPUT: RETVAL boolean LSB_long(value) N_long value CODE: { RETVAL = ((value AND LSB_long) != 0); } OUTPUT: RETVAL boolean MSB_long(value) N_long value CODE: { RETVAL = ((value AND MSB_long) != 0); } OUTPUT: RETVAL boolean ROL_byte(value) N_char value CODE: { RETVAL = ((value AND MSB_byte) != 0); value <<= 1; if (RETVAL) value |= LSB_byte; } OUTPUT: RETVAL value boolean SHL_byte(value,carry) N_char value boolean carry CODE: { RETVAL = ((value AND MSB_byte) != 0); carry &= LSB_byte; value <<= 1; if (carry) value |= LSB_byte; } OUTPUT: RETVAL value boolean ROR_byte(value) N_char value CODE: { RETVAL = ((value AND LSB_byte) != 0); value >>= 1; if (RETVAL) value |= MSB_byte; } OUTPUT: RETVAL value boolean SHR_byte(value,carry) N_char value boolean carry CODE: { RETVAL = ((value AND LSB_byte) != 0); carry &= LSB_byte; value >>= 1; if (carry) value |= MSB_byte; } OUTPUT: RETVAL value boolean ROL_short(value) N_short value CODE: { RETVAL = ((value AND MSB_short) != 0); value <<= 1; if (RETVAL) value |= LSB_short; } OUTPUT: RETVAL value boolean SHL_short(value,carry) N_short value boolean carry CODE: { RETVAL = ((value AND MSB_short) != 0); carry &= LSB_short; value <<= 1; if (carry) value |= LSB_short; } OUTPUT: RETVAL value boolean ROR_short(value) N_short value CODE: { RETVAL = ((value AND LSB_short) != 0); value >>= 1; if (RETVAL) value |= MSB_short; } OUTPUT: RETVAL value boolean SHR_short(value,carry) N_short value boolean carry CODE: { RETVAL = ((value AND LSB_short) != 0); carry &= LSB_short; value >>= 1; if (carry) value |= MSB_short; } OUTPUT: RETVAL value boolean ROL_int(value) N_int value CODE: { RETVAL = ((value AND MSB_int) != 0); value <<= 1; if (RETVAL) value |= LSB_int; } OUTPUT: RETVAL value boolean SHL_int(value,carry) N_int value boolean carry CODE: { RETVAL = ((value AND MSB_int) != 0); carry &= LSB_int; value <<= 1; if (carry) value |= LSB_int; } OUTPUT: RETVAL value boolean ROR_int(value) N_int value CODE: { RETVAL = ((value AND LSB_int) != 0); value >>= 1; if (RETVAL) value |= MSB_int; } OUTPUT: RETVAL value boolean SHR_int(value,carry) N_int value boolean carry CODE: { RETVAL = ((value AND LSB_int) != 0); carry &= LSB_int; value >>= 1; if (carry) value |= MSB_int; } OUTPUT: RETVAL value boolean ROL_long(value) N_long value CODE: { RETVAL = ((value AND MSB_long) != 0); value <<= 1; if (RETVAL) value |= LSB_long; } OUTPUT: RETVAL value boolean SHL_long(value,carry) N_long value boolean carry CODE: { RETVAL = ((value AND MSB_long) != 0); carry &= LSB_long; value <<= 1; if (carry) value |= LSB_long; } OUTPUT: RETVAL value boolean ROR_long(value) N_long value CODE: { RETVAL = ((value AND LSB_long) != 0); value >>= 1; if (RETVAL) value |= MSB_long; } OUTPUT: RETVAL value boolean SHR_long(value,carry) N_long value boolean carry CODE: { RETVAL = ((value AND LSB_long) != 0); carry &= LSB_long; value >>= 1; if (carry) value |= MSB_long; } OUTPUT: RETVAL value