ftp.nice.ch/pub/next/connectivity/infosystems/WAIStation.1.9.6.N.b.tar.gz#/WAIS/ir/docid.c

This is docid.c in view mode; [Download] [Up]

/* WIDE AREA INFORMATION SERVER SOFTWARE:
   No guarantees or restrictions.  See the readme file for the full standard
   disclaimer.
 *
 * these are the methods for the DocID struct
 * -brewster
 *
 * $Log:	docid.c,v $
 * Revision 1.6  92/05/10  14:42:57  jonathan
 * Made a little safer on NULL docid's and such.
 * 
 * Revision 1.5  92/04/01  17:07:25  jonathan
 * Added copyDocID.
 * 
 * Revision 1.4  92/02/21  11:05:03  jonathan
 * added RCSIdent
 * 
 * Revision 1.3  92/02/21  11:04:30  jonathan
 * Added header, fixed $Log.
 * 
 * Revision 1.2  92/02/12  13:17:44  jonathan
 * Added $Log so RCS will put the log message in the header
 * 
*/

#ifndef lint
static char *RCSid = "$Header: /tmp_mnt/net/quake/proj/wais/wais-8-b5/ir/RCS/docid.c,v 1.6 92/05/10 14:42:57 jonathan Exp $";
#endif

#include <ctype.h>
#include "docid.h"
#include "irfileio.h"
#include "cutil.h"
#include "cdialect.h"

#define TESTDOC(doc) if((doc) == NULL) return NULL

/*---------------------------------------------------------------------------*/

/* get the server slot */
any* GetServer(doc)
DocID* doc;
{
  TESTDOC(doc);
  if(NULL != doc->distributorServer)
    return(doc->distributorServer);
  else return(doc->originalServer);
}

/*---------------------------------------------------------------------------*/

any* GetDatabase(doc)
DocID* doc;
{
  TESTDOC(doc);
  if(NULL != doc->distributorDatabase)
    return(doc->distributorDatabase);
  else return(doc->originalDatabase);
}

/*---------------------------------------------------------------------------*/

any* GetLocalID(doc)
DocID* doc;
{
  TESTDOC(doc);
  if(NULL != doc->distributorLocalID)
    return(doc->distributorLocalID);
  else return(doc->originalLocalID);
}

/*---------------------------------------------------------------------------*/

long GetCopyrightDisposition(doc)
DocID* doc;
{
  if(doc)
    return(doc->copyrightDisposition);
  else return 0;
}

/*---------------------------------------------------------------------------*/

/* returns FALSE if it loses, TRUE if it wins */
long ReadDocID(doc,file)
DocID* doc;
FILE* file;
{
  char temp_string[MAX_SYMBOL_SIZE];
  if(FALSE == CheckStartOfStruct("doc-id", file)){
    return(FALSE);
  }
  doc->originalServer = NULL;
  doc->originalDatabase = NULL;
  doc->originalLocalID = NULL;
  doc->distributorServer = NULL;
  doc->distributorDatabase = NULL;
  doc->distributorLocalID = NULL;
  doc->copyrightDisposition = COPY_WITHOUT_RESTRICTION;
	
  while(TRUE){
    long result = ReadSymbol(temp_string, file, 
			     (long)MAX_SYMBOL_SIZE);
		
    if(FALSE == result){ 
      return(FALSE);
    }
    if(END_OF_STRUCT_OR_LIST == result){
      break;
    }
    if(0 == strcmp(temp_string, ":original-server")){
      any* an_any = (any*)s_malloc(sizeof(any));
      ReadAny(an_any, file);
      doc->originalServer = an_any;
    }
    else if(0 == strcmp(temp_string, ":original-database")){
      any* an_any = (any*)s_malloc(sizeof(any));
      ReadAny(an_any, file);
      doc->originalDatabase = an_any;
    }
    else if(0 == strcmp(temp_string, ":original-local-id")){
      any* an_any = (any*)s_malloc(sizeof(any));
      ReadAny(an_any, file);
      doc->originalLocalID = an_any;
    }
    else if(0 == strcmp(temp_string, ":distributor-server")){
      any* an_any = (any*)s_malloc(sizeof(any));
      ReadAny(an_any, file);
      doc->distributorServer = an_any;
    }
    else if(0 == strcmp(temp_string, ":distributor-database")){
      any* an_any = (any*)s_malloc(sizeof(any));
      ReadAny(an_any, file);
      doc->distributorDatabase = an_any;
    }
    else if(0 == strcmp(temp_string, ":distributor-local-id")){
      any* an_any = (any*)s_malloc(sizeof(any));
      ReadAny(an_any, file);
      doc->distributorLocalID = an_any;
    }
    else if(0 == strcmp(temp_string, ":copyright-disposition"))
      ReadLong(file,&doc->copyrightDisposition);
    else{
      SkipObject(file);
    }
  }
  return(TRUE);
}


