* Copy nitems null-bitmap bits from source to destination * * destbitmap: start of destination array's null bitmap (mustn't be NULL) * destoffset: 0-based linear element number of first dest element * srcbitmap: start of source array's null bitmap, or NULL if none * srcoffset: 0-based linear element number of first source element * nitems: number of bits to copy (>= 0) * * If srcbitmap is
| 4853 | * to make it worth worrying too much. For the moment, KISS. |
| 4854 | */ |
| 4855 | void |
| 4856 | array_bitmap_copy(bits8 *destbitmap, int destoffset, |
| 4857 | const bits8 *srcbitmap, int srcoffset, |
| 4858 | int nitems) |
| 4859 | { |
| 4860 | int destbitmask, |
| 4861 | destbitval, |
| 4862 | srcbitmask, |
| 4863 | srcbitval; |
| 4864 | |
| 4865 | Assert(destbitmap); |
| 4866 | if (nitems <= 0) |
| 4867 | return; /* don't risk fetch off end of memory */ |
| 4868 | destbitmap += destoffset / 8; |
| 4869 | destbitmask = 1 << (destoffset % 8); |
| 4870 | destbitval = *destbitmap; |
| 4871 | if (srcbitmap) |
| 4872 | { |
| 4873 | srcbitmap += srcoffset / 8; |
| 4874 | srcbitmask = 1 << (srcoffset % 8); |
| 4875 | srcbitval = *srcbitmap; |
| 4876 | while (nitems-- > 0) |
| 4877 | { |
| 4878 | if (srcbitval & srcbitmask) |
| 4879 | destbitval |= destbitmask; |
| 4880 | else |
| 4881 | destbitval &= ~destbitmask; |
| 4882 | destbitmask <<= 1; |
| 4883 | if (destbitmask == 0x100 /* (1<<8) */) |
| 4884 | { |
| 4885 | *destbitmap++ = destbitval; |
| 4886 | destbitmask = 1; |
| 4887 | if (nitems > 0) |
| 4888 | destbitval = *destbitmap; |
| 4889 | } |
| 4890 | srcbitmask <<= 1; |
| 4891 | if (srcbitmask == 0x100 /* (1<<8) */) |
| 4892 | { |
| 4893 | srcbitmap++; |
| 4894 | srcbitmask = 1; |
| 4895 | if (nitems > 0) |
| 4896 | srcbitval = *srcbitmap; |
| 4897 | } |
| 4898 | } |
| 4899 | if (destbitmask != 1) |
| 4900 | *destbitmap = destbitval; |
| 4901 | } |
| 4902 | else |
| 4903 | { |
| 4904 | while (nitems-- > 0) |
| 4905 | { |
| 4906 | destbitval |= destbitmask; |
| 4907 | destbitmask <<= 1; |
| 4908 | if (destbitmask == 0x100 /* (1<<8) */) |
| 4909 | { |
| 4910 | *destbitmap++ = destbitval; |
| 4911 | destbitmask = 1; |
| 4912 | if (nitems > 0) |
no outgoing calls
no test coverage detected