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