#include <stdio.h>                          /* version 2026-04-09 12:26 UTC+2 */
#include "no3in_functions.h"                /* Achim Flammenkamp, Bielefeld   */
#ifndef  FREE
#define  FREE  '.'
#endif
#ifndef  MARK
#define  MARK  'o'
#endif


unsigned  copy_string(char buffer[], char *source)
// returns number of copied characters
{  unsigned i;
   for (i=0; i<2*MAX_N+4 && (buffer[i]=source[i]); i++);
   return i;
}


int main(int argc, char *argv[])
{
int  i, j, h, k, n;
unsigned  x[2*MAX_N], y[2*MAX_N], grid[MAX_N][MAX_N];
unsigned  flag, set, anz, valid, norm, leadin;
char  buffer[2*MAX_N+4], errline[32];
flag=0;
for (i=1;i<argc && argv[i][0]=='-';i++)
{ 
   if (!argv[i][1] || argv[i][1]=='-' || argv[i][2])
      break;
   switch (argv[i][1])
   { 
      case 'm': flag |= 1;  break; // show configuration as ASCII grafic
      case 'v': flag |= 2;  break; // verbose output
      case 'c': flag |= 4;  break; // only check configuration for validity
      case 'p': flag |= 8;  break; // check, normalize and print configuration
      case '?': printf("usage: %s [-mcnsv?][-d DATABASE] [coded_config_file]\n"
                       ,argv[0]);
                printf("       -?   gives this short explanation and exits\n");
                printf("       -m   show configuration as ASCII grafic\n");
                printf("       -c   only check configuration for validity\n");
                printf("       -p   check, normalize and print coding\n");
                printf("       -v   verbose output\n");
                printf("       --   indicates end of option list\n");
                return  0;
      default:  fprintf(stderr,"unknown option %s ignored\n",argv[i]);
                printf("usage: %s [-mcpv?] [coded_config coded_config ...]\n"
                       ,argv[0]);
                return -1;
   }
}
valid= norm= 0;
for(set=1;i==argc ? get_next_coded_config(stdin,buffer) : i+set-1 < argc
                    && copy_string(buffer,argv[i+set-1]);set++)
{  sprintf(errline," in configuration %u",set);
   switch (n=decode(buffer,x,y,&leadin))
   {  case -1: return fprintf(stderr,"decode error: n too large %u > %d%s\n",
                                     n,MAX_N,errline), -2;
      case -2: return fprintf(stderr,"decode error: illegal character%s\n",
                                     errline), -3;
      case -3: return fprintf(stderr,"decode error: alphabet error or symme"
                                     "try sign invalid %s\n",errline), -4;
      case -4: return fprintf(stderr,"decode error: odd number of characters"
                                     "%s\n",errline), -5;
      case -5: return fprintf(stderr,"decode error: the maximal character"
                                     " is != n%s\n",errline), -6;
      case -6: return fprintf(stderr,"decode error: more than 2 markers in"
                                     " a column%s\n",errline), -7;
   }
   if (!n)
   {  // degenerated case: grid size is 0
#ifdef  SIMPLE
      printf("n = 0\n");
#else
      printf("%3uth configuration",set);
      for (j=0;SYMM[j];j++)
         if (buffer[0]==SYMM[j])
            break;
      if (SYMM[j] && SYMM[j+1])
         printf("    symmetry  %s",symclass(j));
      printf("\n");
#endif
      valid++;  // should/can be in database as default
      continue;
   }
   anz= 2*n;
   for (h=anz;h--;anz--)
      if (x[h] != ~0 && y[h] != ~0)
         break;
   if (flag&1)
      print_config(2*n+leadin,buffer,set,FREE,MARK,stdout);
   if (n == 1)
      return  fprintf(stderr,"location multiple placed%s\n",errline), -8;
   if (h= check_validity(n,x,y))
      return  fprintf(stderr,"%d violating tripels%s\n",h,errline), -9;
   k= symmetry_index(n,x,y,0);
   if (k == 9)
      return  fprintf(stderr,"symmetry_check: internal error%s\n",errline), -10;
#ifdef  SIMPLE
   if (leadin)
      printf("symmetry %s\n",symclass(k));
#endif
   if (leadin && SYMM[k] != buffer[0])
   {  fprintf(stderr,"wrong symmetry character %c changed to correct %c %s\n",
              buffer[0],SYMM[k],errline);
      buffer[0]= SYMM[k];
   }
   valid++;
   if (!(flag&4))
   {  if (normalize(n,x,y))
      {  norm++;
         if (flag&2)
            fprintf(stdout,"%uth configuration was normalized\n",set);
      }
      if (flag&8)
      {   if (encode(n,x,y,buffer,k) < 0)
            return  fprintf(stderr,"not exactly two positions in each row%s\n",
                            errline), -12;
          buffer[2*n+1]='\n';
          buffer[2*n+2]= 0;
          fputs(buffer,stdout);
      }
   }
}
fprintf(stderr,"%u configurations decoded of which are %u valid",set-1,valid);
if (!(flag&4))
{  fprintf(stderr,", %u normalized",norm);
}
fputs("\n",stderr);
return  0;
}
