55#include "../values.h"
66
77char * cc = "/usr/bin/gcc" ;
8- char * cflags = "-I$MOSHHOME/../c_runtime -L$MOSHHOME/../c_runtime -lc_runtime" ;
8+ char * cflags = "-I$MOSHHOME/../c_runtime -L$MOSHHOME/../c_runtime -lc_runtime -lm" ;
9+
10+ void * generate_array (char ,int ,type_description * ,void * data );
11+ float next_realelt (float * );
12+ int next_intelt (int * );
913
1014void System_5finit (void )
1115{
@@ -21,7 +25,9 @@ RML_BEGIN_LABEL(System__compile_5fc_5ffile)
2125 if (cc == NULL || cflags == NULL ) {
2226 /* RMLFAIL */
2327 }
24- memcpy (exename ,str ,strlen (str )- 1 );
28+ memcpy (exename ,str ,strlen (str )- 2 );
29+ exename [strlen (str )- 2 ]= '\0' ;
30+
2531 sprintf (command ,"%s %s -o %s %s" ,cc ,str ,exename ,cflags );
2632 printf ("compile using: %s\n" ,command );
2733 if (system (command ) != 0 ) {
@@ -65,7 +71,7 @@ RML_BEGIN_LABEL(System__execute_5ffunction)
6571 char * str = RML_STRINGDATA (rmlA0 );
6672 char command [255 ];
6773 int ret_val ;
68- sprintf (command ,"%s %s_in.txt %s_out.txt" ,str ,str ,str );
74+ sprintf (command ,"./ %s %s_in.txt %s_out.txt" ,str ,str ,str );
6975 ret_val = system (command );
7076
7177 assert (ret_val == 0 );
@@ -102,7 +108,10 @@ RML_BEGIN_LABEL(System__read_5fvalues_5ffrom_5ffile)
102108 type_description desc ;
103109 void * res , * res2 ;
104110 int ival ;
105- double rval ;
111+ float rval ;
112+ float * rval_arr ;
113+ int * ival_arr ;
114+ int size ;
106115
107116 char * filename = RML_STRINGDATA (rmlA0 );
108117 FILE * file = NULL ;
@@ -123,34 +132,95 @@ RML_BEGIN_LABEL(System__read_5fvalues_5ffrom_5ffile)
123132 }
124133 else /* Array value */
125134 {
126- int currdim ,el ;
135+ int currdim ,el , i ;
127136 if (desc .type == 'r' ) {
128- res = (void * ) mk_nil ();
137+ /* Create array to hold inserted values, max dimension as size */
138+ size = 1 ;
129139 for (currdim = 0 ;currdim < desc .ndims ; currdim ++ ) {
130- res2 = (void * )mk_nil ();
131- for (el = 0 ; el < desc .dim_size [currdim ]; el ++ ) {
132- fscanf (file ,"%e" ,& rval );
133- res2 = (void * ) mk_cons (Values__REAL (mk_rcon (rval )),res2 );
134- }
135- res = (void * ) mk_cons (res ,Values__ARRAY (res2 ));
140+ size *= desc .dim_size [currdim ];
136141 }
137- res = (void * ) Values__ARRAY (res2 );
142+ rval_arr = (float * )malloc (sizeof (float )* size );
143+ assert (rval_arr );
144+ /* Fill the array in reversed order */
145+ for (i = size - 1 ;i >=0 ;i -- ) {
146+ fscanf (file ,"%e" ,& rval_arr [i ]);
147+ }
148+
149+ next_realelt (NULL );
150+ /* 1 is current dimension (start value) */
151+ res = (void * ) Values__ARRAY (generate_array ('r' ,1 ,& desc ,(void * )rval_arr ));
138152 }
139-
140- if (desc .type == 'r' ) {
141- res = (void * ) mk_nil ();
153+
154+ if (desc .type == 'i' ) {
155+ int currdim ,el ,i ;
156+ /* Create array to hold inserted values, mult of dimensions as size */
157+ size = 1 ;
142158 for (currdim = 0 ;currdim < desc .ndims ; currdim ++ ) {
143- res2 = (void * ) mk_nil ();
144- for (el = 0 ; el < desc .dim_size [currdim ]; el ++ ) {
145- fscanf (file ,"%e" ,& rval );
146- res2 = (void * ) mk_cons (Values__REAL (mk_rcon (rval )),res2 );
147- }
148- res = (void * ) mk_cons (res ,Values__ARRAY (res2 ));
159+ size *= desc .dim_size [currdim ];
160+ }
161+ ival_arr = (int * )malloc (sizeof (int )* size );
162+ assert (rval_arr );
163+ /* Fill the array in reversed order */
164+ for (i = size - 1 ;i >=0 ;i -- ) {
165+ fscanf (file ,"%f" ,& ival_arr [i ]);
149166 }
150- res = (void * ) Values__ARRAY (res2 );
167+ next_intelt (NULL );
168+ res = (void * ) Values__ARRAY (generate_array ('i' ,1 ,& desc ,(void * )ival_arr ));
169+
151170 }
152171 }
153172 rmlA0 = (void * )res ;
154173 RML_TAILCALLK (rmlSC );
155- }
174+ }
156175RML_END_LABEL
176+
177+ float next_realelt (float * arr )
178+ {
179+ static int curpos ;
180+
181+ if (arr == NULL ) {
182+ curpos = 0 ;
183+ return 0.0 ;
184+ }
185+ else {
186+ return arr [curpos ++ ];
187+ }
188+ }
189+
190+ int next_intelt (int * arr )
191+ {
192+ static int curpos ;
193+
194+ if (arr == NULL ) {
195+ curpos = 0 ;
196+ return 0.0 ;
197+ }
198+ else return arr [curpos ++ ];
199+ }
200+
201+ void * generate_array (char type , int curdim , type_description * desc ,void * data )
202+
203+ {
204+ void * lst ;
205+ float rval ;
206+ int ival ;
207+ int i ;
208+ lst = (void * )mk_nil ();
209+ if (curdim == desc -> ndims ) {
210+ for (i = 0 ; i < desc -> dim_size [curdim - 1 ]; i ++ ) {
211+ if (type == 'r' ) {
212+ rval = next_realelt ((float * )data );
213+ lst = (void * )mk_cons (Values__REAL (mk_rcon (rval )),lst );
214+
215+ } else if (type == 'i' ) {
216+ ival = next_intelt ((int * )data );
217+ lst = (void * )mk_cons (Values__INTEGER (mk_icon (ival )),lst );
218+ }
219+ }
220+ } else {
221+ for (i = 0 ; i < desc -> dim_size [curdim - 1 ]; i ++ ) {
222+ lst = mk_cons (Values__ARRAY (generate_array (type ,curdim + 1 ,desc ,data )),lst );
223+ }
224+ }
225+ return lst ;
226+ }
0 commit comments