/*---------------------------------------------------------------------------*/

/* this writes a CDocID to a stream */
long WriteDocID(doc,file)
DocID* doc;
FILE* file;
{
  WriteNewline(file);
  WriteStartOfStruct("doc-id", file);
  if (NULL != doc->originalServer){
    WriteNewline(file);
    WriteSymbol(":original-server", file); WriteAny(doc->originalServer, file);
  }
  if (NULL != doc->originalDatabase){
    WriteNewline(file);
    WriteSymbol(":original-database", file); WriteAny(doc->originalDatabase, file);
  }
  if (NULL != doc->originalLocalID){
    WriteNewline(file);
    WriteSymbol(":original-local-id", file); WriteAny(doc->originalLocalID, file);
  }
  if (NULL != doc->distributorServer){
    WriteNewline(file);
    WriteSymbol(":distributor-server", file); WriteAny(doc->distributorServer, file);
  }
  if (NULL != doc->distributorDatabase){
    WriteNewline(file);
    WriteSymbol(":distributor-database", file); 
    WriteAny(doc->distributorDatabase, file);
  }
  if (NULL != doc->distributorLocalID){
    WriteNewline(file);
    WriteSymbol(":distributor-local-id", file); 
    WriteAny(doc->distributorLocalID, file);
  }
  WriteNewline(file);
  WriteSymbol(":copyright-disposition", file);
  WriteLong(doc->copyrightDisposition, file);
  return(WriteEndOfStruct(file));
}

/*---------------------------------------------------------------------------*/

	static Boolean safeCmp _AP((any* a1,any* a2));

	static Boolean safeCmp(a1,a2)
        any* a1;
        any* a2;
        {
		/* compare 2 any's, either of which may be NULL */
		if (a1 == NULL && a2 == NULL)
		  	return(true);
		else if (a1 == NULL || a2 == NULL)
		  	return(false);
		else if (a1->size != a2->size)
		  	return(false);
		else if (memcmp(a1->bytes,a2->bytes,(size_t)a1->size) == 0)
		  	return(true);
		else
			return(false);
		}

/*---------------------------------------------------------------------------*/

Boolean cmpDocIDs(d1,d2)
DocID* d1;
DocID* d2;
{
  if (safeCmp(d1->originalServer,d2->originalServer) &&
      safeCmp(d1->originalDatabase,d2->originalDatabase) &&
      safeCmp(d1->originalLocalID,d2->originalLocalID) &&
      safeCmp(d1->distributorServer,d2->distributorServer) &&
      safeCmp(d1->distributorDatabase,d2->distributorDatabase) &&
      safeCmp(d1->distributorLocalID,d2->distributorLocalID) &&
      d1->copyrightDisposition == d2->copyrightDisposition)
    return(true);
  else
    return(false); 
}
	
/*---------------------------------------------------------------------------*/

DocID* 
makeDocID()
{
  return((DocID*)s_malloc((size_t)sizeof(DocID)));
}

/*---------------------------------------------------------------------------*/

DocID*
copyDocID(doc)
DocID* doc;
{
  DocID* result = NULL;
  if(doc != NULL && 
     (result = makeDocID()) != NULL) {
    result->originalServer = duplicateAny(doc->originalServer);
    result->originalDatabase = duplicateAny(doc->originalDatabase);
    result->originalLocalID = duplicateAny(doc->originalLocalID);
    result->distributorServer = duplicateAny(doc->distributorServer);
    result->distributorDatabase = duplicateAny(doc->distributorDatabase);
    result->distributorLocalID = duplicateAny(doc->distributorLocalID);
  }
  return result;
}

