/* SYSC 1.0 by Eli0t/cONTORTIOn (C) 1996 - FREEWARE */

#include <stdio.h>
#include <string.h>

#define K4H    8

/*

  ERROR CODES:  (stupid tactic, but works!)
  =========================================

  0 - standard 4104 DX SYSEX O.K.
  1 - standard 4104 DX SYSEX bad!
  2 - bad number of parameters
  3 - I/O error
  4 - bad length

  =========================================

*/


main(int argc, char **argv)
{
  FILE *vstup;
  unsigned char pole[16384];
  unsigned int length, suma, i, j, k;

  suma=0;

       if(argc!=2)
  {
     printf("\n\233\061\155 Usage:\n         \233\062\155sysc filename\233\060\155\n\n");
     printf(" \233\061\155Eli0t Studios Project - \233\060\155\233\063\155eliot@sci.muni.cz \233\060\155\233\061\155- (C) 1996 cONTORTIOn\n");
     printf(" \233\063\063\155===============================================================\233\060\155\n");
     printf(" \233\061\155Check 4104 bytes long DX & 15123 bytes long K4 message checksum\233\060\155\n\n");
     return(2); /* bad number of parameters */
  }

  vstup=fopen(argv[1],"r");
       if (vstup==NULL)
  {
     printf("\233\061\155%s\233\060\155 - I/O error!\n\n",argv[1]);
     return(3);
  }

  length=fread(pole,(size_t) 1, (size_t) 16384, vstup);

  if ((length==4104) || (length==15123)) {}
  else
  {
     printf("\233\061\155%s\233\060\155 - bad \233\062\155LENGTH\233\060\155!\n",argv[1]);
     fclose(vstup);
     return(4);
  }
  fclose(vstup);



  if (length==4104) /* DX sysex check */
  {
     for(i=6;i<(length-1);i++) suma+=pole[i];
     suma&=((int) 127);
  }
  else
  {
     for(j=0;j<64;j++)
     {
          i=165;
          for(k=0;k<130;k++) i+=pole[k+(j*131)+K4H];
          i&=((int) 127);
          if (i!=pole[130+(j*131)+K4H])
          {
               suma=1;printf("Error on single: %d\n",j+1);
          }
     }
     for(j=0;j<64;j++)
     {
          i=165;
          for(k=0;k<76;k++) i+=pole[k+(j*77)+K4H+8384];
          i&=((int) 127);
          if (i!=pole[76+(j*77)+K4H+8384])
          {
               suma=1;printf("Error on multi: %d\n",j+1);
          }
     }
     i=165;
     for(k=0;k<10;k++) i+=pole[k+K4H+13312];
     i&=((int) 127);
     if (i!=pole[10+K4H+13312])
     {
          suma=1;printf("Error on drums/common\n");
     }
     for(j=1;j<62;j++)
     {
          i=165;
          for(k=0;k<10;k++) i+=pole[k+K4H+13312+(j*11)];
          i&=((int) 127);
          if (i!=pole[10+K4H+13312+(j*11)])
          {
               suma=1;printf("Error on drum: %d\n",j);
          }
     }
     for(j=0;j<32;j++)
     {
          i=165;
          for(k=0;k<34;k++) i+=pole[k+(j*35)+K4H+13994];
          i&=((int) 127);
          if (i!=pole[34+(j*35)+K4H+13994])
          {
               suma=1;printf("Error on effect: %d\n",j+1);
          }
     }
  }

  if (suma==0)
  {
     printf("\233\062\155%s\233\060\155 O.K.\n",argv[1]);
     return (0);
  }
  else
  {
     printf("\233\061\155%s\233\060\155 - bad \233\062\155CHECKSUM!\233\060\155\007\n",argv[1]);
     return (1);
  }
}
