Mercurial > hg > wm
comparison Meerwald/signature.c @ 3:acb6967ee76d
update to 0.5
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Tue, 14 Aug 2007 21:11:21 +0200 |
| parents | be303a3f5ea8 |
| children | f83ef905a63d |
comparison
equal
deleted
inserted
replaced
| 2:b92f06d9a967 | 3:acb6967ee76d |
|---|---|
| 10 | 10 |
| 11 void init_signature2_bits() { | 11 void init_signature2_bits() { |
| 12 bzero(signature2, sizeof(signature2)); | 12 bzero(signature2, sizeof(signature2)); |
| 13 } | 13 } |
| 14 | 14 |
| 15 int get_signature_bit(int n) { | 15 int _get_signature_bit(char *s, int lim, int n) { |
| 16 int byte = n >> 3; | 16 int byte = n >> 3; |
| 17 int bit = n & 7; | 17 int bit = n & 7; |
| 18 | 18 |
| 19 #ifdef DEBUG | 19 #ifdef DEBUG |
| 20 if (byte < 0 || byte >= NSIGNATURE) | 20 if (byte < 0 || byte >= lim) |
| 21 fprintf(stderr, "get_signature_bit(): index out of range\n"); | 21 fprintf(stderr, "get_signature_bit?(): index out of range\n"); |
| 22 #endif | 22 #endif |
| 23 | 23 |
| 24 return (signature[byte] & (1 << bit)) >> bit; | 24 return (s[byte] & (1 << bit)) >> bit; |
| 25 } | |
| 26 | |
| 27 int get_signature_bit(int n) { | |
| 28 return _get_signature_bit(signature, NSIGNATURE, n); | |
| 25 } | 29 } |
| 26 | 30 |
| 27 int get_signature1_bit(int n) { | 31 int get_signature1_bit(int n) { |
| 32 return _get_signature_bit(signature1, NSIGNATURE, n); | |
| 33 } | |
| 34 | |
| 35 int get_signature2_bit(int n) { | |
| 36 return _get_signature_bit(signature2, NSIGNATURE, n); | |
| 37 } | |
| 38 | |
| 39 void _set_signature_bit(char *s, int lim, int n, int v) { | |
| 28 int byte = n >> 3; | 40 int byte = n >> 3; |
| 29 int bit = n & 7; | 41 int bit = n & 7; |
| 30 | 42 |
| 31 #ifdef DEBUG | 43 #ifdef DEBUG |
| 32 if (byte < 0 || byte >= NSIGNATURE) | 44 if (byte < 0 || byte >= limit / 8) |
| 33 fprintf(stderr, "get_signature1_bit(): index out of range\n"); | 45 fprintf(stderr, "get_signature_bit?(): index out of range\n"); |
| 34 #endif | 46 #endif |
| 35 | 47 |
| 36 return (signature1[byte] & (1 << bit)) >> bit; | 48 if (v) |
| 37 } | 49 s[byte] |= (1 << bit); |
| 38 | 50 else |
| 39 int get_signature2_bit(int n) { | 51 s[byte] &= ~(1 << bit); |
| 40 int byte = n >> 3; | |
| 41 int bit = n & 7; | |
| 42 | |
| 43 #ifdef DEBUG | |
| 44 if (byte < 0 || byte >= NSIGNATURE) | |
| 45 fprintf(stderr, "get_signature2_bit(): index out of range\n"); | |
| 46 #endif | |
| 47 | |
| 48 return (signature2[byte] & (1 << bit)) >> bit; | |
| 49 } | 52 } |
| 50 | 53 |
| 51 void set_signature_bit(int n, int v) { | 54 void set_signature_bit(int n, int v) { |
| 52 int byte = n >> 3; | 55 _set_signature_bit(signature, NSIGNATURE, n, v); |
| 53 int bit = n & 7; | |
| 54 | |
| 55 #ifdef DEBUG | |
| 56 if (byte < 0 || byte >= NSIGNATURE) | |
| 57 fprintf(stderr, "get_signature_bit(): index out of range\n"); | |
| 58 #endif | |
| 59 | |
| 60 if (v) | |
| 61 signature[byte] |= (1 << bit); | |
| 62 else | |
| 63 signature[byte] &= ~(1 << bit); | |
| 64 } | 56 } |
| 65 | 57 |
| 66 void set_signature1_bit(int n, int v) { | 58 void set_signature1_bit(int n, int v) { |
| 67 int byte = n >> 3; | 59 _set_signature_bit(signature1, NSIGNATURE, n, v); |
| 68 int bit = n & 7; | |
| 69 | |
| 70 #ifdef DEBUG | |
| 71 if (byte < 0 || byte >= NSIGNATURE) | |
| 72 fprintf(stderr, "get_signature1_bit(): index out of range\n"); | |
| 73 #endif | |
| 74 | |
| 75 if (v) | |
| 76 signature1[byte] |= (1 << bit); | |
| 77 else | |
| 78 signature1[byte] &= ~(1 << bit); | |
| 79 } | 60 } |
| 80 | 61 |
| 81 void set_signature2_bit(int n, int v) { | 62 void set_signature2_bit(int n, int v) { |
| 82 int byte = n >> 3; | 63 _set_signature_bit(signature2, NSIGNATURE, n, v); |
| 83 int bit = n & 7; | |
| 84 | |
| 85 #ifdef DEBUG | |
| 86 if (byte < 0 || byte >= NSIGNATURE) | |
| 87 fprintf(stderr, "get_signature2_bit(): index out of range\n"); | |
| 88 #endif | |
| 89 | |
| 90 if (v) | |
| 91 signature2[byte] |= (1 << bit); | |
| 92 else | |
| 93 signature2[byte] &= ~(1 << bit); | |
| 94 } | 64 } |
| 95 | 65 |
| 66 int _binstr_to_sig(const char *binstr, char *sig, int *bytes, int *bits) { | |
| 67 int n = strlen(binstr); | |
| 68 int i; | |
| 69 | |
| 70 for (i = 0; i < n; i++) { | |
| 71 if (binstr[i] == '0') | |
| 72 _set_signature_bit(sig, NSIGNATURE, i, 0); | |
| 73 else if (binstr[i] == '1') | |
| 74 _set_signature_bit(sig, NSIGNATURE, i, 1); | |
| 75 else | |
| 76 return 0; | |
| 77 } | |
| 78 | |
| 79 *bytes = (n % 8 > 0) ? n / 8 + 1 : n / 8; | |
| 80 *bits = n; | |
| 81 | |
| 82 return 1; | |
| 83 } | |
| 84 | |
| 85 int binstr_to_sig(const char *binstr) { | |
| 86 _binstr_to_sig(binstr, signature, &n_signature, &nbit_signature); | |
| 87 } | |
| 88 | |
| 89 int binstr_to_sig1(const char *binstr) { | |
| 90 _binstr_to_sig(binstr, signature1, &n_signature1, &nbit_signature1); | |
| 91 } | |
| 92 | |
| 93 int binstr_to_sig2(const char *binstr) { | |
| 94 _binstr_to_sig(binstr, signature2, &n_signature2, &nbit_signature2); | |
| 95 } | |
| 96 | |
| 97 int _sig_to_binstr(char *binstr, char *sig, int bits) { | |
| 98 int i; | |
| 99 | |
| 100 for (i = 0; i < bits; i++) | |
| 101 binstr[i] = _get_signature_bit(sig, NSIGNATURE, i) ? '1' : '0'; | |
| 102 | |
| 103 binstr[bits] = '\0'; | |
| 104 | |
| 105 return 1; | |
| 106 } | |
| 107 | |
| 108 int sig_to_binstr(char *binstr) { | |
| 109 return _sig_to_binstr(binstr, signature, nbit_signature); | |
| 110 } | |
| 111 | |
| 112 int sig1_to_binstr(char *binstr) { | |
| 113 return _sig_to_binstr(binstr, signature1, nbit_signature1); | |
| 114 } | |
| 115 | |
| 116 int sig2_to_binstr(char *binstr) { | |
| 117 return _sig_to_binstr(binstr, signature2, nbit_signature2); | |
| 118 } |
