1 /*
2     data.h - Part of psiconv, a PSION 5 file formats converter
3     Copyright (c) 1999-2014  Frodo Looijaard <frodo@frodo.looijaard.name>
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 /* This file contains the declarations of all types that are used to
21    represent the Psion files. Variables of these types are written by the
22    parse routines, and read by the generation routines.
23 
24    Mostly, the data structures reflect the file format documentation,
25    as included in the formats directory. When in doubt, refer there. */
26 
27 #ifndef PSICONV_DATA_H
28 #define PSICONV_DATA_H
29 
30 #include <psiconv/general.h>
31 #include <psiconv/list.h>
32 
33 /* All types which end on _t are plain types; all other types are pointers
34    to structs. */
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif /* __cplusplus */
39 
40 /* Forward declaration (for psiconv_embedded_object_section) */
41 typedef struct psiconv_file_s *psiconv_file;
42 
43 
44 /* Enums and simple types */
45 
46 
47 /* Floating point number representation */
48 typedef double psiconv_float_t;
49 
50 /* The supported file types. */
51 typedef enum psiconv_file_type {
52   psiconv_unknown_file,
53   psiconv_word_file,
54   psiconv_texted_file,
55   psiconv_mbm_file,
56   psiconv_sketch_file,
57   psiconv_clipart_file,
58   psiconv_sheet_file
59 } psiconv_file_type_t;
60 
61 /* String representation. A string is an array of UCS2 characters, terminated
62    by a 0. So they are just like normal C strings, except that they are built
63    of psiconv_ucs2 elements instead of char elements.
64    The psiconv_ucs2 type holds 16 bits; see unicode.h for more information. */
65 typedef psiconv_ucs2 *psiconv_string_t;
66 
67 /* Represent lengths (in centimeters) and sizes (in points).
68    In the Psion file, these are identical; but we translate them to more
69    human-readable quantities */
70 typedef float psiconv_length_t;    /* For offsets in centimeters */
71 typedef float psiconv_size_t;      /* For sizes in points */
72 
73 /* Represent booleans. As false is zero in the enum, you can still do things
74    like { if (test) ... } instead of { if (test == psiconv_bool_true) ... }.
75    Choose whatever style suits you best. */
76 typedef enum psiconv_bool
77 {
78   psiconv_bool_false,
79   psiconv_bool_true
80 } psiconv_bool_t;
81 
82 /* Some kind of three-valued boolean, used at several places. */
83 typedef enum psiconv_triple
84 {
85   psiconv_triple_on,
86   psiconv_triple_off,
87   psiconv_triple_auto
88 } psiconv_triple_t;
89 
90 /* Text can be in superscript or subscript or neither, but never both
91    superscript and subscript at once. Also, super-superscript and things
92    like that do not exist in the Psion world. */
93 typedef enum psiconv_super_sub
94 { psiconv_normalscript,
95   psiconv_superscript,
96   psiconv_subscript
97 } psiconv_super_sub_t;
98 
99 /* Horizontal justification. */
100 typedef enum psiconv_justify_hor
101 { psiconv_justify_left,
102   psiconv_justify_centre,
103   psiconv_justify_right,
104   psiconv_justify_full
105 } psiconv_justify_hor_t;
106 
107 /* Vertical justification. */
108 typedef enum psiconv_justify_ver
109 { psiconv_justify_top,
110   psiconv_justify_middle,
111   psiconv_justify_bottom
112 } psiconv_justify_ver_t;
113 
114 /* Borders around text fields. */
115 typedef enum psiconv_border_kind
116 { psiconv_border_none,            /* No border */
117   psiconv_border_solid,           /* Single line */
118   psiconv_border_double,          /* Double line */
119   psiconv_border_dotted,          /* Dotted line: . . . . . */
120   psiconv_border_dashed,          /* Dashed line: _ _ _ _ _ */
121   psiconv_border_dotdashed,       /* Dotted/dashed line: _ . _ . _ */
122   psiconv_border_dotdotdashed     /* Dotted/dashed line: . . _ . . _ */
123 } psiconv_border_kind_t;
124 
125 /* Though each printer driver has its own fonts for printing, they are
126    represented on the Psion screen by a few built-in fonts. */
127 typedef enum psiconv_screenfont
128 {
129   psiconv_font_misc,          /* Nonproportional symbols, like Wingbat? */
130   psiconv_font_sansserif,     /* Proportional sans-serif, like Arial */
131   psiconv_font_nonprop,       /* Nonproportional, like Courier */
132   psiconv_font_serif          /* Proportional serifed, like Times */
133 } psiconv_screenfont_t;
134 
135 
136 /* The kind of tab. Note that decimal tabs are not supported by the Psion. */
137 typedef enum psiconv_tab_kind
138 {
139   psiconv_tab_left,      /* Left tab */
140   psiconv_tab_centre,    /* Centre tab */
141   psiconv_tab_right      /* Right tab */
142 } psiconv_tab_kind_t;
143 
144 /* When text has to be replaced, the kind of replacement to do
145    (not yet implemented!) */
146 typedef enum psiconv_replacement_type
147 {
148   psiconv_replace_time,
149   psiconv_replace_date,
150   psiconv_replace_pagenr,
151   psiconv_replace_nr_of_pages,
152   psiconv_replace_filename
153 } psiconv_replacement_type_t;
154 
155 
156 /* Here starts the struct definitions */
157 
158 /* The color of a single pixel, in RGB format.
159    Black: 0x00 0x00 0x00
160    White: 0xff 0xff 0xff */
161 typedef struct psiconv_color_s
162 {
163   psiconv_u8 red;
164   psiconv_u8 green;
165   psiconv_u8 blue;
166 } * psiconv_color;
167 
168 
169 /* Complete font information: both a printer font and a corresponding screen
170    font to display it. */
171 typedef struct psiconv_font_s
172 {
173   psiconv_string_t name;             /* Printer font */
174   psiconv_screenfont_t screenfont;   /* Screen font */
175 } *psiconv_font;
176 
177 /* Complete border information */
178 typedef struct psiconv_border_s
179 {
180   psiconv_border_kind_t kind;   /* Border kind */
181   psiconv_size_t thickness;     /* Set to 1/20 for non-solid lines */
182   psiconv_color color;          /* Border color */
183 } *psiconv_border;
184 
185 /* Complete bullet information.
186    The interaction of left and first line indentation and bullets is quite
187    complicated.
188 
189    BULLET       FIRST  BULLET      FIRST LINE             NEXT LINES
190 
191    None         = 0    -           Left+First             Left
192                 > 0    -           Left+First             Left
193                 < 0    -           Left+First             Left
194 
195    Indent Off   = 0    Left        Left(+Bullet)          Left
196                 > 0    Left        Left+First             Left
197 		< 0    Left+First  Left+First(+Bullet)    Left
198 
199    Indent On    = 0    Left        Left(+Bullet)          Left
200                 > 0    Left        Left+First             Left+First
201 		< 0    Left+First  Left                   Left
202 */
203 typedef struct psiconv_bullet_s
204 {
205   psiconv_bool_t on;           /* Whether the bullet is shown */
206   psiconv_size_t font_size;    /* Bullet font size */
207   psiconv_ucs2 character;      /* Bullet character */
208   psiconv_bool_t indent;       /* Whether to indent (see above */
209   psiconv_color color;         /* Bullet color */
210   psiconv_font font;           /* Bullet font */
211 } *psiconv_bullet;
212 
213 /* Complete single tab information */
214 typedef struct psiconv_tab_s
215 {
216   psiconv_length_t location;      /* The indentation level */
217   psiconv_tab_kind_t kind;        /* Tab kind */
218 } *psiconv_tab;
219 
220 /* A list of tabs */
221 typedef psiconv_list psiconv_tab_list; /* of struct psiconv_tab_s */
222 
223 /* Information about all tabs.
224    Normal tabs start after the rightmost extra tab */
225 typedef struct psiconv_all_tabs_s
226 {
227   psiconv_length_t normal;        /* Normal tab distance */
228   psiconv_tab_list extras;        /* Additional defined tabs */
229 } *psiconv_all_tabs;
230 
231 /* Character layout.
232    This structure holds all layout information that can be applied on the
233    character level (as opposed to layouts that only apply to whole
234    paragraphs).
235    Note that at all times, this structure holds the complete layout
236    information; we do not use incremental layouts, unlike the Psion
237    file format itself. So if an italic text is also underlined, the
238    character_layout will have both set for that region. */
239 typedef struct psiconv_character_layout_s
240 {
241   psiconv_color color;             /* Character color */
242   psiconv_color back_color;        /* Background color */
243   psiconv_size_t font_size;        /* Font size */
244   psiconv_bool_t italic;           /* Use italics? */
245   psiconv_bool_t bold;             /* Use bold? */
246   psiconv_super_sub_t super_sub;   /* Use super/subscript? */
247   psiconv_bool_t underline;        /* Underline? */
248   psiconv_bool_t strikethrough;    /* Strike through? */
249   psiconv_font font;               /* Character font */
250 } *psiconv_character_layout;
251 
252 /* Paragraph layout.
253    This structure holds all layout information that can be applied on the
254    paragraph level (as opposed to layouts that also apply to single
255    characters).
256    Note that at all times, this structure holds the complete layout
257    information; we do not use incremental layouts, unlike the Psion
258    file format itself.
259    Linespacing is the amount of vertical space between lines. If
260    linespacing_exact is set, this amount is used even if that would make
261    text overlap; if it is not set, a greater distance is used if text would
262    otherwise overlap.
263    Several booleans determine where page breaks may be set. keep_together
264    forbids page breaks in the middle of the paragraph; keep_with_next
265    forbids page breaks between this and the next paragraph. on_next_page
266    forces a pagebreak before the paragraph. no_widow_protection allows
267    one single line of the paragraph on a page, and the rest on another page.
268    Sheet cell text normally does not wrap; wrap_to_fit_cell allows this. */
269 typedef struct psiconv_paragraph_layout_s
270 {
271   psiconv_color back_color;           /* Background color */
272   psiconv_length_t indent_left;       /* Left indentation (except first line) */
273   psiconv_length_t indent_right;      /* Right indentation */
274   psiconv_length_t indent_first;      /* First line left indentation */
275   psiconv_justify_hor_t justify_hor;  /* Horizontal justification */
276   psiconv_justify_ver_t justify_ver;  /* Vertical justification */
277   psiconv_size_t linespacing;         /* The linespacing */
278   psiconv_bool_t linespacing_exact;   /* Is linespacing exact or the minimum? */
279   psiconv_size_t space_above;         /* Vertical space before the paragraph */
280   psiconv_size_t space_below;         /* Vertical space after the paragraph */
281   psiconv_bool_t keep_together;       /* Keep lines on one page? */
282   psiconv_bool_t keep_with_next;      /* Disallow pagebreak after paragraph? */
283   psiconv_bool_t on_next_page;        /* Force page break before paragraph? */
284   psiconv_bool_t no_widow_protection; /* Undo widow protection? */
285   psiconv_bool_t wrap_to_fit_cell;    /* Wrap sheet cell text? */
286   psiconv_length_t border_distance;   /* Distance to borders */
287   psiconv_bullet bullet;              /* Bullet information */
288   psiconv_border left_border;         /* Left border information */
289   psiconv_border right_border;        /* Right border information */
290   psiconv_border top_border;          /* Top border information */
291   psiconv_border bottom_border;       /* Bottom border information */
292   psiconv_all_tabs tabs;              /* All tab information */
293 } *psiconv_paragraph_layout;
294 
295 /* A Header Section.
296    It contains the three UIDs and the checksum, and the type of file.
297    As the type of file uniquely defines the UIDs, and as the UIDs determine
298    the checksum, this is never included in a regular psiconv_file structure.
299    It can be used to read the header section separately, though. */
300 typedef struct psiconv_header_section_s
301 {
302   psiconv_u32 uid1;
303   psiconv_u32 uid2;
304   psiconv_u32 uid3;
305   psiconv_u32 checksum;
306   psiconv_file_type_t file;
307 } *psiconv_header_section;
308 
309 /* A Section Table Section entry.
310    Each entry has a UID and an offset.
311    This is never included in a regular psiconv_file structure, as the
312    information is too low-level. It is used internally, though. */
313 typedef struct psiconv_section_table_entry_s
314 {
315   psiconv_u32 id;           /* Section UID */
316   psiconv_u32 offset;       /* Section offset within the file */
317 } *psiconv_section_table_entry;
318 
319 /* A Section Table Section.
320    A list of sections and their offsets.
321    It is simply a list of Section Table Section Entries.
322    This is never included in a regular psiconv_file structure, as the
323    information is too low-level. It is used internally, though. */
324 typedef psiconv_list psiconv_section_table_section;
325                                    /* Of struct psiconv_sectiontable_entry_s */
326 
327 /* An Application ID Section.
328    The type of file.
329    Never included in a regular psiconv_file structure, because it is too
330    low-level. You can always recover it if you know the file type. Used
331    internally.
332    The name should probably be case-insensitive. */
333 typedef struct psiconv_application_id_section_s
334 {
335   psiconv_u32 id;            /* File type UID */
336   psiconv_string_t name;     /* File type name */
337 } *psiconv_application_id_section;
338 
339 /* An Object Icon Section.
340    The icon used for an embedded object. */
341 typedef struct psiconv_object_icon_section_s
342 {
343   psiconv_length_t icon_width;      /* Icon width */
344   psiconv_length_t icon_height;     /* Icon height */
345   psiconv_string_t icon_name;       /* Icon name */
346 } *psiconv_object_icon_section;
347 
348 /* An Object Display Section.
349    How an embedded icon should be displayed.
350    The sizes are computed after cropping or resizing; if the object is shown
351    as an icon, the icon sizes are used here. */
352 typedef struct psiconv_object_display_section_s
353 {
354   psiconv_bool_t show_icon;         /* Show an icon or the whole file? */
355   psiconv_length_t width;           /* Object display width */
356   psiconv_length_t height;          /* Object display height */
357 } *psiconv_object_display_section;
358 
359 /* An Embedded Object Section.
360    All data about an embedded object.
361    An object is another psiconv_file, which is embedded in the current
362    file. Objects can also be embedded in each other, of course. */
363 typedef struct psiconv_embedded_object_section_s
364 {
365   psiconv_object_icon_section icon;       /* Icon information */
366   psiconv_object_display_section display; /* Display information */
367   psiconv_file object;                    /* The object itself */
368 } *psiconv_embedded_object_section;
369 
370 /* Inline character-level layout information.
371    Information how some characters should be laid out.
372    Note that, though you can choose specific layouts for an object, this
373    will probably not affect the object's rendering.
374    Usually, object will be NULL, and the object_width and object_height
375    will be ignored.
376    The object sizes are the same as in the Object Display Section, so
377    this information seems to be redundant. */
378 typedef struct psiconv_in_line_layout_s
379 {
380   psiconv_character_layout layout;         /* Layout information */
381   int length;                              /* Number of characters */
382   psiconv_embedded_object_section object;  /* Embedded object or NULL */
383   psiconv_length_t object_width;           /* Object display width */
384   psiconv_length_t object_height;          /* Object display height */
385 } *psiconv_in_line_layout;
386 
387 /* Inline character information for a whole line.
388    A list of inline character information */
389 typedef psiconv_list psiconv_in_line_layouts;
390                                   /* of struct psiconv_in_line_layout_s */
391 
392 /* What to replace where in text. Not yet implemented!
393    (not yet implemented!) */
394 typedef struct psiconv_replacement_s
395 {
396   int offset;                       /* Offset in text */
397   int cur_len;                      /* Length of text to replace */
398   psiconv_replacement_type_t type;  /* Kind of replacement */
399 } *psiconv_replacement;
400 
401 /* A list of replacements */
402 typedef psiconv_list psiconv_replacements; /* of struct psiconv_replacement_s */
403 
404 /* A paragraph of text.
405    Layout and actual paragraph text are combined here, even though
406    they are seperated in the Psion file format.
407    The base style is referred to, but the base_character and
408    base_paragraph have all style settings already incorporated.
409    The base style can be found using the psiconv_get_style function.
410    The in_lines are either an empty list, or they should apply to exactly
411    the number of characters in this paragraph */
412 typedef struct psiconv_paragraph_s
413 {
414   psiconv_string_t text;                     /* Paragraph text */
415   psiconv_character_layout base_character;   /* Base character layout */
416   psiconv_paragraph_layout base_paragraph;   /* Base paragraph layout */
417   psiconv_s16 base_style;                    /* Paragraph style */
418   psiconv_in_line_layouts in_lines;          /* In-paragraph layout */
419   psiconv_replacements replacements;         /* Replacements like the date */
420 } *psiconv_paragraph;
421 
422 /* A collection of text paragraphs */
423 typedef psiconv_list psiconv_text_and_layout;
424                                           /* Of struct psiconv_paragraph_s */
425 
426 /* A TextEd Section.
427    Text and simple layout, without styles.  */
428 typedef struct psiconv_texted_section_s
429 {
430   psiconv_text_and_layout paragraphs;
431 } *psiconv_texted_section;
432 
433 /* A Page Header.
434    All information about a page header or footer.
435    An explicit base paragraph and character layout is found; this is used
436    as a sort of base style, on which all further formatting is based */
437 typedef struct psiconv_page_header_s
438 {
439   psiconv_bool_t on_first_page;                   /* Display on first page? */
440   psiconv_paragraph_layout base_paragraph_layout; /* Base paragraph layout */
441   psiconv_character_layout base_character_layout; /* Base character layout */
442   psiconv_texted_section text;                    /* The actual text */
443 } *psiconv_page_header;
444 
445 /* A Page Layout Section
446    All information about the layout of a page.
447    Margins, page size, the header, the footer and page numbers */
448 typedef struct psiconv_page_layout_section_s
449 {
450   psiconv_u32 first_page_nr;         /* Page numbers start counting here */
451   psiconv_length_t header_dist;      /* Distance of header to text */
452   psiconv_length_t footer_dist;      /* Distance of footer to text */
453   psiconv_length_t left_margin;      /* Left margin */
454   psiconv_length_t right_margin;     /* Right margin */
455   psiconv_length_t top_margin;       /* Top margin */
456   psiconv_length_t bottom_margin;    /* Bottom margin */
457   psiconv_length_t page_width;       /* Page width */
458   psiconv_length_t page_height;      /* Page height */
459   psiconv_page_header header;        /* Header information */
460   psiconv_page_header footer;        /* Footer information */
461   psiconv_bool_t landscape;          /* Landscape orientation? */
462 } * psiconv_page_layout_section;
463 
464 /* A Word Status Section
465    Settings of the Word program.
466    Several whitespace and related characters can be explicitely shown.
467    Embedded pictures and graphs can be iconized or displayed full.
468    Toolbars can be shown or hidden.
469    Long lines can be wrapped, or you have to use scrolling.
470    The cursor position is the character number of the text.
471    Zoom level: 1000 is "normal" */
472 typedef struct psiconv_word_status_section_s
473 {
474   psiconv_bool_t show_tabs;           /* Show tabs? */
475   psiconv_bool_t show_spaces;         /* Show spaces? */
476   psiconv_bool_t show_paragraph_ends; /* Show paragraph ends? */
477   psiconv_bool_t show_line_breaks;    /* Show line breaks */
478   psiconv_bool_t show_hard_minus;     /* Show hard dashes? */
479   psiconv_bool_t show_hard_space;     /* Show hard spaces? */
480   psiconv_bool_t show_full_pictures;  /* Show embedded pictures (or iconize)? */
481   psiconv_bool_t show_full_graphs;    /* Show embedded graphs (or iconize)? */
482   psiconv_bool_t show_top_toolbar;    /* Show top toolbar? */
483   psiconv_bool_t show_side_toolbar;   /* Show side toolbar? */
484   psiconv_bool_t fit_lines_to_screen; /* Wrap lines? */
485   psiconv_u32 cursor_position;        /* Cursor position (character number) */
486   psiconv_u32 display_size;           /* Zooming level */
487 } *psiconv_word_status_section;
488 
489 /* A Word Style.
490    All information about a single Style.
491    A builtin style may not be changed in the Word program.
492    Outline level is zero if unused.
493    The name may be NULL for the normal style! */
494 typedef struct psiconv_word_style_s
495 {
496   psiconv_character_layout character; /* character-level layout */
497   psiconv_paragraph_layout paragraph; /* paragraph-level layout */
498   psiconv_ucs2 hotkey;                /* The hotkey */
499   psiconv_string_t name;              /* Style name */
500   psiconv_bool_t built_in;            /* Builtin style? */
501   psiconv_u32 outline_level;          /* Outline level */
502 } *psiconv_word_style;
503 
504 /* A list of Word Styles */
505 typedef psiconv_list psiconv_word_style_list;
506                                          /* Of struct psiconv_word_style_s */
507 
508 /* A Word Styles Section
509    All information about styles.
510    Note that the name of the normal style is NULL! */
511 typedef struct psiconv_word_styles_section_s
512 {
513   psiconv_word_style normal;      /* The normal (unspecified) style */
514   psiconv_word_style_list styles; /* All other defined styles */
515 } *psiconv_word_styles_section;
516 
517 /* A Word File
518    All information about a Word File.
519    Note that a section can be NULL if it is not present. */
520 typedef struct psiconv_word_f_s
521 {
522   psiconv_page_layout_section page_sec;    /* Page layout */
523   psiconv_text_and_layout paragraphs;      /* Text and text layout */
524   psiconv_word_status_section status_sec;  /* Internal Word program settings */
525   psiconv_word_styles_section styles_sec;  /* Styles */
526 } *psiconv_word_f;
527 
528 /* A TextEd File
529    All information about a TextEd File.
530    Note that a section can be NULL if it is not present. */
531 typedef struct psiconv_texted_f_s
532 {
533   psiconv_page_layout_section page_sec;    /* Page layout */
534   psiconv_texted_section texted_sec;       /* Text and text layout */
535 } *psiconv_texted_f;
536 
537 /* A Jumptable Section.
538    A simple list of offsets.
539    This is never included in a regular psiconv_file structure, as the
540    information is too low-level. It is used internally, though. */
541 typedef psiconv_list psiconv_jumptable_section; /* of psiconv_u32 */
542 
543 /* A Paint Data Section
544    A collection of pixels.
545    Normalized values [0..1] for each color component.
546    Origin is (x,y)=(0,0), to get pixel at (X,Y) use index [Y*xsize+X] */
547 typedef struct psiconv_paint_data_section_s
548 {
549   psiconv_u32 xsize;          /* Number of pixels in a row */
550   psiconv_u32 ysize;          /* Number of pixels in a column */
551   psiconv_length_t pic_xsize; /* 0 if not specified */
552   psiconv_length_t pic_ysize; /* 0 if not specified */
553   float *red;
554   float *green;
555   float *blue;
556 } *psiconv_paint_data_section;
557 
558 /* A collection of Paint Data Sections */
559 typedef psiconv_list psiconv_pictures;
560             /* of struct psiconv_paint_data_section_s */
561 
562 /* A MBM file
563    All information about a MBM file
564    MBM files contain one or more pictures. */
565 typedef struct psiconv_mbm_f_s
566 {
567   psiconv_pictures sections;
568 } *psiconv_mbm_f;
569 
570 /* Read the Psiconv file format documentation for a complete discription.
571    Basic idea: a picture has a certain display size. Within it, the pixel
572    data begins at a certain offset. Around it, there is an empty form.
573    The first eight values are before magnification and cuts.
574    Cuts are always <= 1.0; a cut of 0.0 cuts nothing away, a cut of 1.0
575    cuts everything away. */
576 typedef struct psiconv_sketch_section_s
577 {
578   psiconv_u16 displayed_xsize;
579   psiconv_u16 displayed_ysize;
580   psiconv_u16 picture_data_x_offset;
581   psiconv_u16 picture_data_y_offset;
582   psiconv_u16 form_xsize;
583   psiconv_u16 form_ysize;
584   psiconv_u16 displayed_size_x_offset;
585   psiconv_u16 displayed_size_y_offset;
586   float magnification_x; /* computed relative to first eight values */
587   float magnification_y; /* computed relative to first eight values */
588   float cut_left;        /* computed relative to first eight values */
589   float cut_right;       /* computed relative to first eight values */
590   float cut_top;         /* computed relative to first eight values */
591   float cut_bottom;      /* computed relative to first eight values */
592   psiconv_paint_data_section picture;
593 } *psiconv_sketch_section;
594 
595 typedef struct psiconv_sketch_f_s
596 {
597   psiconv_sketch_section sketch_sec;
598 } *psiconv_sketch_f;
599 
600 typedef struct psiconv_clipart_section_s
601 {
602   /* Perhaps later on some currently unknown stuff. */
603   psiconv_paint_data_section picture;
604 } * psiconv_clipart_section;
605 
606 typedef psiconv_list psiconv_cliparts; /* of struct psiconv_clipart_section_s */
607 
608 typedef struct psiconv_clipart_f_s
609 {
610   psiconv_cliparts sections;
611 } *psiconv_clipart_f;
612 
613 typedef struct psiconv_sheet_ref_s
614 {
615   psiconv_s16 offset;
616   psiconv_bool_t absolute;
617 } psiconv_sheet_ref_t;
618 
619 typedef struct psiconv_sheet_cell_reference_s
620 {
621   psiconv_sheet_ref_t row;
622   psiconv_sheet_ref_t column;
623 } psiconv_sheet_cell_reference_t;
624 
625 typedef struct psiconv_sheet_cell_block_s
626 {
627   psiconv_sheet_cell_reference_t first;
628   psiconv_sheet_cell_reference_t last;
629 } psiconv_sheet_cell_block_t;
630 
631 typedef enum psiconv_cell_type
632 {
633   psiconv_cell_blank,
634   psiconv_cell_int,
635   psiconv_cell_bool,
636   psiconv_cell_error,
637   psiconv_cell_float,
638   psiconv_cell_string
639 } psiconv_cell_type_t;
640 
641 typedef enum psiconv_sheet_errorcode
642 {
643   psiconv_sheet_error_none,
644   psiconv_sheet_error_null,
645   psiconv_sheet_error_divzero,
646   psiconv_sheet_error_value,
647   psiconv_sheet_error_reference,
648   psiconv_sheet_error_name,
649   psiconv_sheet_error_number,
650   psiconv_sheet_error_notavail
651 } psiconv_sheet_errorcode_t;
652 
653 typedef enum psiconv_sheet_numberformat_code
654 {
655   psiconv_numberformat_general,
656   psiconv_numberformat_fixeddecimal,
657   psiconv_numberformat_scientific,
658   psiconv_numberformat_currency,
659   psiconv_numberformat_percent,
660   psiconv_numberformat_triads,
661   psiconv_numberformat_boolean,
662   psiconv_numberformat_text,
663   psiconv_numberformat_date_dmm,
664   psiconv_numberformat_date_mmd,
665   psiconv_numberformat_date_ddmmyy,
666   psiconv_numberformat_date_mmddyy,
667   psiconv_numberformat_date_yymmdd,
668   psiconv_numberformat_date_dmmm,
669   psiconv_numberformat_date_dmmmyy,
670   psiconv_numberformat_date_ddmmmyy,
671   psiconv_numberformat_date_mmm,
672   psiconv_numberformat_date_monthname,
673   psiconv_numberformat_date_mmmyy,
674   psiconv_numberformat_date_monthnameyy,
675   psiconv_numberformat_date_monthnamedyyyy,
676   psiconv_numberformat_datetime_ddmmyyyyhhii,
677   psiconv_numberformat_datetime_ddmmyyyyHHii,
678   psiconv_numberformat_datetime_mmddyyyyhhii,
679   psiconv_numberformat_datetime_mmddyyyyHHii,
680   psiconv_numberformat_datetime_yyyymmddhhii,
681   psiconv_numberformat_datetime_yyyymmddHHii,
682   psiconv_numberformat_time_hhii,
683   psiconv_numberformat_time_hhiiss,
684   psiconv_numberformat_time_HHii,
685   psiconv_numberformat_time_HHiiss
686 } psiconv_sheet_numberformat_code_t;
687 
688 typedef struct psiconv_sheet_numberformat_s
689 {
690   psiconv_sheet_numberformat_code_t code;
691   psiconv_u8 decimal;
692 } *psiconv_sheet_numberformat;
693 
694 typedef struct psiconv_sheet_cell_layout_s
695 {
696   psiconv_character_layout character;
697   psiconv_paragraph_layout paragraph;
698   psiconv_sheet_numberformat numberformat;
699 } * psiconv_sheet_cell_layout;
700 
701 typedef struct psiconv_sheet_cell_s
702 {
703   psiconv_u16 column;
704   psiconv_u16 row;
705   psiconv_cell_type_t type;
706   union {
707     psiconv_u32 dat_int;
708     double dat_float;
709     psiconv_string_t dat_string;
710     psiconv_bool_t dat_bool;
711     psiconv_sheet_errorcode_t dat_error;
712   } data;
713   psiconv_sheet_cell_layout layout;
714   psiconv_bool_t calculated;
715   psiconv_u32 ref_formula;
716 } *psiconv_sheet_cell;
717 
718 typedef psiconv_list psiconv_sheet_cell_list;
719                                          /* Of struct psiconv_sheet_cell_s */
720 
721 typedef struct psiconv_sheet_status_section_s
722 {
723   psiconv_bool_t show_graph;
724   psiconv_u32 cursor_row;
725   psiconv_u32 cursor_column;
726   psiconv_bool_t show_top_sheet_toolbar;
727   psiconv_bool_t show_side_sheet_toolbar;
728   psiconv_bool_t show_top_graph_toolbar;
729   psiconv_bool_t show_side_graph_toolbar;
730   psiconv_u32 sheet_display_size;
731   psiconv_u32 graph_display_size;
732   psiconv_triple_t show_horizontal_scrollbar;
733   psiconv_triple_t show_vertical_scrollbar;
734 } *psiconv_sheet_status_section;
735 
736 typedef enum psiconv_formula_type
737 {
738   psiconv_formula_unknown,
739   psiconv_formula_op_lt,
740   psiconv_formula_op_le,
741   psiconv_formula_op_gt,
742   psiconv_formula_op_ge,
743   psiconv_formula_op_ne,
744   psiconv_formula_op_eq,
745   psiconv_formula_op_add,
746   psiconv_formula_op_sub,
747   psiconv_formula_op_mul,
748   psiconv_formula_op_div,
749   psiconv_formula_op_pow,
750   psiconv_formula_op_pos,
751   psiconv_formula_op_neg,
752   psiconv_formula_op_not,
753   psiconv_formula_op_and,
754   psiconv_formula_op_or,
755   psiconv_formula_op_con,
756   psiconv_formula_op_bra,
757   psiconv_formula_mark_eof,
758   psiconv_formula_dat_float,
759   psiconv_formula_dat_int,
760   psiconv_formula_dat_var,
761   psiconv_formula_dat_string,
762   psiconv_formula_dat_cellref,
763   psiconv_formula_dat_cellblock,
764   psiconv_formula_dat_vcellblock,
765   psiconv_formula_mark_opsep,
766   psiconv_formula_mark_opend,
767   psiconv_formula_fun_false,
768   psiconv_formula_fun_if,
769   psiconv_formula_fun_true,
770   psiconv_formula_fun_cell,
771   psiconv_formula_fun_errortype,
772   psiconv_formula_fun_isblank,
773   psiconv_formula_fun_iserr,
774   psiconv_formula_fun_iserror,
775   psiconv_formula_fun_islogical,
776   psiconv_formula_fun_isna,
777   psiconv_formula_fun_isnontext,
778   psiconv_formula_fun_isnumber,
779   psiconv_formula_fun_istext,
780   psiconv_formula_fun_n,
781   psiconv_formula_fun_type,
782   psiconv_formula_fun_address,
783   psiconv_formula_fun_column,
784   psiconv_formula_fun_columns,
785   psiconv_formula_fun_hlookup,
786   psiconv_formula_fun_index,
787   psiconv_formula_fun_indirect,
788   psiconv_formula_fun_lookup,
789   psiconv_formula_fun_offset,
790   psiconv_formula_fun_row,
791   psiconv_formula_fun_rows,
792   psiconv_formula_fun_vlookup,
793   psiconv_formula_fun_char,
794   psiconv_formula_fun_code,
795   psiconv_formula_fun_exact,
796   psiconv_formula_fun_find,
797   psiconv_formula_fun_left,
798   psiconv_formula_fun_len,
799   psiconv_formula_fun_lower,
800   psiconv_formula_fun_mid,
801   psiconv_formula_fun_proper,
802   psiconv_formula_fun_replace,
803   psiconv_formula_fun_rept,
804   psiconv_formula_fun_right,
805   psiconv_formula_fun_string,
806   psiconv_formula_fun_t,
807   psiconv_formula_fun_trim,
808   psiconv_formula_fun_upper,
809   psiconv_formula_fun_value,
810   psiconv_formula_fun_date,
811   psiconv_formula_fun_datevalue,
812   psiconv_formula_fun_day,
813   psiconv_formula_fun_hour,
814   psiconv_formula_fun_minute,
815   psiconv_formula_fun_month,
816   psiconv_formula_fun_now,
817   psiconv_formula_fun_second,
818   psiconv_formula_fun_today,
819   psiconv_formula_fun_time,
820   psiconv_formula_fun_timevalue,
821   psiconv_formula_fun_year,
822   psiconv_formula_fun_abs,
823   psiconv_formula_fun_acos,
824   psiconv_formula_fun_asin,
825   psiconv_formula_fun_atan,
826   psiconv_formula_fun_atan2,
827   psiconv_formula_fun_cos,
828   psiconv_formula_fun_degrees,
829   psiconv_formula_fun_exp,
830   psiconv_formula_fun_fact,
831   psiconv_formula_fun_int,
832   psiconv_formula_fun_ln,
833   psiconv_formula_fun_log10,
834   psiconv_formula_fun_mod,
835   psiconv_formula_fun_pi,
836   psiconv_formula_fun_radians,
837   psiconv_formula_fun_rand,
838   psiconv_formula_fun_round,
839   psiconv_formula_fun_sign,
840   psiconv_formula_fun_sin,
841   psiconv_formula_fun_sqrt,
842   psiconv_formula_fun_sumproduct,
843   psiconv_formula_fun_tan,
844   psiconv_formula_fun_trunc,
845   psiconv_formula_fun_cterm,
846   psiconv_formula_fun_ddb,
847   psiconv_formula_fun_fv,
848   psiconv_formula_fun_irr,
849   psiconv_formula_fun_npv,
850   psiconv_formula_fun_pmt,
851   psiconv_formula_fun_pv,
852   psiconv_formula_fun_rate,
853   psiconv_formula_fun_sln,
854   psiconv_formula_fun_syd,
855   psiconv_formula_fun_term,
856   psiconv_formula_fun_combin,
857   psiconv_formula_fun_permut,
858   psiconv_formula_vfn_average,
859   psiconv_formula_vfn_choose,
860   psiconv_formula_vfn_count,
861   psiconv_formula_vfn_counta,
862   psiconv_formula_vfn_countblank,
863   psiconv_formula_vfn_max,
864   psiconv_formula_vfn_min,
865   psiconv_formula_vfn_product,
866   psiconv_formula_vfn_stdevp,
867   psiconv_formula_vfn_stdev,
868   psiconv_formula_vfn_sum,
869   psiconv_formula_vfn_sumsq,
870   psiconv_formula_vfn_varp,
871   psiconv_formula_vfn_var
872 } psiconv_formula_type_t;
873 
874 typedef psiconv_list psiconv_formula_list; /* Of struct psiconv_formula_s */
875 
876 typedef struct psiconv_formula_s
877 {
878   psiconv_formula_type_t type;
879   union {
880     psiconv_u32 dat_int;
881     double dat_float;
882     psiconv_string_t dat_string;
883     psiconv_sheet_cell_reference_t dat_cellref;
884     psiconv_sheet_cell_block_t dat_cellblock;
885     psiconv_formula_list fun_operands;
886     psiconv_u32 dat_variable;
887   } data;
888 } *psiconv_formula;
889 
890 typedef struct psiconv_sheet_line_s
891 {
892   psiconv_u32 position;
893   psiconv_sheet_cell_layout layout;
894 } *psiconv_sheet_line;
895 
896 typedef psiconv_list psiconv_sheet_line_list;
897                      /* Of struct psiconv_sheet_line_s */
898 
899 typedef struct psiconv_sheet_grid_size_s
900 {
901   psiconv_u32 line_number;
902   psiconv_length_t size;
903 } *psiconv_sheet_grid_size;
904 
905 typedef psiconv_list psiconv_sheet_grid_size_list;
906                     /* Of struct psiconv_sheet_grid_size_s */
907 
908 typedef psiconv_list psiconv_sheet_grid_break_list; /* of psiconv_u32 */
909 
910 typedef struct psiconv_sheet_grid_section_s
911 {
912   psiconv_bool_t show_column_titles;
913   psiconv_bool_t show_row_titles;
914   psiconv_bool_t show_vertical_grid;
915   psiconv_bool_t show_horizontal_grid;
916   psiconv_bool_t freeze_rows;
917   psiconv_bool_t freeze_columns;
918   psiconv_u32 frozen_rows;
919   psiconv_u32 frozen_columns;
920   psiconv_u32 first_unfrozen_row_displayed;
921   psiconv_u32 first_unfrozen_column_displayed;
922   psiconv_bool_t show_page_breaks;
923   psiconv_u32 first_row;
924   psiconv_u32 first_column;
925   psiconv_u32 last_row;
926   psiconv_u32 last_column;
927   psiconv_length_t default_row_height;
928   psiconv_length_t default_column_width;
929   psiconv_sheet_grid_size_list row_heights;
930   psiconv_sheet_grid_size_list column_heights;
931   psiconv_sheet_grid_break_list row_page_breaks;
932   psiconv_sheet_grid_break_list column_page_breaks;
933 } *psiconv_sheet_grid_section;
934 
935 typedef struct psiconv_sheet_worksheet_s
936 {
937   psiconv_sheet_cell_layout default_layout;
938   psiconv_sheet_cell_list cells;
939   psiconv_bool_t show_zeros;
940   psiconv_sheet_line_list row_default_layouts;
941   psiconv_sheet_line_list col_default_layouts;
942   psiconv_sheet_grid_section grid;
943 } *psiconv_sheet_worksheet;
944 
945 typedef psiconv_list psiconv_sheet_worksheet_list;
946         /* of struct psiconv_sheet_worksheet_s */
947 
948 typedef enum psiconv_variable_type
949 {
950   psiconv_var_int,
951   psiconv_var_float,
952   psiconv_var_string,
953   psiconv_var_cellref,
954   psiconv_var_cellblock
955 } psiconv_variable_type_t;
956 
957 typedef struct psiconv_sheet_variable_s
958 {
959   psiconv_u32 number;
960   psiconv_string_t name;
961   psiconv_variable_type_t type;
962   union {
963     psiconv_s32 dat_int;
964     double dat_float;
965     psiconv_string_t dat_string;
966     psiconv_sheet_cell_reference_t dat_cellref;
967     psiconv_sheet_cell_block_t dat_cellblock;
968   } data;
969 } *psiconv_sheet_variable;
970 
971 typedef psiconv_list psiconv_sheet_variable_list;
972         /* of struct psiconv_sheet_variable_s */
973 
974 typedef struct psiconv_sheet_name_section_s
975 {
976   psiconv_string_t name;
977 } *psiconv_sheet_name_section;
978 
979 typedef struct psiconv_sheet_info_section_s
980 {
981   psiconv_bool_t auto_recalc;
982 } *psiconv_sheet_info_section;
983 
984 typedef struct psiconv_sheet_workbook_section_s
985 {
986   psiconv_formula_list formulas;
987   psiconv_sheet_worksheet_list worksheets;
988   psiconv_sheet_variable_list variables;
989   psiconv_sheet_info_section info;
990   psiconv_sheet_name_section name;
991 } *psiconv_sheet_workbook_section;
992 
993 typedef struct psiconv_sheet_f_s
994 {
995   psiconv_page_layout_section page_sec;
996   psiconv_sheet_status_section status_sec;
997   psiconv_sheet_workbook_section workbook_sec;
998 } *psiconv_sheet_f;
999 
1000 /* NB: psiconv_file is already defined above */
1001 struct psiconv_file_s
1002 {
1003   psiconv_file_type_t type;
1004   void *file;
1005 };
1006 
1007 
1008 /* UID1 */
1009 #define PSICONV_ID_PSION5 0x10000037
1010 #define PSICONV_ID_CLIPART 0x10000041
1011 /* UID2 */
1012 #define PSICONV_ID_DATA_FILE 0x1000006D
1013 #define PSICONV_ID_MBM_FILE 0x10000042
1014 /* UID3 */
1015 #define PSICONV_ID_WORD 0x1000007F
1016 #define PSICONV_ID_TEXTED 0x10000085
1017 #define PSICONV_ID_SKETCH 0x1000007D
1018 #define PSICONV_ID_SHEET 0x10000088
1019 
1020 /* Section table ids */
1021 #define PSICONV_ID_WORD_STATUS_SECTION 0x10000243
1022 #define PSICONV_ID_APPL_ID_SECTION 0x10000089
1023 #define PSICONV_ID_TEXT_SECTION 0x10000106
1024 #define PSICONV_ID_LAYOUT_SECTION 0x10000143
1025 #define PSICONV_ID_WORD_STYLES_SECTION 0x10000104
1026 #define PSICONV_ID_PAGE_LAYOUT_SECTION 0x10000105
1027 #define PSICONV_ID_PASSWORD_SECTION 0x100000CD
1028 #define PSICONV_ID_SKETCH_SECTION 0x1000007D
1029 #define PSICONV_ID_SHEET_STATUS_SECTION 0x1000011F
1030 #define PSICONV_ID_SHEET_WORKBOOK_SECTION 0x1000011D
1031 #define PSICONV_ID_SHEET_GRAPH_SECTION 0x10000121
1032 
1033 /* Other ids */
1034 #define PSICONV_ID_PAGE_DIMENSIONS1 0x100000fd
1035 #define PSICONV_ID_PAGE_DIMENSIONS2 0x1000010e
1036 #define PSICONV_ID_TEXTED_BODY 0x1000005c
1037 #define PSICONV_ID_TEXTED_REPLACEMENT 0x10000063
1038 #define PSICONV_ID_TEXTED_UNKNOWN 0x10000065
1039 #define PSICONV_ID_TEXTED_LAYOUT 0x10000066
1040 #define PSICONV_ID_TEXTED_TEXT 0x10000064
1041 #define PSICONV_ID_STYLE_REMOVABLE 0x1000004F
1042 #define PSICONV_ID_STYLE_BUILT_IN 0x1000004C
1043 #define PSICONV_ID_CLIPART_ITEM 0x10000040
1044 #define PSICONV_ID_OBJECT 0x10000051
1045 #define PSICONV_ID_OBJECT_DISPLAY_SECTION 0x10000146
1046 #define PSICONV_ID_OBJECT_ICON_SECTION 0x1000012A
1047 #define PSICONV_ID_OBJECT_SECTION_TABLE_SECTION 0x10000144
1048 
1049 
1050 /* Return a clean layout_status. You can modify it at will. Returns NULL
1051    if there is not enough memory. */
1052 extern psiconv_character_layout psiconv_basic_character_layout(void);
1053 
1054 /* Return a clean layout_status. You can modify it at will. Returns NULL
1055    if there is not enough memory. */
1056 extern psiconv_paragraph_layout psiconv_basic_paragraph_layout(void);
1057 
1058 /* Clone a layout_status: the new copy is completely independent of the
1059    original one. Returns NULL if there is not enough memory. */
1060 extern psiconv_paragraph_layout psiconv_clone_paragraph_layout
1061                                        (psiconv_paragraph_layout ls);
1062 
1063 extern psiconv_character_layout psiconv_clone_character_layout
1064                                 (psiconv_character_layout ls);
1065 
1066 /* Get a numbered style. Returns NULL if the style is unknown. */
1067 extern psiconv_word_style psiconv_get_style (psiconv_word_styles_section ss, int nr);
1068 
1069 /* Return the number corresponding to the stylename. Returns 0 on success,
1070    an error code on failure. */
1071 extern int psiconv_find_style(const psiconv_word_styles_section ss,
1072                               const psiconv_ucs2 *name,int *nr);
1073 
1074 /* Get a numbered formula. Returns NULL if the style is unknown. */
1075 extern psiconv_formula psiconv_get_formula (psiconv_formula_list ss, int nr);
1076 
1077 /* Return the default layout */
1078 extern psiconv_sheet_cell_layout psiconv_get_default_layout
1079                                        (psiconv_sheet_line_list row_defaults,
1080                                         psiconv_sheet_line_list col_defaults,
1081                                         psiconv_sheet_cell_layout cell_default,
1082                                         int row,int col);
1083 
1084 extern void psiconv_free_color(psiconv_color color);
1085 extern void psiconv_free_border(psiconv_border border);
1086 extern void psiconv_free_bullet(psiconv_bullet bullet);
1087 extern void psiconv_free_font(psiconv_font font);
1088 extern void psiconv_free_tab(psiconv_tab tab);
1089 extern void psiconv_free_tabs(psiconv_all_tabs tabs);
1090 extern void psiconv_free_paragraph_layout(psiconv_paragraph_layout layout);
1091 extern void psiconv_free_character_layout(psiconv_character_layout layout);
1092 extern void psiconv_free_word_style(psiconv_word_style style);
1093 extern void psiconv_free_word_style_list(psiconv_word_style_list style_list);
1094 extern void psiconv_free_word_styles_section
1095                                       (psiconv_word_styles_section styles);
1096 extern void psiconv_free_formula(psiconv_formula formula);
1097 extern void psiconv_free_formula_list(psiconv_formula_list list);
1098 extern void psiconv_free_sheet_status_section
1099                                       (psiconv_sheet_status_section section);
1100 extern void psiconv_free_sheet_cell_layout(psiconv_sheet_cell_layout layout);
1101 extern void psiconv_free_sheet_grid_break_list
1102                                         (psiconv_sheet_grid_break_list list);
1103 extern void psiconv_free_sheet_grid_size(psiconv_sheet_grid_size s);
1104 extern void psiconv_free_sheet_grid_size_list
1105                                         (psiconv_sheet_grid_size_list list);
1106 extern void psiconv_free_sheet_grid_section(psiconv_sheet_grid_section sec);
1107 extern void psiconv_free_sheet_worksheet(psiconv_sheet_worksheet sheet);
1108 extern void psiconv_free_sheet_worksheet_list
1109                                          (psiconv_sheet_worksheet_list list);
1110 
1111 extern void psiconv_free_sheet_f(psiconv_sheet_f file);
1112 extern void psiconv_free_sheet_cell(psiconv_sheet_cell cell);
1113 extern void psiconv_free_sheet_cell_list(psiconv_sheet_cell_list list);
1114 extern void psiconv_free_sheet_numberformat
1115                                     (psiconv_sheet_numberformat numberformat);
1116 extern void psiconv_free_sheet_line_list(psiconv_sheet_line_list list);
1117 extern void psiconv_free_sheet_line(psiconv_sheet_line line);
1118 extern void psiconv_free_sheet_name_section(psiconv_sheet_name_section section);
1119 extern void psiconv_free_sheet_variable(psiconv_sheet_variable list);
1120 extern void psiconv_free_sheet_variable_list(psiconv_sheet_variable_list list);
1121 extern void psiconv_free_sheet_info_section(psiconv_sheet_info_section section);
1122 extern void psiconv_free_sheet_workbook_section
1123                                       (psiconv_sheet_workbook_section section);
1124 extern void psiconv_free_header_section(psiconv_header_section header);
1125 extern void psiconv_free_section_table_entry(psiconv_section_table_entry entry);
1126 extern void psiconv_free_section_table_section
1127                                    (psiconv_section_table_section section);
1128 extern void psiconv_free_application_id_section
1129                                    (psiconv_application_id_section section);
1130 extern void psiconv_free_object_display_section
1131                                    (psiconv_object_display_section section);
1132 extern void psiconv_free_object_icon_section
1133                                    (psiconv_object_icon_section section);
1134 extern void psiconv_free_embedded_object_section
1135                                    (psiconv_embedded_object_section object);
1136 extern void psiconv_free_in_line_layout(psiconv_in_line_layout layout);
1137 extern void psiconv_free_in_line_layouts(psiconv_in_line_layouts layouts);
1138 extern void psiconv_free_replacement(psiconv_replacement replacement);
1139 extern void psiconv_free_replacements(psiconv_replacements replacements);
1140 extern void psiconv_free_paragraph(psiconv_paragraph paragraph);
1141 extern void psiconv_free_text_and_layout(psiconv_text_and_layout text);
1142 extern void psiconv_free_texted_section(psiconv_texted_section section);
1143 extern void psiconv_free_page_header(psiconv_page_header header);
1144 extern void psiconv_free_page_layout_section
1145                                       (psiconv_page_layout_section section);
1146 extern void psiconv_free_word_status_section
1147                                       (psiconv_word_status_section section);
1148 extern void psiconv_free_word_f(psiconv_word_f file);
1149 extern void psiconv_free_texted_f(psiconv_texted_f file);
1150 extern void psiconv_free_paint_data_section(psiconv_paint_data_section section);
1151 extern void psiconv_free_pictures(psiconv_pictures section);
1152 extern void psiconv_free_jumptable_section
1153                                        (psiconv_jumptable_section section);
1154 extern void psiconv_free_mbm_f(psiconv_mbm_f file);
1155 extern void psiconv_free_sketch_section(psiconv_sketch_section sec);
1156 extern void psiconv_free_sketch_f(psiconv_sketch_f file);
1157 extern void psiconv_free_clipart_section(psiconv_clipart_section section);
1158 extern void psiconv_free_cliparts(psiconv_cliparts section);
1159 extern void psiconv_free_clipart_f(psiconv_clipart_f file);
1160 
1161 extern void psiconv_free_file(psiconv_file file);
1162 
1163 extern int psiconv_compare_color(const psiconv_color value1,
1164                                  const psiconv_color value2);
1165 extern int psiconv_compare_font(const psiconv_font value1,
1166                                 const psiconv_font value2);
1167 extern int psiconv_compare_border(const psiconv_border value1,
1168                                   const psiconv_border value2);
1169 extern int psiconv_compare_bullet(const psiconv_bullet value1,
1170                                   const psiconv_bullet value2);
1171 extern int psiconv_compare_tab(const psiconv_tab value1,
1172                                const psiconv_tab value2);
1173 extern int psiconv_compare_all_tabs(const psiconv_all_tabs value1,
1174                                     const psiconv_all_tabs value2);
1175 extern int psiconv_compare_paragraph_layout
1176                                (const psiconv_paragraph_layout value1,
1177                                 const psiconv_paragraph_layout value2);
1178 
1179 extern int psiconv_compare_character_layout
1180                                (const psiconv_character_layout value1,
1181                                 const psiconv_character_layout value2);
1182 
1183 /* Get a newly allocated file with sensible defaults, ready to generate. */
1184 extern psiconv_file psiconv_empty_file(psiconv_file_type_t type);
1185 
1186 
1187 #ifdef __cplusplus
1188 }
1189 #endif /* __cplusplus */
1190 
1191 #endif /* def PSICONV_DATA_H */
1192