Listing 2: passBytes.c

     1	#include <stdio.h>
     2	
     3	main(argc, argv)
     4	    int argc; char *argv[];
     5	{
     6	    int n;		/* Number of start/end pairs */
     7	    int *start;		/* Where the bad header starts */
     8	    int *end;		/* Where the good header starts after a bad header */
     9	    makeSkipList (argv[1], &n, &start, &end);
    10	    {   int i;
    11		for (i=0; i<n; i++)
    12		    fprintf (stderr, "start[%d] = %d\tend[%d] = %d\n", i, start[i], i, end[i]);
    13	    }
    14	    passBytes (n, start, end);
    15	}
    16	
    17	makeSkipList (filename, Pn, PPstart, PPend)
    18	    char *filename; int *Pn, **PPstart, **PPend;
    19	{
    20	    char line[100];
    21	    char isNow = 'n';	/* h for being in the HEADER area; n for not */
    22	    FILE *fp = fopen (filename, "r");
    23	    *Pn = 0;
    24	    *PPstart = (int *) calloc (1, sizeof(int));
    25	    *PPend   = (int *) calloc (1, sizeof(int));
    26	
    27	    while (fgets (line, sizeof(line), fp)) {	/* exit at EOF or error */
    28		if (line[0] == 'H' && isNow == 'n') {
    29		    *PPstart = (int *) realloc (*PPstart, (*Pn)+1);
    30		    sscanf (line, "%*s %*s %d", &((*PPstart)[*Pn]));
    31		    isNow = 'h';
    32		}
    33		if (line[0] != 'H' && isNow == 'h') {
    34		    *PPend = (int *) realloc (*PPend, (*Pn)+1);
    35		    sscanf (line, "%d", &((*PPend)[*Pn]));
    36		    isNow = 'n';
    37		    (*Pn)++;
    38		}
    39	    }
    40	    fclose(fp);
    41	}
    42	
    43	passBytes (n, Pstart, Pend)
    44	    int n, *Pstart, *Pend;
    45	{
    46	    int i;	/* indexing the Pstart and Pend arrays */
    47	    int b = 0;	/* Current Byte number */
    48	    for (i = 0; i < n; i++) {
    49		register int s = Pstart[i];
    50		register int e = Pend[i];
    51		for (; b < s; b++) {
    52	            putchar (getchar ());
    53	        }
    54		for (; b < e; b++) {
    55	            getchar();
    56	        }
    57	    }
    58	    while (EOF != (i = getchar()))
    59		putchar(i);
    60	}

