|
|
1.1 ! root 1: /* bit_opts.c - operations on bit strings */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/bit_ops.c,v 7.0 89/11/23 22:12:32 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/bit_ops.c,v 7.0 89/11/23 22:12:32 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: bit_ops.c,v $ ! 12: * Revision 7.0 89/11/23 22:12:32 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: /* LINTLIBRARY */ ! 29: ! 30: #include <stdio.h> ! 31: #include "psap.h" ! 32: ! 33: ! 34: /* the first octet indicates how many unused bits are in the last octet -- ! 35: ! 36: prim2bit - presentation element to bit string ! 37: bit2prim - bit string to presentation element ! 38: bit_on - turn a bit ON ! 39: bit_off - turn a bit OFF ! 40: bit_test - test a bit ! 41: */ ! 42: ! 43: ! 44: PElementData ffb (), ffb_aux (); ! 45: PE ffb_pe (); ! 46: ! 47: /* */ ! 48: ! 49: int bit_on (pe, i) ! 50: register PE pe; ! 51: register int i; ! 52: { ! 53: int mask; ! 54: register PElementData bp; ! 55: ! 56: if ((bp = ffb (pe, i, &mask, 1)) == NULLPED) ! 57: return pe_seterr (pe, PE_ERR_NMEM, NOTOK); ! 58: ! 59: *bp |= mask; ! 60: ! 61: return OK; ! 62: } ! 63: ! 64: /* */ ! 65: ! 66: int bit_off (pe, i) ! 67: register PE pe; ! 68: register int i; ! 69: { ! 70: int mask; ! 71: register PElementData bp; ! 72: ! 73: if ((bp = ffb (pe, i, &mask, 1)) == NULLPED) ! 74: return pe_seterr (pe, PE_ERR_NMEM, NOTOK); ! 75: ! 76: *bp &= ~mask; ! 77: ! 78: return OK; ! 79: } ! 80: ! 81: /* */ ! 82: ! 83: int bit_test (pe, i) ! 84: register PE pe; ! 85: register int i; ! 86: { ! 87: int mask; ! 88: register PElementData bp; ! 89: ! 90: if ((bp = ffb (pe, i, &mask, 0)) == NULLPED) ! 91: return pe_seterr (pe, PE_ERR_BIT, NOTOK); ! 92: ! 93: return (*bp & mask ? 1 : 0); ! 94: } ! 95: ! 96: /* */ ! 97: ! 98: static PElementData ffb (pe, n, mask, xtnd) ! 99: register PE pe; ! 100: register int n, ! 101: *mask, ! 102: xtnd; ! 103: { ! 104: register int len, ! 105: i; ! 106: int j; ! 107: register PElementData bp; ! 108: register PE *p, ! 109: q, ! 110: r; ! 111: ! 112: i = (j = n) / 8 + 1; ! 113: if ((bp = ffb_aux (pe, &j, mask)) != NULLPED || !xtnd) ! 114: return bp; ! 115: ! 116: if (pe -> pe_form == PE_FORM_CONS) ! 117: pe = ffb_pe (pe); ! 118: ! 119: switch (pe -> pe_form) { ! 120: case PE_FORM_PRIM: ! 121: if (pe -> pe_len < (PElementLen) (len = i + 1)) { ! 122: if ((bp = PEDalloc (len)) == NULLPED) ! 123: return NULLPED; ! 124: bzero ((char *) bp, len); ! 125: if (pe -> pe_prim) { ! 126: PEDcpy (pe -> pe_prim, bp, pe -> pe_len); ! 127: if (pe -> pe_inline) ! 128: pe -> pe_inline = 0; ! 129: else ! 130: PEDfree (pe -> pe_prim); ! 131: } ! 132: pe -> pe_prim = bp, pe -> pe_len = len; ! 133: } ! 134: pe -> pe_nbits = n + 1; ! 135: *mask = 1 << (7 - (n % 8)); ! 136: return (pe -> pe_prim + i); ! 137: ! 138: case PE_FORM_CONS: ! 139: if ((r = pe_alloc (pe -> pe_class, PE_FORM_PRIM, pe -> pe_id)) ! 140: == NULLPE) ! 141: return NULLPED; ! 142: if ((r -> pe_prim = PEDalloc (len = r -> pe_len = j / 8 + 2)) ! 143: == NULLPED) { ! 144: pe_free (r); ! 145: return NULLPED; ! 146: } ! 147: bzero ((char *) r -> pe_prim, len); ! 148: r -> pe_nbits = j + 1; ! 149: *mask = 1 << (7 - (j % 8)); ! 150: for (p = &pe -> pe_cons; q = *p; p = &q -> pe_next) ! 151: continue; ! 152: *p = r; ! 153: return (r -> pe_prim + len - 1); ! 154: ! 155: default: ! 156: return NULLPED; ! 157: } ! 158: } ! 159: ! 160: /* */ ! 161: ! 162: static PElementData ffb_aux (pe, n, mask) ! 163: register PE pe; ! 164: register int *n, ! 165: *mask; ! 166: { ! 167: register int i, ! 168: nbits; ! 169: register PElementData bp; ! 170: register PE p; ! 171: ! 172: switch (pe -> pe_form) { ! 173: case PE_FORM_PRIM: ! 174: if ((nbits = pe -> pe_nbits) > (i = *n)) { ! 175: *mask = 1 << (7 - (i % 8)); ! 176: return (pe -> pe_prim + i / 8 + 1); ! 177: } ! 178: *n -= nbits; ! 179: break; ! 180: ! 181: case PE_FORM_CONS: ! 182: for (p = pe -> pe_cons; p; p = p -> pe_next) ! 183: if ((bp = ffb_aux (p, n, mask)) != NULLPED) ! 184: return bp; ! 185: break; ! 186: } ! 187: ! 188: return NULLPED; ! 189: } ! 190: ! 191: /* */ ! 192: ! 193: static PE ffb_pe (pe) ! 194: register PE pe; ! 195: { ! 196: register PE p, ! 197: q; ! 198: ! 199: for (p = pe -> pe_cons, q = NULLPE; p; q = p, p = p -> pe_next) ! 200: continue; ! 201: ! 202: if (q != NULLPE) ! 203: switch (q -> pe_form) { ! 204: case PE_FORM_PRIM: ! 205: return q; ! 206: ! 207: case PE_FORM_CONS: ! 208: return ffb_pe (q); ! 209: } ! 210: ! 211: return pe; ! 212: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.