home *** CD-ROM | disk | FTP | other *** search
/ ftp.uv.es / 2014.11.ftp.uv.es.tar / ftp.uv.es / pub / unix / freeWAIS-0.202.tar.gz / freeWAIS-0.202.tar / freeWAIS-0.202 / ir / ztype1.c < prev    next >
C/C++ Source or Header  |  1993-10-05  |  8KB  |  335 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE:
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.    
  4. */
  5.  
  6. /* Copyright (c) CNIDR (see ../COPYRIGHT) */
  7.  
  8.   
  9. #ifndef lint
  10. static char *RCSid = "$Header: /usr/users/freewais/FreeWAIS-0.1/ir/ztype1.c,v 1.1 1993/02/16 15:05:35 freewais Exp $";
  11. #endif
  12.  
  13. /* Change log:
  14.  * $Log: ztype1.c,v $
  15.  * Revision 1.1  1993/02/16  15:05:35  freewais
  16.  * Initial revision
  17.  *
  18.  * Revision 1.2  92/02/12  14:00:49  jonathan
  19.  * Added "$Log" so RCS will put the log message in the header
  20.  * 
  21.    3.26.90    Harry Morris, morris@think.com
  22.    4.11.90  HWM - generalized conditional includes (see c-dialect.h)
  23. */
  24.  
  25. #define _C_Type_1_Query_
  26.  
  27. #include "ztype1.h"
  28. #include "cutil.h"
  29. #include "panic.h"
  30. #include <string.h>
  31.  
  32. #ifndef ANSI_LIKE
  33. #include "ustubs.h"
  34. #endif
  35.  
  36. /*----------------------------------------------------------------------*/
  37.  
  38. query_term*
  39. makeAttributeTerm(use,
  40.           relation,
  41.           position,
  42.           structure,
  43.           truncation,
  44.           completeness,
  45.           term)
  46. char* use;
  47. char* relation;
  48. char* position;
  49. char* structure;
  50. char* truncation;
  51. char* completeness;
  52. any* term;
  53. {
  54.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  55.  
  56.   qt->TermType = TT_Attribute;
  57.  
  58.   /* copy in the attributes */
  59.   strncpy(qt->Use,use,ATTRIBUTE_SIZE);
  60.   strncpy(qt->Relation,relation,ATTRIBUTE_SIZE);
  61.   strncpy(qt->Position,position,ATTRIBUTE_SIZE);
  62.   strncpy(qt->Structure,structure,ATTRIBUTE_SIZE);
  63.   strncpy(qt->Truncation,truncation,ATTRIBUTE_SIZE);
  64.   strncpy(qt->Completeness,completeness,ATTRIBUTE_SIZE);
  65.  
  66.   qt->Term = duplicateAny(term);
  67.  
  68.   qt->ResultSetID = NULL;
  69.  
  70.   return(qt);
  71. }
  72.  
  73. /*----------------------------------------------------------------------*/
  74.  
  75. query_term*
  76. makeResultSetTerm(resultSet)
  77. any* resultSet;
  78.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  79.  
  80.   qt->TermType = TT_ResultSetID;
  81.  
  82.   qt->ResultSetID = duplicateAny(resultSet);
  83.  
  84.   qt->Term = NULL;
  85.   
  86.   return(qt);
  87. }
  88.  
  89. /*----------------------------------------------------------------------*/
  90.  
  91. query_term* 
  92. makeOperatorTerm(operatorCode)
  93. char* operatorCode;
  94. {
  95.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  96.  
  97.   qt->TermType = TT_Operator;
  98.  
  99.   strncpy(qt->Operator,operatorCode,OPERATOR_SIZE);
  100.  
  101.   qt->Term = NULL;
  102.   qt->ResultSetID = NULL;
  103.  
  104.   return(qt);
  105. }
  106.  
  107. /*----------------------------------------------------------------------*/
  108.  
  109. void 
  110. freeTerm(qt)
  111. query_term* qt;
  112. {
  113.   switch (qt->TermType)
  114.     { case TT_Attribute:
  115.     freeAny(qt->Term);
  116.     break;
  117.       case TT_ResultSetID:
  118.     freeAny(qt->ResultSetID);
  119.     break;
  120.       case TT_Operator:
  121.     /* do nothing */
  122.     break;
  123.       default:
  124.     panic("Implementation error: Unknown term type %ld",
  125.           qt->TermType);
  126.     break;
  127.       }
  128.   s_free(qt);
  129. }
  130.  
  131. /*----------------------------------------------------------------------*/
  132.  
  133. #define ATTRIBUTE_LIST_SIZE    ATTRIBUTE_SIZE * 6
  134. #define AT_DELIMITER    " "
  135.  
  136. char* 
  137. writeQueryTerm(qt,buffer,len)
  138. query_term* qt;
  139. char* buffer;
  140. long* len;
  141. {
  142.   char* buf = buffer;
  143.   char attributes[ATTRIBUTE_LIST_SIZE];
  144.  
  145.   switch (qt->TermType)
  146.     { case TT_Attribute:
  147.     strncpy(attributes,qt->Use,ATTRIBUTE_LIST_SIZE); 
  148.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  149.     s_strncat(attributes,qt->Relation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  150.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  151.     s_strncat(attributes,qt->Position,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  152.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  153.     s_strncat(attributes,qt->Structure,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  154.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  155.     s_strncat(attributes,qt->Truncation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  156.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  157.     s_strncat(attributes,qt->Completeness,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE);
  158.     buf = writeString(attributes,DT_AttributeList,buf,len);
  159.     buf = writeAny(qt->Term,DT_Term,buf,len);
  160.     break;
  161.       case TT_ResultSetID:
  162.     buf = writeAny(qt->ResultSetID,DT_ResultSetID,buf,len);
  163.     break;
  164.       case TT_Operator:
  165.     buf = writeString(qt->Operator,DT_Operator,buf,len);
  166.     break;
  167.       default:
  168.     panic("Implementation error: Unknown term type %ld",
  169.           qt->TermType);
  170.     break;
  171.       }
  172.  
  173.   return(buf);
  174. }
  175.  
  176. /*----------------------------------------------------------------------*/
  177.  
  178. char* 
  179. readQueryTerm(qt,buffer)
  180. query_term** qt;
  181. char* buffer;
  182. {
  183.   char* buf = buffer;
  184.   char  *attributeList = NULL;
  185.   char* operator = NULL;
  186.   any*     term;
  187.   char* use = NULL;
  188.   char* relation = NULL;
  189.   char* position = NULL;
  190.   char* structure = NULL;
  191.   char* truncation = NULL;
  192.   char* completeness;
  193.   any*    resultSetID = NULL;
  194.   data_tag tag;
  195.  
  196.   
  197.   tag = peekTag(buffer);
  198.  
  199.   switch(tag)
  200.     { case DT_AttributeList:
  201.     buf = readString(&attributeList,buf);
  202.     buf = readAny(&term,buf);
  203.     use = strtok(attributeList,AT_DELIMITER);
  204.     relation = strtok(NULL,AT_DELIMITER);
  205.     position = strtok(NULL,AT_DELIMITER);
  206.     structure = strtok(NULL,AT_DELIMITER);
  207.     truncation = strtok(NULL,AT_DELIMITER);
  208.     completeness = strtok(NULL,AT_DELIMITER);
  209.     *qt = makeAttributeTerm(use,relation,position,structure,
  210.                 truncation,completeness,term);
  211.     s_free(attributeList);
  212.     freeAny(term);
  213.     break;
  214.       case DT_ResultSetID:
  215.     buf = readAny(&resultSetID,buf);
  216.     *qt = makeResultSetTerm(resultSetID);    
  217.     freeAny(resultSetID);
  218.     break;
  219.       case DT_Operator:
  220.     buf = readString(&operator,buf);
  221.     *qt = makeOperatorTerm(operator);
  222.     s_free(operator);
  223.     break;
  224.       default:
  225.     REPORT_READ_ERROR(buf);
  226.     break;
  227.       }
  228.   
  229.   return(buf);
  230. }
  231.  
  232. /*----------------------------------------------------------------------*/
  233.  
  234. static unsigned long getQueryTermSize _AP((query_term* qt));
  235.  
  236. static unsigned long
  237. getQueryTermSize(qt)
  238. query_term* qt;
  239. /* figure out how many bytes it will take to write this query */
  240. {
  241.   unsigned long size;
  242.   static char attributes[] = "11 22 33 44 55 66"; /* we just need this to 
  243.                              calculate its written
  244.                              size */
  245.  
  246.   switch (qt->TermType)
  247.     { case TT_Attribute:
  248.     size = writtenStringSize(DT_AttributeList,attributes);
  249.     size += writtenAnySize(DT_Term,qt->Term);
  250.     break;
  251.       case TT_ResultSetID:
  252.     size = writtenAnySize(DT_ResultSetID,qt->ResultSetID);
  253.     break;
  254.       case TT_Operator:
  255.     size = writtenStringSize(DT_Operator,qt->Operator);
  256.     break;
  257.       default:
  258.     panic("Implementation error: Unknown term type %ld",
  259.           qt->TermType);
  260.     break;
  261.       }
  262.  
  263.   return(size);
  264. }
  265.  
  266. /*----------------------------------------------------------------------*/
  267.  
  268. /* A query is simply a null terminated list of query terms. For 
  269.    transmission, a query is written into an any which is sent as
  270.    the user information field. */
  271.  
  272. any*
  273. writeQuery(terms)
  274. query_term** terms;
  275. {
  276.   any* info = NULL;
  277.   char* writePos = NULL;
  278.   char* data = NULL;
  279.   unsigned long size = 0;
  280.   long remaining = 0;
  281.   long i;
  282.   query_term* qt = NULL;
  283.  
  284.   if (terms == NULL)
  285.     return(NULL);
  286.  
  287.   /* calculate the size of write buffer */
  288.   for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i])
  289.     size += getQueryTermSize(qt);
  290.  
  291.   data = (char*)s_malloc((size_t)size);
  292.  
  293.   /* write the terms */
  294.   writePos = data;
  295.   remaining = size;
  296.   for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i])
  297.     writePos = writeQueryTerm(qt,writePos,&remaining);
  298.  
  299.   info = makeAny(size,data);
  300.  
  301.   return(info);
  302. }
  303.  
  304. /*----------------------------------------------------------------------*/
  305.  
  306. query_term**
  307. readQuery(info)
  308. any *info;
  309. {
  310.   char* readPos = info->bytes;
  311.   query_term** terms = NULL;
  312.   query_term* qt = NULL;
  313.   long numTerms = 0;
  314.  
  315.  
  316.   while (readPos < info->bytes + info->size)
  317.     { readPos = readQueryTerm(&qt,readPos);
  318.       if (terms == NULL)
  319.     { terms = (query_term**)s_malloc((size_t)(sizeof(query_term*)*2));
  320.     }
  321.       else
  322.     { terms = 
  323.         (query_term**)s_realloc((char*)terms,
  324.                     (size_t)(sizeof(query_term*)*(numTerms+2)));
  325.       }
  326.       terms[numTerms++] = qt;
  327.       terms[numTerms] = NULL;
  328.     }
  329.  
  330.   return(terms);
  331. }
  332.  
  333. /*----------------------------------------------------------------------*/
  334.