514 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			514 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* d4tag.c   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
#ifndef S4UNIX
 | 
						|
   #ifdef __TURBOC__
 | 
						|
      #pragma hdrstop
 | 
						|
   #endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4 *S4FUNCTION d4tag( DATA4 *d4, const char* const tagName )
 | 
						|
{
 | 
						|
   #ifndef S4INDEX_OFF
 | 
						|
      char tagLookup[LEN4TAG_ALIAS+1] ;
 | 
						|
      TAG4 *tagOn ;
 | 
						|
 | 
						|
      #ifdef S4VBASIC
 | 
						|
         if ( c4parm_check( d4, 2, E92401 ) )
 | 
						|
            return 0 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_HIGH
 | 
						|
         if ( d4 == 0 || tagName == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E92401 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      u4ncpy( tagLookup, tagName, sizeof( tagLookup ) ) ;
 | 
						|
      c4upper( tagLookup ) ;
 | 
						|
 | 
						|
      for( tagOn = 0 ;; )
 | 
						|
      {
 | 
						|
         tagOn = d4tagNext( d4, tagOn ) ;
 | 
						|
         if ( tagOn == 0 )
 | 
						|
            break ;
 | 
						|
         if ( strcmp( tagOn->tagFile->alias, tagLookup ) == 0 )
 | 
						|
            return tagOn ;
 | 
						|
         #ifdef S4CLIENT
 | 
						|
            if ( code4indexFormat( d4->codeBase ) == r4ntx )  /* also check index file access name */
 | 
						|
               if ( strcmp( tagOn->tagFile->indexFile->accessName, tagLookup ) == 0 )
 | 
						|
                  return tagOn ;
 | 
						|
         #endif
 | 
						|
      }
 | 
						|
 | 
						|
      if ( d4->codeBase->errTagName )
 | 
						|
         error4describe( d4->codeBase, e4tagName, E92401, tagName, 0, 0 ) ;
 | 
						|
   #endif
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4CLIENT
 | 
						|
/* for N4OTHER should compare full name, adding extension if required */
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4FILE *dfile4tag( DATA4FILE *d4, const char * const tagName )
 | 
						|
{
 | 
						|
   #ifndef S4INDEX_OFF
 | 
						|
      char tagLookup[LEN4TAG_ALIAS+1] ;
 | 
						|
      TAG4FILE *tagOn ;
 | 
						|
      #ifdef N4OTHER
 | 
						|
         #ifndef S4CLIENT
 | 
						|
            char tagLookup2[258] ;
 | 
						|
         #endif
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( d4 == 0 || tagName == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E91102 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef N4OTHER
 | 
						|
         #ifndef S4CLIENT
 | 
						|
            u4nameCurrent( tagLookup2, sizeof( tagLookup2 ), tagName ) ;
 | 
						|
            u4nameExt( tagLookup2, sizeof( tagLookup2 ), code4indexExtension( d4->c4 ), 0 ) ;
 | 
						|
            c4upper( tagLookup2 ) ;
 | 
						|
         #endif
 | 
						|
      #endif
 | 
						|
 | 
						|
      u4namePiece( tagLookup, sizeof( tagLookup ), tagName, 0, 0 ) ;
 | 
						|
      c4upper( tagLookup ) ;
 | 
						|
 | 
						|
      for( tagOn = 0 ;; )
 | 
						|
      {
 | 
						|
         tagOn = dfile4tagNext( d4, tagOn ) ;
 | 
						|
         if ( tagOn == 0 )
 | 
						|
            break ;
 | 
						|
         if ( strcmp( tagOn->alias, tagLookup ) == 0 )
 | 
						|
            return tagOn ;
 | 
						|
         #ifdef N4OTHER
 | 
						|
            #ifndef S4CLIENT
 | 
						|
               if ( strcmp( tagOn->file.name, tagLookup2 ) == 0 )
 | 
						|
                  return tagOn ;
 | 
						|
            #endif
 | 
						|
         #endif
 | 
						|
      }
 | 
						|
 | 
						|
      if ( d4->c4->errTagName )
 | 
						|
         error4describe( d4->c4, e4tagName, E91102, tagName, 0, 0 ) ;
 | 
						|
   #endif
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4 *S4FUNCTION d4tagDefault( DATA4 *d4 )
 | 
						|
{
 | 
						|
   #ifndef S4INDEX_OFF
 | 
						|
      TAG4 *tag ;
 | 
						|
      INDEX4 *index ;
 | 
						|
 | 
						|
      #ifdef S4VBASIC
 | 
						|
         if ( c4parm_check( d4, 2, E92403 ) )
 | 
						|
            return 0 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_HIGH
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E92403 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      tag = d4->tagSelected ;
 | 
						|
      if ( tag )
 | 
						|
         return tag ;
 | 
						|
 | 
						|
      index = (INDEX4 *)l4first( &d4->indexes ) ;
 | 
						|
      if ( index )
 | 
						|
      {
 | 
						|
         tag = (TAG4 *)l4first( &index->tags ) ;
 | 
						|
         if ( tag )
 | 
						|
            return tag ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4CLIENT
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4FILE *dfile4tagDefault( DATA4FILE *d4 )
 | 
						|
{
 | 
						|
   #ifndef S4INDEX_OFF
 | 
						|
      TAG4FILE *tag ;
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E91102 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      tag = dfile4tagSelected( d4 ) ;
 | 
						|
      if ( tag )
 | 
						|
         return tag ;
 | 
						|
 | 
						|
      tag = dfile4tagNext( d4, 0 ) ;
 | 
						|
      return tag ;
 | 
						|
   #else
 | 
						|
      return 0 ;
 | 
						|
   #endif
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4 *S4FUNCTION d4tagNext( DATA4 *d4, TAG4 * tag )
 | 
						|
{
 | 
						|
   #ifdef S4INDEX_OFF
 | 
						|
      return 0 ;
 | 
						|
   #else
 | 
						|
      INDEX4 *i4 ;
 | 
						|
      TAG4 * tagOn ;
 | 
						|
 | 
						|
      tagOn = tag ;
 | 
						|
 | 
						|
      #ifdef S4VBASIC
 | 
						|
         if ( c4parm_check( d4, 2, E92405 ) )
 | 
						|
            return 0 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_HIGH
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E92405 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      if ( tagOn == 0 )
 | 
						|
      {
 | 
						|
         i4 = (INDEX4 *)l4first( &d4->indexes ) ;
 | 
						|
         if ( i4 == 0 )
 | 
						|
            return 0 ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
         for ( i4 = 0 ;; )
 | 
						|
         {
 | 
						|
            i4 = (INDEX4 *)l4next( &d4->indexes, i4 ) ;
 | 
						|
            if ( i4 == 0 )
 | 
						|
               return 0 ;
 | 
						|
            if ( i4 == tagOn->index )
 | 
						|
               break ;
 | 
						|
         }
 | 
						|
      }
 | 
						|
 | 
						|
      tagOn = (TAG4 *)l4next( &i4->tags, tagOn ) ;
 | 
						|
      if ( tagOn == 0 )
 | 
						|
      {
 | 
						|
         i4 = (INDEX4 *)l4next( &d4->indexes, i4 )  ;
 | 
						|
         if ( i4 == 0 )
 | 
						|
            return 0 ;
 | 
						|
         return (TAG4 *)l4first( &i4->tags ) ;
 | 
						|
      }
 | 
						|
      return tagOn ;
 | 
						|
   #endif
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4CLIENT
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4FILE *dfile4tagNext( DATA4FILE *d4, TAG4FILE *tagOn )
 | 
						|
{
 | 
						|
   #ifdef S4INDEX_OFF
 | 
						|
      return 0 ;
 | 
						|
   #else
 | 
						|
      #ifndef N4OTHER
 | 
						|
         INDEX4FILE *i4 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E91102 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef N4OTHER
 | 
						|
         return (TAG4FILE *)l4next( &d4->tagfiles, tagOn ) ;
 | 
						|
      #else
 | 
						|
         if ( tagOn == 0 )
 | 
						|
         {
 | 
						|
            i4 = (INDEX4FILE *)l4first( &d4->indexes ) ;
 | 
						|
            if ( i4 == 0 )
 | 
						|
               return 0 ;
 | 
						|
         }
 | 
						|
         else
 | 
						|
            i4 = tagOn->indexFile ;
 | 
						|
 | 
						|
         tagOn = (TAG4FILE *)l4next( &i4->tags, tagOn ) ;
 | 
						|
         if ( tagOn )
 | 
						|
            return tagOn ;
 | 
						|
 | 
						|
         i4 = (INDEX4FILE *)l4next( &d4->indexes, i4 ) ;
 | 
						|
         if ( i4 == 0 )
 | 
						|
            return 0 ;
 | 
						|
 | 
						|
         return (TAG4FILE *)l4first( &i4->tags ) ;
 | 
						|
      #endif /* N4OTHER */
 | 
						|
   #endif
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4 *S4FUNCTION d4tagPrev( DATA4 *d4, TAG4 *tag )
 | 
						|
{
 | 
						|
   #ifdef S4INDEX_OFF
 | 
						|
      return 0 ;
 | 
						|
   #else
 | 
						|
      INDEX4 *i4 ;
 | 
						|
      TAG4 * tagOn ;
 | 
						|
 | 
						|
      tagOn = tag ;
 | 
						|
 | 
						|
      #ifdef S4VBASIC
 | 
						|
         if ( c4parm_check( d4, 2, E92407 ) )
 | 
						|
            return 0 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_HIGH
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E92407 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      if ( tagOn == 0 )
 | 
						|
      {
 | 
						|
         i4 = (INDEX4 *)l4last( &d4->indexes ) ;
 | 
						|
         if ( i4 == 0 )
 | 
						|
            return 0 ;
 | 
						|
      }
 | 
						|
      else
 | 
						|
      {
 | 
						|
         for ( i4 = 0 ;; )
 | 
						|
         {
 | 
						|
            i4 = (INDEX4 *)l4prev( &d4->indexes, i4 ) ;
 | 
						|
            if ( i4 == 0 )
 | 
						|
               return 0 ;
 | 
						|
            if ( i4 == tagOn->index )
 | 
						|
               break ;
 | 
						|
         }
 | 
						|
      }
 | 
						|
 | 
						|
      tagOn = (TAG4 *)l4prev( &i4->tags, tagOn ) ;
 | 
						|
      if ( tagOn == 0 )
 | 
						|
      {
 | 
						|
         i4 = (INDEX4 *)l4prev( &d4->indexes, i4 )  ;
 | 
						|
         if ( i4 == 0 )
 | 
						|
            return 0 ;
 | 
						|
         return (TAG4 *)l4last( &i4->tags ) ;
 | 
						|
      }
 | 
						|
      return tagOn ;
 | 
						|
   #endif
 | 
						|
}
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4FILE *dfile4tagPrev( DATA4FILE *d4, TAG4FILE *tagOn )
 | 
						|
{
 | 
						|
   #ifdef S4INDEX_OFF
 | 
						|
      return 0 ;
 | 
						|
   #else
 | 
						|
      #ifndef N4OTHER
 | 
						|
         INDEX4FILE *i4 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E91102 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef N4OTHER
 | 
						|
         return (TAG4FILE *)l4prev( &d4->tagfiles, tagOn ) ;
 | 
						|
      #else
 | 
						|
         if ( tagOn == 0 )
 | 
						|
         {
 | 
						|
            i4 = (INDEX4FILE *)l4last( &d4->indexes ) ;
 | 
						|
            if ( i4 == 0 )
 | 
						|
               return 0 ;
 | 
						|
         }
 | 
						|
         else
 | 
						|
            i4 = tagOn->indexFile ;
 | 
						|
 | 
						|
         tagOn = (TAG4FILE *)l4prev( &i4->tags, tagOn ) ;
 | 
						|
         if ( tagOn )
 | 
						|
            return tagOn ;
 | 
						|
 | 
						|
         i4 = (INDEX4FILE *)l4prev( &d4->indexes, i4 ) ;
 | 
						|
         if ( i4 == 0 )
 | 
						|
            return 0 ;
 | 
						|
 | 
						|
         return (TAG4FILE *)l4last( &i4->tags ) ;
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
}
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
void S4FUNCTION d4tagSelect( DATA4 *d4, TAG4 *t4 )
 | 
						|
{
 | 
						|
   #ifdef S4VBASIC
 | 
						|
      if ( c4parm_check( d4, 2, E92409 ) )
 | 
						|
         return ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   #ifdef E4PARM_HIGH
 | 
						|
      if ( d4 == 0 )
 | 
						|
      {
 | 
						|
         error4( 0, e4parm_null, E92409 ) ;
 | 
						|
         return ;
 | 
						|
      }
 | 
						|
   #endif
 | 
						|
 | 
						|
   #ifdef S4INDEX_OFF
 | 
						|
      if ( t4 != 0 )
 | 
						|
      {
 | 
						|
         error4( d4->codeBase, e4notIndex, E92409 ) ;
 | 
						|
         return ;
 | 
						|
      }
 | 
						|
   #else
 | 
						|
      d4->tagSelected = t4 ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   return ;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4CLIENT
 | 
						|
int dfile4tagSelect( DATA4FILE *d4, TAG4FILE *t4 )
 | 
						|
{
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( d4 == 0 )
 | 
						|
         return error4( 0, e4parm_null, E91102 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   #ifdef S4INDEX_OFF
 | 
						|
      if ( t4 != 0 )
 | 
						|
         error4( d4->c4, e4notIndex, E91102 ) ;
 | 
						|
   #else
 | 
						|
      #ifdef N4OTHER
 | 
						|
         d4->tagfiles.selected = (LINK4 *)t4 ;
 | 
						|
      #else
 | 
						|
         #ifdef E4ANALYZE
 | 
						|
            if ( t4 )
 | 
						|
               if ( t4->indexFile->dataFile != d4 )
 | 
						|
                  return error4( t4->codeBase, e4struct, E91102 ) ;
 | 
						|
         #endif
 | 
						|
 | 
						|
         if ( t4 == 0 )
 | 
						|
            d4->indexes.selected = 0 ;
 | 
						|
         else
 | 
						|
         {
 | 
						|
            d4->indexes.selected = (LINK4 *)t4->indexFile ;
 | 
						|
            t4->indexFile->tags.selected = (LINK4 *)t4 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4 *S4FUNCTION d4tagSelected( DATA4 *d4 )
 | 
						|
{
 | 
						|
   #ifndef S4INDEX_OFF
 | 
						|
      #ifdef E4PARM_HIGH
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E92411 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      return d4->tagSelected ;
 | 
						|
   #else
 | 
						|
      return 0 ;
 | 
						|
   #endif
 | 
						|
}
 | 
						|
 | 
						|
#ifndef S4CLIENT
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
TAG4FILE *dfile4tagSelected( DATA4FILE *d4 )
 | 
						|
{
 | 
						|
   #ifndef S4INDEX_OFF
 | 
						|
      #ifndef N4OTHER
 | 
						|
         INDEX4FILE *index ;
 | 
						|
         TAG4FILE *tag ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4PARM_LOW
 | 
						|
         if ( d4 == 0 )
 | 
						|
         {
 | 
						|
            error4( 0, e4parm_null, E91102 ) ;
 | 
						|
            return 0 ;
 | 
						|
         }
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef N4OTHER
 | 
						|
         return (TAG4FILE *)d4->tagfiles.selected ;
 | 
						|
      #else
 | 
						|
         index = (INDEX4FILE *)d4->indexes.selected ;
 | 
						|
         if ( index )
 | 
						|
         {
 | 
						|
            tag = (TAG4FILE *)index->tags.selected ;
 | 
						|
            if ( tag )
 | 
						|
               return tag ;
 | 
						|
         }
 | 
						|
         return (TAG4FILE *)0 ;
 | 
						|
      #endif
 | 
						|
   #else
 | 
						|
      return (TAG4FILE *)0 ;
 | 
						|
   #endif
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef S4VB_DOS
 | 
						|
 | 
						|
TAG4 *d4tag_v( DATA4 *d4, char *name )
 | 
						|
{
 | 
						|
   return d4tag( d4, c4str(name) ) ;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |