Listing 3: browse.c Byte pair encoding file browser
/* browse.c -- Byte Pair Encoding file browser */ /* Copyright 1996 Philip Gage */ #include <stdio.h> #define LINESPERPAGE 23 unsigned char pairtable[128][2]; void decompress_page (FILE *in) { unsigned char stack[16]; short c, top=0, linecount=0; for (;;) { /* Pop byte from stack or read byte from file */ if (top) c = stack[--top]; else if ((c=getc(in)) == EOF) break; /* Push pair on stack or print byte */ if (c & 0x80) { stack[top++] = pairtable[c & 0x7F][1]; stack[top++] = pairtable[c & 0x7F][0]; } else { putchar(c); /* Count linefeeds and quit after one screen */ if (c == '\n' && ++linecount == LINESPERPAGE) break; } } } int main (int argc, char **argv) { FILE *in; long start, end; int c, percent = 0; if (argc != 2) printf("Usage: browse inputfile\n"); else if ((in=fopen(argv[1],"rb"))==NULL) printf("Error opening input %s\n",argv[1]); else { /* Check for optional pair count and pair table */ if ((c = getc(in)) & 0x80) fread(pairtable,2,c & 0x7F,in); else ungetc(c,in); /* Find first and last byte of packed data */ start = ftell(in); fseek(in,0L,SEEK_END); end = ftell(in); fseek(in,start,SEEK_SET); for (;;) { /* Display current page and read new percent */ decompress_page(in); printf("\n%d %% into file, enter new %% ",percent); scanf("%d",&percent); /* Quit program if input percent out of range */ if (percent < 0 || percent > 99) break; /* Move file pointer to new position in file */ fseek(in,start+percent*(end-start)/100,SEEK_SET); } fclose(in); } return 0; }/* End of File */