archie/prospero/lib/psrv/wais_gw/wutil.c
2024-05-27 16:13:40 +02:00

1838 lines
43 KiB
C

/* WIDE AREA INFORMATION SERVER SOFTWARE:
Developed by Thinking Machines Corporation and put into the public
domain with no guarantees or restrictions.
*/
/*----------------------------------------------------------------------*/
#include "futil.h"
#include <ctype.h>
#include "zprot.h"
#include "zutil.h"
#include "wprot.h"
#include <string.h>
#include "wutil.h"
#define CARRIAGE_RETURN 13
#define LINE_FEED 10
#define ESC 27
#define DC1 17
#define DC3 19
#define ETS 3
#define FF 12
/* #define TEST */
#define INIT_CMD 1
#define SEARCH_CMD 2
#define EXTRACT_CMD 3
#define STOP_CMD 4
#define MAX_CMD 4
#define MAX_BUFFER_LENGTH 10000
#ifndef MIN
#define MIN(a,b) (a > b ? b : a)
#endif
#define BIT(n) (1L << n)
char *elm_name_tbl[] = { ES_DocumentHeader
,ES_DocumentShortHeader
,ES_DocumentLongHeader
,ES_DocumentText
,ES_DocumentHeadline
,ES_DocumentCodes
};
void twais_tmplt_typ3_srch_apdu _AP((char* buff,long* buff_len));
void dsply_doc_hdr_record _AP((WAISDocumentHeader* record));
void dsply_short_hdr_record _AP((WAISDocumentShortHeader* record));
#ifdef TEST
main()
{
char cmd[4096];
long cmd_len;
printf("\n\n test template request apdu\n\n");
do
twais_format_req_apdu( TRUE, cmd, &cmd_len);
while ( cmd_len > 0 );
printf("\n\n test formating request apdu\n\n");
do
twais_format_req_apdu( FALSE, cmd, &cmd_len);
while ( cmd_len > 0 );
printf("\n\n test display init response apdu\n\n");
twais_tmplt_init_rsp_apdu( cmd, &cmd_len);
twais_dsply_rsp_apdu( cmd, cmd_len);
printf("\n\n test display type3 search response apdu\n\n");
twais_tmplt_typ3_srch_rsp_apdu( cmd, &cmd_len);
twais_dsply_rsp_apdu( cmd, cmd_len);
printf("\n\n test display type1 search response apdu\n\n");
twais_tmplt_typ1_stry_rsp_apdu( cmd, &cmd_len);
twais_dsply_rsp_apdu( cmd, cmd_len);
}
#endif
static void get_int_item _AP((char* itm_name, long *itm_val));
static void
get_int_item(itm_name, itm_val)
char *itm_name;
long *itm_val;
{
printf(" %s (integer): ", itm_name);
scanf("%ld", itm_val);
}
static void get_str_item _AP((char* itm_name,char* itm_val));
static void
get_str_item(itm_name, itm_val)
char *itm_name;
char *itm_val;
{
printf(" %s (string): ", itm_name);
scanf("%s", itm_val);
}
static void get_line_item _AP((char* itm_name,char* itm_val));
static void
get_line_item(itm_name, itm_val)
char *itm_name;
char *itm_val;
{
printf(" %s (one line string):\n", itm_name);
gets( itm_val);
if ( itm_val[0] == 0 )
gets(itm_val);
}
static void get_req_type _AP((long* req_type));
static void
get_req_type( req_type)
long *req_type;
{
printf("\n\n");
printf(" request type 1)init 2)query search 3)extract story 4)stop: ");
scanf("%ld", req_type);
}
#if !defined(IN_RMG) && !defined(PFS_THREADS)
/*
* "twais_format_req_apdu" This function gets request message. It reads the
* request message into the specified buffer.
* It returns the length of the data
* written into the buffer as an output parameter.
* A zero length value indicates "end session".
*
* return values:
* none
*/
void
twais_format_req_apdu(use_template,apdu_buff,len)
boolean use_template;
char* apdu_buff;
long* len;
/* use_template : (I) flag indicating whether use template apdu */
/* apdu_buff : (O) buffer to put apdu */
/* len : (O) number of bytes written to the buffer */
{
long req_type;
do {
get_req_type( &req_type);
switch (req_type) {
case INIT_CMD:
*len = twais_format_init_apdu( use_template, apdu_buff);
break;
case SEARCH_CMD:
*len = twais_format_typ3_srch_apdu( use_template, apdu_buff);
break;
case EXTRACT_CMD:
*len = twais_format_typ1_srch_apdu( use_template, apdu_buff);
break;
case STOP_CMD:
*len = 0;
break;
default:
break;
}
}
while ( req_type < 1 || req_type > MAX_CMD );
}
/*
* "twais_format_init_apdu"
* prompt user information to format an init apdu and
* write the apdu to the specified buffer
*
* function return:
* number of bytes written to the buffer
*/
long
twais_format_init_apdu(use_template,apdu_buff)
boolean use_template;
char* apdu_buff;
/* use_template : (I) flag indicating whether use template apdu */
/* apdu_buff : (O) buffer to put apdu */
{
InitAPDU *init1;
char *end_ptr;
long len;
long pref_msg_size;
long max_rec_size;
any refID;
char ref_id[128];
if ( use_template ) {
twais_tmplt_init_apdu(apdu_buff, &len);
return( len);
}
get_int_item( "prefered message size", &pref_msg_size);
get_int_item( "maximum record size", &max_rec_size);
get_str_item("reference id", ref_id);
refID.size = strlen(ref_id);
refID.bytes = &ref_id[0];
init1 = makeInitAPDU(WILL_USE,WILL_NOT_USE,WILL_NOT_USE,WILL_NOT_SUPPORT,
WILL_NOT_SUPPORT,
pref_msg_size,
max_rec_size, NULL,
defaultImplementationID(),defaultImplementationName(),
defaultImplementationVersion(), &refID,NULL);
{ long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeInitAPDU(init1, apdu_buff, &buffer_len);
}
freeInitAPDU(init1);
len = (long)end_ptr - (long)apdu_buff;
return(len);
}
/*
* "twais_format_typ3_srch_apdu"
* prompt user information to form a relevance feedback search apdu and
* write the apdu to the specified buffer
*
* function return:
* number of bytes written to the buffer
*/
long
twais_format_typ3_srch_apdu(use_template,apdu_buff)
boolean use_template;
char* apdu_buff;
/* use_template : (I) flag indicating whether use template apdu */
/* apdu_buff : (O) buffer to put apdu */
{
SearchAPDU *search;
char *end_ptr;
long len;
long small, large, medium;
char temp_string[80];
long num_databases, num_elmsets, i;
char **database_names_ptr;
char *database_names[11];
char database_name[10][129];
long elm_type;
char *elm_names[21];
char elm_name[20][128];
char **elm_names_ptr = &elm_names[0];
any refID;
char ref_id[256];
char seed_words[257];
DocObj *DocObjs[5];
DocObj **DocObjsPtr = 0;
long DateFactor;
char BeginDateRange[9], EndDateRange[9];
long maxDocsRetrieved;
long num, sw;
char doc_id[4][200];
any docID[4];
long ChunkCode;
any Start[4], End[4];
char start_pos[4][10], end_pos[4][10];
long start_ipos, end_ipos;
WAISSearch *query;
long count;
for(count = 0; count < 5; count++){
DocObjs[count] = 0;
}
if ( use_template ) {
twais_tmplt_typ3_srch_apdu(apdu_buff, &len);
return( len);
}
get_int_item("small set upper bound", &small);
get_int_item("large set lower bound", &large);
get_int_item("medium set present number", &medium);
get_int_item("number of databases(max 10, 0 search entire databases)", &num_databases);
if ( num_databases == 0 ) {
database_names_ptr = 0;
}
else {
database_names_ptr = &database_names[0];
database_names[num_databases] = 0;
for ( i=0; i < num_databases; i++ ) {
database_names[i] = &database_name[i][0];
sprintf( temp_string,"database name %ld", (i+1) );
get_str_item(temp_string, database_name[i]);
}
}
get_int_item("number of database-element_set pairs(max 10)", &num_elmsets);
if ( num_elmsets == 0 )
elm_names_ptr = 0;
else {
elm_names[num_elmsets * 2 ] = 0;
for ( i=0; i < num_elmsets; i++ ) {
elm_names[i*2] = &elm_name[i*2][0];
sprintf( temp_string,"database name %ld", (i+1) );
get_str_item(temp_string, &elm_name[i*2][0]);
get_int_item(" element type 0)default 1)DocHeaders 2)ShortHeaders\n 3)LongHeaders 4)Text 5)HeadLines 6)Codes",
&elm_type);
if ( (elm_type < 1) || (elm_type > 6) )
elm_type = 1;
elm_names[i*2+1] = &elm_name[i*2+1][0];
strcpy( &elm_name[i*2+1][0], elm_name_tbl[elm_type-1]);
}
}
get_str_item("reference id", ref_id);
refID.size = strlen(ref_id);
refID.bytes = &ref_id[0];
/*
* format wais search query
*/
/* fill in the user information */
get_line_item("seed_words", seed_words);
get_int_item("number of relevance feedback documents(max 4)", &num);
if ( num > 0 ) {
if ( num > 4 )
num = 4;
DocObjsPtr = &DocObjs[0];
for ( i=0; i< num; i++) {
docID[i].bytes = &doc_id[i][0];
sprintf(temp_string, "document id %ld", (i+1));
get_str_item(temp_string, &doc_id[i][0]);
docID[i].size = strlen( &doc_id[i][0]);
get_int_item(" (1)whole story (2)part story", &sw);
if ( sw == 1) {
DocObjs[i] = makeDocObjUsingWholeDocument( &docID[i],NULL);
}
else {
get_int_item(" ChunkCode (1)byte (2)line (3)parag", &ChunkCode);
if ( ChunkCode == 1 ) {
get_int_item(" start position", &start_ipos);
get_int_item(" end position", &end_ipos);
DocObjs[i] = makeDocObjUsingBytes( &docID[i], NULL,
start_ipos, end_ipos);
}
else if ( ChunkCode == 2 ) {
get_int_item(" start position", &start_ipos);
get_int_item(" end position", &end_ipos);
DocObjs[i] = makeDocObjUsingLines( &docID[i], NULL,
start_ipos, end_ipos);
}
else {
get_str_item(" start position", &start_pos[i][0]);
get_str_item(" end position", &end_pos[i][0]);
Start[i].size = strlen( &start_pos[i][0]);
Start[i].bytes = &start_pos[i][0];
End[i].size = strlen( &end_pos[i][0]);
End[i].bytes = &end_pos[i][0];
DocObjs[i] = makeDocObjUsingParagraphs( &docID[i], NULL,
&Start[i], &End[i]);
}
}
}
}
get_int_item("DateFactor (1-independent,2-later,3-earlier,4-range)", &DateFactor);
if ( DateFactor == 2 || DateFactor == 4)
get_str_item("begin date (yyyymmdd)", BeginDateRange);
else
BeginDateRange[0] = '\0';
if ( DateFactor == 3 || DateFactor == 4)
get_str_item("end date (yyyymmdd)", EndDateRange);
else
EndDateRange[0] = '\0';
get_int_item("max. documents retrieved", &maxDocsRetrieved);
query = makeWAISSearch( seed_words, DocObjsPtr, 0L,
DateFactor, BeginDateRange, EndDateRange,
maxDocsRetrieved);
search = makeSearchAPDU( small, large, medium,
1L,
"FOO",
database_names_ptr,
QT_RelevanceFeedbackQuery,
elm_names_ptr,
&refID, query);
{
long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeSearchAPDU(search, apdu_buff, &buffer_len);
}
len = (long)end_ptr - (long)apdu_buff;
i =0;
while ( DocObjs[i] != 0 ) {
CSTFreeDocObj( DocObjs[i]);
i++;
}
CSTFreeWAISSearch(query);
freeSearchAPDU(search);
return(len);
}
/*
* "twais_format_typ1_srch_apdu"
* prompt user information to form a text retrieval search apdu and
* write the apdu to the specified buffer
*
* function return:
* number of bytes written to the buffer
*/
long
twais_format_typ1_srch_apdu(use_template,apdu_buff)
boolean use_template;
char* apdu_buff;
/* use_template : (I) flag indicating whether use template apdu */
/* apdu_buff : (O) buffer to put apdu */
{
SearchAPDU *search;
char *end_ptr;
long len;
long small, large, medium;
char temp_string[80];
long num_databases, num_elmsets, i;
char **database_names_ptr;
char *database_names[11];
char database_name[10][129];
long elm_type;
char *elm_names[21];
char elm_name[20][128];
char **elm_names_ptr = &elm_names[0];
any refID;
char ref_id[256];
any *query;
DocObj *DocObjs[11];
long num_doc;
long sw;
char doc_id[10][200];
any docID[10];
long ChunkCode;
any Start[10], End[10];
long start_ipos, end_ipos;
char start_pos[10][10], end_pos[10][10];
long use_text = 0;
if ( use_template ) {
twais_tmplt_typ1_srch_apdu(apdu_buff, &len);
return( len);
}
get_int_item("small set upper bound", &small);
get_int_item("large set lower bound", &large);
get_int_item("medium set present number", &medium);
get_int_item("number of databases(max 10, 0 search entire databases)", &num_databases);
if ( num_databases == 0 ) {
database_names_ptr = 0;
}
else {
database_names_ptr = &database_names[0];
database_names[num_databases] = 0;
for ( i=0; i < num_databases; i++ ) {
database_names[i] = &database_name[i][0];
sprintf(temp_string, "database name %ld", (i+1));
get_str_item( temp_string, database_name[i]);
}
}
get_int_item("number of database-element_set pairs(max 10)", &num_elmsets);
if ( num_elmsets == 0 )
elm_names_ptr = 0;
else {
elm_names[num_elmsets * 2 ] = 0;
for ( i=0; i < num_elmsets; i++ ) {
elm_names[i*2] = &elm_name[i*2][0];
sprintf( temp_string,"database name %ld", (i+1) );
get_str_item(temp_string, &elm_name[i*2][0]);
get_int_item(" element type 0)default 1)DocHeaders 2)ShortHeaders\n 3)LongHeaders 4)Text 5)HeadLines 6)Codes",
&elm_type);
if ( (elm_type < 1) || (elm_type > 6) )
elm_type = 1;
if ( elm_type == 4) use_text++;
elm_names[i*2+1] = &elm_name[i*2+1][0];
strcpy( &elm_name[i*2+1][0], elm_name_tbl[elm_type-1]);
}
}
get_str_item("reference id", ref_id);
refID.size = strlen(ref_id);
refID.bytes = &ref_id[0];
/*
* format type 1 query
*/
get_int_item("num of documents to retrieve (max 10)", &num_doc);
if ( num_doc > 10 ) num_doc = 10;
if ( num_doc < 1 ) num_doc = 1;
DocObjs[num_doc] = 0;
for ( i=0; i < num_doc; i++ ) {
docID[i].bytes = &doc_id[i][0];
sprintf( temp_string, "document id %ld", (i+1));
get_str_item(temp_string, &doc_id[i][0]);
docID[i].size = strlen( &doc_id[i][0]);
if ( use_text == 0 )
DocObjs[i] = makeDocObjUsingWholeDocument( &docID[i],NULL);
else {
get_int_item(" (1)whole story (2)part story", &sw);
if ( sw == 1) {
DocObjs[i] = makeDocObjUsingWholeDocument( &docID[i],NULL);
}
else {
get_int_item(" ChunkCode (1)byte (2)line (3)parag", &ChunkCode);
if ( ChunkCode == 1 ) {
get_int_item(" start position", &start_ipos);
get_int_item(" end position", &end_ipos);
DocObjs[i] = makeDocObjUsingBytes( &docID[i], NULL,
start_ipos, end_ipos);
}
else if ( ChunkCode == 2 ) {
get_int_item(" start position", &start_ipos);
get_int_item(" end position", &end_ipos);
DocObjs[i] = makeDocObjUsingLines( &docID[i], NULL,
start_ipos, end_ipos);
}
else {
get_str_item(" start position", &start_pos[i][0]);
get_str_item(" end position", &end_pos[i][0]);
Start[i].size = strlen( &start_pos[i][0]);
Start[i].bytes = &start_pos[i][0];
End[i].size = strlen( &end_pos[i][0]);
End[i].bytes = &end_pos[i][0];
DocObjs[i] = makeDocObjUsingParagraphs( &docID[i], NULL,
&Start[i], &End[i]);
}
}
}
}
query = makeWAISTextQuery(DocObjs);
search = makeSearchAPDU( small, large, medium,
1L,
"FOO",
database_names_ptr,
QT_TextRetrievalQuery,
elm_names_ptr,
&refID, query);
{
long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeSearchAPDU(search, apdu_buff, &buffer_len);
}
len = (long)end_ptr - (long)apdu_buff;
i =0;
while ( DocObjs[i] != 0) {
CSTFreeDocObj( DocObjs[i]);
i++;
}
CSTFreeWAISTextQuery( query);
freeSearchAPDU(search);
return(len);
}
static void print_hdline _AP((char* hdline));
static void print_hdline(hdline)
char *hdline;
{
char buf[301];
long len, i;
len = strlen(hdline);
if (len > 300 )
len =300;
for ( i=0; i< len; i++ )
if ( hdline[i] > 31 && hdline[i] < 127 )
buf[i] = hdline[i];
else
buf[i] = '@';
buf[i] = 0;
printf(" Headline: %s\n", buf);
}
static void print_any _AP((char* title,any* any_ptr));
static void print_any( title, any_ptr)
char *title;
any *any_ptr;
{
long i;
printf("%s", title);
if ( any_ptr ) {
for ( i=0; i < any_ptr->size; i++)
{ if (isprint(any_ptr->bytes[i]))
printf("%c", any_ptr->bytes[i]);
else
printf("%ld", (long)any_ptr->bytes[i]);
}
printf("\n");
}
}
static void dsply_long_hdr_record _AP((WAISDocumentLongHeader* record));
static void dsply_long_hdr_record(record)
WAISDocumentLongHeader *record;
{
printf(" LongHeaders\n");
print_any(" DocumentID: ", record->DocumentID);
printf(" VersionNumber: %ld\n", record->VersionNumber);
printf(" Score: %ld, BestMatch: %ld\n",
record->Score,
record->BestMatch);
printf(" DocumentLength: %ld, Lines: %ld\n",
record->DocumentLength,
record->Lines);
if ( record->Source )
printf(" Source: %s\n", record->Source);
if ( record->Date )
printf(" Date: %s\n", record->Date);
if ( record->OriginCity)
printf(" OriginCity: %s\n", record->OriginCity);
if ( record->Headline)
#ifdef FOR_DUM_TERM
print_hdline(record->Headline);
#else
printf(" Headline: %s\n", record->Headline);
#endif
if ( record->StockCodes)
printf(" StockCodes: %s", record->StockCodes);
if ( record->CompanyCodes )
printf(" CompanyCodes: %s", record->CompanyCodes);
if ( record->IndustryCodes)
printf(" IndustryCodes: %s", record->IndustryCodes);
printf("\n");
}
/*
* dsply_text
* display story text
*/
#define TEXT_LINES_PER_PAGE 18
#define DQ_PAR_LEN 3
#define DQ_EOL_LEN 1
#define DQ_MAX_LINE_LEN 256
#define PRINT_LINE(line, ndx, line_cnt,text_ptr,last_ptr,continue_viewing)\
line[ndx] = NULL;\
line_cnt++; \
printf("%s\n", line);\
ndx = 0;\
if ( (line_cnt == TEXT_LINES_PER_PAGE) && (text_ptr <= last_ptr)) {\
line_cnt = 0;\
printf("\n ... more to come, enter 1 to continue or 0 to stop: ");\
scanf("%ld", &continue_viewing);\
}
#if 0
/*
* try to format text
*/
dsply_text( size, text)
long size;
char *text;
{
char line[DQ_MAX_LINE_LEN +1];
char *last_ptr;
char *text_ptr;
long ndx;
long line_cnt = 0;
long continue_viewing = 1;
text_ptr = text;
last_ptr = text_ptr + size;
while ( (*text_ptr != ETS) && (text_ptr < last_ptr) ) {
if ( *text_ptr++ == ESC ) {
if (*text_ptr++ == 'k')
break;
}
}
if ( text_ptr >= last_ptr ) {
printf("**** ERROR in display text -- could not find text\n");
return;
}
ndx = 0;
while ( (continue_viewing == 1) && ( *text_ptr != ETS) &&
(text_ptr < last_ptr) ) {
if ( *text_ptr == ESC) {
text_ptr++;
if ( *text_ptr == 'l' )
text_ptr++;
if ( ndx > 0 ) {
PRINT_LINE(line, ndx,line_cnt,text_ptr,last_ptr,continue_viewing);
}
ndx = DQ_PAR_LEN;
strncpy( line, text_ptr, ndx);
text_ptr += DQ_PAR_LEN;
PRINT_LINE(line, ndx,line_cnt,text_ptr,last_ptr,continue_viewing);
}
else if ( (*text_ptr == DC1) || (*text_ptr == DC3) )
text_ptr++;
else if ( *text_ptr == CARRIAGE_RETURN ) {
text_ptr += DQ_EOL_LEN;
PRINT_LINE(line, ndx, line_cnt,text_ptr,last_ptr,continue_viewing);
}
else {
line[ndx++] = *text_ptr++;
if ( ndx > DQ_MAX_LINE_LEN ) {
printf("**** ERROR in display text -- line too long %ld\n", ndx);
return;
}
}
}
if ( text_ptr >= last_ptr ) {
printf("**** ERROR in display text -- could not find End Of Text\n");
return;
}
if ( ndx > 0 ) {
line[ndx] = NULL;
line_cnt++;
printf("%s\n", line);
}
}
#endif
static void dsply_text _AP((long size,char* text));
static void dsply_text( size, text)
long size;
char *text;
{
char *text_ptr, *last_ptr;
long line_cnt = 0;
long continue_viewing = 1;
char buff[3200];
long len;
char *buff_start, *buff_ptr;
text_ptr = text;
buff_start = &buff[0];
buff_ptr = buff_start;
last_ptr = text_ptr + size;
while ( (text_ptr <= last_ptr) && (continue_viewing == 1) ) {
if ( *text_ptr == ESC ) {
text_ptr++;
text_ptr++;
}
else if (*text_ptr == DC1 || *text_ptr == DC3)
text_ptr++;
else if (*text_ptr == ETS)
text_ptr++;
else if ( *text_ptr == CARRIAGE_RETURN ) {
text_ptr++;
*buff_ptr++= CARRIAGE_RETURN;
*buff_ptr++ = LINE_FEED;
line_cnt++;
if ( (line_cnt == TEXT_LINES_PER_PAGE) &&
(text_ptr <= last_ptr)) {
len = (long)buff_ptr - (long) buff_start;
fwrite( buff_start, len, 1, stdout);
line_cnt = 0;
buff_ptr = buff_start;
printf("\n ... more to come, enter 1 to continue or 0 to stop: ");
scanf("%ld", &continue_viewing);
}
}
else
*buff_ptr++ = *text_ptr++;
}
if ( buff_ptr > buff_start) {
len = (long)buff_ptr - (long)buff_start;
fwrite( buff_start, len, 1, stdout);
}
}
static void dsply_text_record _AP((WAISDocumentText* record));
static void dsply_text_record( record)
WAISDocumentText *record;
{
printf(" Text\n");
print_any(" DocumentID: ", record->DocumentID);
printf(" VersionNumber: %ld\n", record->VersionNumber);
dsply_text( record->DocumentText->size,
record->DocumentText->bytes);
}
static void dsply_headline_record _AP((WAISDocumentHeadlines* record));
static void dsply_headline_record( record)
WAISDocumentHeadlines *record;
{
printf(" Headlines\n");
print_any(" DocumentID: ", record->DocumentID);
printf(" VersionNumber: %ld\n", record->VersionNumber);
if ( record->Source )
printf(" Source: %s\n", record->Source);
if ( record->Date )
printf(" Date: %s\n", record->Date);
if ( record->OriginCity)
printf(" OriginCity: %s\n", record->OriginCity);
print_hdline(record->Headline);
if ( record->Headline)
#ifdef FOR_DUM_TERM
print_hdline(record->Headline);
#else
printf(" Headline: %s\n", record->Headline);
#endif
}
static void dsply_code_record _AP((WAISDocumentCodes* record));
static void dsply_code_record( record)
WAISDocumentCodes *record;
/*
* 'dsply_code_record'
* display one WAIS code record
*/
{
printf(" Codes\n");
print_any(" DocumentID: ", record->DocumentID);
printf(" VersionNumber: %ld\n", record->VersionNumber);
if ( record->StockCodes)
printf(" StockCodes: %s", record->StockCodes);
if ( record->CompanyCodes )
printf(" CompanyCodes: %s", record->CompanyCodes);
if ( record->IndustryCodes)
printf(" IndustryCodes: %s", record->IndustryCodes);
printf("\n");
}
/*
* "twais_dsply_rsp_apdu"
* display response apdu on stdout
* the response apdu is in the specified buffer
*/
void
twais_dsply_rsp_apdu(rsp_buff, rsp_len)
char *rsp_buff; /* (I) buffer contain response apdu */
long rsp_len; /* (I) number of bytes in the buffer */
{
pdu_type pdu;
pdu = peekPDUType(rsp_buff);
switch ( pdu) {
case initResponseAPDU:
twais_dsply_init_rsp_apdu( rsp_buff);
break;
case searchResponseAPDU:
twais_dsply_srch_rsp_apdu( rsp_buff);
break;
case initAPDU:
twais_dsply_init_apdu( rsp_buff);
break;
case searchAPDU:
twais_dsply_srch_apdu( rsp_buff);
break;
default:
break;
}
}
/*
* "twais_dsply_init_rsp_apdu"
* display init response apdu on stdout
* the response apdu is encoded in the specified buffer
*/
void
twais_dsply_init_rsp_apdu( buffer)
char *buffer; /* (I) buffer contain the init response apdu */
{
InitResponseAPDU *response;
WAISInitResponse *info;
long i, len;
printf("\n\n Init Response:\n");
readInitResponseAPDU(&response,buffer);
printf(" willSearch: %ld, willPresent: %ld, willDelete: %ld\n",
response->willSearch,
response->willPresent,
response->willDelete);
printf(" supportAccessControl: %ld, supportResourceControl: %ld\n",
response->supportAccessControl,
response->supportResourceControl);
printf(" PreferredMessageSize: %ld, MaximumRecordSize: %ld\n",
response->PreferredMessageSize,
response->MaximumRecordSize);
if ( response->ImplementationID != 0) {
printf(" ImplementationID: %s\n",
response->ImplementationID);
}
if ( response->ImplementationName != 0) {
printf(" ImplementationName: %s\n",
response->ImplementationName);
}
if ( response->ImplementationVersion != 0) {
printf(" ImplementationVersion: %s\n",
response->ImplementationVersion);
}
if ( response->ReferenceID != 0) {
print_any(" ReferenceID: ", response->ReferenceID);
}
if ( response->UserInformationField != 0) {
info = (WAISInitResponse *)response->UserInformationField;
printf(" ChunkCode: %ld, ChunkIDLength: %ld\n",
info->ChunkCode,
info->ChunkIDLength);
if (info->ChunkMarker) {
printf(" ChunkMarker: ");
len = strlen( info->ChunkMarker);
for ( i=0; i< len; i++)
printf("%ld, ", info->ChunkMarker[i]);
printf("\n");
}
if (info->HighlightMarker) {
printf(" HighlightMarker: ");
len = strlen( info->HighlightMarker);
for ( i=0; i< len; i++)
printf("%ld, ", info->HighlightMarker[i]);
printf("\n");
}
if (info->DeHighlightMarker) {
printf(" DeHighlightMarker: ");
len = strlen( info->DeHighlightMarker);
for ( i=0; i< len; i++)
printf("%ld, ", info->DeHighlightMarker[i]);
printf("\n");
}
if (info->NewlineCharacters) {
printf(" NewlineCharacters: ");
len = strlen( info->NewlineCharacters);
for ( i=0; i< len; i++)
printf("%ld, ", info->NewlineCharacters[i]);
printf("\n");
}
}
freeInitResponseAPDU( response);
}
/*
* "twais_dsply_init_apdu"
* display init apdu on stdout
* the apdu is in the specified buffer
*/
void
twais_dsply_init_apdu( buffer)
char *buffer; /* (I) buffer contain the init response apdu */
{
InitAPDU *init;
printf("\n\n Init Request:\n");
readInitAPDU(&init,buffer);
printf(" willSearch: %ld, willPresent: %ld, willDelete: %ld\n",
init->willSearch,
init->willPresent,
init->willDelete);
printf(" supportAccessControl: %ld, supportResourceControl: %ld\n",
init->supportAccessControl,
init->supportResourceControl);
printf(" PreferredMessageSize: %ld, MaximumRecordSize: %ld\n",
init->PreferredMessageSize,
init->MaximumRecordSize);
if ( init->IDAuthentication != 0) {
printf(" IDAuthentication: %s\n",
init->IDAuthentication);
}
if ( init->ImplementationID != 0) {
printf(" ImplementationID: %s\n",
init->ImplementationID);
}
if ( init->ImplementationName != 0) {
printf(" ImplementationName: %s\n",
init->ImplementationName);
}
if ( init->ImplementationVersion != 0) {
printf(" ImplementationVersion: %s\n",
init->ImplementationVersion);
}
if ( init->ReferenceID != 0) {
print_any(" ReferenceID: ", init->ReferenceID);
}
freeInitAPDU( init);
}
/*
* "twais_dsply_srch_rsp_apdu"
* display search response apdu on stdout
* the response apdu is encoded in the specified buffer
*/
void
twais_dsply_srch_rsp_apdu( buffer)
char *buffer; /* (I) buffer contain the search response apdu */
{
SearchResponseAPDU *response;
WAISSearchResponse *info;
long continue_viewing;
long i, k;
printf("\n\n Search Response:\n");
readSearchResponseAPDU(&response,buffer);
printf(" SearchStatus: %ld\n", response->SearchStatus);
printf(" ResultCount: %ld\n", response->ResultCount);
printf(" NumberOfRecordsReturned: %ld\n", response->NumberOfRecordsReturned);
printf(" PresentStatus: %ld\n", response->PresentStatus);
if ( response->ReferenceID != 0 )
print_any(" ReferenceID: ", response->ReferenceID);
if ( response->DatabaseDiagnosticRecords != 0 ) {
info = (WAISSearchResponse *)response->DatabaseDiagnosticRecords;
if ( info->SeedWordsUsed != 0 )
printf(" SeedWordsUsed: %s\n", info->SeedWordsUsed);
i =0;
continue_viewing = 1;
if ( info->DocHeaders != 0 ) {
k =0;
while ( (continue_viewing == 1) && info->DocHeaders[k] != 0 ) {
i++;
printf("\n record %2d, ", i);
dsply_doc_hdr_record( info->DocHeaders[k++]);
#ifdef FOR_DUM_TERM
if ( i < response->NumberOfRecordsReturned ) {
printf("\n\n ... more to come, enter 1 to continue or 0 to stop: ");
scanf("%ld", &continue_viewing);
}
#endif
}
}
if ( info->ShortHeaders != 0 ) {
k =0;
while ( (continue_viewing == 1) && info->ShortHeaders[k] != 0 ) {
i++;
printf("\n record %2d, ", i);
dsply_short_hdr_record( info->ShortHeaders[k++]);
#ifdef FOR_DUM_TERM
if ( i < response->NumberOfRecordsReturned ) {
printf("\n\n ... more to come, enter 1 to continue or 0 to stop: ");
scanf("%ld", &continue_viewing);
}
#endif
}
}
if ( info->LongHeaders != 0 ) {
k =0;
while ( (continue_viewing == 1) && (info->LongHeaders[k] != 0) ) {
i++;
printf("\n record %2d, ", i);
dsply_long_hdr_record( info->LongHeaders[k++]);
#ifdef FOR_DUM_TERM
if ( i < response->NumberOfRecordsReturned ) {
printf("\n\n ... more to come, enter 1 to continue or 0 to stop: ");
scanf("%ld", &continue_viewing);
}
#endif
}
}
if ( info->Text != 0 ) {
k =0;
while ( (continue_viewing == 1) && (info->Text[k] != 0) ) {
i++;
printf("\n record %2d, ", i);
dsply_text_record( info->Text[k++]);
#ifdef FOR_DUM_TERM
if ( i < response->NumberOfRecordsReturned ) {
printf("\n\n ... more to come, enter 1 to continue or 0 to stop: ");
scanf("%ld", &continue_viewing);
}
#endif
}
}
if ( info->Headlines != 0 ) {
k =0;
while ( (continue_viewing ==1) && (info->Headlines[k] != 0) ) {
i++;
printf("\n record %2d, ", i);
dsply_headline_record( info->Headlines[k++]);
#ifdef DUM_TERM
if ( i < response->NumberOfRecordsReturned ) {
printf("\n\n ... more to come, enter 1 to continue or 0 to stop: ");
scanf("%ld", &continue_viewing);
}
#endif
}
}
if ( info->Codes != 0 ) {
k =0;
while ( (continue_viewing ==1) && (info->Codes[k] != 0) ) {
i++;
printf("\n record %2d, ", i);
dsply_code_record( info->Codes[k++]);
#ifdef FOR_DUM_TERM
if ( i < response->NumberOfRecordsReturned ) {
printf("\n\n ... more to come, enter 1 to continue or 0 to stop: ");
scanf("%ld", &continue_viewing);
}
#endif
}
}
freeWAISSearchResponse(info);
}
freeSearchResponseAPDU( response);
}
/*
* 'dsply_doc_hdr_record'
* display one WAIS document header record
*/
void dsply_doc_hdr_record( record)
WAISDocumentHeader *record;
{
printf(" DocHeaders\n");
print_any(" DocumentID: ", record->DocumentID);
printf(" VersionNumber: %ld\n", record->VersionNumber);
printf(" Score: %ld, BestMatch: %ld\n",
record->Score, record->BestMatch);
printf(" DocumentLength: %ld, Lines: %ld\n",
record->DocumentLength,
record->Lines);
if ( record->Source )
printf(" Source: %s\n", record->Source);
if ( record->Date )
printf(" Date: %s\n", record->Date);
if ( record->OriginCity )
printf(" OriginCity: %s\n", record->OriginCity);
if ( record->Headline )
#ifdef FOR_DUM_TERM
print_hdline(record->Headline);
#else
printf(" Headline: %s\n", record->Headline);
#endif
}
void dsply_short_hdr_record( record)
WAISDocumentShortHeader *record;
{
printf(" ShortHeaders\n");
print_any(" DocumentID: ", record->DocumentID);
printf(" VersionNumber: %ld\n", record->VersionNumber);
printf(" Score: %ld, BestMatch: %ld\n",
record->Score, record->BestMatch);
printf(" DocumentLength: %ld, Lines: %ld\n",
record->DocumentLength, record->Lines);
}
static void print_docs _AP((DocObj** docs));
static void print_docs( docs)
DocObj **docs;
{
long i;
for ( i=0; docs[i] !=0; i++ ) {
printf(" Document %ld:\n", i+1 );
print_any(" DocID: ", docs[i]->DocumentID);
if (docs[i]->Type != NULL)
printf(" Type: %s\n",docs[i]->Type);
printf(" ChunkCode: %ld\n", docs[i]->ChunkCode);
switch ( docs[i]->ChunkCode ) {
case CT_byte:
case CT_line:
printf(" Range: (%ld, %ld)\n", docs[i]->ChunkStart.Pos,
docs[i]->ChunkEnd.Pos);
break;
case CT_paragraph:
print_any(" Chunk Start: ", docs[i]->ChunkStart.ID);
print_any(" Chunk End: ", docs[i]->ChunkEnd.ID);
break;
case CT_document:
default:
break;
}
}
}
#if !defined(IN_RMG) && !defined(PFS_THREADS)
static void
twais_dsply_srch_apdu( buffer)
char *buffer;
{
SearchAPDU *search;
WAISSearch *info;
DocObj **docs;
any *text_search;
long i;
printf("\n\n Search Request:\n");
readSearchAPDU(&search,buffer);
printf(" SmallSetUpperBound: %ld\n", search->SmallSetUpperBound);
printf(" LargeSetLowerBound: %ld\n", search->LargeSetLowerBound);
printf(" MediumSetPresentNumber: %ld\n", search->MediumSetPresentNumber);
printf(" ReplaceIndicator: %ld\n", search->ReplaceIndicator);
if ( search->ResultSetName != 0 )
printf(" ResultSetName: %s\n", search->ResultSetName);
if ( search->QueryType != 0 )
printf(" QueryType: %s\n", search->QueryType);
if ( search->DatabaseNames != 0 )
for ( i=0; search->DatabaseNames[i] != 0 ; i++ )
printf(" Databasenames[%ld]: %s\n", i,
search->DatabaseNames[i]);
if ( search->ElementSetNames != 0 )
for ( i=0; search->ElementSetNames[i] != 0 ; i++ )
printf(" ElementSetNames[%ld]: %s\n", i,
search->ElementSetNames[i]);
if ( search->ReferenceID != 0 )
print_any(" ReferenceID: ", search->ReferenceID);
if ( search->Query != 0 ) {
if ( ! strcmp( search->QueryType, QT_TextRetrievalQuery) ) {
text_search = (any *) search->Query;
docs = readWAISTextQuery(text_search);
if ( docs != 0 )
print_docs( docs);
freeAny(text_search);
doList((void**)docs,freeDocObj);
s_free(docs);
}
else if ( ! strcmp( search->QueryType, QT_RelevanceFeedbackQuery) ) {
info = (WAISSearch *)search->Query;
if ( info->SeedWords != 0 )
printf(" SeedWords: %s\n", info->SeedWords);
if ( info->Docs != 0 )
print_docs( info->Docs);
printf(" DateFactor: %ld\n", info->DateFactor);
if ( info->BeginDateRange )
printf(" BeginDateRange: %s\n", info->BeginDateRange);
if ( info->EndDateRange )
printf(" EndDateRange: %s\n", info->EndDateRange);
printf(" MaxDocumentsRetrieved: %ld\n", info->MaxDocumentsRetrieved);
freeWAISSearch(info);
}
else {
printf(" Unrecognized query type\n");
}
}
freeSearchAPDU( search);
}
#endif (!IN_RMG && !PFS_THREADS)
void twais_free_apdu(apdu_buff)
char *apdu_buff;
{
pdu_type pdu;
pdu = peekPDUType(apdu_buff);
switch ( pdu) {
case (initAPDU):
freeInitAPDU((struct InitAPDU *)apdu_buff);
break;
case (initResponseAPDU):
freeInitResponseAPDU((struct InitResponseAPDU *)apdu_buff);
break;
case (searchAPDU):
freeSearchAPDU((struct SearchAPDU *)apdu_buff);
break;
case (searchResponseAPDU):
freeSearchResponseAPDU((struct SearchResponseAPDU *)apdu_buff);
break;
default:
break;
}
}
void
twais_tmplt_init_apdu(buff, buff_len)
char *buff;
long *buff_len;
{
InitAPDU *init;
char *end_ptr;
long len;
any refID;
refID.size = 2;
refID.bytes = "10";
init = makeInitAPDU(WILL_USE,WILL_NOT_USE,WILL_NOT_USE,WILL_NOT_SUPPORT,
WILL_NOT_SUPPORT,
2048L,
2048L, NULL,
defaultImplementationID(),defaultImplementationName(),
defaultImplementationVersion(), &refID,NULL);
{ long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeInitAPDU(init,buff, &buffer_len);
}
len = (long)end_ptr - (long)&buff[0];
*buff_len = len;
freeInitAPDU(init);
}
void
twais_tmplt_init_rsp_apdu(buff, buff_len)
char *buff;
long *buff_len;
{
WAISInitResponse *info;
InitResponseAPDU *response;
char *end_ptr;
long len;
any refID;
char chunk_marker[3];
char highl_marker[2];
char dhighl_marker[2];
char new_line_chars[2];
refID.size = 1;
refID.bytes = "0";
chunk_marker[0] = ESC;
chunk_marker[1] = '1';
chunk_marker[2]= 0;
highl_marker[0] = DC1;
highl_marker[1] = 0;
dhighl_marker[0] = DC3;
dhighl_marker[1] = 0;
new_line_chars[0] = CARRIAGE_RETURN;
new_line_chars[1] = 0;
info = makeWAISInitResponse( CT_paragraph
,3
,chunk_marker
,highl_marker
,dhighl_marker
,new_line_chars
);
response = makeInitResponseAPDU( ACCEPT,
WILL_USE,WILL_NOT_USE,WILL_NOT_USE,
WILL_NOT_SUPPORT,WILL_NOT_SUPPORT,
1024L, 2048L,
NULL,
defaultImplementationID(),
defaultImplementationName(),
defaultImplementationVersion(),
&refID,
info);
{ long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeInitResponseAPDU(response, buff, &buffer_len);
}
len = (long)end_ptr - (long)&buff[0];
*buff_len = len;
CSTFreeWAISInitResponse( info);
freeInitResponseAPDU(response);
}
void twais_tmplt_typ1_srch_apdu( buff, buff_len)
char *buff;
long *buff_len;
{
SearchAPDU *search1;
char *end_ptr;
long len;
static char *database_names[2];
any docID;
any refID;
DocObj *DocObjs[2];
any *query;
database_names[0] = "Quest";
database_names[1] = NULL;
docID.size = 12;
docID.bytes = "0000106776WJ";
refID.size = 1;
refID.bytes = "3";
DocObjs[0] = makeDocObjUsingWholeDocument( &docID,NULL);
DocObjs[1] = NULL;
query = makeWAISTextQuery(DocObjs);
search1 = makeSearchAPDU( 10L, 16L, 15L,
1L,
"FOO",
database_names,
QT_TextRetrievalQuery,
0L,
&refID,
query);
{
long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeSearchAPDU( search1, buff, &buffer_len);
}
len = (long)end_ptr - (long)&buff[0];
*buff_len = len;
CSTFreeWAISTextQuery( query);
freeSearchAPDU(search1);
}
#if 0
void twais_tmplt_typ3_srch_apdu( buff, buff_len)
char *buff;
long *buff_len;
{
SearchAPDU *search3;
char *end_ptr;
static char *database_names[2];
long len;
any refID;
WAISSearch *query;
database_names[0] = "Quest"
database_names[1] = NULL;
refID.size = 1;
refID.bytes = "3";
query = makeWAISSearch( "Supercomputers in Taiwan",
0L,
0L,
1L,
0L,
0L,
10L
);
search3 = makeSearchAPDU( 10L, 16L, 15L,
1L,
"FOO",
database_names,
QT_RelevanceFeedbackQuery,
0L,
&refID,
query);
{
long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeSearchAPDU( search3, buff, &buffer_len);
}
len = (long)end_ptr - (long)&buff[0];
*buff_len = len;
CSTFreeWAISSearch( query);
freeSearchAPDU(search3);
}
#endif
void twais_tmplt_typ3_srch_rsp_apdu( buff, buff_len)
char *buff;
long *buff_len;
{
char *end_ptr;
long len;
any refID;
WAISDocumentHeader *doc_headers[3];
WAISSearchResponse *records;
SearchResponseAPDU *response;
any doc_id1;
any doc_id2;
refID.size = 1;
refID.bytes = "1";
doc_id1.size = 12;
doc_id1.bytes = "0000106776WJ";
doc_id2.size = 12;
doc_id2.bytes = "0000026870WP";
doc_headers[0] = makeWAISDocumentHeader(
&doc_id1,
1L,
80L,
1L,
850L,
200L,
NULL,
"Source1",
"19900115",
"CRAY sells supercomputer to Taiwan",
"New York");
doc_headers[1] = makeWAISDocumentHeader(
&doc_id2,
1L,
60L,
1L,
550L,
100L,
NULL,
"Test Source",
"19900110",
"Test Headline",
"Test City");
doc_headers[2] = 0;
records = makeWAISSearchResponse( "Supercomputer Taiwan"
,doc_headers
,0 ,0 ,0 ,0
,0
,NULL
);
response = makeSearchResponseAPDU( SUCCESS
,2
,2
,0
,0
,SUCCESS
,&refID
,records);
{
long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeSearchResponseAPDU( response, buff, &buffer_len);
}
len = (long)end_ptr - (long)&buff[0];
*buff_len = len;
CSTFreeWAISDocumentHeader( doc_headers[0]);
CSTFreeWAISDocumentHeader( doc_headers[1]);
CSTFreeWAISSearchResponse( records);
freeSearchResponseAPDU(response);
}
twais_tmplt_typ1_stry_rsp_apdu( buff, buff_len)
char *buff;
long *buff_len;
{
char *end_ptr;
long len;
any refID;
WAISDocumentText *doc_text[2];
WAISSearchResponse *records;
SearchResponseAPDU *response;
any docID;
any story;
char *story_buff;
FILE *fptr;
refID.size = 1;
refID.bytes = "1";
docID.size = 12;
docID.bytes = "0000106776WJ";
doc_text[0] = 0;
doc_text[1] = 0;
fptr = locked_fopen("twais_template.txt", "r");
if (fptr == NULL ) {
printf(" unable to open story text file \n");
return;
}
fread((char*)&story.size, sizeof(long), 1, fptr);
story_buff = s_malloc( story.size +1);
if ( story_buff == NULL) {
printf(" insufficient memory\n");
locked_fclose( fptr,"twais_template.txt",TRUE);
return;
}
fread( story_buff, 1, story.size, fptr);
story.bytes = story_buff;
doc_text[0] = makeWAISDocumentText( &docID, 1L, &story);
records = makeWAISSearchResponse( 0
,0 ,0 ,0
,doc_text ,0
,0
,NULL
);
response = makeSearchResponseAPDU( SUCCESS
,1
,1
,0
,0
,SUCCESS
,&refID
,records);
{
long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeSearchResponseAPDU( response, buff, &buffer_len);
}
len = (long)end_ptr - (long)&buff[0];
*buff_len = len;
CSTFreeWAISDocumentText( doc_text[0]);
CSTFreeWAISSearchResponse( records);
freeSearchResponseAPDU(response);
s_free(story_buff);
locked_fclose( fptr,"twais_template.txt",TRUE);
}
void twais_tmplt_typ3_srch_apdu( buff, buff_len)
char *buff;
long *buff_len;
{
SearchAPDU *search3;
char *end_ptr;
static char *database_names[7] = {
"11111111111111111111111111111111111111111111111111",
"22222222222222222222222222222222222222222222222222",
"33333333333333333333333333333333333333333333333333",
"44444444444444444444444444444444444444444444444444",
"55555555555555555555555555555555555555555555555555",
"66666666666666666666666666666666666666666666666666",
0};
static char *elem_names[7] = { ES_DocumentHeader
,ES_DocumentShortHeader
,ES_DocumentLongHeader
,ES_DocumentText
,ES_DocumentHeadline
,ES_DocumentCodes
,0};
long len;
any refID;
WAISSearch *query;
refID.size = 1;
refID.bytes = "3";
query = makeWAISSearch(
"What is the penalities for driving without insurance",
0L,
0L,
1L,
0L,
0L,
10L
);
search3 = makeSearchAPDU( 10L, 16L, 15L,
1L,
"FOO",
database_names,
QT_RelevanceFeedbackQuery,
elem_names,
&refID,
query);
{
long buffer_len = MAX_BUFFER_LENGTH;
end_ptr = writeSearchAPDU( search3, buff, &buffer_len);
}
len = (long)end_ptr - (long)&buff[0];
*buff_len = len;
CSTFreeWAISSearch( query);
freeSearchAPDU(search3);
}
#endif /*!IN_RMG && !PFS_THREADS*/