1 /*
2  * Copyright (c) 1997-1999, 2003 Massachusetts Institute of Technology
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  *
18  */
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 
23 #include "fftw-int.h"
24 
25 /**************** import/export using file ***************/
26 
file_emitter(char c,void * data)27 static void file_emitter(char c, void *data)
28 {
29      putc(c, (FILE *) data);
30 }
31 
fftw_export_wisdom_to_file(FILE * output_file)32 void fftw_export_wisdom_to_file(FILE *output_file)
33 {
34      if (output_file)
35 	  fftw_export_wisdom(file_emitter, (void *) output_file);
36 }
37 
file_get_input(void * data)38 static int file_get_input(void *data)
39 {
40      return getc((FILE *) data);
41 }
42 
fftw_import_wisdom_from_file(FILE * input_file)43 fftw_status fftw_import_wisdom_from_file(FILE *input_file)
44 {
45      if (!input_file)
46 	  return FFTW_FAILURE;
47      return fftw_import_wisdom(file_get_input, (void *) input_file);
48 }
49 
50 /*************** import/export using string **************/
51 
emission_counter(char c,void * data)52 static void emission_counter(char c, void *data)
53 {
54      int *counter = (int *) data;
55 
56      ++*counter;
57 }
58 
string_emitter(char c,void * data)59 static void string_emitter(char c, void *data)
60 {
61      char **output_string = (char **) data;
62 
63      *((*output_string)++) = c;
64      **output_string = 0;
65 }
66 
fftw_export_wisdom_to_string(void)67 char *fftw_export_wisdom_to_string(void)
68 {
69      int string_length = 0;
70      char *s, *s2;
71 
72      fftw_export_wisdom(emission_counter, (void *) &string_length);
73 
74      s = (char *) fftw_malloc(sizeof(char) * (string_length + 1));
75      if (!s)
76 	  return 0;
77      s2 = s;
78 
79      fftw_export_wisdom(string_emitter, (void *) &s2);
80 
81      if (s + string_length != s2)
82 	  fftw_die("Unexpected output string length!\n");
83 
84      return s;
85 }
86 
string_get_input(void * data)87 static int string_get_input(void *data)
88 {
89      char **input_string = (char **) data;
90 
91      if (**input_string)
92 	  return *((*input_string)++);
93      else
94 	  return 0;
95 }
96 
fftw_import_wisdom_from_string(const char * input_string)97 fftw_status fftw_import_wisdom_from_string(const char *input_string)
98 {
99      const char *s = input_string;
100 
101      if (!input_string)
102 	  return FFTW_FAILURE;
103      return fftw_import_wisdom(string_get_input, (void *) &s);
104 }
105