75int LCW_Uncomp(
void const * source,
void * dest,
unsigned long )
77 unsigned char * source_ptr, * dest_ptr, * copy_ptr;
78 unsigned char op_code, data;
80 unsigned * word_dest_ptr;
84 source_ptr = (
unsigned char*) source;
85 dest_ptr = (
unsigned char*) dest;
90 op_code = *source_ptr++;
92 if (!(op_code & 0x80)) {
95 count = (op_code >> 4) + 3;
96 copy_ptr = dest_ptr - ((unsigned) *source_ptr++ + (((unsigned) op_code & 0x0f) << 8));
98 while (count--) *dest_ptr++ = *copy_ptr++;
102 if (!(op_code & 0x40)) {
104 if (op_code == 0x80) {
107 return ((
unsigned long) (dest_ptr - (
unsigned char*) dest));
112 count = op_code & 0x3f;
114 while (count--) *dest_ptr++ = *source_ptr++;
119 if (op_code == 0xfe) {
122 count = *source_ptr + ((unsigned) *(source_ptr + 1) << 8);
123 word_data = data = *(source_ptr + 2);
124 word_data = (word_data << 24) + (word_data << 16) + (word_data << 8) + word_data;
127 copy_ptr = dest_ptr + 4 - ((unsigned) dest_ptr & 0x3);
128 count -= (copy_ptr - dest_ptr);
129 while (dest_ptr < copy_ptr) *dest_ptr++ = data;
131 word_dest_ptr = (
unsigned*) dest_ptr;
133 dest_ptr += (count & 0xfffffffc);
135 while (word_dest_ptr < (
unsigned*) dest_ptr) {
136 *word_dest_ptr = word_data;
137 *(word_dest_ptr + 1) = word_data;
141 copy_ptr = dest_ptr + (count & 0x3);
142 while (dest_ptr < copy_ptr) *dest_ptr++ = data;
146 if (op_code == 0xff) {
149 count = *source_ptr + ((unsigned) *(source_ptr + 1) << 8);
150 copy_ptr = (
unsigned char*) dest + *(source_ptr + 2) + ((unsigned) *(source_ptr + 3) << 8);
153 while (count--) *dest_ptr++ = *copy_ptr++;
158 count = (op_code & 0x3f) + 3;
159 copy_ptr = (
unsigned char*) dest + *source_ptr + ((
unsigned) *(source_ptr + 1) << 8);
162 while (count--) *dest_ptr++ = *copy_ptr++;