#include <stdio.h>       /* version of 2026-04-01 16:46 */
#include <math.h>        /* read from stdin & interprets empty lines */
#include "no3in_functions.h"

static unsigned  x[2*MAX_N], y[2*MAX_N], count[MAX_N][NO_SYM+1];
// grid size limits for given symmetry which are completely scaned  ".:/-ox+*c?"
static unsigned  max_n[NO_SYM] = { 19, 25, 27, 34, 54, 48, 54, 98, 53, 0 };


int main(int argc, char *argv[])
{
unsigned  set, anz, h, i, j, k, l, m, n, maxn[NO_SYM];
char  buffer[2*MAX_N+4], errline[16];
FILE  *fp = (argc>1 ? fopen(argv[1],"r") : stdin);
if (!fp)
   return  fprintf(stderr,"Can't open %s\n",argv[1]), -1;
errline[0]='\0';
for (i=0;i<NO_SYM;i++)
   maxn[i]= 0;
for (i=0;i<MAX_N;i++)
   for (j=0;j<=NO_SYM;j++)
      count[i][j]= 0;
for (l=0;l<4;l++)
   printf("(count, n, start)%s",(l<3?"  ":"\n"));
m= 0;
anz= 0;
l= 0;
for (set=0;fgets(buffer,2*MAX_N+4,fp);set++)
{  if (fp != stdin)
      sprintf(errline," in line %u",set+1);
   for (h=0;SYMM[h];h++)
      if (buffer[0]==SYMM[h])
         break;
   for (i=1;buffer[i]>' ';i++);
   i -= !!SYMM[h];
   if (i&1)
      return  fprintf(stderr,"Odd number of characters%s\n",errline), -1;
   n = i/2;
   if (!n)
      continue;  // degenerated case of grid size 0
   if (n != m)
   {  if (anz)
      {  l++;
         printf("(%5u,%2u,%6u)  ",anz,m,set-anz+1);
         if (!(l%4))
            printf("\n");
      }
      anz=0;
      m= n;
   }
   anz++;
   if (h >= NO_SYM || !SYMM[h])
      return  fprintf(stderr,"Invalid symmetry symbol%s\n",errline), -1;
   count[n-1][h]++;
   if (buffer[0]=='c')  // rct4 counted to rot2
      count[n-1][1]++;
   count[n-1][NO_SYM]++;  // total count
   if (n > maxn[h])
      maxn[h]= n;
}
if (fp != stdin)
   fclose(fp);
if (anz)
   printf("(%5u,%2u,%6u)\n",anz,m,set-anz+1);
fprintf(stderr,"%u configurations read\n\n",set);
printf(" n ");
for (h=0;h<NO_SYM;h++)
   printf(" %6s",symclass(h));
printf(" %6s\n","sum");
for (h=0;h<=NO_SYM;h++)
   printf("-------");
printf("---\n");
for (j=MAX_N;j;)
   if (count[--j][NO_SYM])
      break;
for (i=0;i<=j;i++)
{  printf("%2u ",i+1);
   for (h=0;h<=NO_SYM;h++)
   {  char  z= i < max_n[h<NO_SYM?h:0] ? '!' : ' ';
      if (count[i][h])
         printf("%6u%c",count[i][h],z);
      else if (!i && h<7)
         printf("     - ");
      else if ((i+1&1) && (h==3 || h==4 || h==6 || h==7&&i)  ||  (i&1) && h==8)
         printf("     - ");
      else
         printf("     0%c",z);
   }
   printf("\n");
}
fprintf(stderr,"no configuration stored/found for n=");
for (i=0;i<j;i++)
   if (!count[i][NO_SYM])  fprintf(stderr,"%u,",i+1);
fprintf(stderr," and every n >= %u\n",j+2);
fprintf(stderr,"\n       maximal known size in the symmetry class\n");
printf("   ");
for (h=0;h<NO_SYM;h++)
   printf(" %6s",symclass(h));
printf("\n");
for (h=0;h<=NO_SYM;h++)
   printf("-------");
printf("\n n");
for (h=0;h<NO_SYM;h++)
   if (maxn[h])
      printf(" %6u",maxn[h]);
   else
      printf("      -");
printf("\n");

return 0;
}
