⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htvms_waisui.c

📁 用于linux和其他unix下面的
💻 C
📖 第 1 页 / 共 4 页
字号:
  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 + -