/[public]/psiconv/trunk/lib/psiconv/generate_driver.c
ViewVC logotype

Annotation of /psiconv/trunk/lib/psiconv/generate_driver.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 82 - (hide annotations)
Wed Dec 27 23:20:45 2000 UTC (23 years, 3 months ago) by frodo
File MIME type: text/plain
File size: 8252 byte(s)
(Frodo) Not yet perfect; but we actually rewrote a Psion Word file!

1 frodo 73 /*
2     generate_driver.c - Part of psiconv, a PSION 5 file formats converter
3     Copyright (c) 2000 Frodo Looijaard <frodol@dds.nl>
4    
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9    
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     GNU General Public License for more details.
14    
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     */
19    
20     #include "config.h"
21     #include "compat.h"
22    
23     #include <stdlib.h>
24    
25     #include "error.h"
26     #include "generate_routines.h"
27    
28    
29     int psiconv_write(psiconv_buffer *buf,const psiconv_file value)
30     {
31     int res;
32    
33     if (!value) {
34     psiconv_warn(0,0,"Can't parse to an empty buffer!");
35     return -PSICONV_E_OTHER;
36     }
37 frodo 80 if (!(*buf = psiconv_buffer_new()))
38 frodo 75 return -PSICONV_E_NOMEM;
39 frodo 73
40     if (value->type == psiconv_word_file) {
41     if ((res =psiconv_write_word_file(*buf,(psiconv_word_f) (value->file))))
42     goto ERROR;
43 frodo 82 } else if (value->type == psiconv_texted_file) {
44 frodo 73 if ((res =psiconv_write_texted_file(*buf,
45     (psiconv_texted_f) (value->file))))
46     goto ERROR;
47     #if 0
48     } else if (value->type == psiconv_sketch_file) {
49 frodo 80 if ((res =psiconv_write_sketch_file(*buf,
50 frodo 73 (psiconv_sketch_f) (value->file))))
51     goto ERROR;
52     } else if (value->type == psiconv_mbm_file) {
53 frodo 80 if ((res =psiconv_write_mbm_file(*buf,
54 frodo 73 (psiconv_mbm_f) (value->file))))
55     goto ERROR;
56     } else if (value->type == psiconv_clipart_file) {
57 frodo 80 if ((res =psiconv_write_clipart_file(*buf,
58 frodo 73 (psiconv_clipart_f) (value->file))))
59     goto ERROR;
60     #endif
61     } else {
62     psiconv_warn(0,0,"Unknown or unsupported file type");
63     res = -PSICONV_E_GENERATE;
64     goto ERROR;
65     }
66 frodo 80 if ((res = psiconv_buffer_resolve(*buf)))
67     goto ERROR;
68 frodo 73 return -PSICONV_E_OK;
69    
70     ERROR:
71 frodo 79 psiconv_buffer_free(*buf);
72 frodo 73 return res;
73     }
74    
75     int psiconv_write_texted_file(psiconv_buffer buf,psiconv_texted_f value)
76     {
77     psiconv_character_layout base_char;
78     psiconv_paragraph_layout base_para;
79     int res;
80     psiconv_section_table_section section_table;
81     psiconv_section_table_entry entry;
82 frodo 80 psiconv_u32 section_table_id;
83     psiconv_buffer buf_texted;
84 frodo 73
85     if (!value) {
86     psiconv_warn(0,0,"Null TextEd file");
87     return -PSICONV_E_GENERATE;
88     }
89    
90     if (!(section_table = psiconv_list_new(sizeof(*entry)))) {
91     res = -PSICONV_E_NOMEM;
92     goto ERROR1;
93     }
94    
95     if (!(entry = malloc(sizeof(*entry)))) {
96     res = -PSICONV_E_NOMEM;
97     goto ERROR2;
98     }
99    
100 frodo 80 if (!(base_char = psiconv_basic_character_layout())) {
101 frodo 73 res = -PSICONV_E_NOMEM;
102     goto ERROR3;
103     }
104 frodo 80 if (!(base_para = psiconv_basic_paragraph_layout())) {
105 frodo 73 res = -PSICONV_E_NOMEM;
106     goto ERROR4;
107     }
108    
109     if ((res = psiconv_write_header_section(buf,PSICONV_ID_PSION5,
110     PSICONV_ID_DATA_FILE,
111     PSICONV_ID_TEXTED)))
112 frodo 80 goto ERROR5;
113 frodo 73
114 frodo 80 section_table_id = psiconv_buffer_unique_id();
115     if ((res = psiconv_write_offset(buf,section_table_id)))
116     goto ERROR5;
117 frodo 73
118     entry->id = PSICONV_ID_APPL_ID_SECTION;
119 frodo 80 entry->offset = psiconv_buffer_unique_id();
120 frodo 76 if ((res = psiconv_list_add(section_table,entry)))
121 frodo 80 goto ERROR5;
122     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
123     goto ERROR5;
124     if ((res=psiconv_write_application_id_section(buf,
125 frodo 73 PSICONV_ID_TEXTED,"TextEd.app")))
126 frodo 80 goto ERROR5;
127 frodo 73
128     entry->id = PSICONV_ID_PAGE_LAYOUT_SECTION;
129 frodo 80 entry->offset = psiconv_buffer_unique_id();
130 frodo 76 if ((res = psiconv_list_add(section_table,entry)))
131 frodo 80 goto ERROR5;
132     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
133     goto ERROR5;
134     if ((res = psiconv_write_page_layout_section(buf,value->page_sec)))
135     goto ERROR5;
136 frodo 73
137     entry->id = PSICONV_ID_TEXTED;
138 frodo 80 entry->offset = psiconv_buffer_unique_id();
139 frodo 76 if ((res = psiconv_list_add(section_table,entry)))
140 frodo 80 goto ERROR5;
141     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
142     goto ERROR5;
143     if ((res = psiconv_write_texted_section(buf,value->texted_sec,
144     base_char,base_para,&buf_texted)))
145     goto ERROR5;
146 frodo 73
147 frodo 80 if ((res = psiconv_buffer_concat(buf,buf_texted)))
148 frodo 73 goto ERROR6;
149    
150 frodo 80
151     if ((res = psiconv_buffer_add_target(buf,section_table_id)))
152 frodo 73 goto ERROR6;
153    
154     res = psiconv_write_section_table_section(buf,section_table);
155    
156     ERROR6:
157 frodo 80 psiconv_buffer_free(buf_texted);
158     ERROR5:
159 frodo 73 psiconv_free_paragraph_layout(base_para);
160 frodo 80 ERROR4:
161 frodo 73 psiconv_free_character_layout(base_char);
162     ERROR3:
163     free(entry);
164     ERROR2:
165     psiconv_list_free(section_table);
166     ERROR1:
167     return res;
168     }
169 frodo 82
170     int psiconv_write_word_file(psiconv_buffer buf,psiconv_word_f value)
171     {
172     int res;
173     psiconv_section_table_section section_table;
174     psiconv_section_table_entry entry;
175     psiconv_u32 section_table_id;
176    
177     if (!value) {
178     psiconv_warn(0,0,"Null Word file");
179     return -PSICONV_E_GENERATE;
180     }
181    
182     if (!(section_table = psiconv_list_new(sizeof(*entry)))) {
183     res = -PSICONV_E_NOMEM;
184     goto ERROR1;
185     }
186    
187     if (!(entry = malloc(sizeof(*entry)))) {
188     res = -PSICONV_E_NOMEM;
189     goto ERROR2;
190     }
191    
192     if ((res = psiconv_write_header_section(buf,PSICONV_ID_PSION5,
193     PSICONV_ID_DATA_FILE,
194     PSICONV_ID_WORD)))
195     goto ERROR3;
196    
197     section_table_id = psiconv_buffer_unique_id();
198     if ((res = psiconv_write_offset(buf,section_table_id)))
199     goto ERROR3;
200    
201     entry->id = PSICONV_ID_APPL_ID_SECTION;
202     entry->offset = psiconv_buffer_unique_id();
203     if ((res = psiconv_list_add(section_table,entry)))
204     goto ERROR3;
205     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
206     goto ERROR3;
207     if ((res=psiconv_write_application_id_section(buf,
208     PSICONV_ID_WORD,"Word.app")))
209     goto ERROR3;
210    
211     entry->id = PSICONV_ID_WORD_STATUS_SECTION;
212     entry->offset = psiconv_buffer_unique_id();
213     if ((res = psiconv_list_add(section_table,entry)))
214     goto ERROR3;
215     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
216     goto ERROR3;
217     if ((res = psiconv_write_word_status_section(buf,value->status_sec)))
218     goto ERROR3;
219    
220     entry->id = PSICONV_ID_PAGE_LAYOUT_SECTION;
221     entry->offset = psiconv_buffer_unique_id();
222     if ((res = psiconv_list_add(section_table,entry)))
223     goto ERROR3;
224     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
225     goto ERROR3;
226     if ((res = psiconv_write_page_layout_section(buf,value->page_sec)))
227     goto ERROR3;
228    
229     entry->id = PSICONV_ID_WORD_STYLES_SECTION;
230     entry->offset = psiconv_buffer_unique_id();
231     if ((res = psiconv_list_add(section_table,entry)))
232     goto ERROR3;
233     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
234     goto ERROR3;
235     if ((res = psiconv_write_word_styles_section(buf,value->styles_sec)))
236     goto ERROR3;
237    
238     entry->id = PSICONV_ID_TEXT_SECTION;
239     entry->offset = psiconv_buffer_unique_id();
240     if ((res = psiconv_list_add(section_table,entry)))
241     goto ERROR3;
242     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
243     goto ERROR3;
244     if ((res = psiconv_write_text_section(buf,value->paragraphs)))
245     goto ERROR3;
246    
247     entry->id = PSICONV_ID_LAYOUT_SECTION;
248     entry->offset = psiconv_buffer_unique_id();
249     if ((res = psiconv_list_add(section_table,entry)))
250     goto ERROR3;
251     if ((res = psiconv_buffer_add_target(buf,entry->offset)))
252     goto ERROR3;
253     if ((res = psiconv_write_styled_layout_section(buf,value->paragraphs,
254     value->styles_sec)))
255     goto ERROR3;
256    
257     if ((res = psiconv_buffer_add_target(buf,section_table_id)))
258     goto ERROR3;
259    
260     res = psiconv_write_section_table_section(buf,section_table);
261    
262     ERROR3:
263     free(entry);
264     ERROR2:
265     psiconv_list_free(section_table);
266     ERROR1:
267     return res;
268     }

frodo@frodo.looijaard.name
ViewVC Help
Powered by ViewVC 1.1.26