/******************************************************************************* * * Project: seft (search engine for text) * * File: output.c * * Author: Owen de Kretser (oldk@cs.mu.oz.au) * * Organisation: Dept. of CS&SE, University of Melbourne * * Date: April 1999 * * Purpose: window printing functions * *******************************************************************************/ /***** #includes **************************************************************/ #include #include "output.h" #include "util.h" #include "local_strings.h" #include "main.h" #include "words.h" #include "stem.h" #include "tst.h" /***** Function Prototypes ****************************************************/ void output_window_header(WORD*, int rank, int score); void output_sparse_window(query_data*, WORD*); void output_null_window(query_data*, WORD*); /******************************************************************************* * * Function: output_window * * Purpose: seek into text file and extract/output an appropriate window * *******************************************************************************/ void output_window(query_data* qd, WORD* word, int rank, int score) { if (qd->no_output == FALSE) { output_window_header(word,rank,score); output_sparse_window(qd, word); } else { output_null_window(qd,word); } } /******************************************************************************* * * Function: output_window_header * * Purpose: output window header information * *******************************************************************************/ void output_window_header(WORD* word, int rank, int score) { char line[MAX_LINE_LENGTH*2]; int length; int i; int line_diff; sprintf(line,"== %2d (%3d%%) == %s:%d ", rank, score, *(word->name), word->line_no); fprintf(stdout,"%s",line); length = strlen(line); line_diff = MAX_LINE_LENGTH - length -1; for (i=0; i < line_diff; i++) { fprintf(stdout,"="); } fprintf(stdout,"\n"); } /******************************************************************************* * * Function: output_null_window * * Purpose: perform seek only (useful for timing) * *******************************************************************************/ void output_null_window(query_data* qd, WORD* word) { FILE* fptr; int i; u_char buffer[MAX_QUERY_LEN]; fptr = safe_fopen(*(word->name),"rb"); fseek(fptr,word->seek_pos,SEEK_SET); for (i=0; i < qd->window_size; i++) { fgets(buffer,MAX_QUERY_LEN,fptr); } fclose(fptr); } /******************************************************************************* * * Function: output_sparse_window * * Purpose: output window in sparse (original) format * *******************************************************************************/ void output_sparse_window(query_data* qd, WORD* word) { u_char Word[MAXSTEMLEN]; u_char copy_word[MAXSTEMLEN]; u_char *end, *s_in; FILE* fptr; int i; u_char buffer[MAX_QUERY_LEN]; fptr = safe_fopen(*(word->name),"rb"); fseek(fptr,word->seek_pos,SEEK_SET); for (i=0; i < qd->window_size; i++) { fgets(buffer,MAX_QUERY_LEN,fptr); if (qd->no_hilite == TRUE) { fprintf(stdout,"%s",buffer); } else { s_in = (u_char*)buffer; end = s_in + strlen((char*)s_in) - 1; if (!INAWORD(*s_in)) { PARSE_NON_WORD(Word,s_in, end); print_str255(Word,stdout); } while ( s_in <= end) { /* Get a word */ PARSE_WORD(Word, s_in, end); //tolower_word = copy_string_tolower(Word); string_copy(copy_word,Word); stemmer(qd->stem_method,copy_word); copy_word[copy_word[0]+1] = '\0'; if (tst_search(qd->tst_root,copy_word) != NOT_FOUND) { fprintf(stdout,"\033[7m"); print_str255(Word,stdout); fprintf(stdout,"\033[m"); } else { print_str255(Word,stdout); } PARSE_NON_WORD(Word,s_in, end); print_str255(Word,stdout); } } } fprintf(stdout,"\n"); }