1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <strings.h>
4 
5 #include <mut.h>
6 #include <mlo.h>
7 #include <mlu.h>
8 #include "spi_global.h"
9 
10 spimodel *SPIHEADMODEL = NULL;
11 
12 void spiloaderror( char*, int, char* );
13 
spiloadmodel(void)14 void spiloadmodel( void )
15 {
16   char *env, place[80], word[80], *pt, *buffer;
17   FILE *ptf;
18   int line;
19   spimodel *new;
20 
21   env = mbkgetenv( "MBK_SPI_MODEL" );
22 
23   if( !env )
24   {
25     fflush( stdout );
26     fprintf( stderr, "*** ERROR *** : Variable MBK_SPI_MODEL not found.\n" );
27     fprintf( stderr, "                try ""man spi""\n");
28     EXIT(1);
29   }
30 
31   ptf = fopen( env, "r" );
32   if( !ptf )
33   {
34     fflush( stdout );
35     fprintf( stderr, "*** ERROR *** : Can't open file %s.\n", env );
36     EXIT(1);
37   }
38 
39   line = 0;
40   while( ! feof( ptf ) )
41   {
42     line++;
43     fgets( place, 80, ptf );
44 
45     /* On remplace le \n par un caractere de fin de chaine */
46     buffer=place;
47     while( *buffer )
48     {
49       if( *buffer=='\n' )
50       {
51         *buffer=0;
52         break;
53       }
54       buffer++;
55     }
56 
57     buffer=place;
58     /* On passe les espaces en t�te de fichier */
59     while( *buffer==' ' && *buffer )
60       buffer++;
61 
62     if( !*buffer )
63       continue;
64     if( *buffer == '#' )
65       continue;
66 
67     /* On recopie le nom */
68     pt=word;
69     while( *buffer!=' ' && *buffer )
70     {
71        *pt=*buffer;
72        pt++;
73        buffer++;
74     }
75     *pt=0;
76 
77     new = mbkalloc( sizeof( spimodel ) );
78     new->NEXT  = SPIHEADMODEL ;
79     new->MODEL = namealloc( word );
80     new->TYPE  = 0;
81     SPIHEADMODEL = new;
82 
83     while( *buffer==' ' && *buffer )
84       buffer++;
85     if( !*buffer )
86       spiloaderror( env, line, "No type found" ); /*le type est obligatoire */
87 
88     /* La suite est le type, N ou P */
89 
90     switch( *buffer )
91     {
92       case 'N':
93       case 'n':
94         new->TYPE = new->TYPE | TRANSN ;
95         break;
96       case 'P':
97       case 'p':
98         new->TYPE = new->TYPE | TRANSP ;
99         break;
100       default :
101         spiloaderror( env, line, "Bad type" );
102     }
103     buffer++;
104 
105     if( *buffer!=' ' && *buffer!='\0' )
106       spiloaderror( env, line, "Bad type" );
107 
108     while( *buffer==' ' && *buffer )
109       buffer++;
110 
111     while( *buffer )
112     {
113       pt=word;
114       while( *buffer!=' ' && *buffer )
115       {
116         *pt=*buffer;
117         pt++;
118         buffer++;
119       }
120       *pt=0;
121 
122       if( strcasecmp( word, "FAST" ) == 0 )
123         new->TYPE = new->TYPE | TRANSFAST;
124       else
125       if( strcasecmp( word, "HVIO" ) == 0 )
126         new->TYPE = new->TYPE | TRANSHVIO;
127       else
128         spiloaderror( env, line, "Unknown option" );
129 
130       while( *buffer==' ' && *buffer )
131         buffer++;
132     }
133   }
134 
135   fclose( ptf );
136 }
137 
spiloaderror(char * name,int line,char * reason)138 void spiloaderror( char *name, int line, char *reason )
139 {
140   fflush( stdout );
141   fprintf( stderr, "*** ERROR *** bad model file %s line %d\n", name, line );
142   fprintf( stderr, "Reason is : %s.\n", reason );
143   EXIT(1);
144 }
145 
spitransmodel(char type)146 char* spitransmodel( char type )
147 {
148   spimodel *scan;
149 
150   if( !SPIHEADMODEL )
151     spiloadmodel();
152 
153   for( scan = SPIHEADMODEL ; scan ; scan = scan->NEXT )
154   {
155     if( scan->TYPE == type )
156       return( scan->MODEL );
157   }
158 
159   fflush( stdout );
160   fprintf( stderr, "*** ERROR *** No known type.\n" );
161   fprintf( stderr, "Flags : %c %s %s\n",
162            IsTransN(type)?'N':'P',
163            IsTransFast(type)?"FAST":"---",
164            IsTransHvio(type)?"HVIO":"---"
165          );
166   EXIT(1);
167 
168   return(0);
169 }
170 
spitranstype(char * model)171 char spitranstype( char *model )
172 {
173   spimodel *scan;
174 
175   if( !SPIHEADMODEL )
176     spiloadmodel();
177 
178   for( scan = SPIHEADMODEL ; scan ; scan = scan->NEXT )
179   {
180     if( strcasecmp(scan->MODEL, model) == 0 )
181       return( scan->TYPE );
182   }
183 
184   return(SPI_UNK_TRANS_TYPE);
185 }
186