/* xls2xml: Converts from Microsoft Excel files to XML. Copyright 1999 Roberto Arturo Tena Sanchez This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* Roberto Arturo Tena Sanchez */ #include #include #include #include #include #include /* FONT - Font Description */ int p31 (void) { char number[6]; /* max number 65535 */ xmlNodePtr font; xmlNodePtr bold; xmlNodePtr family; U16 flags; assert_return (xls2xml, parameters->record.opcode == 0x31, 19); test (parameters->record.size >= 15, 15); assert_return (xls2xml, parameters->xml_tree_shortcuts.defaults != NULL, 19); if (parameters->xml_tree_shortcuts.fonts == NULL) { test (parameters->next_font_refnum == 0, 19); parameters->xml_tree_shortcuts.fonts = xmlNewChild ( parameters->xml_tree_shortcuts.defaults, NULL, (unsigned char *)"fonts", NULL); test (parameters->xml_tree_shortcuts.fonts != NULL, 10); } font = xmlNewChild (parameters->xml_tree_shortcuts.fonts, NULL, (unsigned char *)"font", NULL); test (font != NULL, 10); /* refnum */ sprintf (number, "%d", parameters->next_font_refnum); parameters->next_font_refnum++; test (parameters->next_font_refnum != 0, 10); test (xmlSetProp (font, (unsigned char *)"refnum", (unsigned char *)number) != NULL, 10); /* heigth */ sprintf (number, "%d", fil_sreadU16 (parameters->record.info)); test (xmlNewChild (font, NULL, (unsigned char *)"height", (unsigned char *)number) != NULL, 10); verbose ("FIXME: colorrefnum in font tag"); flags = fil_sreadU16 (parameters->record.info+2); /* italic */ test (xmlNewChild (font, NULL, (unsigned char *)"italic", flags & 0x0002 ? (unsigned char *)"yes" : (unsigned char *)"no") != NULL, 10); /* strikeout */ test (xmlNewChild (font, NULL, (unsigned char *)"strikeout", flags & 0x0008 ? (unsigned char *)"yes" : (unsigned char *)"no") != NULL, 10); /* outline */ test (xmlNewChild (font, NULL, (unsigned char *)"outline", flags & 0x0010 ? (unsigned char *)"yes" : (unsigned char *)"no") != NULL, 10); /* shadow */ test (xmlNewChild (font, NULL, (unsigned char *)"shadow", flags & 0x0020 ? (unsigned char *)"yes" : (unsigned char *)"no") != NULL, 10); verbose ("FIXME: 31: enable colorrefnum"); /* next code is ok, just enable it when we actually output colors */ /* * colorrefnum * sprintf (number, "%d", fil_sreadU16 (parameters->record.info+4)); test (xmlNewChild (font, NULL, (unsigned char *)"colorrefnum", (unsigned char *)number) != NULL, 10); */ /* bold */ switch (fil_sreadU16 (parameters->record.info+6)) { case 0x0190: bold = xmlNewChild (font, NULL, (unsigned char *)"bold", (unsigned char *)"no"); test (bold != NULL, 10); test (xmlSetProp (bold, (unsigned char *)"type", (unsigned char *)"yesno") != NULL, 10); break; case 0x02bc: bold = xmlNewChild (font, NULL, (unsigned char *)"bold", (unsigned char *)"yes"); test (bold != NULL, 10); test (xmlSetProp (bold, (unsigned char *)"type", (unsigned char *)"yesno") != NULL, 10); break; default: sprintf (number, "%d", fil_sreadU16 (parameters->record.info+6)); bold = xmlNewChild (font, NULL, (unsigned char *)"bold", (unsigned char *)number); test (bold != NULL, 10); test (xmlSetProp (bold, (unsigned char *)"type", (unsigned char *)"numeric") != NULL, 10); break; } /* pos */ switch (fil_sreadU16 (parameters->record.info+8)) { default: test (xmlNewChild (font, NULL, (unsigned char *)"pos", (unsigned char *)"normal") != NULL, 10); break; case 0x01: test (xmlNewChild (font, NULL, (unsigned char *)"pos", (unsigned char *)"superscript") != NULL, 10); break; case 0x02: test (xmlNewChild (font, NULL, (unsigned char *)"pos", (unsigned char *)"subscript") != NULL, 10); break; } /* underline */ switch (*(parameters->record.info+10)) { default: test (xmlNewChild (font, NULL, (unsigned char *)"underline", (unsigned char *)"no") != NULL, 10); break; case 0x01: test (xmlNewChild (font, NULL, (unsigned char *)"underline", (unsigned char *)"single") != NULL, 10); break; case 0x02: test (xmlNewChild (font, NULL, (unsigned char *)"underline", (unsigned char *)"double") != NULL, 10); break; case 0x21: test (xmlNewChild (font, NULL, (unsigned char *)"underline", (unsigned char *)"singleaccounting") != NULL, 10); break; case 0x22: test (xmlNewChild (font, NULL, (unsigned char *)"underline", (unsigned char *)"doubleaccounting") != NULL, 10); break; } /* family */ switch (*(parameters->record.info+11)) { case 0x02: family = xmlNewChild (font, NULL, (unsigned char *)"family", (unsigned char *)"swiss"); test (family != NULL, 10); test (xmlSetProp (family, (unsigned char *)"type", (unsigned char *)"word") != NULL, 10); break; case 0x01: family = xmlNewChild (font, NULL, (unsigned char *)"family", (unsigned char *)"roman"); test (family != NULL, 10); test (xmlSetProp (family, (unsigned char *)"type", (unsigned char *)"word") != NULL, 10); break; default: sprintf (number, "%d", *(parameters->record.info+11)); family = xmlNewChild (font, NULL, (unsigned char *)"family", (unsigned char *)number); test (family != NULL, 10); test (xmlSetProp (family, (unsigned char *)"type", (unsigned char *)"numeric") != NULL, 10); break; } /* name */ switch (parameters->biff_version) { case BIFF_5_7: *(parameters->record.info+12) = *(parameters->record.info+14); *(parameters->record.info+13) = 0; *(parameters->record.info+14) = 0; return write_unicode_xml_child (font, NULL, "name", parameters->record.info+12, 3 + *(parameters->record.info+12), NULL); case BIFF_8: test (*(parameters->record.info+15) == 0x01, 15); *(parameters->record.info+13) = *(parameters->record.info+14); *(parameters->record.info+14) = 0; return write_unicode_xml_child (font, NULL, "name", parameters->record.info + 13, 3 + *(parameters->record.info+13), NULL); default: return 15; } }