|
|
1.1 ! root 1: /* interface.c - bit manipulation utility routines */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/others/quipu/photo/RCS/interface.c,v 7.0 89/11/23 22:01:44 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/others/quipu/photo/RCS/interface.c,v 7.0 89/11/23 22:01:44 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: interface.c,v $ ! 12: * Revision 7.0 89/11/23 22:01:44 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: ! 29: #include <stdio.h> ! 30: #include "quipu/photo.h" ! 31: ! 32: /* This file contains utility routines used by both the */ ! 33: /* encoding and decoding programs. */ ! 34: /* The routines are concerned with getting and setting bits of */ ! 35: /* a bit string. */ ! 36: ! 37: /* All these routine work in basically the same way. ! 38: /* a mask is used to get at each individual bit within ! 39: /* a byte. Each time the next bit is required, the ! 40: /* mask is shifted right, when the mask is zero, the byte is either ! 41: /* written to the file, or the next byte read in depending upon the ! 42: /* routine. ! 43: */ ! 44: ! 45: int PIC_LINESIZE,STOP,NUMLINES; ! 46: ! 47: /* ROUTINE: Get_bit */ ! 48: /* */ ! 49: /* SYNOPSIS: Gets the next bit from the input. */ ! 50: /* Returns 0 if it is a zero. */ ! 51: /* Returns 1 if it is a one */ ! 52: char ! 53: get_bit (lineptr) ! 54: ! 55: bit_string * lineptr; /* the line to get the bit from */ ! 56: ! 57: { ! 58: unsigned char result; ! 59: ! 60: /* Anding the mask and the data gives a 0 if the bit masked is 0, 1 otherwis ! 61: e */ ! 62: result = lineptr->mask & lineptr->pos; ! 63: ! 64: lineptr->mask >>= 1; ! 65: ! 66: if (lineptr->mask == 0) { ! 67: lineptr->pos = *lineptr->dbuf++; ! 68: lineptr->mask = BIT_MASK; ! 69: } ! 70: ! 71: if( result != 0 ) /* may not be 1, may be 0001000 for example */ ! 72: result = 1; ! 73: ! 74: return ( (char) result ); ! 75: } ! 76: ! 77: ! 78: ! 79: /* ROUTINE: Set_bit */ ! 80: /* */ ! 81: /* SYNOPSIS: Sets the next bit of the bit string pointed to by */ ! 82: /* lineptr to a one. */ ! 83: ! 84: set_bit (lineptr) ! 85: ! 86: bit_string * lineptr; ! 87: ! 88: { ! 89: /* This sets the masked bit */ ! 90: lineptr->pos |= lineptr->mask; ! 91: ! 92: lineptr->mask >>= 1; ! 93: ! 94: if (lineptr->mask == 0) { ! 95: *lineptr->dbuf++ = lineptr->pos; ! 96: lineptr->mask = BIT_MASK; ! 97: } ! 98: ! 99: } ! 100: ! 101: ! 102: ! 103: ! 104: /* ROUTINE: Clr_bit */ ! 105: /* */ ! 106: /* SYNOPSIS: clears the next bit of the bit string pointed to by */ ! 107: /* lineptr. i.e set it to zero. */ ! 108: ! 109: clr_bit (lineptr) ! 110: ! 111: bit_string * lineptr; ! 112: ! 113: { ! 114: /* clear the masked bit */ ! 115: lineptr->pos &= ~(lineptr->mask) ; ! 116: ! 117: lineptr->mask >>= 1; /* right shift the mask */ ! 118: ! 119: if (lineptr->mask == 0) { /* may need to move on to the next byte */ ! 120: *lineptr->dbuf++ = lineptr->pos; ! 121: lineptr->mask = BIT_MASK; ! 122: } ! 123: ! 124: } ! 125: ! 126: ! 127: ! 128:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.