/* HTVMS_WAISUI.h ** ** Adaptation for Lynx by F.Macrides (macrides@sci.wfeb.edu) ** ** 31-May-1994 FM Initial version. */ #ifndef HTVMSWAIS_H #define HTVMSWAIS_H #ifndef __STDLIB_LOADED #include #endif /* __STDLIB_LOADED */ #define _AP(args) () void log_write _AP((char *)); /* ** Routines originally from Panic.h -- FM ** **----------------------------------------------------------------------*/ void panic (char* format,...); /*----------------------------------------------------------------------*/ /* ** Routines originally from CUtil.h -- FM ** **----------------------------------------------------------------------*/ /* types and constants */ #ifndef boolean #define boolean unsigned long #endif /* boolean */ #ifndef true #define true (boolean)1L #endif /* true */ #ifndef false #define false (boolean)0L /* used to be (!true), but broke some compilers */ #endif /* false */ #ifndef TRUE #define TRUE true #endif /* TRUE */ #ifndef FALSE #define FALSE false #endif /* FALSE */ /*----------------------------------------------------------------------*/ /* functions */ /* enhanced memory handling functions - don't call them directly, use the macros below */ void fs_checkPtr _AP((void* ptr)); void* fs_malloc _AP((size_t size)); void* fs_realloc _AP((void* ptr,size_t size)); void fs_free _AP((void* ptr)); char* fs_strncat _AP((char* dst,char* src,size_t maxToAdd,size_t maxTotal)); /* macros for memory functions. call these in your program. */ #define s_checkPtr(ptr) fs_checkPtr(ptr) #define s_malloc(size) fs_malloc(size) #define s_realloc(ptr,size) fs_realloc((ptr),(size)) #define s_free(ptr) { fs_free((char*)ptr); ptr = NULL; } #define s_strncat(dst,src,maxToAdd,maxTotal) fs_strncat((dst),(src),(maxToAdd),(maxTotal)) char* s_strdup _AP((char* s)); #define IS_DELIMITER 1 #define NOT_DELIMITER !IS_DELIMITER char char_downcase _AP((unsigned long ch)); char *string_downcase _AP((char* word)); /*----------------------------------------------------------------------*/ /* ** Routines originally from ZUtil.c -- FM ** **----------------------------------------------------------------------*/ /* Data types / constants */ /* bytes to leave for the header size info */ #define HEADER_LEN (size_t)2 typedef long pdu_type; #define initAPDU (pdu_type)20 #define initResponseAPDU (pdu_type)21 #define searchAPDU (pdu_type)22 #define searchResponseAPDU (pdu_type)23 #define presentAPDU (pdu_type)24 #define presentResponseAPDU (pdu_type)25 #define deteteAPDU (pdu_type)26 #define deleteResponseAPDU (pdu_type)27 #define accessControlAPDU (pdu_type)28 #define accessControlResponseAPDU (pdu_type)29 #define resourceControlAPDU (pdu_type)30 #define resourceControlResponseAPDU (pdu_type)31 typedef struct any { /* an any is a non-ascii string of characters */ unsigned long size; char* bytes; } any; typedef any bit_map; /* a bit_map is a group of packed bits */ typedef unsigned long data_tag; #define DT_PDUType (data_tag)1 #define DT_ReferenceID (data_tag)2 #define DT_ProtocolVersion (data_tag)3 #define DT_Options (data_tag)4 #define DT_PreferredMessageSize (data_tag)5 #define DT_MaximumRecordSize (data_tag)6 #define DT_IDAuthentication (data_tag)7 #define DT_ImplementationID (data_tag)8 #define DT_ImplementationName (data_tag)9 #define DT_ImplementationVersion (data_tag)10 #define DT_UserInformationField (data_tag)11 #define DT_Result (data_tag)12 #define DT_SmallSetUpperBound (data_tag)13 #define DT_LargeSetLowerBound (data_tag)14 #define DT_MediumSetPresentNumber (data_tag)15 #define DT_ReplaceIndicator (data_tag)16 #define DT_ResultSetName (data_tag)17 #define DT_DatabaseNames (data_tag)18 #define DT_ElementSetNames (data_tag)19 #define DT_QueryType (data_tag)20 #define DT_Query (data_tag)21 #define DT_SearchStatus (data_tag)22 #define DT_ResultCount (data_tag)23 #define DT_NumberOfRecordsReturned (data_tag)24 #define DT_NextResultSetPosition (data_tag)25 #define DT_ResultSetStatus (data_tag)26 #define DT_PresentStatus (data_tag)27 #define DT_DatabaseDiagnosticRecords (data_tag)28 #define DT_NumberOfRecordsRequested (data_tag)29 #define DT_ResultSetStartPosition (data_tag)30 #define DT_ResultSetID (data_tag)31 #define DT_DeleteOperation (data_tag)32 #define DT_DeleteStatus (data_tag)33 #define DT_NumberNotDeleted (data_tag)34 #define DT_BulkStatuses (data_tag)35 #define DT_DeleteMSG (data_tag)36 #define DT_SecurityChallenge (data_tag)37 #define DT_SecurityChallengeResponse (data_tag)38 #define DT_SuspendedFlag (data_tag)39 #define DT_ResourceReport (data_tag)40 #define DT_PartialResultsAvailable (data_tag)41 #define DT_ContinueFlag (data_tag)42 #define DT_ResultSetWanted (data_tag)43 #define UNUSED -1 /* number of bytes required to represent the following sizes in compressed integer format */ #define CompressedInt1Byte 128 /* 2 ^ 7 */ #define CompressedInt2Byte 16384 /* 2 ^ 14 */ #define CompressedInt3Byte 2097152 /* 2 ^ 21 */ /* others may follow ... */ /* types of query */ #define QT_0 "0" /* query whose non-standard format has been agreed upon client and server */ /* values for InitAPDU option element */ #define WILL_USE TRUE #define WILL_NOT_USE FALSE #define WILL_SUPPORT TRUE #define WILL_NOT_SUPPORT FALSE /* values for InitResponseAPDU result element */ #define ACCEPT TRUE #define REJECT FALSE /* values for SearchAPDU replace indicator element */ #define ON TRUE #define OFF FALSE /* values for SearchResponseAPDU search status element */ #define SUCCESS 0 /* intuitive huh? */ #define FAILURE 1 /* values for SearchResponseAPDU result set status element */ #define SUBSET 1 #define INTERIM 2 #define NONE 3 /* values for SearchResponseAPDU present status element */ /* SUCCESS already defined */ #define PARTIAL_1 1 #define PARTIAL_2 2 #define PARTIAL_3 3 #define PARTIAL_4 4 #define PS_NONE 5 /* can't use NONE since it was used by result set status */ #define DIAGNOSTIC_CODE_SIZE (size_t)3 typedef struct diagnosticRecord { boolean SURROGATE; char DIAG[DIAGNOSTIC_CODE_SIZE]; char* ADDINFO; } diagnosticRecord; #define D_PermanentSystemError "S1" #define D_TemporarySystemError "S2" #define D_UnsupportedSearch "S3" #define D_TermsOnlyStopWords "S5" #define D_TooManyArgumentWords "S6" #define D_TooManyBooleanOperators "S7" #define D_TooManyTruncatedWords "S8" #define D_TooMany IncompleteSubfields "S9" #define D_TruncatedWordsTooShort "SA" #define D_InvalidFormatForRecordNumber "SB" #define D_TooManyCharactersInSearch "SC" #define D_TooManyRecordsRetrieved "SD" #define D_PresentRequestOutOfRange "SF" #define D_SystemErrorInPresentRecords "SG" #define D_RecordNotAuthorizedToBeSent "SH" #define D_RecordExceedsPrefMessageSize "SI" #define D_RecordExceedsMaxRecordSize "SJ" #define D_ResultSetNotSuppAsSearchTerm "SK" #define D_OnlyOneRsltSetAsSrchTermSupp "SL" #define D_OnlyANDingOfASnglRsltSetSupp "SM" #define D_RsltSetExistsNoReplace "SN" #define D_ResultSetNamingNotSupported "SO" #define D_CombinationDatabasesNotSupp "SP" #define D_ElementSetNamesNotSupported "SQ" #define D_ElementSetNameNotValid "SR" #define D_OnlyASingleElmntSetNameSupp "SS" #define D_ResultSetDeletedByTarget "ST" #define D_ResultSetIsInUse "SU" #define D_DatabasesIsLocked "SV" #define D_TerminatedByNoContinueResp "SW" #define D_ResultSetDoesNotExist "SX" #define D_ResExNoResultsAvailable "SY" #define D_ResExUnpredictableResults "SZ" #define D_ResExValidSubsetOfResults "T1" #define D_AccessControlFailure "T2" #define D_SecurityNotIssuedReqTerm "T3" #define D_SecurityNotBeIssuedRecNotInc "T4" /*----------------------------------------------------------------------*/ /* for internal error handling */ extern char* readErrorPosition; /* pos where buf stoped making sense */ /* the following are macros so that they can return OUT of the function which calls them */ #define RETURN_ON_NULL(var) \ if (var == NULL) \ return(NULL); /* jump out of caller */ #define REPORT_READ_ERROR(pos) \ { readErrorPosition = (pos); \ return(NULL); /* jump out of caller */ \ } #define CHECK_FOR_SPACE_LEFT(spaceNeeded,spaceLeft) \ { if (*spaceLeft >= spaceNeeded) \ (*spaceLeft) -= spaceNeeded; \ else \ { *spaceLeft = 0; \ return(NULL); /* jump out of the caller */ \ } \ } /*----------------------------------------------------------------------*/ diagnosticRecord* makeDiag _AP((boolean surrogate,char* code,char* addInfo)); void freeDiag _AP((diagnosticRecord* diag)); char* writeDiag _AP((diagnosticRecord* diag,char* buffer,long* len)); char* readDiag _AP((diagnosticRecord** diag,char* buffer)); char* writeCompressedInteger _AP((unsigned long num,char* buf,long* len)); char* readCompressedInteger _AP((unsigned long *num,char* buf)); char* writeCompressedIntWithPadding _AP((unsigned long num,unsigned long size, char* buffer,long* len)); unsigned long writtenCompressedIntSize _AP((unsigned long num)); char* writeTag _AP((data_tag tag,char* buf,long* len)); char* readTag _AP((data_tag* tag,char* buf)); data_tag peekTag _AP((char* buf)); unsigned long writtenTagSize _AP((data_tag tag)); any* makeAny _AP((unsigned long size,char* data)); void freeAny _AP((any* a)); any* duplicateAny _AP((any* a)); char* writeAny _AP((any* a,data_tag tag,char* buffer,long* len)); char* readAny _AP((any** anAny,char* buffer)); unsigned long writtenAnySize _AP((data_tag tag,any* a)); any* stringToAny _AP((char* s)); char* anyToString _AP((any* a)); unsigned long writtenStringSize _AP((data_tag tag,char* s)); any* longToAny _AP((long Num)); long anyToLong _AP((any* a)); char* writeString _AP((char* s,data_tag tag,char* buffer,long* len)); char* readString _AP((char** s,char* buffer)); bit_map* makeBitMap (unsigned long numBits,...); void freeBitMap _AP((bit_map* bm)); boolean bitAtPos _AP((long pos,bit_map* bm)); char* writeBitMap _AP((bit_map* bm,data_tag tag,char* buffer,long* len)); char* readBitMap _AP((bit_map** bm,char* buffer)); char* writeByte _AP((unsigned long byte,char* buf,long* len)); char* readByte _AP((unsigned char* byte,char* buf)); char* writeBoolean _AP((boolean flag,char* buf,long* len)); char* readBoolean _AP((boolean* flag,char* buf)); char* writePDUType _AP((pdu_type pduType,char* buf,long* len)); char* readPDUType _AP((pdu_type* pduType,char* buf)); pdu_type peekPDUType _AP((char* buf)); char* writeBinaryInteger _AP((long num,unsigned long size, char* buf,long* len)); char* readBinaryInteger _AP((long* num,unsigned long size,char* buf)); unsigned long writtenCompressedBinIntSize _AP((long num)); char* writeNum _AP((long num,data_tag tag,char* buffer,long* len)); char* readNum _AP((long* num,char* buffer)); unsigned long writtenNumSize _AP((data_tag tag,long num)); void doList _AP((void** list,void (*func)())); char* writeProtocolVersion _AP((char* buf,long* len)); char* defaultImplementationID _AP((void)); char* defaultImplementationName _AP((void)); char* defaultImplementationVersion _AP((void)); /*----------------------------------------------------------------------*/ /* ** Routines originally from ZType1.c -- FM ** **----------------------------------------------------------------------*/ /* This file implements the type 1 query defined in appendices B & C of the SR 1 spec. */ /*----------------------------------------------------------------------*/ /* types and constants */ /* new data tags */ #define DT_AttributeList (data_tag)44 #define DT_Term (data_tag)45 #define DT_Operator (data_tag)46 #define QT_BooleanQuery "1" /* standard boolean query */ /* general attribute code - use in place of any attribute */ #define IGNORE "ig" /* use value codes */ #define UV_ISBN "ub" #define CORPORATE_NAME "uc" #define ISSN "us" #define PERSONAL_NAME "up" #define SUBJECT "uj" #define TITLE "ut" #define GEOGRAPHIC_NAME "ug" #define CODEN "ud" #define SUBJECT_SUBDIVISION "ue" #define SERIES_TITLE "uf" #define MICROFORM_GENERATION "uh" #define PLACE_OF_PUBLICATION "ui" #define NUC_CODE "uk" #define LANGUAGE "ul" #define COMBINATION_OF_USE_VALUES "um" #define SYSTEM_CONTROL_NUMBER "un" #define DATE "uo" #define LC_CONTROL_NUMBER "ur" #define MUSIC_PUBLISHERS_NUMBER "uu" #define GOVERNMENT_DOCUMENTS_NUMBER "uv" #define SUBJECT_CLASSIFICATION "uw" #define RECORD_TYPE "uy" /* relation value codes */ #define EQUAL "re" #define GREATER_THAN "rg" #define GREATER_THAN_OR_EQUAL "ro" #define LESS_THAN "rl" #define LESS_THAN_OR_EQUAL "rp" #define NOT_EQUAL "rn" /* position value codes */ #define FIRST_IN_FIELD "pf" #define FIRST_IN_SUBFIELD "ps" #define FIRST_IN_A_SUBFIELD "pa" #define FIRST_IN_NOT_A_SUBFIELD "pt" #define ANY_POSITION_IN_FIELD "py" /* structure value codes */ #define PHRASE "sp" #define WORD "sw" #define KEY "sk" #define WORD_LIST "sl" /* truncation value codes */ #define NO_TRUNCATION "tn" #define RIGHT_TRUNCATION "tr" #define PROC_NUM_INCLUDED_IN_SEARCH_ARG "ti" /* completeness value codes */ #define INCOMPLETE_SUBFIELD "ci" #define COMPLETE_SUBFIELD "cs" #define COMPLETEFIELD "cf" /* operator codes */ #define AND "a" #define OR "o" #define AND_NOT "n" /* term types */ #define TT_Attribute 1 #define TT_ResultSetID 2 #define TT_Operator 3 #define ATTRIBUTE_SIZE 3 #define OPERATOR_SIZE 2 typedef struct query_term { /* type */ long TermType; /* for term */ char Use[ATTRIBUTE_SIZE]; char Relation[ATTRIBUTE_SIZE]; char Position[ATTRIBUTE_SIZE]; char Structure[ATTRIBUTE_SIZE]; char Truncation[ATTRIBUTE_SIZE]; char Completeness[ATTRIBUTE_SIZE]; any* Term; /* for result set */ any* ResultSetID; /* for operator */ char Operator[OPERATOR_SIZE]; } query_term; /*----------------------------------------------------------------------*/ /* functions */ query_term* makeAttributeTerm _AP(( char* use,char* relation,char* position,char* structure, char* truncation,char* completeness,any* term)); query_term* makeResultSetTerm _AP((any* resultSet)); query_term* makeOperatorTerm _AP((char* operatorCode)); void freeTerm _AP((query_term* qt)); char* writeQueryTerm _AP((query_term* qt,char* buffer,long* len)); char* readQueryTerm _AP((query_term** qt,char* buffer)); any* writeQuery _AP((query_term** terms)); query_term** readQuery _AP((any* info)); /*----------------------------------------------------------------------*/ /* ** Routines originally from UI.c -- FM ** **----------------------------------------------------------------------*/ char * generate_search_apdu _AP((char* buff, /* buffer to hold the apdu */ long *buff_len, /* number of bytes written to the buffer */ char *seed_words, /* string of the seed words */ char *database_name, DocObj** docobjs, long maxDocsRetrieved )); char * generate_retrieval_apdu _AP((char *buff, long *buff_len, any *docID, long chunk_type, long start_line, long end_line, char *type, char *database_name)); long interpret_message _AP((char *request_message, long request_length, char *response_message, long response_buffer_length, /* length of the buffer (modified)*/ FILE *connection, boolean verbose)); void display_text_record_completely _AP((WAISDocumentText *record, boolean quote_string_quotes)); char *trim_junk _AP((char *headline)); /* ** Routines originally from ZProt.c -- FM ** **----------------------------------------------------------------------*/ /* APDU types */ typedef struct InitAPDU { pdu_type PDUType; boolean willSearch,willPresent,willDelete; boolean supportAccessControl,supportResourceControl; long PreferredMessageSize; long MaximumRecordSize; char* IDAuthentication; char* ImplementationID; char* ImplementationName; char* ImplementationVersion; any* ReferenceID; void* UserInformationField; } InitAPDU; typedef struct InitResponseAPDU { pdu_type PDUType; boolean Result; boolean willSearch,willPresent,willDelete; boolean supportAccessControl,supportResourceControl; long PreferredMessageSize; long MaximumRecordSize; char* IDAuthentication; char* ImplementationID; char* ImplementationName; char* ImplementationVersion; any* ReferenceID; void* UserInformationField; } InitResponseAPDU; typedef struct SearchAPDU { pdu_type PDUType; long SmallSetUpperBound; long LargeSetLowerBound; long MediumSetPresentNumber; boolean ReplaceIndicator; char* ResultSetName; char** DatabaseNames; char* QueryType; char** ElementSetNames; any* ReferenceID; void* Query; } SearchAPDU; typedef struct SearchResponseAPDU { pdu_type PDUType; long SearchStatus; long ResultCount; long NumberOfRecordsReturned; long NextResultSetPosition; long ResultSetStatus; long PresentStatus; any* ReferenceID; void* DatabaseDiagnosticRecords; } SearchResponseAPDU; typedef struct PresentAPDU { pdu_type PDUType; long NumberOfRecordsRequested; long ResultSetStartPosition; char* ResultSetID; char* ElementSetNames; any* ReferenceID; void* PresentInfo; } PresentAPDU; typedef struct PresentResponseAPDU { pdu_type PDUType; boolean PresentStatus; long NumberOfRecordsReturned; long NextResultSetPosition; any* ReferenceID; void* DatabaseDiagnosticRecords; } PresentResponseAPDU; /*----------------------------------------------------------------------*/ /* Functions */ InitAPDU* makeInitAPDU _AP((boolean search,boolean present,boolean deleteIt, boolean accessControl,boolean resourceControl, long prefMsgSize,long maxMsgSize, char* auth,char* id,char* name, char* version, any* refID,void* userInfo)); void freeInitAPDU _AP((InitAPDU* init)); char* writeInitAPDU _AP((InitAPDU* init,char* buffer,long* len)); char* readInitAPDU _AP((InitAPDU** init,char* buffer)); InitResponseAPDU* makeInitResponseAPDU _AP((boolean result, boolean search,boolean present,boolean deleteIt, boolean accessControl,boolean resourceControl, long prefMsgSize,long maxMsgSize, char* auth,char* id,char* name, char* version, any* refID,void* userInfo)); void freeInitResponseAPDU _AP((InitResponseAPDU* init)); char* writeInitResponseAPDU _AP((InitResponseAPDU* init,char* buffer,long* len)); char* readInitResponseAPDU _AP((InitResponseAPDU** init,char* buffer)); InitResponseAPDU* replyToInitAPDU _AP((InitAPDU* init,boolean result,void* userInfo)); SearchAPDU* makeSearchAPDU _AP((long small,long large, long medium, boolean replace,char* name,char** databases, char* type,char** elements,any* refID,void* queryInfo)); void freeSearchAPDU _AP((SearchAPDU* query)); char* writeSearchAPDU _AP((SearchAPDU* query,char* buffer,long* len)); char* readSearchAPDU _AP((SearchAPDU** query,char* buffer)); SearchResponseAPDU* makeSearchResponseAPDU _AP((long result,long count, long recordsReturned,long nextPos, long resultStatus,long presentStatus, any* refID,void* records)); void freeSearchResponseAPDU _AP((SearchResponseAPDU* queryResponse)); char* writeSearchResponseAPDU _AP((SearchResponseAPDU* queryResponse,char* buffer,long* len)); char* readSearchResponseAPDU _AP((SearchResponseAPDU** queryResponse,char* buffer)); PresentAPDU* makePresentAPDU _AP((long recsReq, long startPos, char* resultID,any* refID,void* info)); void freePresentAPDU _AP((PresentAPDU* present)); char* writePresentAPDU _AP((PresentAPDU* present,char* buffer,long* len)); char* readPresentAPDU _AP((PresentAPDU** present,char* buffer)); PresentResponseAPDU* makePresentResponseAPDU _AP((boolean status,long recsRet, long nextPos,any* refID, void* records)); void freePresentResponseAPDU _AP((PresentResponseAPDU* present)); char* writePresentResponseAPDU _AP((PresentResponseAPDU* present,char* buffer,long* len)); char* readPresentResponseAPDU _AP((PresentResponseAPDU** present,char* buffer)); /*----------------------------------------------------------------------*/ /* user extension hooks: */ extern char* writeInitInfo _AP((InitAPDU* init,char* buffer,long* len)); extern char* readInitInfo _AP((void** info,char* buffer)); extern char* writeInitResponseInfo _AP((InitResponseAPDU* init,char* buffer,long* len)); extern char* readInitResponseInfo _AP((void** info,char* buffer)); extern char* writeSearchInfo _AP((SearchAPDU* query,char* buffer,long* len)); extern char* readSearchInfo _AP((void** info,char* buffer)); extern char* writeSearchResponseInfo _AP((SearchResponseAPDU* query,char* buffer,long* len)); extern char* readSearchResponseInfo _AP((void** info,char* buffer)); extern char* writePresentInfo _AP((PresentAPDU* present,char* buffer,long* len)); extern char* readPresentInfo _AP((void** info,char* buffer)); extern char* writePresentResponseInfo _AP((PresentResponseAPDU* present,char* buffer,long* len)); extern char* readPresentResponseInfo _AP((void** info,char* buffer)); #endif /* HTVMSWAIS_H */