/* PAT_FUNCS.C	module
   Friday, November 17th 1995

   NOTES: Module containg functions retrieving information from *.pat files
          used by SNNS

*/


#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "pat_funcs.h"





/* Each field cannot exceed BUFFER_SIZE characters */
#define BUFFER_SIZE 256
/* Each line in the file shouldn't exceed MAX_LINE_SIZE characters */
#define MAX_LINE_SIZE 2048
#define COMMENT_CHARACTER '#'
#define TRUE  1
#define FALSE 0




int is_white_line();
int is_comment_line();




int pat_read_info(fp,patterns,inputs,outputs)
FILE *fp;
unsigned *patterns;
unsigned *inputs;
unsigned *outputs;
{ char line_string[MAX_LINE_SIZE+1];
  char buffer[BUFFER_SIZE+1];
  char *chptr;
  int flag1=0;
  int flag2=0;
  int flag3=0;

  *patterns=0;
  *inputs=0;
  *outputs=0;

  do { fgets(line_string,MAX_LINE_SIZE,fp);
       line_string[strlen(line_string)-1]='\0';
       if(is_white_line(line_string)) continue;
       if(is_comment_line(line_string)) continue;
       if(strstr(line_string,"No. of patterns"))
         { chptr=line_string;
           while(*chptr!=':') chptr++;
           chptr++;
           sscanf(chptr,"%u",patterns);
           flag1=1;
           continue;
         }
       if(strstr(line_string,"No. of input units"))
         { chptr=line_string;
           while(*chptr!=':') chptr++;
           chptr++;
           sscanf(chptr,"%u",inputs);
           flag2=1;
           continue;
         }
       if(strstr(line_string,"No. of output units"))
         { chptr=line_string;
           while(*chptr!=':') chptr++;
           chptr++;
           sscanf(chptr,"%u",outputs);
           flag3=1;
           continue;
         }  
     } while(!feof(fp));
   
  rewind(fp);
  return (flag1&&flag2&&flag3);
 



}/* End of res_read_info() */






/* # OUTPUT(1)=name of output

   If table==NULL then only the num_of_names is returned

*/
void pat_read_output_names(fp,num_of_names,table)
FILE *fp;
unsigned *num_of_names;
char **table;
{ char line_string[MAX_LINE_SIZE+1];
  char *chptr;
  unsigned u,outputs;


  do { fgets(line_string,MAX_LINE_SIZE,fp);
       line_string[strlen(line_string)-1]='\0';
       if(is_white_line(line_string)) continue;
       if(is_comment_line(line_string)) continue;
       if(strstr(line_string,"No. of output units :"))
         { chptr=line_string+21;
           sscanf(chptr,"%u",&outputs);
           break;
         }  
     } while(!feof(fp));

  rewind(fp);


  (*num_of_names)=0;

  do { fgets(line_string,MAX_LINE_SIZE,fp);
       line_string[strlen(line_string)-1]='\0';
       if(is_comment_line(line_string))
         { if(!strstr(line_string,"OUTPUT")) continue; 
           (*num_of_names)++;
           chptr=strchr(line_string,'(');
           chptr++;
           sscanf(chptr,"%u",&u);
           if((u==0)||(u>outputs)) 
             { (*num_of_names)--;
               continue;
             }
           chptr=strchr(line_string,'=');
           chptr++;
           if(table!=NULL) strcpy(table[u-1],chptr);
         }
       if((*num_of_names)==outputs) break;      

     } while(!feof(fp)); 

   
  rewind(fp);
  return;
 


}/* End of pat_read_output_names() */





/* # INPUT(1)=name of output

   If table==NULL then only the num_of_names is returned

*/
void pat_read_input_names(fp,num_of_names,table)
FILE *fp;
unsigned *num_of_names;
char **table;
{ char line_string[MAX_LINE_SIZE+1];
  char *chptr;
  unsigned u,outputs;


  do { fgets(line_string,MAX_LINE_SIZE,fp);
       line_string[strlen(line_string)-1]='\0';
       if(is_white_line(line_string)) continue;
       if(is_comment_line(line_string)) continue;
       if(strstr(line_string,"No. of output units :"))
         { chptr=line_string+21;
           sscanf(chptr,"%u",&outputs);
           break;
         }  
     } while(!feof(fp));

  rewind(fp);


  (*num_of_names)=0;

  do { fgets(line_string,MAX_LINE_SIZE,fp);
       line_string[strlen(line_string)-1]='\0';
       if(is_comment_line(line_string))
         { if(!strstr(line_string,"INPUT")) continue; 
           (*num_of_names)++;
           chptr=strchr(line_string,'(');
           chptr++;
           sscanf(chptr,"%u",&u);
           if((u==0)||(u>outputs)) 
             { (*num_of_names)--;
               continue;
             }
           chptr=strchr(line_string,'=');
           chptr++;
           if(table!=NULL) strcpy(table[u-1],chptr);  
         }
       if((*num_of_names)==outputs) break;      

     } while(!feof(fp)); 

   
  rewind(fp);
  return;
 


}/* End of pat_read_input_names() */








int pat_read_data(fp,input_data,output_data,patterns,inputs,outputs)
FILE *fp;
double **input_data;
double **output_data;
unsigned patterns;
unsigned inputs;
unsigned outputs;
{ char line_string[MAX_LINE_SIZE+1];
  char buffer[BUFFER_SIZE+1];
  char *chptr;
  unsigned p,t,pos;
  double d;
  
  /* strip off *.res header */
  do { fgets(line_string,MAX_LINE_SIZE,fp);
      if(strstr(line_string,"No. of output units")) break;
      } while(!feof(fp));
   if(feof(fp)) return FALSE;


  /* read patterns */
  for(p=0;p<patterns;p++)
     {  /* read inputs */
        again:
        fgets(line_string,MAX_LINE_SIZE,fp);
        if(feof(fp)) return FALSE;
        line_string[strlen(line_string)-1]='\0';
        if(is_white_line(line_string)||is_comment_line(line_string)) goto again;
        chptr=line_string;
        for(t=0;t<inputs;t++)
           { pos=0;
             while(isspace(*chptr)) chptr++;
             while(!isspace(*chptr))
                  { buffer[pos]=(*chptr);
                    pos++;
                    chptr++; 
                  }
             buffer[pos]='\0';
             
             sscanf(buffer,"%lf",&d);
             input_data[p][t]=d;
           }

       /* read desired outputs  */
       again2:
       fgets(line_string,MAX_LINE_SIZE,fp);
        if(feof(fp)) return FALSE;
        line_string[strlen(line_string)-1]='\0';
        if(is_white_line(line_string)||is_comment_line(line_string)) goto again2;
        chptr=line_string;
        for(t=0;t<outputs;t++)
           { pos=0;
             while(isspace(*chptr)) chptr++;
             while(!isspace(*chptr))
                  { buffer[pos]=(*chptr);
                    pos++;
                    chptr++; 
                  }
             buffer[pos]='\0';
             sscanf(buffer,"%lf",&d);
             output_data[p][t]=d;
           }      
     }

   
  return TRUE;



}/* End of pat_read_data() */



 



int is_white_line(line)
char *line;
{ register unsigned i=0;
  int flag=1;
  
  while(line[i]!='\0')
       { if(!isspace(line[i])) flag=0;
         i++;
       }
  return flag;


}/* End of is_white_line() */




int is_comment_line(line)
char *line;
{ register unsigned i=0;

  while(isspace(line[i])) i++;
  if(line[i]==COMMENT_CHARACTER) return TRUE;
  return FALSE;


}/* End of is_comment_line() */
























