1 /* ------------------------------------------------------------------------ */ 2 /* LHa for UNIX */ 3 /* larc.c -- extra *.lzs */ 4 /* */ 5 /* Modified Nobutaka Watazaki */ 6 /* */ 7 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */ 8 /* ------------------------------------------------------------------------ */ 9 #include "lha.h" 10 11 /* ------------------------------------------------------------------------ */ 12 static int flag, flagcnt, matchpos; 13 /* ------------------------------------------------------------------------ */ 14 /* lzs */ 15 unsigned short decode_c_lzs()16decode_c_lzs( /*void*/ ) 17 { 18 if (getbits(1)) { 19 return getbits(8); 20 } 21 else { 22 matchpos = getbits(11); 23 return getbits(4) + 0x100; 24 } 25 } 26 27 /* ------------------------------------------------------------------------ */ 28 /* lzs */ 29 unsigned short decode_p_lzs()30decode_p_lzs( /*void*/ ) 31 { 32 return (loc - matchpos - MAGIC0) & 0x7ff; 33 } 34 35 /* ------------------------------------------------------------------------ */ 36 /* lzs */ 37 void decode_start_lzs()38decode_start_lzs( /*void*/ ) 39 { 40 init_getbits(); 41 init_code_cache(); 42 } 43 44 /* ------------------------------------------------------------------------ */ 45 /* lz5 */ 46 unsigned short decode_c_lz5()47decode_c_lz5( /*void*/ ) 48 { 49 int c; 50 51 if (flagcnt == 0) { 52 flagcnt = 8; 53 flag = getc(infile); 54 } 55 flagcnt--; 56 c = getc(infile); 57 if ((flag & 1) == 0) { 58 matchpos = c; 59 c = getc(infile); 60 matchpos += (c & 0xf0) << 4; 61 c &= 0x0f; 62 c += 0x100; 63 } 64 flag >>= 1; 65 return c; 66 } 67 68 /* ------------------------------------------------------------------------ */ 69 /* lz5 */ 70 unsigned short decode_p_lz5()71decode_p_lz5( /*void*/ ) 72 { 73 return (loc - matchpos - MAGIC5) & 0xfff; 74 } 75 76 /* ------------------------------------------------------------------------ */ 77 /* lz5 */ 78 void decode_start_lz5()79decode_start_lz5( /*void*/ ) 80 { 81 int i; 82 83 flagcnt = 0; 84 for (i = 0; i < 256; i++) 85 memset(&text[i * 13 + 18], i, 13); 86 for (i = 0; i < 256; i++) 87 text[256 * 13 + 18 + i] = i; 88 for (i = 0; i < 256; i++) 89 text[256 * 13 + 256 + 18 + i] = 255 - i; 90 memset(&text[256 * 13 + 512 + 18], 0, 128); 91 memset(&text[256 * 13 + 512 + 128 + 18], ' ', 128 - 18); 92 } 93