1838 lines
43 KiB
C
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*/
|