#define _WITH_GETLINE #include "mystdlib.h" #include #include #include #include static int find_offset( const void *key, const void *line ) { size_t l = strlen( (char*)key ); return strncmp( (char*)key, *(char**)line, l ); } static int qsort_cmp( const void *a, const void *b ) { return strcmp( *(char**)a, *(char**)b ); } int main( int argc, char ** args ) { MAP coords; char *p, **offsets, *input = malloc(1024); ssize_t ll; size_t i, l, lines, input_length = 1024; if( argc != 2 ) { fprintf( stderr, "Syntax: printf %%s\\t%%s\\t%%s | %s \n", args[0] ); exit(111); } coords = map_file( args[1], 1 ); if( !coords || !input ) { fprintf( stderr, "Error allocating resources\n" ); exit( 111 ); } p = (char *)coords->addr; for ( i=0, lines=0; isize; ++i ) if( p[i] == 0x00 ) ++lines; offsets = malloc( lines * sizeof(char*)); if( !offsets ) exit( 111 ); offsets[0] = p; l = 1; for ( i=0; isize; ++i ) if( p[i] == 0x00 ) offsets[l++] = p+i+1; l--; qsort(offsets, l, sizeof(char*), qsort_cmp ); while( ( ll = getline( &input, &input_length, stdin ) ) >= 0 ) { char **coord_line; input[ll-1]='\t'; coord_line = bsearch( input, offsets, l, sizeof(char*), find_offset ); if( !coord_line && ll > 2 && isalpha( input[ll-2] ) ) { input[ll-2] = '\t'; input[ll-1]=0; ll--; coord_line = bsearch( input, offsets, l, sizeof(char*), find_offset ); } if( coord_line ) printf( "%s\n", *coord_line + ll ); else puts( "\t" ); } return 0; }