/* TestFileToMat.c */

#include <stdio.h>

#define NN 300
#define FileData "MatrixDataFile3.txt"
#define INF 0XEFFFFF

int FileToMat(int*);
void DisplayMat(int*);

void main(void)
{
 int K,    Mat[NN];

 K = FileToMat(Mat);
 if (!K) goto FIN;
 DisplayMat(Mat);

FIN:
 getchar();
}

/**************************************************************/

int FileToMat(int *P)
{
 int I,J,K,M,N,Neg;        char CH,*S,*SS,SData[NN];
 FILE *F;

 if ((F=fopen(FileData,"r"))==NULL)
  {printf("Cannot open file %s\n",FileData); return 0;}

 CH=(char)fgetc(F);   N=0;
LP2:
 while ((!feof(F)) && (CH != '[')) CH=(char)fgetc(F);     /* find next [ */

 K=0;
 if (!feof(F))
  {
   N++; printf("%d  ",N);
   while (CH != ']') {putchar(CH); CH=(char)fgetc(F);}
   puts("]\n");
   goto LP2;
  }

 INX:
  puts("Input number before the selected data-input (zero to abort):");
  scanf("%d",&K); getchar();
  if (!K) {fclose(F); return 0;}
  if ((K<0) || (K>N)) {printf("Number must be between 1 and %d\n",N); goto INX;}

  rewind(F);

  CH = (char)fgetc(F);
  for (I=1; I<K; I++)
   {
    while (CH != ']') CH = (char)fgetc(F);
   CH = (char)fgetc(F);
  }

 
 CH = (char)fgetc(F);   S=SData;
 while (CH != '[') CH = (char)fgetc(F);    *S=CH; S++;
 CH = (char)fgetc(F);    *S=CH;  S++;
 if ((CH != 'M') && (CH != 'm'))
  {puts("ERROR: No marker M immediately after ["); return 0;}
 CH = (char)fgetc(F);
 while (CH != ']') {*S=CH; CH = (char)fgetc(F); S++;}
 *S=']';
 fclose(F);

 S++; *S='\0';
 puts(SData);

 S=SData;
 while ((*S<'0') || (*S>'9')) S++;
 K=0;
 while ((*S>='0') && (*S<='9')) {K = K*10 + *S - 48; S++;}  *P=K; P++;

 M = K/100;  N = K%100;
 printf("%dx%d\n",M,N);

 for (I=1; I<=M; I++)
  {
   for (J=1; J<=N; J++)
    {
     Neg=0;
     while ((*S<'0') || (*S>'9')) S++;
     SS=S; SS--;
     if (*SS=='-') Neg=-1;
     K=0;
     while ((*S>='0') && (*S<='9')) {K = K*10 + *S - 48; S++;}
     if (Neg) K=-K; *P=K; P++;
    }
  }
 *P=INF;
 return 1;
}

/***************************************************************************/

void DisplayMat(int *P)        /* P -> linear matrix array */
 {
  int I,J,K,M,N,Max=0,T;    char S1[] = "%1d%2d%3d%4d%5d%6d%7d%8d%9d",S2[3];

  M=*P/100;  N=*P%100;  P++;
  for (I=1; I<=M; I++)
   {
    for (J=1; J<=N; J++)
     {
      if (*P>=0) K=*P; else K=-*P;
      if (K>Max) Max=K;
    }
  }

 T=1; K=1;
 while (T<=Max) {T=T*10; K++;} 
 for (I=0; I<3; I++) S2[I] = S1[3*K+I];  S2[3]='\0';


 for (I=1; I<=M; I++)
   {
    for (J=1; J<=N; J++) {printf(S2,*P); P++;}
    puts("");
  }

 return;
}

