📄 htvms_waisui.c
字号:
long dataSize = writtenCompressedBinIntSize(num); long size; size = writtenTagSize(tag); /* space for the tag */ size += writtenCompressedIntSize(dataSize); /* space for the size */ size += dataSize; /* space for the data */ return(size);}/*----------------------------------------------------------------------*/typedef void (voidfunc)(void *);voiddoList(void** list, voidfunc *func)/* call func on each element of the NULL terminated list of pointers */{ register long i; register void* ptr = NULL; if (list == NULL) return; for (i = 0,ptr = list[i]; ptr != NULL; ptr = list[++i]) (*func)(ptr);}/*----------------------------------------------------------------------*/char*writeProtocolVersion(char* buf, long* len)/* write a bitmap describing the protocols available */{ static bit_map* version = NULL; if (version == NULL) { version = makeBitMap((unsigned long)1,true); /* version 1! */ } return(writeBitMap(version,DT_ProtocolVersion,buf,len));}/*----------------------------------------------------------------------*/char*defaultImplementationID(void){ static char ImplementationID[] = "TMC"; return(ImplementationID);}/*----------------------------------------------------------------------*/char*defaultImplementationName(void){ static char ImplementationName[] = "Thinking Machines Corporation Z39.50"; return(ImplementationName);}/*----------------------------------------------------------------------*/char*defaultImplementationVersion(void){ static char ImplementationVersion[] = "2.0A"; return(ImplementationVersion);}/*----------------------------------------------------------------------*//*** Routines originally from ZType1.c -- FM****----------------------------------------------------------------------*//* WIDE AREA INFORMATION SERVER SOFTWARE: No guarantees or restrictions. See the readme file for the full standard disclaimer. 3.26.90 Harry Morris, morris@think.com 4.11.90 HWM - generalized conditional includes (see c-dialect.h)*//*----------------------------------------------------------------------*/query_term*makeAttributeTerm(char* use,char* relation,char* position,char* structure,char* truncation,char* completeness,any* term){ query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term)); qt->TermType = TT_Attribute; /* copy in the attributes */ strncpy(qt->Use,use,ATTRIBUTE_SIZE); strncpy(qt->Relation,relation,ATTRIBUTE_SIZE); strncpy(qt->Position,position,ATTRIBUTE_SIZE); strncpy(qt->Structure,structure,ATTRIBUTE_SIZE); strncpy(qt->Truncation,truncation,ATTRIBUTE_SIZE); strncpy(qt->Completeness,completeness,ATTRIBUTE_SIZE); qt->Term = duplicateAny(term); qt->ResultSetID = NULL; return(qt);}/*----------------------------------------------------------------------*/query_term*makeResultSetTerm(any* resultSet){ query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term)); qt->TermType = TT_ResultSetID; qt->ResultSetID = duplicateAny(resultSet); qt->Term = NULL; return(qt);}/*----------------------------------------------------------------------*/query_term*makeOperatorTerm(char* operatorCode){ query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term)); qt->TermType = TT_Operator; strncpy(qt->Operator,operatorCode,OPERATOR_SIZE); qt->Term = NULL; qt->ResultSetID = NULL; return(qt);}/*----------------------------------------------------------------------*/voidfreeTerm(void* param){ query_term* qt = (query_term*)param; switch (qt->TermType) { case TT_Attribute: freeAny(qt->Term); break; case TT_ResultSetID: freeAny(qt->ResultSetID); break; case TT_Operator: /* do nothing */ break; default: panic("Implementation error: Unknown term type %ld", qt->TermType); break; } s_free(qt);}/*----------------------------------------------------------------------*/#define ATTRIBUTE_LIST_SIZE ATTRIBUTE_SIZE * 6#define AT_DELIMITER " "char*writeQueryTerm(query_term* qt, char* buffer, long* len){ char* buf = buffer; char attributes[ATTRIBUTE_LIST_SIZE]; switch (qt->TermType) { case TT_Attribute: strncpy(attributes,qt->Use,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,qt->Relation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,qt->Position,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,qt->Structure,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,qt->Truncation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE); s_strncat(attributes,qt->Completeness,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); buf = writeString(attributes,DT_AttributeList,buf,len); buf = writeAny(qt->Term,DT_Term,buf,len); break; case TT_ResultSetID: buf = writeAny(qt->ResultSetID,DT_ResultSetID,buf,len); break; case TT_Operator: buf = writeString(qt->Operator,DT_Operator,buf,len); break; default: panic("Implementation error: Unknown term type %ld", qt->TermType); break; } return(buf);}/*----------------------------------------------------------------------*/char*readQueryTerm(query_term** qt, char* buffer){ char* buf = buffer; char *attributeList = NULL; char* operator = NULL; any* term; char* use = NULL; char* relation = NULL; char* position = NULL; char* structure = NULL; char* truncation = NULL; char* completeness; any* resultSetID = NULL; data_tag tag; tag = peekTag(buffer); switch(tag) { case DT_AttributeList: buf = readString(&attributeList,buf); buf = readAny(&term,buf); use = strtok(attributeList,AT_DELIMITER); relation = strtok(NULL,AT_DELIMITER); position = strtok(NULL,AT_DELIMITER); structure = strtok(NULL,AT_DELIMITER); truncation = strtok(NULL,AT_DELIMITER); completeness = strtok(NULL,AT_DELIMITER); *qt = makeAttributeTerm(use,relation,position,structure, truncation,completeness,term); s_free(attributeList); freeAny(term); break; case DT_ResultSetID: buf = readAny(&resultSetID,buf); *qt = makeResultSetTerm(resultSetID); freeAny(resultSetID); break; case DT_Operator: buf = readString(&operator,buf); *qt = makeOperatorTerm(operator); s_free(operator); break; default: REPORT_READ_ERROR(buf); break; } return(buf);}/*----------------------------------------------------------------------*/static unsigned long getQueryTermSize PARAMS((query_term* qt));static unsigned longgetQueryTermSize(query_term* qt)/* figure out how many bytes it will take to write this query */{ unsigned long size = 0; static char attributes[] = "11 22 33 44 55 66"; /* we just need this to calculate its written size */ switch (qt->TermType) { case TT_Attribute: size = writtenStringSize(DT_AttributeList,attributes); size += writtenAnySize(DT_Term,qt->Term); break; case TT_ResultSetID: size = writtenAnySize(DT_ResultSetID,qt->ResultSetID); break; case TT_Operator: size = writtenStringSize(DT_Operator,qt->Operator); break; default: panic("Implementation error: Unknown term type %ld", qt->TermType); break; } return(size);}/*----------------------------------------------------------------------*//* A query is simply a null terminated list of query terms. For transmission, a query is written into an any which is sent as the user information field. */any*writeQuery(query_term** terms){ any* info = NULL; char* writePos = NULL; char* data = NULL; unsigned long size = 0; long remaining = 0; long i; query_term* qt = NULL; if (terms == NULL) return(NULL); /* calculate the size of write buffer */ for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i]) size += getQueryTermSize(qt); data = (char*)s_malloc((size_t)size); /* write the terms */ writePos = data; remaining = size; for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i]) writePos = writeQueryTerm(qt,writePos,&remaining); info = makeAny(size,data); return(info);}/*----------------------------------------------------------------------*/query_term**readQuery(any *info){ char* readPos = info->bytes; query_term** terms = NULL; query_term* qt = NULL; long numTerms = 0L; char tmp[100]; sprintf(tmp,"readquery: bytes: %ld",info->size); log_write(tmp); while (readPos < info->bytes + info->size) { readPos = readQueryTerm(&qt,readPos); if (terms == NULL) { terms = (query_term**)s_malloc((size_t)(sizeof(query_term*)*2)); } else { terms = (query_term**)s_realloc((char*)terms, (size_t)(sizeof(query_term*)*(numTerms+2))); } if (qt == NULL) log_write("qt = null"); terms[numTerms++] = qt; terms[numTerms] = NULL; } return(terms);}/*----------------------------------------------------------------------*//*** Routines originally from panic.c -- FM****----------------------------------------------------------------------*//* WIDE AREA INFORMATION SERVER SOFTWARE: No guarantees or restrictions. See the readme file for the full standard disclaimer. Morris@think.com*//* panic is an error system interface. On the Mac, it will pop * up a little window to explain the problem. * On a unix box, it will print out the error and call perror() *//*----------------------------------------------------------------------*/static void exitAction PARAMS((long error));static voidexitAction(long error GCC_UNUSED){ long i; for (i = 0; i < 100000; i++) ; exit(0);}/*----------------------------------------------------------------------*/#define PANIC_HEADER "Fatal Error: "voidpanic(char *format, ...){ va_list ap; /* the variable arguments */ fprintf(stderr,PANIC_HEADER); LYva_start(ap, format); /* init ap */ vfprintf(stderr,format,ap); /* print the contents */ va_end(ap); /* free ap */ fflush(stderr); exitAction(0);}/*----------------------------------------------------------------------*//*** Routines originally from cutil.c -- FM****----------------------------------------------------------------------*//* Wide AREA INFORMATION SERVER SOFTWARE No guarantees or restrictions. See the readme file for the full standard disclaimer. 3.26.90 Harry Morris, morris@think.com 4.11.90 HWM - generalized conditional includes (see c-dialect.h)*//*----------------------------------------------------------------------*/voidfs_checkPtr(void* ptr)/* If the ptr is NULL, give an error */{ if (ptr == NULL) panic("checkPtr found a NULL pointer");}/*----------------------------------------------------------------------*/void*fs_malloc(size_t size)/* does safety checks and optional accounting */{ register void* ptr = NULL; ptr = (void*)calloc((size_t)size,(size_t)1); s_checkPtr(ptr); return(ptr);}/*----------------------------------------------------------------------*/void*fs_realloc(void* ptr, size_t size)/* does safety checks and optional accounting note - we don't know how big ptr's memory is, so we can't ensure that any new memory allocated is NULLed! */{ register void* nptr = NULL; if (ptr == NULL) /* this is really a malloc */ return(s_malloc(size)); nptr = (void*)realloc(ptr,size); s_checkPtr(ptr); return(nptr);}/*----------------------------------------------------------------------*/voidfs_free(void* ptr)/* does safety checks and optional accounting */{ if (ptr != NULL) /* some non-ansi compilers/os's cant handle freeing null */ { /* if we knew the size of this block of memory, we could clear it - oh well */ free(ptr); ptr = NULL; }}/*----------------------------------------------------------------------*/char*s_strdup(char* s)/* return a copy of s. This is identical to the standard library routine strdup(), except that it is safe. If s == NULL or malloc fails, appropriate action is taken. */{ unsigned long len; char* copy = NULL; if (s == NULL) /* saftey check to postpone stupid errors */ return(NULL); len = strlen(s); /* length of string - terminator */ copy = (char*)s_malloc((size_t)(sizeof(char)*(len + 1))); strncpy(copy,s,len + 1); return(copy);}/*----------------------------------------------------------------------*/char*fs_strncat(char* dst, char* src, size_t maxToAdd, size_t maxTotal)/* like strncat, except the fourth argument limits the maximum total length of the resulting string */{ size_t dstSize = strlen(dst); size_t srcSize = strlen(src); if (dstSize + srcSize < maxTotal) /* use regular old strncat */ return(strncat(dst,src,maxToAdd)); else { size_t truncateTo = maxTotal - dstSize - 1; char saveChar = src[truncateTo]; char* result = NULL; src[truncateTo] = '\0'; result = strncat(dst,src,maxToAdd); src[truncateTo] = saveChar; return(result); }}/*----------------------------------------------------------------------*/char char_downcase(unsigned long long_ch){ unsigned char ch = long_ch & 0xFF; /* just want one byte */ /* when ansi is the way of the world, this can be tolower */ return (((ch >= 'A') && (ch <= 'Z')) ? (ch + 'a' -'A') : ch);}char *string_downcase(char *word){ long i = 0; while(word[i] != '\0'){ word[i] = char_downcase((unsigned long)word[i]); i++; } return(word);}/*----------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -