Mercurial > hg > octave-nkf
annotate liboctave/sparse-mk-ops.awk @ 10431:5dd7a7bf4950
simplify sparse->full conversions in liboctave
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Mon, 22 Mar 2010 12:05:33 +0100 |
parents | 42d098307c30 |
children | fd0a3ac60b0e |
rev | line source |
---|---|
7019 | 1 # Copyright (C) 2004, 2005, 2007 John W. Eaton |
2 # | |
3 # This file is part of Octave. | |
4 # | |
5 # Octave is free software; you can redistribute it and/or modify it | |
6 # under the terms of the GNU General Public License as published by the | |
7 # Free Software Foundation; either version 3 of the License, or (at | |
8 # your option) any later version. | |
9 # | |
10 # Octave is distributed in the hope that it will be useful, but WITHOUT | |
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
13 # for more details. | |
14 # | |
15 # You should have received a copy of the GNU General Public License | |
16 # along with Octave; see the file COPYING. If not, see | |
17 # <http://www.gnu.org/licenses/>. | |
18 | |
5164 | 19 BEGIN { |
20 declare_types = 0; | |
21 generate_ops = 0; | |
22 ntypes = 0; | |
23 } { | |
24 if (NR == 1 && make_inclusive_header) | |
25 { | |
26 print "// DO NOT EDIT -- generated by sparse-mk-ops"; | |
27 tmp = make_inclusive_header; | |
28 gsub (/[\.-]/, "_", tmp); | |
29 printf ("#if !defined (octave_%s)\n", tmp); | |
30 printf ("#define octave_%s 1\n", tmp); | |
31 } | |
32 } | |
33 /^#/ { | |
34 if ($2 == "types") | |
35 declare_types = 1; | |
36 else if ($2 == "ops") | |
37 { | |
38 generate_ops = 1; | |
39 declare_types = 0; | |
40 } | |
41 next; | |
42 } { | |
43 if (declare_types) | |
44 { | |
45 ntypes++; | |
46 | |
47 if (NF == 6) | |
48 { | |
49 scalar_zero_val[ntypes] = $6; | |
50 fwd_decl_ok[ntypes] = $5 == "YES"; | |
51 header[ntypes] = $4 == "NONE" ? "" : $4; | |
52 class[ntypes] = $3; | |
53 type[ntypes] = $2; | |
54 tag[ntypes] = $1; | |
55 rev_tag[$1] = ntypes; | |
56 } | |
57 else | |
58 printf ("skipping line %d: %s\n", NR, $0); | |
59 } | |
60 else if (generate_ops) | |
61 { | |
62 if (NF >= 5) | |
63 { | |
64 result_tag_1 = $1; | |
65 result_tag_2 = $2; | |
66 lhs_tag = $3; | |
67 rhs_tag = $4; | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
68 op_type = $5; |
5164 | 69 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
70 bin_ops = index (op_type, "B") != 0; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
71 cmp_ops = index (op_type, "C") != 0; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
72 eqne_ops = index (op_type, "E") != 0; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
73 bool_ops = index (op_type, "L") != 0; |
5164 | 74 |
75 n = 5; | |
76 | |
77 lhs_conv = cmp_ops ? $(++n) : ""; | |
78 rhs_conv = cmp_ops ? $(++n) : ""; | |
79 | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
80 if (lhs_conv == "NONE") |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
81 lhs_conv = ""; |
5164 | 82 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
83 if (rhs_conv == "NONE") |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
84 rhs_conv = ""; |
5164 | 85 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
86 k = 0 |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
87 while (NF > n) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
88 bool_headers[k++] = $(++n); |
5164 | 89 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
90 cc_file = sprintf ("%s-%s-%s.cc", prefix, lhs_tag, rhs_tag); |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
91 h_file = sprintf ("%s-%s-%s.h", prefix, lhs_tag, rhs_tag); |
5164 | 92 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
93 if (list_cc_files) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
94 { |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
95 print cc_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
96 next; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
97 } |
5164 | 98 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
99 if (list_h_files) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
100 { |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
101 print h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
102 next; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
103 } |
5164 | 104 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
105 if (make_inclusive_header) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
106 { |
5164 | 107 printf ("#include \"%s\"\n", h_file); |
108 next; | |
109 } | |
110 | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
111 h_guard = sprintf ("octave_%s_%s_%s_h", prefix, lhs_tag, rhs_tag); |
5164 | 112 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
113 result_num_1 = rev_tag[result_tag_1]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
114 result_num_2 = rev_tag[result_tag_2]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
115 lhs_num = rev_tag[lhs_tag]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
116 rhs_num = rev_tag[rhs_tag]; |
5164 | 117 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
118 result_type_1 = type[result_num_1]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
119 result_type_2 = type[result_num_2]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
120 lhs_type = type[lhs_num]; |
5164 | 121 rhs_type = type[rhs_num]; |
122 | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
123 result_scalar_zero_val_1 = scalar_zero_val[result_num_1]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
124 result_scalar_zero_val_2 = scalar_zero_val[result_num_2]; |
5164 | 125 lhs_scalar_zero_val = scalar_zero_val[lhs_num]; |
126 rhs_scalar_zero_val = scalar_zero_val[rhs_num]; | |
127 | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
128 result_header_1 = header[result_num_1]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
129 result_header_2 = header[result_num_2]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
130 lhs_header = header[lhs_num]; |
5164 | 131 rhs_header = header[rhs_num]; |
132 | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
133 lhs_class = class[lhs_num]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
134 rhs_class = class[rhs_num]; |
5164 | 135 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
136 print "// DO NOT EDIT -- generated by sparse-mk-ops" > h_file; |
5164 | 137 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
138 printf ("#if !defined (%s)\n", h_guard) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
139 printf ("#define %s 1\n", h_guard) >> h_file; |
5164 | 140 |
141 if (result_header_1) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
142 { |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
143 if (result_fwd_decl_ok) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
144 printf ("class %s\n", result_type_1) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
145 else |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
146 printf ("#include \"%s\"\n", result_header_1) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
147 } |
5164 | 148 |
149 if (result_header_2 && ! (result_header_2 == result_header_1)) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
150 { |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
151 if (result_fwd_decl_ok) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
152 printf ("class %s\n", result_type_2) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
153 else |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
154 printf ("#include \"%s\"\n", result_header_2) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
155 } |
5164 | 156 |
157 if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
158 { |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
159 if (result_fwd_decl_ok) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
160 printf ("class %s\n", lhs_type) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
161 else |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
162 printf ("#include \"%s\"\n", lhs_header) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
163 } |
5164 | 164 |
165 if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_header == result_header_2)) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
166 { |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
167 if (result_fwd_decl_ok) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
168 printf ("class %s\n", rhs_type) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
169 else |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
170 printf ("#include \"%s\"\n", rhs_header) >> h_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
171 } |
5164 | 172 |
173 printf ("#include \"Sparse-op-defs.h\"\n") >> h_file; | |
174 | |
175 if (bin_ops) | |
6708 | 176 printf ("SPARSE_%s%s_BIN_OP_DECLS (%s, %s, %s, %s, OCTAVE_API)\n", lhs_class, |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
177 rhs_class, result_type_1, result_type_2, lhs_type, |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
178 rhs_type) >> h_file |
5164 | 179 |
180 if (cmp_ops) | |
6708 | 181 printf ("SPARSE_%s%s_CMP_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
182 rhs_class, lhs_type, rhs_type) >> h_file |
5164 | 183 |
184 if (eqne_ops) | |
6708 | 185 printf ("SPARSE_%s%s_EQNE_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
186 rhs_class, lhs_type, rhs_type) >> h_file |
5164 | 187 |
188 if (bool_ops) | |
6708 | 189 printf ("SPARSE_%s%s_BOOL_OP_DECLS (%s, %s, OCTAVE_API)\n", lhs_class, |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
190 rhs_class, lhs_type, rhs_type) >> h_file |
5164 | 191 |
192 | |
193 print "#endif" >> h_file; | |
194 | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
195 close (h_file); |
5164 | 196 |
197 | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
198 print "// DO NOT EDIT -- generated by sparse-mk-ops" > cc_file; |
5164 | 199 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
200 ## print "#ifdef HAVE_CONFIG_H" >> cc_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
201 print "#include <config.h>" >> cc_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
202 ## print "#endif" >> cc_file; |
5164 | 203 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
204 print "#include \"Array-util.h\"" >> cc_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
205 print "#include \"quit.h\"" >> cc_file; |
5164 | 206 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
207 printf ("#include \"%s\"\n", h_file) >> cc_file; |
5164 | 208 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
209 for (i in bool_headers) |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
210 { |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
211 printf ("#include \"%s\"\n", bool_headers[i]) >> cc_file; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
212 delete bool_headers[i]; |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
213 } |
5164 | 214 |
215 if (result_header_1) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
216 printf ("#include \"%s\"\n", result_header_1) >> cc_file; |
5164 | 217 |
218 if (result_header_2 && ! (result_header_2 == result_header_1)) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
219 printf ("#include \"%s\"\n", result_header_2) >> cc_file; |
5164 | 220 |
221 if (lhs_header && ! (lhs_header == result_header_1 || lhs_header == result_header_2)) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
222 printf ("#include \"%s\"\n", lhs_header) >> cc_file; |
5164 | 223 |
224 if (rhs_header && ! (rhs_header == lhs_header || rhs_header == result_header_1 || rhs_heaer == result_header_2)) | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
225 printf ("#include \"%s\"\n", rhs_header) >> cc_file; |
5164 | 226 |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
227 if (bin_ops) |
5164 | 228 printf ("SPARSE_%s%s_BIN_OPS (%s, %s, %s, %s)\n", lhs_class, |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
229 rhs_class, result_type_1, result_type_2, lhs_type, |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
230 rhs_type) >> cc_file |
5164 | 231 |
232 if (cmp_ops) | |
233 printf ("SPARSE_%s%s_CMP_OPS (%s, %s, %s, %s, %s, %s)\n", | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
234 lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val, |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
235 lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file |
5164 | 236 |
237 if (eqne_ops) | |
238 printf ("SPARSE_%s%s_EQNE_OPS (%s, %s, %s, %s, %s, %s)\n", | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
239 lhs_class, rhs_class, lhs_type, lhs_scalar_zero_val, |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
240 lhs_conv, rhs_type, rhs_scalar_zero_val, rhs_conv) >> cc_file |
5164 | 241 |
242 if (bool_ops) | |
243 printf ("SPARSE_%s%s_BOOL_OPS2 (%s, %s, %s, %s)\n", lhs_class, | |
10317
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
244 rhs_class, lhs_type, rhs_type, lhs_scalar_zero_val, |
42d098307c30
untabify additional source files
John W. Eaton <jwe@octave.org>
parents:
7019
diff
changeset
|
245 rhs_scalar_zero_val) >> cc_file |
5164 | 246 |
247 | |
248 close (cc_file); | |
249 } | |
250 else | |
251 printf ("skipping line %d: %s\n", NR, $0); | |
252 } | |
253 } | |
254 END { | |
255 if (make_inclusive_header) | |
256 print "#endif"; | |
257 } |