* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / tests / ucomp.c
blobcc3eef8f8cecfffe658cca23cea2b5c0c2b9244f
2 /*
3 * Uncompress program this is very very fast
5 */
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10 #include <stdio.h>
11 #include <malloc.h>
13 #define MAXLEN 255
15 #define maxno 61000U
16 #define USE_BSS
18 #ifdef USE_BSS
19 unsigned char fptr[maxno];
20 #else
21 unsigned char *fptr;
22 #endif
23 FILE * fd;
24 int key;
26 main(argc, argv)
27 int argc;
28 char ** argv;
30 #ifndef USE_BSS
31 fptr = (unsigned char * ) malloc(maxno);
33 if( fptr == 0 )
35 perror("Cannot allocate memory");
36 exit(1);
38 #endif
40 if( argc < 2 )
42 fd = stdin;
43 key = getc(fd);
44 uncompress();
46 else
48 fd = fopen(argv[1], "r" );
49 if( fd == 0 ) { perror("Open failed"); exit(1); }
51 key = getc(fd);
52 uncompress();
56 /* \f
58 Uncompression routine -- v.v.fast
61 uncompress()
63 register unsigned char * mainscan;
64 register unsigned char * secondscan;
65 register unsigned char * ptr = (unsigned char * ) fptr;
66 register unsigned char * eptr = ptr+maxno;
67 register unsigned int len;
68 register int ch;
70 mainscan = ptr;
72 for(;;)
74 ch = getc(fd);
75 if(ch == EOF) break;
76 ch &= 0xFF;
77 if(ch == key)
79 ch = getc(fd);
80 if( ch == 0 )
81 *mainscan++ = key;
82 else
84 len = (unsigned char) getc(fd);
85 if( ch & 0x80 )
86 len += ((unsigned char) getc(fd)) << 8;
87 secondscan = mainscan - len;
88 if(len > mainscan - ptr) secondscan += maxno;
89 len = (unsigned char) ch & 0x7F;
90 for( ; len>0; len-- )
92 *mainscan++ = *secondscan++;
93 if( secondscan == eptr ) secondscan = ptr;
94 if( mainscan == eptr )
95 { write(1, ptr, (int)(mainscan-ptr)); mainscan = ptr; }
99 else
100 *mainscan++ = ch;
102 if( mainscan == eptr )
103 { write(1, ptr, (int)(mainscan-ptr)); mainscan = ptr; }
105 if( mainscan != ptr )
106 { write(1, ptr, (int)(mainscan-ptr)); mainscan = ptr; }