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