
#include <stdio.h>
#include <string.h>

#pragma pack(1)

typedef unsigned short word;
typedef unsigned int   uint;
typedef unsigned char  byte;

uint flen( FILE* f ) {
  fseek( f, 0, SEEK_END );
  uint len = ftell(f);
  fseek( f, 0, SEEK_SET );
  return len;
}

// reimport rec.exe lzrec_export.!!! rec1.exe;

int main( int argc, char** argv ) {

  if( argc<=3 ) return 1;

  FILE* f1 = fopen( argv[1], "rb" ); if( f1==0 ) return 1;
  FILE* f2 = fopen( argv[2], "rb" ); if( f2==0 ) return 1;
  FILE* g1 = fopen( argv[3], "wb" ); if( g1==0 ) return 1;

  uint f1len = flen(f1);
  byte* f1buf = new byte[f1len]; if( f1buf==0 ) return 2;
  fread( f1buf, 1,f1len, f1 );
  fclose(f1);

  uint f2len = flen(f2);
  byte* f2buf = new byte[f2len]; if( f2buf==0 ) return 2;
  fread( f2buf, 1,f2len, f2 );
  fclose(f2);

  uint i,j,k,l,n;

  char s1[] = "mdesc( "; uint s1len=sizeof(s1)-1;
  char s2[] = "!MAP!"; uint s2len=sizeof(s2)-1;
  n = f2len-s1len-3;

  for( i=0; i<n; i++ ) {
    if( strncmp((char*)&f2buf[i],s1,s1len)==0 ) {
      for( j=i; j<n-1; j++ ) if( f2buf[j]==',' ) break; f2buf[j]=0;


      char* p = (char*)&f2buf[i+s1len];
      l = j-(i+s1len);

      for( j=j; j<f2len-1; j++ ) if( f2buf[j]=='"' ) break; 
      char* q = (char*)&f2buf[++j];
      for( j=j; j<f2len-1; j++ ) if( f2buf[j]=='"' ) break; f2buf[j]=0;
      uint qlen=strlen(q);

//printf( "%08X: %s %s\n", i, p, q );

      for( k=0; k<f1len-l; k++ ) {
        if( (((uint&)f1buf[k-s2len])=='PAM!') && (strncmp((char*)&f1buf[k],p,l)==0) ) {
          char* v = (char*)&f1buf[k]; v += strlen(v)+1;
          uint vlen = strlen(v);
//printf( "   %08X: %s %i %i\n", k, v, vlen, qlen );
          if( vlen==qlen ) strcpy(v,q);
        }
      }

    }
  }

  fwrite( f1buf, 1,f1len, g1 );
  fclose(g1);

}








