Listing 2 (FAKELOCK.C) Hardware Lock Simulator

//
//      This function simulates the type of objects that come with
//      hardware locks. A real lock object module would make a call to
//      an external device attached to the printer port (or sometime the
//      RS232 port). The lock object module passes an input parameter to
//      the external device and reads the return value created by the
//      external device. The lock object module then returns a value
//      to the calling program.
//
//      FAKELOCK's input parameters are a pointer to a string of char
//      and an int, telling which lock to use. The second parameter is
//      present to simulate two locks.
//

#include <alloc.h> 
#include <string.h>
#include "fakelock.h" 

int     FAKELOCK( char* incode, int key )
{
  int   leng;               // length of input string, must be >=5
  int   merg;               // place where incode is merged with itself
  char* strincode;          // pointer to tempory storeage area
  int*  strlong;            // points to place in string;
  int  i,j;
  
  if ( (leng = strlen( incode )) < 5 )  // find leng of string parameter
    return ( 0 );                       // if not above minimun exit
  
  if ( (strincode = malloc( leng+4 )) == NULL ) // allocate tempory string area
    return ( 0 );                 // if tempory area not available exit
  
  strcpy( strincode, incode );     // copy input parameter to work area
  
  j = leng % 4;                   // determine length to get even 4 bytes
  
  if ( j != 0 )                    // if not even 4 bytes long
  {
    j = 4 - j;                     // determine fill length
    for ( i = 1; i <= j; i++ )
    {
      strincode[leng] = NULL;     // fill with NULL
      leng++;                     // increment length
    }
  }
  
  j = leng / 4;                   // determine number of loops in merge
  strlong = ((int *)strincode);    // get first four characters
  
  merg = *strlong;                // move first part of string to merge
  
  for ( i = 1; i < j; i++ )
  {
    strlon g++;                  // increment to next part of in string
    merg &= (long)(*strlong);     // bit wise and
  }
  
  switch ( key )
  {
    case 1 : merg ^= 11239; break;    // special code for lock 1
    case 2 : merg ^= 15096; break;    // special code for lock 2
    default: merg = 1;                // code when no key given
  }
  
  free( strincode );
  
  return ( merg );
}
/* End of File */