/*---------------------------------------------------------------------------*/

void freeDocID(doc)
DocID* doc;
{
  if(doc) {
    freeAny(doc->originalServer);
    freeAny(doc->originalDatabase);
    freeAny(doc->originalLocalID);
    freeAny(doc->distributorServer);
    freeAny(doc->distributorDatabase);
    freeAny(doc->distributorLocalID);
    s_free(doc);
  }
}

/*---------------------------------------------------------------------------*/

#define DT_OriginalServer 	(data_tag)1
#define DT_OriginalDatabase 	(data_tag)2
#define DT_OriginalLocalID	(data_tag)3
#define DT_DistributorServer	(data_tag)4
#define DT_DistributorDatabase	(data_tag)5
#define DT_DistributorLocalID	(data_tag)6
#define DT_CopyrightDispostion	(data_tag)7

DocID*
docIDFromAny(rawDocID)
any* rawDocID;
/* read from a z3950 docid to a docid structure */
{
  DocID* docID;
  char* buf;
  
  TESTDOC(rawDocID);

  buf = rawDocID->bytes;
  docID = makeDocID();
  while ((buf - rawDocID->bytes) < rawDocID->size)
    { data_tag tag = peekTag(buf);
      switch (tag)
	{ case DT_OriginalServer:
	    buf = readAny(&(docID->originalServer),buf);
	    break;
	  case DT_OriginalDatabase:
	    buf = readAny(&(docID->originalDatabase),buf);
	    break;
	  case DT_OriginalLocalID:
	    buf = readAny(&(docID->originalLocalID),buf);
	    break;
	  case DT_DistributorServer:
	    buf = readAny(&(docID->distributorServer),buf);
	    break;
	  case DT_DistributorDatabase:
	    buf = readAny(&(docID->distributorDatabase),buf);
	    break;
	  case DT_DistributorLocalID:
	    buf = readAny(&(docID->distributorLocalID),buf);
	    break;
	  case DT_CopyrightDispostion:
	    buf = readNum(&(docID->copyrightDisposition),buf);
	    break;
	  default:
	    freeDocID(docID);
	    return(NULL);
	  };
    }
  
  return(docID);
}

/*---------------------------------------------------------------------------*/

any*
anyFromDocID(docID)
DocID* docID;
/* write a docid structure to a buffer in z3950 format */
{
  any* rawDocID = NULL;
  char* buf = NULL;
  char* data = NULL;
  long size,bytesLeft;
  
  if (docID == NULL)
    return(NULL);
    
  size = writtenAnySize(DT_OriginalServer,docID->originalServer);
  size += writtenAnySize(DT_OriginalDatabase,docID->originalDatabase);
  size += writtenAnySize(DT_OriginalLocalID,docID->originalLocalID);
  size += writtenAnySize(DT_DistributorServer,docID->distributorServer);
  size += writtenAnySize(DT_DistributorDatabase,docID->distributorDatabase);
  size += writtenAnySize(DT_DistributorLocalID,docID->distributorLocalID);
  size += writtenNumSize(DT_CopyrightDispostion,docID->copyrightDisposition);
  
  data = s_malloc((size_t)(sizeof(char) * size));
  
  buf = data;
  bytesLeft = size;
  
  buf = writeAny(docID->originalServer,DT_OriginalServer,buf,&bytesLeft);
  buf = writeAny(docID->originalDatabase,DT_OriginalDatabase,buf,&bytesLeft);
  buf = writeAny(docID->originalLocalID,DT_OriginalLocalID,buf,&bytesLeft);
  buf = writeAny(docID->distributorServer,DT_DistributorServer,buf,
                 &bytesLeft);
  buf = writeAny(docID->distributorDatabase,DT_DistributorDatabase,
                 buf,&bytesLeft);
  buf = writeAny(docID->distributorLocalID,DT_DistributorLocalID,buf,
                 &bytesLeft);
  buf = writeNum(docID->copyrightDisposition,DT_CopyrightDispostion,
                 buf,&bytesLeft);
  
  rawDocID = makeAny(size,data);
  
  return(rawDocID);
}

/*---------------------------------------------------------------------------*/

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.