0000: 2f 2a 20 0a 2f 20 66 72 65 65 78 6c 2e 63 0a 2f /* ./ freexl.c./
0010: 0a 2f 20 46 72 65 65 58 4c 20 69 6d 70 6c 65 6d ./ FreeXL implem
0020: 65 6e 74 61 74 69 6f 6e 0a 2f 0a 2f 20 76 65 72 entation././ ver
0030: 73 69 6f 6e 20 20 31 2e 30 2c 20 32 30 31 31 20 sion 1.0, 2011
0040: 4a 75 6c 79 20 32 36 0a 2f 0a 2f 20 41 75 74 68 July 26././ Auth
0050: 6f 72 3a 20 53 61 6e 64 72 6f 20 46 75 72 69 65 or: Sandro Furie
0060: 72 69 20 61 2e 66 75 72 69 65 72 69 40 6c 71 74 ri a.furieri@lqt
0070: 2e 69 74 0a 2f 0a 2f 20 2d 2d 2d 2d 2d 2d 2d 2d .it././ --------
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00c0: 2d 2d 2d 2d 2d 2d 0a 2f 20 0a 2f 20 56 65 72 73 ------./ ./ Vers
00d0: 69 6f 6e 3a 20 4d 50 4c 20 31 2e 31 2f 47 50 4c ion: MPL 1.1/GPL
00e0: 20 32 2e 30 2f 4c 47 50 4c 20 32 2e 31 0a 2f 20 2.0/LGPL 2.1./
00f0: 0a 2f 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 ./ The contents
0100: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 61 72 65 of this file are
0110: 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 subject to the
0120: 4d 6f 7a 69 6c 6c 61 20 50 75 62 6c 69 63 20 4c Mozilla Public L
0130: 69 63 65 6e 73 65 20 56 65 72 73 69 6f 6e 0a 2f icense Version./
0140: 20 31 2e 31 20 28 74 68 65 20 22 4c 69 63 65 6e 1.1 (the "Licen
0150: 73 65 22 29 3b 20 79 6f 75 20 6d 61 79 20 6e 6f se"); you may no
0160: 74 20 75 73 65 20 74 68 69 73 20 66 69 6c 65 20 t use this file
0170: 65 78 63 65 70 74 20 69 6e 20 63 6f 6d 70 6c 69 except in compli
0180: 61 6e 63 65 20 77 69 74 68 0a 2f 20 74 68 65 20 ance with./ the
0190: 4c 69 63 65 6e 73 65 2e 20 59 6f 75 20 6d 61 79 License. You may
01a0: 20 6f 62 74 61 69 6e 20 61 20 63 6f 70 79 20 6f obtain a copy o
01b0: 66 20 74 68 65 20 4c 69 63 65 6e 73 65 20 61 74 f the License at
01c0: 0a 2f 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6d 6f ./ http://www.mo
01d0: 7a 69 6c 6c 61 2e 6f 72 67 2f 4d 50 4c 2f 0a 2f zilla.org/MPL/./
01e0: 20 0a 2f 20 53 6f 66 74 77 61 72 65 20 64 69 73 ./ Software dis
01f0: 74 72 69 62 75 74 65 64 20 75 6e 64 65 72 20 74 tributed under t
0200: 68 65 20 4c 69 63 65 6e 73 65 20 69 73 20 64 69 he License is di
0210: 73 74 72 69 62 75 74 65 64 20 6f 6e 20 61 6e 20 stributed on an
0220: 22 41 53 20 49 53 22 20 62 61 73 69 73 2c 0a 2f "AS IS" basis,./
0230: 20 57 49 54 48 4f 55 54 20 57 41 52 52 41 4e 54 WITHOUT WARRANT
0240: 59 20 4f 46 20 41 4e 59 20 4b 49 4e 44 2c 20 65 Y OF ANY KIND, e
0250: 69 74 68 65 72 20 65 78 70 72 65 73 73 20 6f 72 ither express or
0260: 20 69 6d 70 6c 69 65 64 2e 20 53 65 65 20 74 68 implied. See th
0270: 65 20 4c 69 63 65 6e 73 65 0a 2f 20 66 6f 72 20 e License./ for
0280: 74 68 65 20 73 70 65 63 69 66 69 63 20 6c 61 6e the specific lan
0290: 67 75 61 67 65 20 67 6f 76 65 72 6e 69 6e 67 20 guage governing
02a0: 72 69 67 68 74 73 20 61 6e 64 20 6c 69 6d 69 74 rights and limit
02b0: 61 74 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 ations under the
02c0: 0a 2f 20 4c 69 63 65 6e 73 65 2e 0a 2f 0a 2f 20 ./ License.././
02d0: 54 68 65 20 4f 72 69 67 69 6e 61 6c 20 43 6f 64 The Original Cod
02e0: 65 20 69 73 20 74 68 65 20 46 72 65 65 58 4c 20 e is the FreeXL
02f0: 6c 69 62 72 61 72 79 0a 2f 0a 2f 20 54 68 65 20 library././ The
0300: 49 6e 69 74 69 61 6c 20 44 65 76 65 6c 6f 70 65 Initial Develope
0310: 72 20 6f 66 20 74 68 65 20 4f 72 69 67 69 6e 61 r of the Origina
0320: 6c 20 43 6f 64 65 20 69 73 20 41 6c 65 73 73 61 l Code is Alessa
0330: 6e 64 72 6f 20 46 75 72 69 65 72 69 0a 2f 20 0a ndro Furieri./ .
0340: 2f 20 50 6f 72 74 69 6f 6e 73 20 63 72 65 61 74 / Portions creat
0350: 65 64 20 62 79 20 74 68 65 20 49 6e 69 74 69 61 ed by the Initia
0360: 6c 20 44 65 76 65 6c 6f 70 65 72 20 61 72 65 20 l Developer are
0370: 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 30 Copyright (C) 20
0380: 31 31 0a 2f 20 74 68 65 20 49 6e 69 74 69 61 6c 11./ the Initial
0390: 20 44 65 76 65 6c 6f 70 65 72 2e 20 41 6c 6c 20 Developer. All
03a0: 52 69 67 68 74 73 20 52 65 73 65 72 76 65 64 2e Rights Reserved.
03b0: 0a 2f 20 0a 2f 20 43 6f 6e 74 72 69 62 75 74 6f ./ ./ Contributo
03c0: 72 28 73 29 3a 0a 2f 20 42 72 61 64 20 48 61 72 r(s):./ Brad Har
03d0: 64 73 0a 2f 20 0a 2f 20 41 6c 74 65 72 6e 61 74 ds./ ./ Alternat
03e0: 69 76 65 6c 79 2c 20 74 68 65 20 63 6f 6e 74 65 ively, the conte
03f0: 6e 74 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 nts of this file
0400: 20 6d 61 79 20 62 65 20 75 73 65 64 20 75 6e 64 may be used und
0410: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 0a er the terms of.
0420: 2f 20 65 69 74 68 65 72 20 74 68 65 20 47 4e 55 / either the GNU
0430: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 General Public
0440: 4c 69 63 65 6e 73 65 20 56 65 72 73 69 6f 6e 20 License Version
0450: 32 20 6f 72 20 6c 61 74 65 72 20 28 74 68 65 20 2 or later (the
0460: 22 47 50 4c 22 29 2c 20 6f 72 0a 2f 20 74 68 65 "GPL"), or./ the
0470: 20 47 4e 55 20 4c 65 73 73 65 72 20 47 65 6e 65 GNU Lesser Gene
0480: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e ral Public Licen
0490: 73 65 20 56 65 72 73 69 6f 6e 20 32 2e 31 20 6f se Version 2.1 o
04a0: 72 20 6c 61 74 65 72 20 28 74 68 65 20 22 4c 47 r later (the "LG
04b0: 50 4c 22 29 2c 0a 2f 20 69 6e 20 77 68 69 63 68 PL"),./ in which
04c0: 20 63 61 73 65 20 74 68 65 20 70 72 6f 76 69 73 case the provis
04d0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 47 50 4c 20 ions of the GPL
04e0: 6f 72 20 74 68 65 20 4c 47 50 4c 20 61 72 65 20 or the LGPL are
04f0: 61 70 70 6c 69 63 61 62 6c 65 20 69 6e 73 74 65 applicable inste
0500: 61 64 0a 2f 20 6f 66 20 74 68 6f 73 65 20 61 62 ad./ of those ab
0510: 6f 76 65 2e 20 49 66 20 79 6f 75 20 77 69 73 68 ove. If you wish
0520: 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 20 6f 66 to allow use of
0530: 20 79 6f 75 72 20 76 65 72 73 69 6f 6e 20 6f 66 your version of
0540: 20 74 68 69 73 20 66 69 6c 65 20 6f 6e 6c 79 0a this file only.
0550: 2f 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d / under the term
0560: 73 20 6f 66 20 65 69 74 68 65 72 20 74 68 65 20 s of either the
0570: 47 50 4c 20 6f 72 20 74 68 65 20 4c 47 50 4c 2c GPL or the LGPL,
0580: 20 61 6e 64 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f and not to allo
0590: 77 20 6f 74 68 65 72 73 20 74 6f 0a 2f 20 75 73 w others to./ us
05a0: 65 20 79 6f 75 72 20 76 65 72 73 69 6f 6e 20 6f e your version o
05b0: 66 20 74 68 69 73 20 66 69 6c 65 20 75 6e 64 65 f this file unde
05c0: 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 r the terms of t
05d0: 68 65 20 4d 50 4c 2c 20 69 6e 64 69 63 61 74 65 he MPL, indicate
05e0: 20 79 6f 75 72 0a 2f 20 64 65 63 69 73 69 6f 6e your./ decision
05f0: 20 62 79 20 64 65 6c 65 74 69 6e 67 20 74 68 65 by deleting the
0600: 20 70 72 6f 76 69 73 69 6f 6e 73 20 61 62 6f 76 provisions abov
0610: 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68 e and replace th
0620: 65 6d 20 77 69 74 68 20 74 68 65 20 6e 6f 74 69 em with the noti
0630: 63 65 0a 2f 20 61 6e 64 20 6f 74 68 65 72 20 70 ce./ and other p
0640: 72 6f 76 69 73 69 6f 6e 73 20 72 65 71 75 69 72 rovisions requir
0650: 65 64 20 62 79 20 74 68 65 20 47 50 4c 20 6f 72 ed by the GPL or
0660: 20 74 68 65 20 4c 47 50 4c 2e 20 49 66 20 79 6f the LGPL. If yo
0670: 75 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 0a u do not delete.
0680: 2f 20 74 68 65 20 70 72 6f 76 69 73 69 6f 6e 73 / the provisions
0690: 20 61 62 6f 76 65 2c 20 61 20 72 65 63 69 70 69 above, a recipi
06a0: 65 6e 74 20 6d 61 79 20 75 73 65 20 79 6f 75 72 ent may use your
06b0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 version of this
06c0: 20 66 69 6c 65 20 75 6e 64 65 72 0a 2f 20 74 68 file under./ th
06d0: 65 20 74 65 72 6d 73 20 6f 66 20 61 6e 79 20 6f e terms of any o
06e0: 6e 65 20 6f 66 20 74 68 65 20 4d 50 4c 2c 20 74 ne of the MPL, t
06f0: 68 65 20 47 50 4c 20 6f 72 20 74 68 65 20 4c 47 he GPL or the LG
0700: 50 4c 2e 0a 2f 20 0a 2a 2f 0a 23 69 6e 63 6c 75 PL../ .*/.#inclu
0710: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 de <stdlib.h>.#i
0720: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e nclude <stdio.h>
0730: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e .#include <strin
0740: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6d g.h>.#include <m
0750: 61 74 68 2e 68 3e 0a 0a 23 69 66 20 64 65 66 69 ath.h>..#if defi
0760: 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f 29 ned(__MINGW32__)
0770: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 49 4e || defined(_WIN
0780: 33 32 29 0a 23 64 65 66 69 6e 65 20 4c 49 42 49 32).#define LIBI
0790: 43 4f 4e 56 5f 53 54 41 54 49 43 0a 23 69 6e 63 CONV_STATIC.#inc
07a0: 6c 75 64 65 20 3c 69 63 6f 6e 76 2e 68 3e 0a 23 lude <iconv.h>.#
07b0: 64 65 66 69 6e 65 20 4c 49 42 43 48 41 52 53 45 define LIBCHARSE
07c0: 54 5f 53 54 41 54 49 43 0a 23 69 66 64 65 66 20 T_STATIC.#ifdef
07d0: 5f 4d 53 43 5f 56 45 52 0a 2f 2a 20 3c 6c 6f 63 _MSC_VER./* <loc
07e0: 61 6c 63 68 61 72 73 65 74 2e 68 3e 20 69 73 6e alcharset.h> isn
07f0: 27 74 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 't supported on
0800: 4f 53 47 65 6f 34 57 20 2a 2f 0a 2f 2a 20 61 70 OSGeo4W */./* ap
0810: 70 6c 79 69 6e 67 20 61 20 74 72 69 63 6b 79 20 plying a tricky
0820: 77 6f 72 6b 61 72 6f 75 6e 64 20 74 6f 20 66 69 workaround to fi
0830: 78 20 74 68 69 73 20 69 73 73 75 65 20 2a 2f 0a x this issue */.
0840: 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68 61 extern const cha
0850: 72 20 2a 6c 6f 63 61 6c 65 5f 63 68 61 72 73 65 r *locale_charse
0860: 74 20 28 76 6f 69 64 29 3b 0a 23 65 6c 73 65 20 t (void);.#else
0870: 2f 2a 20 73 61 6e 65 20 57 69 6e 64 6f 77 73 20 /* sane Windows
0880: 2d 20 6e 6f 74 20 4f 53 47 65 6f 34 57 20 2a 2f - not OSGeo4W */
0890: 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 6f 63 61 6c .#include <local
08a0: 63 68 61 72 73 65 74 2e 68 3e 0a 23 65 6e 64 69 charset.h>.#endi
08b0: 66 20 2f 2a 20 65 6e 64 20 6c 6f 63 61 6c 63 68 f /* end localch
08c0: 61 72 73 65 74 20 2a 2f 0a 23 65 6c 73 65 20 2f arset */.#else /
08d0: 2a 20 6e 6f 74 20 57 49 4e 44 4f 57 53 20 2a 2f * not WINDOWS */
08e0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 .#if defined(__A
08f0: 50 50 4c 45 5f 5f 29 20 7c 7c 20 64 65 66 69 6e PPLE__) || defin
0900: 65 64 28 5f 5f 41 4e 44 52 4f 49 44 5f 5f 29 0a ed(__ANDROID__).
0910: 23 69 6e 63 6c 75 64 65 20 3c 69 63 6f 6e 76 2e #include <iconv.
0920: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6c 6f 63 h>.#include <loc
0930: 61 6c 63 68 61 72 73 65 74 2e 68 3e 0a 23 65 6c alcharset.h>.#el
0940: 73 65 20 2f 2a 20 6e 65 69 74 68 65 72 20 4d 61 se /* neither Ma
0950: 63 20 4f 73 58 20 6e 6f 72 20 41 6e 64 72 6f 69 c OsX nor Androi
0960: 64 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 69 d */.#include <i
0970: 63 6f 6e 76 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 conv.h>.#include
0980: 20 3c 6c 61 6e 67 69 6e 66 6f 2e 68 3e 0a 23 65 <langinfo.h>.#e
0990: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 ndif.#endif..#if
09a0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 defined(_WIN32)
09b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4d && !defined(__M
09c0: 49 4e 47 57 33 32 5f 5f 29 0a 23 69 6e 63 6c 75 INGW32__).#inclu
09d0: 64 65 20 22 63 6f 6e 66 69 67 2d 6d 73 76 63 2e de "config-msvc.
09e0: 68 22 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 h".#else.#includ
09f0: 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 65 6e e "config.h".#en
0a00: 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22 66 dif..#include "f
0a10: 72 65 65 78 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 reexl.h".#includ
0a20: 65 20 22 66 72 65 65 78 6c 5f 69 6e 74 65 72 6e e "freexl_intern
0a30: 61 6c 73 2e 68 22 0a 0a 23 69 66 20 64 65 66 69 als.h"..#if defi
0a40: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 ned(_WIN32) && !
0a50: 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 defined(__MINGW3
0a60: 32 5f 5f 29 0a 2f 2a 20 4d 53 56 43 20 63 6f 6d 2__)./* MSVC com
0a70: 70 69 6c 65 72 20 64 6f 65 73 6e 27 74 20 73 75 piler doesn't su
0a80: 70 70 6f 72 74 20 6c 72 6f 75 6e 64 28 29 20 61 pport lround() a
0a90: 74 20 61 6c 6c 20 2a 2f 0a 73 74 61 74 69 63 20 t all */.static
0aa0: 64 6f 75 62 6c 65 0a 72 6f 75 6e 64 20 28 64 6f double.round (do
0ab0: 75 62 6c 65 20 6e 75 6d 29 0a 7b 0a 20 20 20 20 uble num).{.
0ac0: 64 6f 75 62 6c 65 20 69 6e 74 65 67 65 72 20 3d double integer =
0ad0: 20 63 65 69 6c 20 28 6e 75 6d 29 3b 0a 20 20 20 ceil (num);.
0ae0: 20 69 66 20 28 6e 75 6d 20 3e 20 30 29 0a 09 72 if (num > 0)..r
0af0: 65 74 75 72 6e 20 69 6e 74 65 67 65 72 20 2d 20 eturn integer -
0b00: 6e 75 6d 20 3e 20 30 2e 35 20 3f 20 69 6e 74 65 num > 0.5 ? inte
0b10: 67 65 72 20 2d 20 31 2e 30 20 3a 20 69 6e 74 65 ger - 1.0 : inte
0b20: 67 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 ger;. return
0b30: 69 6e 74 65 67 65 72 20 2d 20 6e 75 6d 20 3e 3d integer - num >=
0b40: 20 30 2e 35 20 3f 20 69 6e 74 65 67 65 72 20 2d 0.5 ? integer -
0b50: 20 31 2e 30 20 3a 20 69 6e 74 65 67 65 72 3b 0a 1.0 : integer;.
0b60: 7d 0a 0a 73 74 61 74 69 63 20 6c 6f 6e 67 0a 6c }..static long.l
0b70: 72 6f 75 6e 64 20 28 64 6f 75 62 6c 65 20 6e 75 round (double nu
0b80: 6d 29 0a 7b 0a 20 20 20 20 6c 6f 6e 67 20 69 6e m).{. long in
0b90: 74 65 67 65 72 20 3d 20 28 6c 6f 6e 67 29 20 72 teger = (long) r
0ba0: 6f 75 6e 64 20 28 6e 75 6d 29 3b 0a 20 20 20 20 ound (num);.
0bb0: 72 65 74 75 72 6e 20 69 6e 74 65 67 65 72 3b 0a return integer;.
0bc0: 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 }.#endif..static
0bd0: 20 76 6f 69 64 0a 73 77 61 70 31 36 20 28 62 69 void.swap16 (bi
0be0: 66 66 5f 77 6f 72 64 31 36 20 2a 20 77 6f 72 64 ff_word16 * word
0bf0: 29 0a 7b 0a 2f 2a 20 45 6e 64 69 61 6e 6e 65 73 ).{./* Endiannes
0c00: 73 3a 20 73 77 61 70 70 69 6e 67 20 61 20 31 36 s: swapping a 16
0c10: 20 62 69 74 20 77 6f 72 64 20 2a 2f 0a 20 20 20 bit word */.
0c20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 unsigned char s
0c30: 61 76 65 20 3d 20 77 6f 72 64 2d 3e 62 79 74 65 ave = word->byte
0c40: 73 5b 30 5d 3b 0a 20 20 20 20 77 6f 72 64 2d 3e s[0];. word->
0c50: 62 79 74 65 73 5b 30 5d 20 3d 20 77 6f 72 64 2d bytes[0] = word-
0c60: 3e 62 79 74 65 73 5b 31 5d 3b 0a 20 20 20 20 77 >bytes[1];. w
0c70: 6f 72 64 2d 3e 62 79 74 65 73 5b 31 5d 20 3d 20 ord->bytes[1] =
0c80: 73 61 76 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 save;.}..static
0c90: 76 6f 69 64 0a 73 77 61 70 33 32 20 28 62 69 66 void.swap32 (bif
0ca0: 66 5f 77 6f 72 64 33 32 20 2a 20 77 6f 72 64 29 f_word32 * word)
0cb0: 0a 7b 0a 2f 2a 20 45 6e 64 69 61 6e 6e 65 73 73 .{./* Endianness
0cc0: 3a 20 73 77 61 70 70 69 6e 67 20 61 20 33 32 20 : swapping a 32
0cd0: 62 69 74 20 77 6f 72 64 20 2a 2f 0a 20 20 20 20 bit word */.
0ce0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 61 unsigned char sa
0cf0: 76 65 30 20 3d 20 77 6f 72 64 2d 3e 62 79 74 65 ve0 = word->byte
0d00: 73 5b 30 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e s[0];. unsign
0d10: 65 64 20 63 68 61 72 20 73 61 76 65 31 20 3d 20 ed char save1 =
0d20: 77 6f 72 64 2d 3e 62 79 74 65 73 5b 31 5d 3b 0a word->bytes[1];.
0d30: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
0d40: 72 20 73 61 76 65 32 20 3d 20 77 6f 72 64 2d 3e r save2 = word->
0d50: 62 79 74 65 73 5b 32 5d 3b 0a 20 20 20 20 77 6f bytes[2];. wo
0d60: 72 64 2d 3e 62 79 74 65 73 5b 30 5d 20 3d 20 77 rd->bytes[0] = w
0d70: 6f 72 64 2d 3e 62 79 74 65 73 5b 33 5d 3b 0a 20 ord->bytes[3];.
0d80: 20 20 20 77 6f 72 64 2d 3e 62 79 74 65 73 5b 31 word->bytes[1
0d90: 5d 20 3d 20 73 61 76 65 32 3b 0a 20 20 20 20 77 ] = save2;. w
0da0: 6f 72 64 2d 3e 62 79 74 65 73 5b 32 5d 20 3d 20 ord->bytes[2] =
0db0: 73 61 76 65 31 3b 0a 20 20 20 20 77 6f 72 64 2d save1;. word-
0dc0: 3e 62 79 74 65 73 5b 33 5d 20 3d 20 73 61 76 65 >bytes[3] = save
0dd0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 0;.}..static voi
0de0: 64 0a 73 77 61 70 5f 66 6c 6f 61 74 20 28 62 69 d.swap_float (bi
0df0: 66 66 5f 66 6c 6f 61 74 20 2a 20 77 6f 72 64 29 ff_float * word)
0e00: 0a 7b 0a 2f 2a 20 45 6e 64 69 61 6e 6e 65 73 73 .{./* Endianness
0e10: 3a 20 73 77 61 70 70 69 6e 67 20 61 20 36 34 20 : swapping a 64
0e20: 62 69 74 20 66 6c 6f 61 74 20 2a 2f 0a 20 20 20 bit float */.
0e30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 unsigned char s
0e40: 61 76 65 30 20 3d 20 77 6f 72 64 2d 3e 62 79 74 ave0 = word->byt
0e50: 65 73 5b 30 5d 3b 0a 20 20 20 20 75 6e 73 69 67 es[0];. unsig
0e60: 6e 65 64 20 63 68 61 72 20 73 61 76 65 31 20 3d ned char save1 =
0e70: 20 77 6f 72 64 2d 3e 62 79 74 65 73 5b 31 5d 3b word->bytes[1];
0e80: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
0e90: 61 72 20 73 61 76 65 32 20 3d 20 77 6f 72 64 2d ar save2 = word-
0ea0: 3e 62 79 74 65 73 5b 32 5d 3b 0a 20 20 20 20 75 >bytes[2];. u
0eb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 61 76 nsigned char sav
0ec0: 65 33 20 3d 20 77 6f 72 64 2d 3e 62 79 74 65 73 e3 = word->bytes
0ed0: 5b 33 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 [3];. unsigne
0ee0: 64 20 63 68 61 72 20 73 61 76 65 34 20 3d 20 77 d char save4 = w
0ef0: 6f 72 64 2d 3e 62 79 74 65 73 5b 34 5d 3b 0a 20 ord->bytes[4];.
0f00: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
0f10: 20 73 61 76 65 35 20 3d 20 77 6f 72 64 2d 3e 62 save5 = word->b
0f20: 79 74 65 73 5b 35 5d 3b 0a 20 20 20 20 75 6e 73 ytes[5];. uns
0f30: 69 67 6e 65 64 20 63 68 61 72 20 73 61 76 65 36 igned char save6
0f40: 20 3d 20 77 6f 72 64 2d 3e 62 79 74 65 73 5b 36 = word->bytes[6
0f50: 5d 3b 0a 20 20 20 20 77 6f 72 64 2d 3e 62 79 74 ];. word->byt
0f60: 65 73 5b 30 5d 20 3d 20 77 6f 72 64 2d 3e 62 79 es[0] = word->by
0f70: 74 65 73 5b 37 5d 3b 0a 20 20 20 20 77 6f 72 64 tes[7];. word
0f80: 2d 3e 62 79 74 65 73 5b 31 5d 20 3d 20 73 61 76 ->bytes[1] = sav
0f90: 65 36 3b 0a 20 20 20 20 77 6f 72 64 2d 3e 62 79 e6;. word->by
0fa0: 74 65 73 5b 32 5d 20 3d 20 73 61 76 65 35 3b 0a tes[2] = save5;.
0fb0: 20 20 20 20 77 6f 72 64 2d 3e 62 79 74 65 73 5b word->bytes[
0fc0: 33 5d 20 3d 20 73 61 76 65 34 3b 0a 20 20 20 20 3] = save4;.
0fd0: 77 6f 72 64 2d 3e 62 79 74 65 73 5b 34 5d 20 3d word->bytes[4] =
0fe0: 20 73 61 76 65 33 3b 0a 20 20 20 20 77 6f 72 64 save3;. word
0ff0: 2d 3e 62 79 74 65 73 5b 35 5d 20 3d 20 73 61 76 ->bytes[5] = sav
1000: 65 32 3b 0a 20 20 20 20 77 6f 72 64 2d 3e 62 79 e2;. word->by
1010: 74 65 73 5b 36 5d 20 3d 20 73 61 76 65 31 3b 0a tes[6] = save1;.
1020: 20 20 20 20 77 6f 72 64 2d 3e 62 79 74 65 73 5b word->bytes[
1030: 37 5d 20 3d 20 73 61 76 65 30 3b 0a 7d 0a 0a 73 7] = save0;.}..s
1040: 74 61 74 69 63 20 69 6e 74 0a 62 69 66 66 5f 73 tatic int.biff_s
1050: 65 74 5f 75 74 66 38 5f 63 6f 6e 76 65 72 74 65 et_utf8_converte
1060: 72 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b r (biff_workbook
1070: 20 2a 20 77 6f 72 6b 62 6f 6f 6b 29 0a 7b 0a 2f * workbook).{./
1080: 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 * attempting to
1090: 73 65 74 20 75 70 20 61 20 63 68 61 72 73 65 74 set up a charset
10a0: 20 63 6f 6e 76 65 72 74 65 72 20 74 6f 20 55 54 converter to UT
10b0: 46 2d 38 20 2a 2f 0a 20 20 20 20 69 63 6f 6e 76 F-8 */. iconv
10c0: 5f 74 20 63 76 74 20 3d 20 28 69 63 6f 6e 76 5f _t cvt = (iconv_
10d0: 74 29 20 28 2d 31 29 3b 0a 20 20 20 20 69 66 20 t) (-1);. if
10e0: 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 38 5f (workbook->utf8_
10f0: 63 6f 6e 76 65 72 74 65 72 29 0a 09 69 63 6f 6e converter)..icon
1100: 76 5f 63 6c 6f 73 65 20 28 77 6f 72 6b 62 6f 6f v_close (workboo
1110: 6b 2d 3e 75 74 66 38 5f 63 6f 6e 76 65 72 74 65 k->utf8_converte
1120: 72 29 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b r);. workbook
1130: 2d 3e 75 74 66 38 5f 63 6f 6e 76 65 72 74 65 72 ->utf8_converter
1140: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 77 69 = NULL;. swi
1150: 74 63 68 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 tch (workbook->b
1160: 69 66 66 5f 63 6f 64 65 5f 70 61 67 65 29 0a 20 iff_code_page).
1170: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 63 61 73 {. cas
1180: 65 20 30 78 30 31 36 46 3a 0a 09 20 20 63 76 74 e 0x016F:.. cvt
1190: 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 = iconv_open ("
11a0: 55 54 46 2d 38 22 2c 20 22 41 53 43 49 49 22 29 UTF-8", "ASCII")
11b0: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 ;.. break;.
11c0: 20 20 63 61 73 65 20 30 78 30 31 42 35 3a 0a 09 case 0x01B5:..
11d0: 20 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 cvt = iconv_op
11e0: 65 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 43 50 en ("UTF-8", "CP
11f0: 34 33 37 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 437");.. break;
1200: 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 30 32 . case 0x02
1210: 44 30 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 6f D0:.. cvt = ico
1220: 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 nv_open ("UTF-8"
1230: 2c 20 22 43 50 37 32 30 22 29 3b 0a 09 20 20 62 , "CP720");.. b
1240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 reak;. case
1250: 20 30 78 30 32 45 31 3a 0a 09 20 20 63 76 74 20 0x02E1:.. cvt
1260: 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 = iconv_open ("U
1270: 54 46 2d 38 22 2c 20 22 43 50 37 33 37 22 29 3b TF-8", "CP737");
1280: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 .. break;.
1290: 20 63 61 73 65 20 30 78 30 33 30 37 3a 0a 09 20 case 0x0307:..
12a0: 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 cvt = iconv_ope
12b0: 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 43 50 37 n ("UTF-8", "CP7
12c0: 37 35 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 75");.. break;.
12d0: 20 20 20 20 20 20 63 61 73 65 20 30 78 30 33 35 case 0x035
12e0: 32 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 6f 6e 2:.. cvt = icon
12f0: 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 2c v_open ("UTF-8",
1300: 20 22 43 50 38 35 30 22 29 3b 0a 09 20 20 62 72 "CP850");.. br
1310: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 eak;. case
1320: 30 78 30 33 35 34 3a 0a 09 20 20 63 76 74 20 3d 0x0354:.. cvt =
1330: 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 iconv_open ("UT
1340: 46 2d 38 22 2c 20 22 43 50 38 35 32 22 29 3b 0a F-8", "CP852");.
1350: 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 . break;.
1360: 63 61 73 65 20 30 78 30 33 35 37 3a 0a 09 20 20 case 0x0357:..
1370: 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e cvt = iconv_open
1380: 20 28 22 55 54 46 2d 38 22 2c 20 22 43 50 38 35 ("UTF-8", "CP85
1390: 35 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 5");.. break;.
13a0: 20 20 20 20 20 63 61 73 65 20 30 78 30 33 35 39 case 0x0359
13b0: 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 6f 6e 76 :.. cvt = iconv
13c0: 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 2c 20 _open ("UTF-8",
13d0: 22 43 50 38 35 37 22 29 3b 0a 09 20 20 62 72 65 "CP857");.. bre
13e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 30 ak;. case 0
13f0: 78 30 33 35 41 3a 0a 09 20 20 63 76 74 20 3d 20 x035A:.. cvt =
1400: 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 iconv_open ("UTF
1410: 2d 38 22 2c 20 22 43 50 38 35 38 22 29 3b 0a 09 -8", "CP858");..
1420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 break;. c
1430: 61 73 65 20 30 78 30 33 35 43 3a 0a 09 20 20 63 ase 0x035C:.. c
1440: 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 vt = iconv_open
1450: 28 22 55 54 46 2d 38 22 2c 20 22 43 50 38 36 30 ("UTF-8", "CP860
1460: 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 ");.. break;.
1470: 20 20 20 20 63 61 73 65 20 30 78 30 33 35 44 3a case 0x035D:
1480: 0a 09 20 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f .. cvt = iconv_
1490: 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 open ("UTF-8", "
14a0: 43 50 38 36 31 22 29 3b 0a 09 20 20 62 72 65 61 CP861");.. brea
14b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 k;. case 0x
14c0: 30 33 35 45 3a 0a 09 20 20 63 76 74 20 3d 20 69 035E:.. cvt = i
14d0: 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d conv_open ("UTF-
14e0: 38 22 2c 20 22 43 50 38 36 32 22 29 3b 0a 09 20 8", "CP862");..
14f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 break;. ca
1500: 73 65 20 30 78 30 33 35 46 3a 0a 09 20 20 63 76 se 0x035F:.. cv
1510: 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 t = iconv_open (
1520: 22 55 54 46 2d 38 22 2c 20 22 43 50 38 36 33 22 "UTF-8", "CP863"
1530: 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 );.. break;.
1540: 20 20 20 63 61 73 65 20 30 78 30 33 36 30 3a 0a case 0x0360:.
1550: 09 20 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f . cvt = iconv_o
1560: 70 65 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 43 pen ("UTF-8", "C
1570: 50 38 36 34 22 29 3b 0a 09 20 20 62 72 65 61 6b P864");.. break
1580: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 30 ;. case 0x0
1590: 33 36 31 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 361:.. cvt = ic
15a0: 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 onv_open ("UTF-8
15b0: 22 2c 20 22 43 50 38 36 35 22 29 3b 0a 09 20 20 ", "CP865");..
15c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 break;. cas
15d0: 65 20 30 78 30 33 36 32 3a 0a 09 20 20 63 76 74 e 0x0362:.. cvt
15e0: 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 = iconv_open ("
15f0: 55 54 46 2d 38 22 2c 20 22 43 50 38 36 36 22 29 UTF-8", "CP866")
1600: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 ;.. break;.
1610: 20 20 63 61 73 65 20 30 78 30 33 36 35 3a 0a 09 case 0x0365:..
1620: 20 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 cvt = iconv_op
1630: 65 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 43 50 en ("UTF-8", "CP
1640: 38 36 39 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 869");.. break;
1650: 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 30 33 . case 0x03
1660: 36 41 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 6f 6A:.. cvt = ico
1670: 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 nv_open ("UTF-8"
1680: 2c 20 22 43 50 38 37 34 22 29 3b 0a 09 20 20 62 , "CP874");.. b
1690: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 reak;. case
16a0: 20 30 78 30 33 41 34 3a 0a 09 20 20 63 76 74 20 0x03A4:.. cvt
16b0: 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 = iconv_open ("U
16c0: 54 46 2d 38 22 2c 20 22 43 50 39 33 32 22 29 3b TF-8", "CP932");
16d0: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 .. break;.
16e0: 20 63 61 73 65 20 30 78 30 33 41 38 3a 0a 09 20 case 0x03A8:..
16f0: 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 cvt = iconv_ope
1700: 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 43 50 39 n ("UTF-8", "CP9
1710: 33 36 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 36");.. break;.
1720: 20 20 20 20 20 20 63 61 73 65 20 30 78 30 33 42 case 0x03B
1730: 35 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 6f 6e 5:.. cvt = icon
1740: 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 2c v_open ("UTF-8",
1750: 20 22 43 50 39 34 39 22 29 3b 0a 09 20 20 62 72 "CP949");.. br
1760: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 eak;. case
1770: 30 78 30 33 42 36 3a 0a 09 20 20 63 76 74 20 3d 0x03B6:.. cvt =
1780: 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 iconv_open ("UT
1790: 46 2d 38 22 2c 20 22 43 50 39 35 30 22 29 3b 0a F-8", "CP950");.
17a0: 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 . break;.
17b0: 63 61 73 65 20 30 78 30 34 42 30 3a 0a 09 20 20 case 0x04B0:..
17c0: 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e cvt = iconv_open
17d0: 20 28 22 55 54 46 2d 38 22 2c 20 22 55 54 46 2d ("UTF-8", "UTF-
17e0: 31 36 4c 45 22 29 3b 0a 09 20 20 62 72 65 61 6b 16LE");.. break
17f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 30 ;. case 0x0
1800: 34 45 32 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 4E2:.. cvt = ic
1810: 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 onv_open ("UTF-8
1820: 22 2c 20 22 43 50 31 32 35 30 22 29 3b 0a 09 20 ", "CP1250");..
1830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 break;. ca
1840: 73 65 20 30 78 30 34 45 33 3a 0a 09 20 20 63 76 se 0x04E3:.. cv
1850: 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 t = iconv_open (
1860: 22 55 54 46 2d 38 22 2c 20 22 43 50 31 32 35 31 "UTF-8", "CP1251
1870: 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 ");.. break;.
1880: 20 20 20 20 63 61 73 65 20 30 78 30 34 45 34 3a case 0x04E4:
1890: 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 38 30 . case 0x80
18a0: 30 31 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 6f 01:.. cvt = ico
18b0: 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 nv_open ("UTF-8"
18c0: 2c 20 22 43 50 31 32 35 32 22 29 3b 0a 09 20 20 , "CP1252");..
18d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 break;. cas
18e0: 65 20 30 78 30 34 45 35 3a 0a 09 20 20 63 76 74 e 0x04E5:.. cvt
18f0: 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 = iconv_open ("
1900: 55 54 46 2d 38 22 2c 20 22 43 50 31 32 35 33 22 UTF-8", "CP1253"
1910: 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 );.. break;.
1920: 20 20 20 63 61 73 65 20 30 78 30 34 45 36 3a 0a case 0x04E6:.
1930: 09 20 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f . cvt = iconv_o
1940: 70 65 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 43 pen ("UTF-8", "C
1950: 50 31 32 35 34 22 29 3b 0a 09 20 20 62 72 65 61 P1254");.. brea
1960: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 k;. case 0x
1970: 30 34 45 37 3a 0a 09 20 20 63 76 74 20 3d 20 69 04E7:.. cvt = i
1980: 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d conv_open ("UTF-
1990: 38 22 2c 20 22 43 50 31 32 35 35 22 29 3b 0a 09 8", "CP1255");..
19a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 break;. c
19b0: 61 73 65 20 30 78 30 34 45 38 3a 0a 09 20 20 63 ase 0x04E8:.. c
19c0: 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 vt = iconv_open
19d0: 28 22 55 54 46 2d 38 22 2c 20 22 43 50 31 32 35 ("UTF-8", "CP125
19e0: 36 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 6");.. break;.
19f0: 20 20 20 20 20 63 61 73 65 20 30 78 30 34 45 39 case 0x04E9
1a00: 3a 0a 09 20 20 63 76 74 20 3d 20 69 63 6f 6e 76 :.. cvt = iconv
1a10: 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 22 2c 20 _open ("UTF-8",
1a20: 22 43 50 31 32 35 37 22 29 3b 0a 09 20 20 62 72 "CP1257");.. br
1a30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 eak;. case
1a40: 30 78 30 34 45 41 3a 0a 09 20 20 63 76 74 20 3d 0x04EA:.. cvt =
1a50: 20 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 iconv_open ("UT
1a60: 46 2d 38 22 2c 20 22 43 50 31 32 35 38 22 29 3b F-8", "CP1258");
1a70: 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 .. break;.
1a80: 20 63 61 73 65 20 30 78 30 35 35 31 3a 0a 09 20 case 0x0551:..
1a90: 20 63 76 74 20 3d 20 69 63 6f 6e 76 5f 6f 70 65 cvt = iconv_ope
1aa0: 6e 20 28 22 55 54 46 2d 38 22 2c 20 22 43 50 31 n ("UTF-8", "CP1
1ab0: 33 36 31 22 29 3b 0a 09 20 20 62 72 65 61 6b 3b 361");.. break;
1ac0: 0a 20 20 20 20 20 20 63 61 73 65 20 30 78 32 37 . case 0x27
1ad0: 31 30 3a 0a 20 20 20 20 20 20 63 61 73 65 20 30 10:. case 0
1ae0: 78 38 30 30 30 3a 0a 09 20 20 63 76 74 20 3d 20 x8000:.. cvt =
1af0: 69 63 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 iconv_open ("UTF
1b00: 2d 38 22 2c 20 22 4d 61 63 52 6f 6d 61 6e 22 29 -8", "MacRoman")
1b10: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 ;.. break;.
1b20: 20 20 7d 3b 0a 20 20 20 20 69 66 20 28 63 76 74 };. if (cvt
1b30: 20 3d 3d 20 28 69 63 6f 6e 76 5f 74 29 20 28 2d == (iconv_t) (-
1b40: 31 29 29 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 1))..return 0;.
1b50: 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 workbook->utf
1b60: 38 5f 63 6f 6e 76 65 72 74 65 72 20 3d 20 63 76 8_converter = cv
1b70: 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b t;. return 1;
1b80: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 .}..static char
1b90: 2a 0a 63 6f 6e 76 65 72 74 5f 74 6f 5f 75 74 66 *.convert_to_utf
1ba0: 38 20 28 69 63 6f 6e 76 5f 74 20 63 6f 6e 76 65 8 (iconv_t conve
1bb0: 72 74 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 rter, const char
1bc0: 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 6c 65 *buf, int bufle
1bd0: 6e 2c 20 69 6e 74 20 2a 65 72 72 29 0a 7b 0a 2f n, int *err).{./
1be0: 2a 20 63 6f 6e 76 65 72 74 69 6e 67 20 61 20 73 * converting a s
1bf0: 74 72 69 6e 67 20 74 6f 20 55 54 46 38 20 2a 2f tring to UTF8 */
1c00: 0a 20 20 20 20 63 68 61 72 20 2a 75 74 66 38 62 . char *utf8b
1c10: 75 66 20 3d 20 30 3b 0a 23 69 66 20 21 64 65 66 uf = 0;.#if !def
1c20: 69 6e 65 64 28 5f 5f 4d 49 4e 47 57 33 32 5f 5f ined(__MINGW32__
1c30: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 57 49 ) && defined(_WI
1c40: 4e 33 32 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 N32). const c
1c50: 68 61 72 20 2a 70 42 75 66 3b 0a 23 65 6c 73 65 har *pBuf;.#else
1c60: 0a 20 20 20 20 63 68 61 72 20 2a 70 42 75 66 3b . char *pBuf;
1c70: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 69 7a 65 .#endif. size
1c80: 5f 74 20 6c 65 6e 3b 0a 20 20 20 20 73 69 7a 65 _t len;. size
1c90: 5f 74 20 75 74 66 38 6c 65 6e 3b 0a 20 20 20 20 _t utf8len;.
1ca0: 69 6e 74 20 6d 61 78 6c 65 6e 20 3d 20 62 75 66 int maxlen = buf
1cb0: 6c 65 6e 20 2a 20 34 3b 0a 20 20 20 20 63 68 61 len * 4;. cha
1cc0: 72 20 2a 70 55 74 66 38 62 75 66 3b 0a 20 20 20 r *pUtf8buf;.
1cd0: 20 2a 65 72 72 20 3d 20 46 52 45 45 58 4c 5f 4f *err = FREEXL_O
1ce0: 4b 3b 0a 20 20 20 20 69 66 20 28 21 63 6f 6e 76 K;. if (!conv
1cf0: 65 72 74 65 72 29 0a 20 20 20 20 20 20 7b 0a 09 erter). {..
1d00: 20 20 2a 65 72 72 20 3d 20 46 52 45 45 58 4c 5f *err = FREEXL_
1d10: 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 48 41 52 UNSUPPORTED_CHAR
1d20: 53 45 54 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e SET;.. return N
1d30: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ULL;. }.
1d40: 20 75 74 66 38 62 75 66 20 3d 20 6d 61 6c 6c 6f utf8buf = mallo
1d50: 63 20 28 6d 61 78 6c 65 6e 29 3b 0a 20 20 20 20 c (maxlen);.
1d60: 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 20 20 len = buflen;.
1d70: 20 20 75 74 66 38 6c 65 6e 20 3d 20 6d 61 78 6c utf8len = maxl
1d80: 65 6e 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 en;. pBuf = (
1d90: 63 68 61 72 20 2a 29 20 62 75 66 3b 0a 20 20 20 char *) buf;.
1da0: 20 70 55 74 66 38 62 75 66 20 3d 20 75 74 66 38 pUtf8buf = utf8
1db0: 62 75 66 3b 0a 20 20 20 20 69 66 20 28 69 63 6f buf;. if (ico
1dc0: 6e 76 20 28 63 6f 6e 76 65 72 74 65 72 2c 20 26 nv (converter, &
1dd0: 70 42 75 66 2c 20 26 6c 65 6e 2c 20 26 70 55 74 pBuf, &len, &pUt
1de0: 66 38 62 75 66 2c 20 26 75 74 66 38 6c 65 6e 29 f8buf, &utf8len)
1df0: 20 3d 3d 20 28 73 69 7a 65 5f 74 29 20 28 2d 31 == (size_t) (-1
1e00: 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 66 72 )). {.. fr
1e10: 65 65 20 28 75 74 66 38 62 75 66 29 3b 0a 09 20 ee (utf8buf);..
1e20: 20 2a 65 72 72 20 3d 20 46 52 45 45 58 4c 5f 49 *err = FREEXL_I
1e30: 4e 56 41 4c 49 44 5f 43 48 41 52 41 43 54 45 52 NVALID_CHARACTER
1e40: 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c ;.. return NULL
1e50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 75 74 ;. }. ut
1e60: 66 38 62 75 66 5b 6d 61 78 6c 65 6e 20 2d 20 75 f8buf[maxlen - u
1e70: 74 66 38 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a tf8len] = '\0';.
1e80: 20 20 20 20 72 65 74 75 72 6e 20 75 74 66 38 62 return utf8b
1e90: 75 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f uf;.}..static vo
1ea0: 69 64 0a 67 65 74 5f 75 6e 69 63 6f 64 65 5f 70 id.get_unicode_p
1eb0: 61 72 61 6d 73 20 28 75 6e 73 69 67 6e 65 64 20 arams (unsigned
1ec0: 63 68 61 72 20 2a 61 64 64 72 2c 20 69 6e 74 20 char *addr, int
1ed0: 73 77 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 swap, unsigned i
1ee0: 6e 74 20 2a 73 74 61 72 74 5f 6f 66 66 73 65 74 nt *start_offset
1ef0: 2c 0a 09 09 20 20 20 20 69 6e 74 20 2a 72 65 61 ,... int *rea
1f00: 6c 5f 75 74 66 31 36 2c 20 75 6e 73 69 67 6e 65 l_utf16, unsigne
1f10: 64 20 69 6e 74 20 2a 65 78 74 72 61 5f 73 6b 69 d int *extra_ski
1f20: 70 29 0a 7b 0a 2f 2a 20 72 65 74 72 69 65 76 69 p).{./* retrievi
1f30: 6e 67 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e ng Unicode strin
1f40: 67 20 70 61 72 61 6d 73 20 2a 2f 0a 20 20 20 20 g params */.
1f50: 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 biff_word16 word
1f60: 31 36 3b 0a 20 20 20 20 62 69 66 66 5f 77 6f 72 16;. biff_wor
1f70: 64 33 32 20 77 6f 72 64 33 32 3b 0a 20 20 20 20 d32 word32;.
1f80: 69 6e 74 20 73 6b 69 70 5f 31 20 3d 20 30 3b 0a int skip_1 = 0;.
1f90: 20 20 20 20 69 6e 74 20 73 6b 69 70 5f 32 20 3d int skip_2 =
1fa0: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 0;. unsigned
1fb0: 20 63 68 61 72 20 2a 70 5f 73 74 72 69 6e 67 20 char *p_string
1fc0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 75 6e 73 69 = addr;. unsi
1fd0: 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 20 3d gned char mask =
1fe0: 20 2a 70 5f 73 74 72 69 6e 67 3b 0a 0a 2f 2a 0a *p_string;../*.
1ff0: 20 2a 20 61 20 62 69 74 77 69 73 65 20 6d 61 73 * a bitwise mas
2000: 6b 0a 20 2a 20 30 78 30 31 20 2d 20 74 68 65 20 k. * 0x01 - the
2010: 73 74 72 69 6e 67 20 69 73 20 27 72 65 61 6c 27 string is 'real'
2020: 20 55 54 46 31 36 4c 45 0a 20 2a 20 20 20 20 20 UTF16LE. *
2030: 20 20 20 6f 74 68 65 72 77 69 73 65 20 61 6e 79 otherwise any
2040: 20 68 69 67 68 2d 6f 72 64 65 72 20 5a 45 52 4f high-order ZERO
2050: 65 73 20 61 72 65 20 73 75 70 70 72 65 73 73 65 es are suppresse
2060: 64 0a 20 2a 20 20 20 20 20 20 20 20 5b 27 73 74 d. * ['st
2070: 72 69 70 70 65 64 27 20 55 54 46 31 36 5d 0a 20 ripped' UTF16].
2080: 2a 0a 20 2a 20 30 78 30 34 20 2d 20 61 6e 20 65 *. * 0x04 - an e
2090: 78 74 72 61 20 33 32 2d 62 69 74 20 66 69 65 6c xtra 32-bit fiel
20a0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 0a 20 2a d is present . *
20b0: 20 30 78 30 38 20 2d 20 61 6e 6f 74 68 65 72 20 0x08 - another
20c0: 65 78 74 72 61 20 31 36 2d 62 69 74 20 66 69 65 extra 16-bit fie
20d0: 6c 64 20 69 73 20 70 72 65 73 65 6e 74 0a 20 2a ld is present. *
20e0: 20 20 20 20 20 20 20 20 28 73 75 63 68 20 65 78 (such ex
20f0: 74 72 61 20 28 6f 70 74 69 6f 6e 61 6c 29 20 66 tra (optional) f
2100: 69 65 6c 64 73 20 61 72 65 20 69 6e 74 65 6e 64 ields are intend
2110: 65 64 20 62 79 20 4d 53 20 20 0a 20 2a 20 20 20 ed by MS . *
2120: 20 20 20 20 20 66 6f 72 20 74 65 78 74 20 66 6f for text fo
2130: 72 6d 61 74 74 69 6e 67 20 70 75 72 70 6f 73 65 rmatting purpose
2140: 73 3a 20 77 65 27 6c 6c 20 69 67 6e 6f 72 65 20 s: we'll ignore
2150: 74 68 65 6d 0a 20 2a 20 20 20 20 20 20 20 20 61 them. * a
2160: 74 20 61 6c 6c 2c 20 73 69 6d 70 6c 79 20 61 64 t all, simply ad
2170: 6a 75 73 74 69 6e 67 20 61 6e 79 20 6f 66 66 73 justing any offs
2180: 65 74 20 61 73 20 72 65 71 75 69 72 65 64 29 0a et as required).
2190: 20 2a 2f 0a 20 20 20 20 70 5f 73 74 72 69 6e 67 */. p_string
21a0: 2b 2b 3b 0a 20 20 20 20 69 66 20 28 28 6d 61 73 ++;. if ((mas
21b0: 6b 20 26 20 30 78 30 31 29 20 3d 3d 20 30 78 30 k & 0x01) == 0x0
21c0: 31 29 0a 09 2a 72 65 61 6c 5f 75 74 66 31 36 20 1)..*real_utf16
21d0: 3d 20 31 3b 0a 20 20 20 20 65 6c 73 65 0a 09 2a = 1;. else..*
21e0: 72 65 61 6c 5f 75 74 66 31 36 20 3d 20 30 3b 0a real_utf16 = 0;.
21f0: 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 if ((mask &
2200: 30 78 30 34 29 20 3d 3d 20 30 78 30 34 29 0a 20 0x04) == 0x04).
2210: 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6f 70 74 {.. /* opt
2220: 69 6f 6e 61 6c 20 66 69 65 6c 64 3a 20 33 32 2d ional field: 32-
2230: 62 69 74 73 20 2a 2f 0a 09 20 20 6d 65 6d 63 70 bits */.. memcp
2240: 79 20 28 77 6f 72 64 33 32 2e 62 79 74 65 73 2c y (word32.bytes,
2250: 20 70 5f 73 74 72 69 6e 67 2c 20 32 29 3b 0a 09 p_string, 2);..
2260: 20 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 if (swap)..
2270: 20 20 20 73 77 61 70 33 32 20 28 26 77 6f 72 64 swap32 (&word
2280: 33 32 29 3b 0a 09 20 20 73 6b 69 70 5f 31 20 3d 32);.. skip_1 =
2290: 20 77 6f 72 64 33 32 2e 76 61 6c 75 65 3b 0a 09 word32.value;..
22a0: 20 20 70 5f 73 74 72 69 6e 67 20 2b 3d 20 34 3b p_string += 4;
22b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 . }. if
22c0: 28 28 6d 61 73 6b 20 26 20 30 78 30 38 29 20 3d ((mask & 0x08) =
22d0: 3d 20 30 78 30 38 29 0a 20 20 20 20 20 20 7b 0a = 0x08). {.
22e0: 09 20 20 2f 2a 20 6f 70 74 69 6f 6e 61 6c 20 66 . /* optional f
22f0: 69 65 6c 64 20 31 36 2d 62 69 74 73 20 2a 2f 0a ield 16-bits */.
2300: 09 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 . memcpy (word1
2310: 36 2e 62 79 74 65 73 2c 20 70 5f 73 74 72 69 6e 6.bytes, p_strin
2320: 67 2c 20 32 29 3b 0a 09 20 20 69 66 20 28 73 77 g, 2);.. if (sw
2330: 61 70 29 0a 09 20 20 20 20 20 20 73 77 61 70 31 ap).. swap1
2340: 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 20 20 6 (&word16);..
2350: 73 6b 69 70 5f 32 20 3d 20 77 6f 72 64 31 36 2e skip_2 = word16.
2360: 76 61 6c 75 65 3b 0a 09 20 20 70 5f 73 74 72 69 value;.. p_stri
2370: 6e 67 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d ng += 2;. }
2380: 0a 20 20 20 20 2a 73 74 61 72 74 5f 6f 66 66 73 . *start_offs
2390: 65 74 20 3d 20 70 5f 73 74 72 69 6e 67 20 2d 20 et = p_string -
23a0: 61 64 64 72 3b 0a 20 20 20 20 2a 65 78 74 72 61 addr;. *extra
23b0: 5f 73 6b 69 70 20 3d 20 73 6b 69 70 5f 31 20 2b _skip = skip_1 +
23c0: 20 28 73 6b 69 70 5f 32 20 2a 20 34 29 3b 0a 7d (skip_2 * 4);.}
23d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 70 61 72 ..static int.par
23e0: 73 65 5f 75 6e 69 63 6f 64 65 5f 73 74 72 69 6e se_unicode_strin
23f0: 67 20 28 69 63 6f 6e 76 5f 74 20 63 6f 6e 76 65 g (iconv_t conve
2400: 72 74 65 72 2c 20 75 6e 73 69 67 6e 65 64 20 73 rter, unsigned s
2410: 68 6f 72 74 20 63 68 61 72 61 63 74 65 72 73 2c hort characters,
2420: 0a 09 09 20 20 20 20 20 20 69 6e 74 20 72 65 61 ... int rea
2430: 6c 5f 75 74 66 31 36 2c 20 75 6e 73 69 67 6e 65 l_utf16, unsigne
2440: 64 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 5f d char *unicode_
2450: 73 74 72 69 6e 67 2c 0a 09 09 20 20 20 20 20 20 string,...
2460: 63 68 61 72 20 2a 2a 75 74 66 38 5f 73 74 72 69 char **utf8_stri
2470: 6e 67 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 69 ng).{./* attempi
2480: 6e 67 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 6e ng to convert an
2490: 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 Unicode string
24a0: 69 6e 74 6f 20 55 54 46 2d 38 20 2a 2f 0a 20 20 into UTF-8 */.
24b0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c unsigned int l
24c0: 65 6e 20 3d 20 63 68 61 72 61 63 74 65 72 73 20 en = characters
24d0: 2a 20 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 * 2;. char *s
24e0: 74 72 69 6e 67 3b 0a 20 20 20 20 69 6e 74 20 65 tring;. int e
24f0: 72 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 rr;. unsigned
2500: 20 63 68 61 72 20 2a 70 5f 73 74 72 69 6e 67 20 char *p_string
2510: 3d 20 75 6e 69 63 6f 64 65 5f 73 74 72 69 6e 67 = unicode_string
2520: 3b 0a 0a 20 20 20 20 73 74 72 69 6e 67 20 3d 20 ;.. string =
2530: 6d 61 6c 6c 6f 63 20 28 6c 65 6e 29 3b 0a 20 20 malloc (len);.
2540: 20 20 69 66 20 28 21 72 65 61 6c 5f 75 74 66 31 if (!real_utf1
2550: 36 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 6). {.. /*
2560: 20 27 73 74 72 69 70 70 65 64 27 20 55 54 46 2d 'stripped' UTF-
2570: 31 36 3a 20 72 65 71 75 69 72 65 73 20 70 61 64 16: requires pad
2580: 64 69 6e 67 20 2a 2f 0a 09 20 20 75 6e 73 69 67 ding */.. unsig
2590: 6e 65 64 20 69 6e 74 20 69 3b 0a 09 20 20 66 6f ned int i;.. fo
25a0: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 68 r (i = 0; i < ch
25b0: 61 72 61 63 74 65 72 73 3b 20 69 2b 2b 29 0a 09 aracters; i++)..
25c0: 20 20 20 20 7b 0a 09 09 2a 28 73 74 72 69 6e 67 {...*(string
25d0: 20 2b 20 28 69 20 2a 20 32 29 29 20 3d 20 2a 70 + (i * 2)) = *p
25e0: 5f 73 74 72 69 6e 67 3b 0a 09 09 70 5f 73 74 72 _string;...p_str
25f0: 69 6e 67 2b 2b 3b 0a 09 09 2a 28 73 74 72 69 6e ing++;...*(strin
2600: 67 20 2b 20 28 28 69 20 2a 20 32 29 20 2b 20 31 g + ((i * 2) + 1
2610: 29 29 20 3d 20 30 78 30 30 3b 0a 09 20 20 20 20 )) = 0x00;..
2620: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 6c }. }. el
2630: 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a se. {.. /*
2640: 20 61 6c 72 65 61 64 79 20 65 6e 63 6f 64 65 64 already encoded
2650: 20 61 73 20 55 54 46 2d 31 36 20 2a 2f 0a 09 20 as UTF-16 */..
2660: 20 6d 65 6d 63 70 79 20 28 73 74 72 69 6e 67 2c memcpy (string,
2670: 20 70 5f 73 74 72 69 6e 67 2c 20 6c 65 6e 29 3b p_string, len);
2680: 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 63 6f 6e 76 . }./* conv
2690: 65 72 74 69 6e 67 20 74 65 78 74 20 74 6f 20 55 erting text to U
26a0: 54 46 2d 38 20 2a 2f 0a 20 20 20 20 2a 75 74 66 TF-8 */. *utf
26b0: 38 5f 73 74 72 69 6e 67 20 3d 20 63 6f 6e 76 65 8_string = conve
26c0: 72 74 5f 74 6f 5f 75 74 66 38 20 28 63 6f 6e 76 rt_to_utf8 (conv
26d0: 65 72 74 65 72 2c 20 73 74 72 69 6e 67 2c 20 6c erter, string, l
26e0: 65 6e 2c 20 26 65 72 72 29 3b 0a 20 20 20 20 66 en, &err);. f
26f0: 72 65 65 20 28 73 74 72 69 6e 67 29 3b 0a 20 20 ree (string);.
2700: 20 20 69 66 20 28 65 72 72 29 0a 09 72 65 74 75 if (err)..retu
2710: 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e rn 0;. return
2720: 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 1;.}..static in
2730: 74 0a 64 65 63 6f 64 65 5f 72 6b 5f 69 6e 74 65 t.decode_rk_inte
2740: 67 65 72 20 28 75 6e 73 69 67 6e 65 64 20 63 68 ger (unsigned ch
2750: 61 72 20 2a 62 79 74 65 73 2c 20 69 6e 74 20 2a ar *bytes, int *
2760: 76 61 6c 75 65 2c 20 69 6e 74 20 73 77 61 70 29 value, int swap)
2770: 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 .{./* attempting
2780: 20 74 6f 20 64 65 63 6f 64 65 20 61 6e 20 52 4b to decode an RK
2790: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 49 4e 54 value as an INT
27a0: 2d 33 32 20 2a 2f 0a 20 20 20 20 62 69 66 66 5f -32 */. biff_
27b0: 77 6f 72 64 33 32 20 77 6f 72 64 33 32 3b 0a 20 word32 word32;.
27c0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
27d0: 20 6d 61 73 6b 20 3d 20 62 79 74 65 73 5b 30 5d mask = bytes[0]
27e0: 3b 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 ;. if ((mask
27f0: 26 20 30 78 30 32 29 20 3d 3d 20 30 78 30 32 20 & 0x02) == 0x02
2800: 26 26 20 28 6d 61 73 6b 20 26 20 30 78 30 31 29 && (mask & 0x01)
2810: 20 3d 3d 20 30 78 30 30 29 0a 20 20 20 20 20 20 == 0x00).
2820: 7b 0a 09 20 20 2f 2a 20 6f 6b 2c 20 74 68 69 73 {.. /* ok, this
2830: 20 52 4b 20 76 61 6c 75 65 20 69 73 20 61 6e 20 RK value is an
2840: 49 4e 54 2d 33 32 20 2a 2f 0a 09 20 20 6d 65 6d INT-32 */.. mem
2850: 63 70 79 20 28 77 6f 72 64 33 32 2e 62 79 74 65 cpy (word32.byte
2860: 73 2c 20 62 79 74 65 73 2c 20 34 29 3b 0a 09 20 s, bytes, 4);..
2870: 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 if (swap)..
2880: 20 20 73 77 61 70 33 32 20 28 26 77 6f 72 64 33 swap32 (&word3
2890: 32 29 3b 0a 09 20 20 2a 76 61 6c 75 65 20 3d 20 2);.. *value =
28a0: 77 6f 72 64 33 32 2e 73 69 67 6e 65 64 5f 76 61 word32.signed_va
28b0: 6c 75 65 20 3e 3e 20 32 3b 09 2f 2a 20 72 69 67 lue >> 2;./* rig
28c0: 68 74 20 73 68 69 66 74 3a 20 32 20 62 69 74 73 ht shift: 2 bits
28d0: 20 2a 2f 0a 09 20 20 72 65 74 75 72 6e 20 31 3b */.. return 1;
28e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 . }. ret
28f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 urn 0;.}..static
2900: 20 69 6e 74 0a 64 65 63 6f 64 65 5f 72 6b 5f 66 int.decode_rk_f
2910: 6c 6f 61 74 20 28 75 6e 73 69 67 6e 65 64 20 63 loat (unsigned c
2920: 68 61 72 20 2a 62 79 74 65 73 2c 20 64 6f 75 62 har *bytes, doub
2930: 6c 65 20 2a 76 61 6c 75 65 2c 20 69 6e 74 20 73 le *value, int s
2940: 77 61 70 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 wap).{./* attemp
2950: 74 69 6e 67 20 74 6f 20 64 65 63 6f 64 65 20 61 ting to decode a
2960: 6e 20 52 4b 20 76 61 6c 75 65 20 61 73 20 61 20 n RK value as a
2970: 44 4f 55 42 4c 45 2d 46 4c 4f 41 54 20 2a 2f 0a DOUBLE-FLOAT */.
2980: 20 20 20 20 62 69 66 66 5f 77 6f 72 64 33 32 20 biff_word32
2990: 77 6f 72 64 33 32 3b 0a 20 20 20 20 62 69 66 66 word32;. biff
29a0: 5f 66 6c 6f 61 74 20 77 6f 72 64 5f 66 6c 6f 61 _float word_floa
29b0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 6e 74 5f 76 t;. int int_v
29c0: 61 6c 75 65 3b 0a 20 20 20 20 64 6f 75 62 6c 65 alue;. double
29d0: 20 64 62 6c 5f 76 61 6c 75 65 3b 0a 20 20 20 20 dbl_value;.
29e0: 69 6e 74 20 64 69 76 5f 62 79 5f 31 30 30 20 3d int div_by_100 =
29f0: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 0;. unsigned
2a00: 20 63 68 61 72 20 6d 61 73 6b 20 3d 20 62 79 74 char mask = byt
2a10: 65 73 5b 30 5d 3b 0a 20 20 20 20 69 66 20 28 28 es[0];. if ((
2a20: 6d 61 73 6b 20 26 20 30 78 30 32 29 20 3d 3d 20 mask & 0x02) ==
2a30: 30 78 30 32 20 26 26 20 28 6d 61 73 6b 20 26 20 0x02 && (mask &
2a40: 30 78 30 31 29 20 3d 3d 20 30 78 30 31 29 0a 20 0x01) == 0x01).
2a50: 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6f 6b 2c {.. /* ok,
2a60: 20 74 68 69 73 20 52 4b 20 76 61 6c 75 65 20 69 this RK value i
2a70: 73 20 61 6e 20 49 4e 54 2d 33 32 20 28 64 69 76 s an INT-32 (div
2a80: 69 64 65 64 20 62 79 20 31 30 30 29 20 2a 2f 0a ided by 100) */.
2a90: 09 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 33 . memcpy (word3
2aa0: 32 2e 62 79 74 65 73 2c 20 62 79 74 65 73 2c 20 2.bytes, bytes,
2ab0: 34 29 3b 0a 09 20 20 69 66 20 28 73 77 61 70 29 4);.. if (swap)
2ac0: 0a 09 20 20 20 20 20 20 73 77 61 70 33 32 20 28 .. swap32 (
2ad0: 26 77 6f 72 64 33 32 29 3b 0a 09 20 20 69 6e 74 &word32);.. int
2ae0: 5f 76 61 6c 75 65 20 3d 20 77 6f 72 64 33 32 2e _value = word32.
2af0: 73 69 67 6e 65 64 5f 76 61 6c 75 65 20 3e 3e 20 signed_value >>
2b00: 32 3b 09 2f 2a 20 72 69 67 68 74 20 73 68 69 66 2;./* right shif
2b10: 74 3a 20 32 20 62 69 74 73 20 2a 2f 0a 09 20 20 t: 2 bits */..
2b20: 2a 76 61 6c 75 65 20 3d 20 28 64 6f 75 62 6c 65 *value = (double
2b30: 29 20 69 6e 74 5f 76 61 6c 75 65 20 2f 20 31 30 ) int_value / 10
2b40: 30 2e 30 3b 0a 09 20 20 72 65 74 75 72 6e 20 31 0.0;.. return 1
2b50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 ;. }. if
2b60: 20 28 28 6d 61 73 6b 20 26 20 30 78 30 32 29 20 ((mask & 0x02)
2b70: 3d 3d 20 30 78 30 30 29 0a 20 20 20 20 20 20 7b == 0x00). {
2b80: 0a 09 20 20 2f 2a 20 6f 6b 2c 20 74 68 69 73 20 .. /* ok, this
2b90: 52 4b 20 76 61 6c 75 65 20 69 73 20 61 20 46 4c RK value is a FL
2ba0: 4f 41 54 20 2a 2f 0a 09 20 20 69 66 20 28 28 6d OAT */.. if ((m
2bb0: 61 73 6b 20 26 20 30 78 30 31 29 20 3d 3d 20 30 ask & 0x01) == 0
2bc0: 78 30 31 29 0a 09 20 20 20 20 20 20 64 69 76 5f x01).. div_
2bd0: 62 79 5f 31 30 30 20 3d 20 31 3b 0a 09 20 20 6d by_100 = 1;.. m
2be0: 65 6d 63 70 79 20 28 77 6f 72 64 33 32 2e 62 79 emcpy (word32.by
2bf0: 74 65 73 2c 20 62 79 74 65 73 2c 20 34 29 3b 0a tes, bytes, 4);.
2c00: 09 20 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 . if (swap)..
2c10: 20 20 20 20 73 77 61 70 33 32 20 28 26 77 6f 72 swap32 (&wor
2c20: 64 33 32 29 3b 0a 09 20 20 69 6e 74 5f 76 61 6c d32);.. int_val
2c30: 75 65 20 3d 20 77 6f 72 64 33 32 2e 76 61 6c 75 ue = word32.valu
2c40: 65 3b 0a 09 20 20 69 6e 74 5f 76 61 6c 75 65 20 e;.. int_value
2c50: 26 3d 20 30 78 66 66 66 66 66 66 66 63 3b 0a 09 &= 0xfffffffc;..
2c60: 20 20 77 6f 72 64 33 32 2e 76 61 6c 75 65 20 3d word32.value =
2c70: 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 20 6d int_value;.. m
2c80: 65 6d 73 65 74 20 28 77 6f 72 64 5f 66 6c 6f 61 emset (word_floa
2c90: 74 2e 62 79 74 65 73 2c 20 27 5c 30 27 2c 20 38 t.bytes, '\0', 8
2ca0: 29 3b 0a 09 20 20 69 66 20 28 73 77 61 70 29 0a );.. if (swap).
2cb0: 09 20 20 20 20 20 20 6d 65 6d 63 70 79 20 28 77 . memcpy (w
2cc0: 6f 72 64 5f 66 6c 6f 61 74 2e 62 79 74 65 73 2c ord_float.bytes,
2cd0: 20 77 6f 72 64 33 32 2e 62 79 74 65 73 2c 20 34 word32.bytes, 4
2ce0: 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 );.. else..
2cf0: 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 5f 66 memcpy (word_f
2d00: 6c 6f 61 74 2e 62 79 74 65 73 20 2b 20 34 2c 20 loat.bytes + 4,
2d10: 77 6f 72 64 33 32 2e 62 79 74 65 73 2c 20 34 29 word32.bytes, 4)
2d20: 3b 0a 09 20 20 64 62 6c 5f 76 61 6c 75 65 20 3d ;.. dbl_value =
2d30: 20 77 6f 72 64 5f 66 6c 6f 61 74 2e 76 61 6c 75 word_float.valu
2d40: 65 3b 0a 09 20 20 69 66 20 28 64 69 76 5f 62 79 e;.. if (div_by
2d50: 5f 31 30 30 29 0a 09 20 20 20 20 20 20 64 62 6c _100).. dbl
2d60: 5f 76 61 6c 75 65 20 2f 3d 20 31 30 30 2e 30 3b _value /= 100.0;
2d70: 0a 09 20 20 2a 76 61 6c 75 65 20 3d 20 64 62 6c .. *value = dbl
2d80: 5f 76 61 6c 75 65 3b 0a 09 20 20 72 65 74 75 72 _value;.. retur
2d90: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 n 1;. }.
2da0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 return 0;.}..st
2db0: 61 74 69 63 20 69 6e 74 0a 63 68 65 63 6b 5f 78 atic int.check_x
2dc0: 66 5f 64 61 74 65 74 69 6d 65 20 28 62 69 66 66 f_datetime (biff
2dd0: 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b _workbook * work
2de0: 62 6f 6f 6b 2c 20 75 6e 73 69 67 6e 65 64 20 73 book, unsigned s
2df0: 68 6f 72 74 20 78 66 5f 69 6e 64 65 78 2c 0a 09 hort xf_index,..
2e00: 09 20 20 20 69 6e 74 20 2a 69 73 5f 64 61 74 65 . int *is_date
2e10: 2c 20 69 6e 74 20 2a 69 73 5f 64 61 74 65 74 69 , int *is_dateti
2e20: 6d 65 2c 20 69 6e 74 20 2a 69 73 5f 74 69 6d 65 me, int *is_time
2e30: 29 0a 7b 0a 2f 2a 20 74 65 73 74 69 6e 67 20 66 ).{./* testing f
2e40: 6f 72 20 44 41 54 45 2f 44 41 54 45 54 49 4d 45 or DATE/DATETIME
2e50: 2f 54 49 4d 45 20 66 6f 72 6d 61 74 73 20 2a 2f /TIME formats */
2e60: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 73 68 . unsigned sh
2e70: 6f 72 74 20 69 64 78 3b 0a 20 20 20 20 75 6e 73 ort idx;. uns
2e80: 69 67 6e 65 64 20 73 68 6f 72 74 20 66 6f 72 6d igned short form
2e90: 61 74 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 at_index;. if
2ea0: 20 28 78 66 5f 69 6e 64 65 78 20 3e 3d 20 77 6f (xf_index >= wo
2eb0: 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 78 66 5f rkbook->biff_xf_
2ec0: 6e 65 78 74 5f 69 6e 64 65 78 29 0a 09 72 65 74 next_index)..ret
2ed0: 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 6d 61 urn 0;. forma
2ee0: 74 5f 69 6e 64 65 78 20 3d 20 77 6f 72 6b 62 6f t_index = workbo
2ef0: 6f 6b 2d 3e 62 69 66 66 5f 78 66 5f 61 72 72 61 ok->biff_xf_arra
2f00: 79 5b 78 66 5f 69 6e 64 65 78 5d 3b 0a 20 20 20 y[xf_index];.
2f10: 20 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 for (idx = 0; i
2f20: 64 78 20 3c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d dx < workbook->m
2f30: 61 78 5f 66 6f 72 6d 61 74 5f 69 6e 64 65 78 3b ax_format_index;
2f40: 20 69 64 78 2b 2b 29 0a 20 20 20 20 20 20 7b 0a idx++). {.
2f50: 09 20 20 62 69 66 66 5f 66 6f 72 6d 61 74 20 2a . biff_format *
2f60: 66 6f 72 6d 61 74 20 3d 20 77 6f 72 6b 62 6f 6f format = workboo
2f70: 6b 2d 3e 66 6f 72 6d 61 74 5f 61 72 72 61 79 20 k->format_array
2f80: 2b 20 69 64 78 3b 0a 09 20 20 69 66 20 28 66 6f + idx;.. if (fo
2f90: 72 6d 61 74 2d 3e 66 6f 72 6d 61 74 5f 69 6e 64 rmat->format_ind
2fa0: 65 78 20 3d 3d 20 66 6f 72 6d 61 74 5f 69 6e 64 ex == format_ind
2fb0: 65 78 29 0a 09 20 20 20 20 7b 0a 09 09 2a 69 73 ex).. {...*is
2fc0: 5f 64 61 74 65 20 3d 20 66 6f 72 6d 61 74 2d 3e _date = format->
2fd0: 69 73 5f 64 61 74 65 3b 0a 09 09 2a 69 73 5f 64 is_date;...*is_d
2fe0: 61 74 65 74 69 6d 65 20 3d 20 66 6f 72 6d 61 74 atetime = format
2ff0: 2d 3e 69 73 5f 64 61 74 65 74 69 6d 65 3b 0a 09 ->is_datetime;..
3000: 09 2a 69 73 5f 74 69 6d 65 20 3d 20 66 6f 72 6d .*is_time = form
3010: 61 74 2d 3e 69 73 5f 74 69 6d 65 3b 0a 09 09 72 at->is_time;...r
3020: 65 74 75 72 6e 20 31 3b 0a 09 20 20 20 20 7d 0a eturn 1;.. }.
3030: 20 20 20 20 20 20 7d 0a 20 20 20 20 2a 69 73 5f }. *is_
3040: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 2a 69 date = 0;. *i
3050: 73 5f 64 61 74 65 74 69 6d 65 20 3d 20 30 3b 0a s_datetime = 0;.
3060: 20 20 20 20 2a 69 73 5f 74 69 6d 65 20 3d 20 30 *is_time = 0
3070: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
3080: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 63 68 }..static int.ch
3090: 65 63 6b 5f 78 66 5f 64 61 74 65 74 69 6d 65 5f eck_xf_datetime_
30a0: 35 38 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 58 (biff_workboo
30b0: 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 75 6e k * workbook, un
30c0: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 78 66 5f signed short xf_
30d0: 69 6e 64 65 78 2c 0a 09 09 20 20 20 20 20 20 69 index,... i
30e0: 6e 74 20 2a 69 73 5f 64 61 74 65 2c 20 69 6e 74 nt *is_date, int
30f0: 20 2a 69 73 5f 64 61 74 65 74 69 6d 65 2c 20 69 *is_datetime, i
3100: 6e 74 20 2a 69 73 5f 74 69 6d 65 29 0a 7b 0a 2f nt *is_time).{./
3110: 2a 20 0a 2f 20 74 65 73 74 69 6e 67 20 66 6f 72 * ./ testing for
3120: 20 44 41 54 45 2f 44 41 54 45 54 49 4d 45 2f 54 DATE/DATETIME/T
3130: 49 4d 45 20 66 6f 72 6d 61 74 73 20 0a 2f 20 42 IME formats ./ B
3140: 49 46 46 35 20 61 6e 64 20 42 49 46 46 38 20 76 IFF5 and BIFF8 v
3150: 65 72 73 69 6f 6e 73 0a 2a 2f 0a 20 20 20 20 75 ersions.*/. u
3160: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 66 6f nsigned short fo
3170: 72 6d 61 74 5f 69 6e 64 65 78 3b 0a 20 20 20 20 rmat_index;.
3180: 69 66 20 28 78 66 5f 69 6e 64 65 78 20 3e 3d 20 if (xf_index >=
3190: 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 78 workbook->biff_x
31a0: 66 5f 6e 65 78 74 5f 69 6e 64 65 78 29 0a 09 72 f_next_index)..r
31b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 eturn 0;. for
31c0: 6d 61 74 5f 69 6e 64 65 78 20 3d 20 77 6f 72 6b mat_index = work
31d0: 62 6f 6f 6b 2d 3e 62 69 66 66 5f 78 66 5f 61 72 book->biff_xf_ar
31e0: 72 61 79 5b 78 66 5f 69 6e 64 65 78 5d 3b 0a 20 ray[xf_index];.
31f0: 20 20 20 73 77 69 74 63 68 20 28 66 6f 72 6d 61 switch (forma
3200: 74 5f 69 6e 64 65 78 29 0a 20 20 20 20 20 20 7b t_index). {
3210: 0a 20 20 20 20 20 20 63 61 73 65 20 31 34 3a 0a . case 14:.
3220: 20 20 20 20 20 20 63 61 73 65 20 31 35 3a 0a 20 case 15:.
3230: 20 20 20 20 20 63 61 73 65 20 31 36 3a 0a 20 20 case 16:.
3240: 20 20 20 20 63 61 73 65 20 31 37 3a 0a 09 20 20 case 17:..
3250: 2f 2a 20 42 49 46 46 35 2f 42 49 46 46 38 20 62 /* BIFF5/BIFF8 b
3260: 75 69 6c 74 2d 69 6e 20 44 41 54 45 20 66 6f 72 uilt-in DATE for
3270: 6d 61 74 73 20 2a 2f 0a 09 20 20 2a 69 73 5f 64 mats */.. *is_d
3280: 61 74 65 20 3d 20 31 3b 0a 09 20 20 2a 69 73 5f ate = 1;.. *is_
3290: 64 61 74 65 74 69 6d 65 20 3d 20 30 3b 0a 09 20 datetime = 0;..
32a0: 20 2a 69 73 5f 74 69 6d 65 20 3d 20 30 3b 0a 09 *is_time = 0;..
32b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 return 1;.
32c0: 20 20 63 61 73 65 20 31 38 3a 0a 20 20 20 20 20 case 18:.
32d0: 20 63 61 73 65 20 31 39 3a 0a 20 20 20 20 20 20 case 19:.
32e0: 63 61 73 65 20 32 30 3a 0a 20 20 20 20 20 20 63 case 20:. c
32f0: 61 73 65 20 32 31 3a 0a 20 20 20 20 20 20 63 61 ase 21:. ca
3300: 73 65 20 34 35 3a 0a 20 20 20 20 20 20 63 61 73 se 45:. cas
3310: 65 20 34 36 3a 0a 20 20 20 20 20 20 63 61 73 65 e 46:. case
3320: 20 34 37 3a 0a 09 20 20 2f 2a 20 42 49 46 46 35 47:.. /* BIFF5
3330: 2f 42 49 46 46 38 20 62 75 69 6c 74 2d 69 6e 20 /BIFF8 built-in
3340: 54 49 4d 45 20 66 6f 72 6d 61 74 73 20 2a 2f 0a TIME formats */.
3350: 09 20 20 2a 69 73 5f 64 61 74 65 20 3d 20 30 3b . *is_date = 0;
3360: 0a 09 20 20 2a 69 73 5f 64 61 74 65 74 69 6d 65 .. *is_datetime
3370: 20 3d 20 30 3b 0a 09 20 20 2a 69 73 5f 74 69 6d = 0;.. *is_tim
3380: 65 20 3d 20 31 3b 0a 09 20 20 72 65 74 75 72 6e e = 1;.. return
3390: 20 31 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 1;. case 2
33a0: 32 3a 0a 09 20 20 2f 2a 20 42 49 46 46 35 2f 42 2:.. /* BIFF5/B
33b0: 49 46 46 38 20 62 75 69 6c 74 2d 69 6e 20 44 41 IFF8 built-in DA
33c0: 54 45 54 49 4d 45 20 66 6f 72 6d 61 74 73 20 2a TETIME formats *
33d0: 2f 0a 09 20 20 2a 69 73 5f 64 61 74 65 20 3d 20 /.. *is_date =
33e0: 30 3b 0a 09 20 20 2a 69 73 5f 64 61 74 65 74 69 0;.. *is_dateti
33f0: 6d 65 20 3d 20 31 3b 0a 09 20 20 2a 69 73 5f 74 me = 1;.. *is_t
3400: 69 6d 65 20 3d 20 30 3b 0a 09 20 20 72 65 74 75 ime = 0;.. retu
3410: 72 6e 20 31 3b 0a 20 20 20 20 20 20 64 65 66 61 rn 1;. defa
3420: 75 6c 74 3a 0a 09 20 20 62 72 65 61 6b 3b 0a 20 ult:.. break;.
3430: 20 20 20 20 20 7d 3b 0a 20 20 20 20 72 65 74 75 };. retu
3440: 72 6e 20 63 68 65 63 6b 5f 78 66 5f 64 61 74 65 rn check_xf_date
3450: 74 69 6d 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 time (workbook,
3460: 78 66 5f 69 6e 64 65 78 2c 20 69 73 5f 64 61 74 xf_index, is_dat
3470: 65 2c 20 69 73 5f 64 61 74 65 74 69 6d 65 2c 0a e, is_datetime,.
3480: 09 09 09 20 20 20 20 20 20 69 73 5f 74 69 6d 65 ... is_time
3490: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 );.}..static voi
34a0: 64 0a 63 6f 6d 70 75 74 65 5f 74 69 6d 65 20 28 d.compute_time (
34b0: 69 6e 74 20 2a 68 68 2c 20 69 6e 74 20 2a 6d 6d int *hh, int *mm
34c0: 2c 20 69 6e 74 20 2a 73 73 2c 20 64 6f 75 62 6c , int *ss, doubl
34d0: 65 20 70 65 72 63 65 6e 74 29 0a 7b 0a 2f 2a 20 e percent).{./*
34e0: 63 6f 6d 70 75 74 69 6e 67 20 61 6e 20 45 78 63 computing an Exc
34f0: 65 6c 20 74 69 6d 65 20 2a 2f 0a 20 20 20 20 69 el time */. i
3500: 6e 74 20 68 6f 75 72 73 3b 0a 20 20 20 20 69 6e nt hours;. in
3510: 74 20 6d 69 6e 73 3b 0a 20 20 20 20 69 6e 74 20 t mins;. int
3520: 73 65 63 73 3b 0a 20 20 20 20 64 6f 75 62 6c 65 secs;. double
3530: 20 64 61 79 5f 73 65 63 6f 6e 64 73 20 3d 20 32 day_seconds = 2
3540: 34 20 2a 20 36 30 20 2a 20 36 30 3b 0a 20 20 20 4 * 60 * 60;.
3550: 20 64 61 79 5f 73 65 63 6f 6e 64 73 20 2a 3d 20 day_seconds *=
3560: 70 65 72 63 65 6e 74 3b 0a 20 20 20 20 73 65 63 percent;. sec
3570: 73 20 3d 20 6c 72 6f 75 6e 64 20 28 64 61 79 5f s = lround (day_
3580: 73 65 63 6f 6e 64 73 29 3b 0a 20 20 20 20 68 6f seconds);. ho
3590: 75 72 73 20 3d 20 73 65 63 73 20 2f 20 33 36 30 urs = secs / 360
35a0: 30 3b 0a 20 20 20 20 73 65 63 73 20 2d 3d 20 68 0;. secs -= h
35b0: 6f 75 72 73 20 2a 20 33 36 30 30 3b 0a 20 20 20 ours * 3600;.
35c0: 20 6d 69 6e 73 20 3d 20 73 65 63 73 20 2f 20 36 mins = secs / 6
35d0: 30 3b 0a 20 20 20 20 73 65 63 73 20 2d 3d 20 6d 0;. secs -= m
35e0: 69 6e 73 20 2a 20 36 30 3b 0a 20 20 20 20 2a 68 ins * 60;. *h
35f0: 68 20 3d 20 68 6f 75 72 73 3b 0a 20 20 20 20 2a h = hours;. *
3600: 6d 6d 20 3d 20 6d 69 6e 73 3b 0a 20 20 20 20 2a mm = mins;. *
3610: 73 73 20 3d 20 73 65 63 73 3b 0a 7d 0a 0a 73 74 ss = secs;.}..st
3620: 61 74 69 63 20 76 6f 69 64 0a 63 6f 6d 70 75 74 atic void.comput
3630: 65 5f 64 61 74 65 20 28 69 6e 74 20 2a 79 65 61 e_date (int *yea
3640: 72 2c 20 69 6e 74 20 2a 6d 6f 6e 74 68 2c 20 69 r, int *month, i
3650: 6e 74 20 2a 64 61 79 2c 20 69 6e 74 20 63 6f 75 nt *day, int cou
3660: 6e 74 29 0a 7b 0a 2f 2a 20 63 6f 75 6d 70 75 74 nt).{./* coumput
3670: 69 6e 67 20 61 6e 20 45 78 63 65 6c 20 64 61 74 ing an Excel dat
3680: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a e */. int i;.
3690: 20 20 20 20 69 6e 74 20 79 79 20 3d 20 2a 79 65 int yy = *ye
36a0: 61 72 3b 0a 20 20 20 20 69 6e 74 20 6d 6d 20 3d ar;. int mm =
36b0: 20 2a 6d 6f 6e 74 68 3b 0a 20 20 20 20 69 6e 74 *month;. int
36c0: 20 64 64 20 3d 20 2a 64 61 79 3b 0a 20 20 20 20 dd = *day;.
36d0: 66 6f 72 20 28 69 20 3d 20 31 3b 20 69 20 3c 20 for (i = 1; i <
36e0: 63 6f 75 6e 74 3b 20 69 2b 2b 29 0a 20 20 20 20 count; i++).
36f0: 20 20 7b 0a 09 20 20 69 6e 74 20 6c 61 73 74 5f {.. int last_
3700: 64 61 79 5f 6f 66 5f 6d 6f 6e 74 68 3b 0a 09 20 day_of_month;..
3710: 20 73 77 69 74 63 68 20 28 6d 6d 29 0a 09 20 20 switch (mm)..
3720: 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20 32 3a {.. case 2:
3730: 0a 09 09 69 66 20 28 28 79 79 20 25 20 34 29 20 ...if ((yy % 4)
3740: 3d 3d 20 30 29 0a 09 09 20 20 7b 0a 09 09 20 20 == 0)... {...
3750: 20 20 20 20 2f 2a 20 46 65 62 72 75 61 72 79 2c /* February,
3760: 20 6c 65 61 70 20 79 65 61 72 20 2a 2f 0a 09 09 leap year */...
3770: 20 20 20 20 20 20 6c 61 73 74 5f 64 61 79 5f 6f last_day_o
3780: 66 5f 6d 6f 6e 74 68 20 3d 20 32 39 3b 0a 09 09 f_month = 29;...
3790: 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 }...else...
37a0: 20 6c 61 73 74 5f 64 61 79 5f 6f 66 5f 6d 6f 6e last_day_of_mon
37b0: 74 68 20 3d 20 32 38 3b 0a 09 09 62 72 65 61 6b th = 28;...break
37c0: 3b 0a 09 20 20 20 20 63 61 73 65 20 34 3a 0a 09 ;.. case 4:..
37d0: 20 20 20 20 63 61 73 65 20 36 3a 0a 09 20 20 20 case 6:..
37e0: 20 63 61 73 65 20 39 3a 0a 09 20 20 20 20 63 61 case 9:.. ca
37f0: 73 65 20 31 31 3a 0a 09 09 6c 61 73 74 5f 64 61 se 11:...last_da
3800: 79 5f 6f 66 5f 6d 6f 6e 74 68 20 3d 20 33 30 3b y_of_month = 30;
3810: 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 64 ...break;.. d
3820: 65 66 61 75 6c 74 3a 0a 09 09 6c 61 73 74 5f 64 efault:...last_d
3830: 61 79 5f 6f 66 5f 6d 6f 6e 74 68 20 3d 20 33 31 ay_of_month = 31
3840: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
3850: 7d 3b 0a 09 20 20 69 66 20 28 64 64 20 3d 3d 20 };.. if (dd ==
3860: 6c 61 73 74 5f 64 61 79 5f 6f 66 5f 6d 6f 6e 74 last_day_of_mont
3870: 68 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 28 h).. {...if (
3880: 6d 6d 20 3d 3d 20 31 32 29 0a 09 09 20 20 7b 0a mm == 12)... {.
3890: 09 09 20 20 20 20 20 20 6d 6d 20 3d 20 31 3b 0a .. mm = 1;.
38a0: 09 09 20 20 20 20 20 20 79 79 20 2b 3d 20 31 3b .. yy += 1;
38b0: 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 ... }...else...
38c0: 20 20 20 20 6d 6d 20 2b 3d 20 31 3b 0a 09 09 64 mm += 1;...d
38d0: 64 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 d = 1;.. }..
38e0: 20 65 6c 73 65 0a 09 20 20 20 20 20 20 64 64 20 else.. dd
38f0: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 += 1;. }.
3900: 20 20 2a 79 65 61 72 20 3d 20 79 79 3b 0a 20 20 *year = yy;.
3910: 20 20 2a 6d 6f 6e 74 68 20 3d 20 6d 6d 3b 0a 20 *month = mm;.
3920: 20 20 20 2a 64 61 79 20 3d 20 64 64 3b 0a 7d 0a *day = dd;.}.
3930: 0a 73 74 61 74 69 63 20 69 6e 74 0a 73 65 74 5f .static int.set_
3940: 64 61 74 65 5f 69 6e 74 5f 76 61 6c 75 65 20 28 date_int_value (
3950: 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 biff_workbook *
3960: 77 6f 72 6b 62 6f 6f 6b 2c 20 75 6e 73 69 67 6e workbook, unsign
3970: 65 64 20 69 6e 74 20 72 6f 77 2c 0a 09 09 20 20 ed int row,...
3980: 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 unsigned short
3990: 20 63 6f 6c 2c 20 75 6e 73 69 67 6e 65 64 20 73 col, unsigned s
39a0: 68 6f 72 74 20 6d 6f 64 65 2c 20 69 6e 74 20 6e hort mode, int n
39b0: 75 6d 29 0a 7b 0a 2f 2a 20 73 65 74 74 69 6e 67 um).{./* setting
39c0: 20 61 20 44 41 54 45 20 76 61 6c 75 65 20 74 6f a DATE value to
39d0: 20 73 6f 6d 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 some cell */.
39e0: 20 20 62 69 66 66 5f 63 65 6c 6c 5f 76 61 6c 75 biff_cell_valu
39f0: 65 20 2a 70 5f 63 65 6c 6c 3b 0a 20 20 20 20 63 e *p_cell;. c
3a00: 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 har *string;.
3a10: 20 63 68 61 72 20 62 75 66 5b 36 34 5d 3b 0a 20 char buf[64];.
3a20: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
3a30: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 79 79 3b len;. int yy;
3a40: 0a 20 20 20 20 69 6e 74 20 6d 6d 3b 0a 20 20 20 . int mm;.
3a50: 20 69 6e 74 20 64 64 3b 0a 20 20 20 20 69 6e 74 int dd;. int
3a60: 20 63 6f 75 6e 74 20 3d 20 6e 75 6d 3b 0a 0a 20 count = num;..
3a70: 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d if (workbook-
3a80: 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d 3d >active_sheet ==
3a90: 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 NULL)..return F
3aa0: 52 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 45 REEXL_ILLEGAL_CE
3ab0: 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 20 LL_ROW_COL;.
3ac0: 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 if (workbook->ac
3ad0: 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c tive_sheet->cell
3ae0: 5f 76 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c 29 _values == NULL)
3af0: 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f ..return FREEXL_
3b00: 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 ILLEGAL_CELL_ROW
3b10: 5f 43 4f 4c 3b 0a 20 20 20 20 69 66 20 28 72 6f _COL;. if (ro
3b20: 77 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 w >= workbook->a
3b30: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 ctive_sheet->row
3b40: 73 0a 09 7c 7c 20 63 6f 6c 20 3e 3d 20 77 6f 72 s..|| col >= wor
3b50: 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 kbook->active_sh
3b60: 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 0a 09 72 eet->columns)..r
3b70: 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c 4c eturn FREEXL_ILL
3b80: 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 4f EGAL_CELL_ROW_CO
3b90: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 L;.. if (mode
3ba0: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 79 79 20 ). {.. yy
3bb0: 3d 20 31 39 30 34 3b 0a 09 20 20 6d 6d 20 3d 20 = 1904;.. mm =
3bc0: 31 3b 0a 09 20 20 64 64 20 3d 20 32 3b 0a 20 20 1;.. dd = 2;.
3bd0: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a 20 }. else.
3be0: 20 20 20 20 20 7b 0a 09 20 20 79 79 20 3d 20 31 {.. yy = 1
3bf0: 39 30 30 3b 0a 09 20 20 6d 6d 20 3d 20 31 3b 0a 900;.. mm = 1;.
3c00: 09 20 20 64 64 20 3d 20 31 3b 0a 20 20 20 20 20 . dd = 1;.
3c10: 20 7d 0a 20 20 20 20 63 6f 6d 70 75 74 65 5f 64 }. compute_d
3c20: 61 74 65 20 28 26 79 79 2c 20 26 6d 6d 2c 20 26 ate (&yy, &mm, &
3c30: 64 64 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 dd, count);.
3c40: 73 70 72 69 6e 74 66 20 28 62 75 66 2c 20 22 25 sprintf (buf, "%
3c50: 30 34 64 2d 25 30 32 64 2d 25 30 32 64 22 2c 20 04d-%02d-%02d",
3c60: 79 79 2c 20 6d 6d 2c 20 64 64 29 3b 0a 20 20 20 yy, mm, dd);.
3c70: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 62 len = strlen (b
3c80: 75 66 29 3b 0a 20 20 20 20 73 74 72 69 6e 67 20 uf);. string
3c90: 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20 2b 20 = malloc (len +
3ca0: 31 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 72 1);. if (!str
3cb0: 69 6e 67 29 0a 09 72 65 74 75 72 6e 20 46 52 45 ing)..return FRE
3cc0: 45 58 4c 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 EXL_INSUFFICIENT
3cd0: 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 73 74 72 _MEMORY;. str
3ce0: 63 70 79 20 28 73 74 72 69 6e 67 2c 20 62 75 66 cpy (string, buf
3cf0: 29 3b 0a 0a 20 20 20 20 70 5f 63 65 6c 6c 20 3d );.. p_cell =
3d00: 0a 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 ..workbook->acti
3d10: 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f 76 ve_sheet->cell_v
3d20: 61 6c 75 65 73 20 2b 0a 09 28 72 6f 77 20 2a 20 alues +..(row *
3d30: 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 workbook->active
3d40: 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 _sheet->columns)
3d50: 20 2b 20 63 6f 6c 3b 0a 20 20 20 20 70 5f 63 65 + col;. p_ce
3d60: 6c 6c 2d 3e 74 79 70 65 20 3d 20 46 52 45 45 58 ll->type = FREEX
3d70: 4c 5f 43 45 4c 4c 5f 44 41 54 45 3b 0a 20 20 20 L_CELL_DATE;.
3d80: 20 70 5f 63 65 6c 6c 2d 3e 76 61 6c 75 65 2e 74 p_cell->value.t
3d90: 65 78 74 5f 76 61 6c 75 65 20 3d 20 73 74 72 69 ext_value = stri
3da0: 6e 67 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 ng;. return F
3db0: 52 45 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 REEXL_OK;.}..sta
3dc0: 74 69 63 20 69 6e 74 0a 73 65 74 5f 64 61 74 65 tic int.set_date
3dd0: 74 69 6d 65 5f 69 6e 74 5f 76 61 6c 75 65 20 28 time_int_value (
3de0: 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 biff_workbook *
3df0: 77 6f 72 6b 62 6f 6f 6b 2c 20 75 6e 73 69 67 6e workbook, unsign
3e00: 65 64 20 69 6e 74 20 72 6f 77 2c 0a 09 09 09 75 ed int row,....u
3e10: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 63 6f nsigned short co
3e20: 6c 2c 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 l, unsigned shor
3e30: 74 20 6d 6f 64 65 2c 20 69 6e 74 20 6e 75 6d 29 t mode, int num)
3e40: 0a 7b 0a 2f 2a 20 73 65 74 74 69 6e 67 20 61 20 .{./* setting a
3e50: 44 41 54 45 54 49 4d 45 20 76 61 6c 75 65 20 74 DATETIME value t
3e60: 6f 20 73 6f 6d 65 20 63 65 6c 6c 20 2a 2f 0a 20 o some cell */.
3e70: 20 20 20 62 69 66 66 5f 63 65 6c 6c 5f 76 61 6c biff_cell_val
3e80: 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a 20 20 20 20 ue *p_cell;.
3e90: 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a 20 20 char *string;.
3ea0: 20 20 63 68 61 72 20 62 75 66 5b 36 34 5d 3b 0a char buf[64];.
3eb0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
3ec0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 79 79 len;. int yy
3ed0: 3b 0a 20 20 20 20 69 6e 74 20 6d 6d 3b 0a 20 20 ;. int mm;.
3ee0: 20 20 69 6e 74 20 64 64 3b 0a 20 20 20 20 69 6e int dd;. in
3ef0: 74 20 63 6f 75 6e 74 20 3d 20 6e 75 6d 3b 0a 0a t count = num;..
3f00: 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b if (workbook
3f10: 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d ->active_sheet =
3f20: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 = NULL)..return
3f30: 46 52 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 FREEXL_ILLEGAL_C
3f40: 45 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 ELL_ROW_COL;.
3f50: 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 if (workbook->a
3f60: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c ctive_sheet->cel
3f70: 6c 5f 76 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c l_values == NULL
3f80: 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
3f90: 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f _ILLEGAL_CELL_RO
3fa0: 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 66 20 28 72 W_COL;. if (r
3fb0: 6f 77 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ow >= workbook->
3fc0: 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f active_sheet->ro
3fd0: 77 73 0a 09 7c 7c 20 63 6f 6c 20 3e 3d 20 77 6f ws..|| col >= wo
3fe0: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
3ff0: 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 0a 09 heet->columns)..
4000: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c return FREEXL_IL
4010: 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 LEGAL_CELL_ROW_C
4020: 4f 4c 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 OL;.. if (mod
4030: 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 79 79 e). {.. yy
4040: 20 3d 20 31 39 30 34 3b 0a 09 20 20 6d 6d 20 3d = 1904;.. mm =
4050: 20 31 3b 0a 09 20 20 64 64 20 3d 20 32 3b 0a 20 1;.. dd = 2;.
4060: 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a }. else.
4070: 20 20 20 20 20 20 7b 0a 09 20 20 79 79 20 3d 20 {.. yy =
4080: 31 39 30 30 3b 0a 09 20 20 6d 6d 20 3d 20 31 3b 1900;.. mm = 1;
4090: 0a 09 20 20 64 64 20 3d 20 31 3b 0a 20 20 20 20 .. dd = 1;.
40a0: 20 20 7d 0a 20 20 20 20 63 6f 6d 70 75 74 65 5f }. compute_
40b0: 64 61 74 65 20 28 26 79 79 2c 20 26 6d 6d 2c 20 date (&yy, &mm,
40c0: 26 64 64 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 &dd, count);.
40d0: 20 73 70 72 69 6e 74 66 20 28 62 75 66 2c 20 22 sprintf (buf, "
40e0: 25 30 34 64 2d 25 30 32 64 2d 25 30 32 64 20 30 %04d-%02d-%02d 0
40f0: 30 3a 30 30 3a 30 30 22 2c 20 79 79 2c 20 6d 6d 0:00:00", yy, mm
4100: 2c 20 64 64 29 3b 0a 20 20 20 20 6c 65 6e 20 3d , dd);. len =
4110: 20 73 74 72 6c 65 6e 20 28 62 75 66 29 3b 0a 20 strlen (buf);.
4120: 20 20 20 73 74 72 69 6e 67 20 3d 20 6d 61 6c 6c string = mall
4130: 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a 20 20 oc (len + 1);.
4140: 20 20 69 66 20 28 21 73 74 72 69 6e 67 29 0a 09 if (!string)..
4150: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e return FREEXL_IN
4160: 53 55 46 46 49 43 49 45 4e 54 5f 4d 45 4d 4f 52 SUFFICIENT_MEMOR
4170: 59 3b 0a 20 20 20 20 73 74 72 63 70 79 20 28 73 Y;. strcpy (s
4180: 74 72 69 6e 67 2c 20 62 75 66 29 3b 0a 0a 20 20 tring, buf);..
4190: 20 20 70 5f 63 65 6c 6c 20 3d 0a 09 77 6f 72 6b p_cell =..work
41a0: 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 book->active_she
41b0: 65 74 2d 3e 63 65 6c 6c 5f 76 61 6c 75 65 73 20 et->cell_values
41c0: 2b 0a 09 28 72 6f 77 20 2a 20 77 6f 72 6b 62 6f +..(row * workbo
41d0: 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 ok->active_sheet
41e0: 2d 3e 63 6f 6c 75 6d 6e 73 29 20 2b 20 63 6f 6c ->columns) + col
41f0: 3b 0a 20 20 20 20 70 5f 63 65 6c 6c 2d 3e 74 79 ;. p_cell->ty
4200: 70 65 20 3d 20 46 52 45 45 58 4c 5f 43 45 4c 4c pe = FREEXL_CELL
4210: 5f 44 41 54 45 54 49 4d 45 3b 0a 20 20 20 20 70 _DATETIME;. p
4220: 5f 63 65 6c 6c 2d 3e 76 61 6c 75 65 2e 74 65 78 _cell->value.tex
4230: 74 5f 76 61 6c 75 65 20 3d 20 73 74 72 69 6e 67 t_value = string
4240: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 ;. return FRE
4250: 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 EXL_OK;.}..stati
4260: 63 20 69 6e 74 0a 73 65 74 5f 64 61 74 65 5f 64 c int.set_date_d
4270: 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 62 69 66 ouble_value (bif
4280: 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 f_workbook * wor
4290: 6b 62 6f 6f 6b 2c 20 75 6e 73 69 67 6e 65 64 20 kbook, unsigned
42a0: 69 6e 74 20 72 6f 77 2c 0a 09 09 20 20 20 20 20 int row,...
42b0: 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 unsigned short
42c0: 20 63 6f 6c 2c 20 75 6e 73 69 67 6e 65 64 20 73 col, unsigned s
42d0: 68 6f 72 74 20 6d 6f 64 65 2c 20 64 6f 75 62 6c hort mode, doubl
42e0: 65 20 6e 75 6d 29 0a 7b 0a 2f 2a 20 73 65 74 74 e num).{./* sett
42f0: 69 6e 67 20 61 20 44 41 54 45 20 76 61 6c 75 65 ing a DATE value
4300: 20 74 6f 20 73 6f 6d 65 20 63 65 6c 6c 20 2a 2f to some cell */
4310: 0a 20 20 20 20 62 69 66 66 5f 63 65 6c 6c 5f 76 . biff_cell_v
4320: 61 6c 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a 20 20 alue *p_cell;.
4330: 20 20 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a char *string;.
4340: 20 20 20 20 63 68 61 72 20 62 75 66 5b 36 34 5d char buf[64]
4350: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
4360: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 nt len;. int
4370: 79 79 3b 0a 20 20 20 20 69 6e 74 20 6d 6d 3b 0a yy;. int mm;.
4380: 20 20 20 20 69 6e 74 20 64 64 3b 0a 20 20 20 20 int dd;.
4390: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 28 69 6e 74 int count = (int
43a0: 29 20 66 6c 6f 6f 72 20 28 6e 75 6d 29 3b 0a 0a ) floor (num);..
43b0: 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b if (workbook
43c0: 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d ->active_sheet =
43d0: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 = NULL)..return
43e0: 46 52 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 FREEXL_ILLEGAL_C
43f0: 45 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 ELL_ROW_COL;.
4400: 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 if (workbook->a
4410: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c ctive_sheet->cel
4420: 6c 5f 76 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c l_values == NULL
4430: 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
4440: 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f _ILLEGAL_CELL_RO
4450: 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 66 20 28 72 W_COL;. if (r
4460: 6f 77 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ow >= workbook->
4470: 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f active_sheet->ro
4480: 77 73 0a 09 7c 7c 20 63 6f 6c 20 3e 3d 20 77 6f ws..|| col >= wo
4490: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
44a0: 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 0a 09 heet->columns)..
44b0: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c return FREEXL_IL
44c0: 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 LEGAL_CELL_ROW_C
44d0: 4f 4c 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 OL;.. if (mod
44e0: 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 79 79 e). {.. yy
44f0: 20 3d 20 31 39 30 34 3b 0a 09 20 20 6d 6d 20 3d = 1904;.. mm =
4500: 20 31 3b 0a 09 20 20 64 64 20 3d 20 32 3b 0a 20 1;.. dd = 2;.
4510: 20 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 0a }. else.
4520: 20 20 20 20 20 20 7b 0a 09 20 20 79 79 20 3d 20 {.. yy =
4530: 31 39 30 30 3b 0a 09 20 20 6d 6d 20 3d 20 31 3b 1900;.. mm = 1;
4540: 0a 09 20 20 64 64 20 3d 20 31 3b 0a 20 20 20 20 .. dd = 1;.
4550: 20 20 7d 0a 20 20 20 20 63 6f 6d 70 75 74 65 5f }. compute_
4560: 64 61 74 65 20 28 26 79 79 2c 20 26 6d 6d 2c 20 date (&yy, &mm,
4570: 26 64 64 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20 &dd, count);.
4580: 20 73 70 72 69 6e 74 66 20 28 62 75 66 2c 20 22 sprintf (buf, "
4590: 25 30 34 64 2d 25 30 32 64 2d 25 30 32 64 22 2c %04d-%02d-%02d",
45a0: 20 79 79 2c 20 6d 6d 2c 20 64 64 29 3b 0a 20 20 yy, mm, dd);.
45b0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 20 28 len = strlen (
45c0: 62 75 66 29 3b 0a 20 20 20 20 73 74 72 69 6e 67 buf);. string
45d0: 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 6e 20 2b = malloc (len +
45e0: 20 31 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 1);. if (!st
45f0: 72 69 6e 67 29 0a 09 72 65 74 75 72 6e 20 46 52 ring)..return FR
4600: 45 45 58 4c 5f 49 4e 53 55 46 46 49 43 49 45 4e EEXL_INSUFFICIEN
4610: 54 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 73 74 T_MEMORY;. st
4620: 72 63 70 79 20 28 73 74 72 69 6e 67 2c 20 62 75 rcpy (string, bu
4630: 66 29 3b 0a 0a 20 20 20 20 70 5f 63 65 6c 6c 20 f);.. p_cell
4640: 3d 0a 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 =..workbook->act
4650: 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f ive_sheet->cell_
4660: 76 61 6c 75 65 73 20 2b 0a 09 28 72 6f 77 20 2a values +..(row *
4670: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 workbook->activ
4680: 65 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 e_sheet->columns
4690: 29 20 2b 20 63 6f 6c 3b 0a 20 20 20 20 70 5f 63 ) + col;. p_c
46a0: 65 6c 6c 2d 3e 74 79 70 65 20 3d 20 46 52 45 45 ell->type = FREE
46b0: 58 4c 5f 43 45 4c 4c 5f 44 41 54 45 3b 0a 20 20 XL_CELL_DATE;.
46c0: 20 20 70 5f 63 65 6c 6c 2d 3e 76 61 6c 75 65 2e p_cell->value.
46d0: 74 65 78 74 5f 76 61 6c 75 65 20 3d 20 73 74 72 text_value = str
46e0: 69 6e 67 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 ing;. return
46f0: 46 52 45 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 FREEXL_OK;.}..st
4700: 61 74 69 63 20 69 6e 74 0a 73 65 74 5f 64 61 74 atic int.set_dat
4710: 65 74 69 6d 65 5f 64 6f 75 62 6c 65 5f 76 61 6c etime_double_val
4720: 75 65 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f 6f ue (biff_workboo
4730: 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 75 6e k * workbook, un
4740: 73 69 67 6e 65 64 20 69 6e 74 20 72 6f 77 2c 0a signed int row,.
4750: 09 09 09 20 20 20 75 6e 73 69 67 6e 65 64 20 73 ... unsigned s
4760: 68 6f 72 74 20 63 6f 6c 2c 20 75 6e 73 69 67 6e hort col, unsign
4770: 65 64 20 73 68 6f 72 74 20 6d 6f 64 65 2c 20 64 ed short mode, d
4780: 6f 75 62 6c 65 20 6e 75 6d 29 0a 7b 0a 2f 2a 20 ouble num).{./*
4790: 73 65 74 74 69 6e 67 20 61 20 44 41 54 45 54 49 setting a DATETI
47a0: 4d 45 20 76 61 6c 75 65 20 74 6f 20 73 6f 6d 65 ME value to some
47b0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 62 69 66 cell */. bif
47c0: 66 5f 63 65 6c 6c 5f 76 61 6c 75 65 20 2a 70 5f f_cell_value *p_
47d0: 63 65 6c 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a cell;. char *
47e0: 73 74 72 69 6e 67 3b 0a 20 20 20 20 63 68 61 72 string;. char
47f0: 20 62 75 66 5b 36 34 5d 3b 0a 20 20 20 20 75 6e buf[64];. un
4800: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a signed int len;.
4810: 20 20 20 20 69 6e 74 20 79 79 3b 0a 20 20 20 20 int yy;.
4820: 69 6e 74 20 6d 6d 3b 0a 20 20 20 20 69 6e 74 20 int mm;. int
4830: 64 64 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 dd;. int h;.
4840: 20 20 20 69 6e 74 20 6d 3b 0a 20 20 20 20 69 6e int m;. in
4850: 74 20 73 3b 0a 20 20 20 20 69 6e 74 20 63 6f 75 t s;. int cou
4860: 6e 74 20 3d 20 28 69 6e 74 29 20 66 6c 6f 6f 72 nt = (int) floor
4870: 20 28 6e 75 6d 29 3b 0a 20 20 20 20 64 6f 75 62 (num);. doub
4880: 6c 65 20 70 65 72 63 65 6e 74 20 3d 20 6e 75 6d le percent = num
4890: 20 2d 20 28 64 6f 75 62 6c 65 29 20 63 6f 75 6e - (double) coun
48a0: 74 3b 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 6b t;.. if (work
48b0: 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 book->active_she
48c0: 65 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 et == NULL)..ret
48d0: 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c 4c 45 47 urn FREEXL_ILLEG
48e0: 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b AL_CELL_ROW_COL;
48f0: 0a 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f . if (workboo
4900: 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d k->active_sheet-
4910: 3e 63 65 6c 6c 5f 76 61 6c 75 65 73 20 3d 3d 20 >cell_values ==
4920: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 52 NULL)..return FR
4930: 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c EEXL_ILLEGAL_CEL
4940: 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 L_ROW_COL;. i
4950: 66 20 28 72 6f 77 20 3e 3d 20 77 6f 72 6b 62 6f f (row >= workbo
4960: 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 ok->active_sheet
4970: 2d 3e 72 6f 77 73 0a 09 7c 7c 20 63 6f 6c 20 3e ->rows..|| col >
4980: 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 = workbook->acti
4990: 76 65 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e ve_sheet->column
49a0: 73 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 s)..return FREEX
49b0: 4c 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 L_ILLEGAL_CELL_R
49c0: 4f 57 5f 43 4f 4c 3b 0a 0a 20 20 20 20 69 66 20 OW_COL;.. if
49d0: 28 6d 6f 64 65 29 0a 20 20 20 20 20 20 7b 0a 09 (mode). {..
49e0: 20 20 79 79 20 3d 20 31 39 30 34 3b 0a 09 20 20 yy = 1904;..
49f0: 6d 6d 20 3d 20 31 3b 0a 09 20 20 64 64 20 3d 20 mm = 1;.. dd =
4a00: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 2;. }. e
4a10: 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 79 lse. {.. y
4a20: 79 20 3d 20 31 39 30 30 3b 0a 09 20 20 6d 6d 20 y = 1900;.. mm
4a30: 3d 20 31 3b 0a 09 20 20 64 64 20 3d 20 31 3b 0a = 1;.. dd = 1;.
4a40: 20 20 20 20 20 20 7d 0a 20 20 20 20 63 6f 6d 70 }. comp
4a50: 75 74 65 5f 64 61 74 65 20 28 26 79 79 2c 20 26 ute_date (&yy, &
4a60: 6d 6d 2c 20 26 64 64 2c 20 63 6f 75 6e 74 29 3b mm, &dd, count);
4a70: 0a 20 20 20 20 63 6f 6d 70 75 74 65 5f 74 69 6d . compute_tim
4a80: 65 20 28 26 68 2c 20 26 6d 2c 20 26 73 2c 20 70 e (&h, &m, &s, p
4a90: 65 72 63 65 6e 74 29 3b 0a 20 20 20 20 73 70 72 ercent);. spr
4aa0: 69 6e 74 66 20 28 62 75 66 2c 20 22 25 30 34 64 intf (buf, "%04d
4ab0: 2d 25 30 32 64 2d 25 30 32 64 20 25 30 32 64 3a -%02d-%02d %02d:
4ac0: 25 30 32 64 3a 25 30 32 64 22 2c 20 79 79 2c 20 %02d:%02d", yy,
4ad0: 6d 6d 2c 20 64 64 2c 20 68 2c 20 6d 2c 20 73 29 mm, dd, h, m, s)
4ae0: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c ;. len = strl
4af0: 65 6e 20 28 62 75 66 29 3b 0a 20 20 20 20 73 74 en (buf);. st
4b00: 72 69 6e 67 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c ring = malloc (l
4b10: 65 6e 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 20 en + 1);. if
4b20: 28 21 73 74 72 69 6e 67 29 0a 09 72 65 74 75 72 (!string)..retur
4b30: 6e 20 46 52 45 45 58 4c 5f 49 4e 53 55 46 46 49 n FREEXL_INSUFFI
4b40: 43 49 45 4e 54 5f 4d 45 4d 4f 52 59 3b 0a 20 20 CIENT_MEMORY;.
4b50: 20 20 73 74 72 63 70 79 20 28 73 74 72 69 6e 67 strcpy (string
4b60: 2c 20 62 75 66 29 3b 0a 0a 20 20 20 20 70 5f 63 , buf);.. p_c
4b70: 65 6c 6c 20 3d 0a 09 77 6f 72 6b 62 6f 6f 6b 2d ell =..workbook-
4b80: 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 >active_sheet->c
4b90: 65 6c 6c 5f 76 61 6c 75 65 73 20 2b 0a 09 28 72 ell_values +..(r
4ba0: 6f 77 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 ow * workbook->a
4bb0: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 6f 6c ctive_sheet->col
4bc0: 75 6d 6e 73 29 20 2b 20 63 6f 6c 3b 0a 20 20 20 umns) + col;.
4bd0: 20 70 5f 63 65 6c 6c 2d 3e 74 79 70 65 20 3d 20 p_cell->type =
4be0: 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 44 41 54 45 FREEXL_CELL_DATE
4bf0: 54 49 4d 45 3b 0a 20 20 20 20 70 5f 63 65 6c 6c TIME;. p_cell
4c00: 2d 3e 76 61 6c 75 65 2e 74 65 78 74 5f 76 61 6c ->value.text_val
4c10: 75 65 20 3d 20 73 74 72 69 6e 67 3b 0a 20 20 20 ue = string;.
4c20: 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f return FREEXL_O
4c30: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 K;.}..static int
4c40: 0a 73 65 74 5f 74 69 6d 65 5f 64 6f 75 62 6c 65 .set_time_double
4c50: 5f 76 61 6c 75 65 20 28 62 69 66 66 5f 77 6f 72 _value (biff_wor
4c60: 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b kbook * workbook
4c70: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 , unsigned int r
4c80: 6f 77 2c 0a 09 09 20 20 20 20 20 20 20 75 6e 73 ow,... uns
4c90: 69 67 6e 65 64 20 73 68 6f 72 74 20 63 6f 6c 2c igned short col,
4ca0: 20 64 6f 75 62 6c 65 20 6e 75 6d 29 0a 7b 0a 2f double num).{./
4cb0: 2a 20 73 65 74 74 69 6e 67 20 61 20 54 49 4d 45 * setting a TIME
4cc0: 20 76 61 6c 75 65 20 74 6f 20 73 6f 6d 65 20 63 value to some c
4cd0: 65 6c 6c 20 2a 2f 0a 20 20 20 20 62 69 66 66 5f ell */. biff_
4ce0: 63 65 6c 6c 5f 76 61 6c 75 65 20 2a 70 5f 63 65 cell_value *p_ce
4cf0: 6c 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 ll;. char *st
4d00: 72 69 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 62 ring;. char b
4d10: 75 66 5b 36 34 5d 3b 0a 20 20 20 20 75 6e 73 69 uf[64];. unsi
4d20: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 gned int len;.
4d30: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 6e 74 int h;. int
4d40: 20 6d 3b 0a 20 20 20 20 69 6e 74 20 73 3b 0a 20 m;. int s;.
4d50: 20 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 28 int count = (
4d60: 69 6e 74 29 20 66 6c 6f 6f 72 20 28 6e 75 6d 29 int) floor (num)
4d70: 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 70 65 72 ;. double per
4d80: 63 65 6e 74 20 3d 20 6e 75 6d 20 2d 20 28 64 6f cent = num - (do
4d90: 75 62 6c 65 29 20 63 6f 75 6e 74 3b 0a 0a 20 20 uble) count;..
4da0: 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e if (workbook->
4db0: 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d 3d 20 active_sheet ==
4dc0: 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 52 NULL)..return FR
4dd0: 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c EEXL_ILLEGAL_CEL
4de0: 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 L_ROW_COL;. i
4df0: 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 f (workbook->act
4e00: 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f ive_sheet->cell_
4e10: 76 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c 29 0a values == NULL).
4e20: 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 .return FREEXL_I
4e30: 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f LLEGAL_CELL_ROW_
4e40: 43 4f 4c 3b 0a 20 20 20 20 69 66 20 28 72 6f 77 COL;. if (row
4e50: 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 >= workbook->ac
4e60: 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 73 tive_sheet->rows
4e70: 0a 09 7c 7c 20 63 6f 6c 20 3e 3d 20 77 6f 72 6b ..|| col >= work
4e80: 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 book->active_she
4e90: 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 0a 09 72 65 et->columns)..re
4ea0: 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c 4c 45 turn FREEXL_ILLE
4eb0: 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 4f 4c GAL_CELL_ROW_COL
4ec0: 3b 0a 0a 20 20 20 20 63 6f 6d 70 75 74 65 5f 74 ;.. compute_t
4ed0: 69 6d 65 20 28 26 68 2c 20 26 6d 2c 20 26 73 2c ime (&h, &m, &s,
4ee0: 20 70 65 72 63 65 6e 74 29 3b 0a 20 20 20 20 73 percent);. s
4ef0: 70 72 69 6e 74 66 20 28 62 75 66 2c 20 22 25 30 printf (buf, "%0
4f00: 32 64 3a 25 30 32 64 3a 25 30 32 64 22 2c 20 68 2d:%02d:%02d", h
4f10: 2c 20 6d 2c 20 73 29 3b 0a 20 20 20 20 6c 65 6e , m, s);. len
4f20: 20 3d 20 73 74 72 6c 65 6e 20 28 62 75 66 29 3b = strlen (buf);
4f30: 0a 20 20 20 20 73 74 72 69 6e 67 20 3d 20 6d 61 . string = ma
4f40: 6c 6c 6f 63 20 28 6c 65 6e 20 2b 20 31 29 3b 0a lloc (len + 1);.
4f50: 20 20 20 20 69 66 20 28 21 73 74 72 69 6e 67 29 if (!string)
4f60: 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f ..return FREEXL_
4f70: 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 4d 45 4d INSUFFICIENT_MEM
4f80: 4f 52 59 3b 0a 20 20 20 20 73 74 72 63 70 79 20 ORY;. strcpy
4f90: 28 73 74 72 69 6e 67 2c 20 62 75 66 29 3b 0a 0a (string, buf);..
4fa0: 20 20 20 20 70 5f 63 65 6c 6c 20 3d 0a 09 77 6f p_cell =..wo
4fb0: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
4fc0: 68 65 65 74 2d 3e 63 65 6c 6c 5f 76 61 6c 75 65 heet->cell_value
4fd0: 73 20 2b 0a 09 28 72 6f 77 20 2a 20 77 6f 72 6b s +..(row * work
4fe0: 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 book->active_she
4ff0: 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 20 2b 20 63 et->columns) + c
5000: 6f 6c 3b 0a 20 20 20 20 70 5f 63 65 6c 6c 2d 3e ol;. p_cell->
5010: 74 79 70 65 20 3d 20 46 52 45 45 58 4c 5f 43 45 type = FREEXL_CE
5020: 4c 4c 5f 54 49 4d 45 3b 0a 20 20 20 20 70 5f 63 LL_TIME;. p_c
5030: 65 6c 6c 2d 3e 76 61 6c 75 65 2e 74 65 78 74 5f ell->value.text_
5040: 76 61 6c 75 65 20 3d 20 73 74 72 69 6e 67 3b 0a value = string;.
5050: 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 return FREEX
5060: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 L_OK;.}..static
5070: 69 6e 74 0a 73 65 74 5f 69 6e 74 5f 76 61 6c 75 int.set_int_valu
5080: 65 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b e (biff_workbook
5090: 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 75 6e 73 * workbook, uns
50a0: 69 67 6e 65 64 20 69 6e 74 20 72 6f 77 2c 20 75 igned int row, u
50b0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 63 6f nsigned short co
50c0: 6c 2c 0a 09 20 20 20 20 20 20 20 69 6e 74 20 6e l,.. int n
50d0: 75 6d 29 0a 7b 0a 2f 2a 20 73 65 74 74 69 6e 67 um).{./* setting
50e0: 20 61 6e 20 49 4e 54 45 47 45 52 20 76 61 6c 75 an INTEGER valu
50f0: 65 20 74 6f 20 73 6f 6d 65 20 63 65 6c 6c 20 2a e to some cell *
5100: 2f 0a 20 20 20 20 62 69 66 66 5f 63 65 6c 6c 5f /. biff_cell_
5110: 76 61 6c 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a 0a value *p_cell;..
5120: 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b if (workbook
5130: 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d ->active_sheet =
5140: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 = NULL)..return
5150: 46 52 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 FREEXL_ILLEGAL_C
5160: 45 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 ELL_ROW_COL;.
5170: 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 if (workbook->a
5180: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c ctive_sheet->cel
5190: 6c 5f 76 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c l_values == NULL
51a0: 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
51b0: 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f _ILLEGAL_CELL_RO
51c0: 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 66 20 28 72 W_COL;. if (r
51d0: 6f 77 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ow >= workbook->
51e0: 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f active_sheet->ro
51f0: 77 73 0a 09 7c 7c 20 63 6f 6c 20 3e 3d 20 77 6f ws..|| col >= wo
5200: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
5210: 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 0a 09 heet->columns)..
5220: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c return FREEXL_IL
5230: 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 LEGAL_CELL_ROW_C
5240: 4f 4c 3b 0a 0a 20 20 20 20 70 5f 63 65 6c 6c 20 OL;.. p_cell
5250: 3d 0a 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 =..workbook->act
5260: 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f ive_sheet->cell_
5270: 76 61 6c 75 65 73 20 2b 0a 09 28 72 6f 77 20 2a values +..(row *
5280: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 workbook->activ
5290: 65 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 e_sheet->columns
52a0: 29 20 2b 20 63 6f 6c 3b 0a 20 20 20 20 70 5f 63 ) + col;. p_c
52b0: 65 6c 6c 2d 3e 74 79 70 65 20 3d 20 46 52 45 45 ell->type = FREE
52c0: 58 4c 5f 43 45 4c 4c 5f 49 4e 54 3b 0a 20 20 20 XL_CELL_INT;.
52d0: 20 70 5f 63 65 6c 6c 2d 3e 76 61 6c 75 65 2e 69 p_cell->value.i
52e0: 6e 74 5f 76 61 6c 75 65 20 3d 20 6e 75 6d 3b 0a nt_value = num;.
52f0: 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 return FREEX
5300: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 L_OK;.}..static
5310: 69 6e 74 0a 73 65 74 5f 64 6f 75 62 6c 65 5f 76 int.set_double_v
5320: 61 6c 75 65 20 28 62 69 66 66 5f 77 6f 72 6b 62 alue (biff_workb
5330: 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 ook * workbook,
5340: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 6f 77 unsigned int row
5350: 2c 0a 09 09 20 20 75 6e 73 69 67 6e 65 64 20 73 ,... unsigned s
5360: 68 6f 72 74 20 63 6f 6c 2c 20 64 6f 75 62 6c 65 hort col, double
5370: 20 6e 75 6d 29 0a 7b 0a 2f 2a 20 73 65 74 74 69 num).{./* setti
5380: 6e 67 20 61 20 44 4f 55 42 4c 45 20 76 61 6c 75 ng a DOUBLE valu
5390: 65 20 74 6f 20 73 6f 6d 65 20 63 65 6c 6c 20 2a e to some cell *
53a0: 2f 0a 20 20 20 20 62 69 66 66 5f 63 65 6c 6c 5f /. biff_cell_
53b0: 76 61 6c 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a 0a value *p_cell;..
53c0: 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b if (workbook
53d0: 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d ->active_sheet =
53e0: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 = NULL)..return
53f0: 46 52 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 FREEXL_ILLEGAL_C
5400: 45 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 ELL_ROW_COL;.
5410: 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 if (workbook->a
5420: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c ctive_sheet->cel
5430: 6c 5f 76 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c l_values == NULL
5440: 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
5450: 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f _ILLEGAL_CELL_RO
5460: 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 66 20 28 72 W_COL;. if (r
5470: 6f 77 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ow >= workbook->
5480: 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f active_sheet->ro
5490: 77 73 0a 09 7c 7c 20 63 6f 6c 20 3e 3d 20 77 6f ws..|| col >= wo
54a0: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
54b0: 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 0a 09 heet->columns)..
54c0: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c return FREEXL_IL
54d0: 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 LEGAL_CELL_ROW_C
54e0: 4f 4c 3b 0a 0a 20 20 20 20 70 5f 63 65 6c 6c 20 OL;.. p_cell
54f0: 3d 0a 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 =..workbook->act
5500: 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f ive_sheet->cell_
5510: 76 61 6c 75 65 73 20 2b 0a 09 28 72 6f 77 20 2a values +..(row *
5520: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 workbook->activ
5530: 65 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 e_sheet->columns
5540: 29 20 2b 20 63 6f 6c 3b 0a 20 20 20 20 70 5f 63 ) + col;. p_c
5550: 65 6c 6c 2d 3e 74 79 70 65 20 3d 20 46 52 45 45 ell->type = FREE
5560: 58 4c 5f 43 45 4c 4c 5f 44 4f 55 42 4c 45 3b 0a XL_CELL_DOUBLE;.
5570: 20 20 20 20 70 5f 63 65 6c 6c 2d 3e 76 61 6c 75 p_cell->valu
5580: 65 2e 64 62 6c 5f 76 61 6c 75 65 20 3d 20 6e 75 e.dbl_value = nu
5590: 6d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 m;. return FR
55a0: 45 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 EEXL_OK;.}..stat
55b0: 69 63 20 69 6e 74 0a 73 65 74 5f 74 65 78 74 5f ic int.set_text_
55c0: 76 61 6c 75 65 20 28 62 69 66 66 5f 77 6f 72 6b value (biff_work
55d0: 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c book * workbook,
55e0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 6f unsigned int ro
55f0: 77 2c 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 w, unsigned shor
5600: 74 20 63 6f 6c 2c 0a 09 09 63 68 61 72 20 2a 74 t col,...char *t
5610: 65 78 74 29 0a 7b 0a 2f 2a 20 73 65 74 74 69 6e ext).{./* settin
5620: 67 20 61 20 54 45 58 54 20 76 61 6c 75 65 20 74 g a TEXT value t
5630: 6f 20 73 6f 6d 65 20 63 65 6c 6c 20 2a 2f 0a 20 o some cell */.
5640: 20 20 20 62 69 66 66 5f 63 65 6c 6c 5f 76 61 6c biff_cell_val
5650: 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a 0a 20 20 20 ue *p_cell;..
5660: 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 if (workbook->a
5670: 63 74 69 76 65 5f 73 68 65 65 74 20 3d 3d 20 4e ctive_sheet == N
5680: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 52 45 ULL)..return FRE
5690: 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c EXL_ILLEGAL_CELL
56a0: 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 66 _ROW_COL;. if
56b0: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 (workbook->acti
56c0: 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f 76 ve_sheet->cell_v
56d0: 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c 29 0a 09 alues == NULL)..
56e0: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c return FREEXL_IL
56f0: 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 LEGAL_CELL_ROW_C
5700: 4f 4c 3b 0a 20 20 20 20 69 66 20 28 72 6f 77 20 OL;. if (row
5710: 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 >= workbook->act
5720: 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 73 0a ive_sheet->rows.
5730: 09 7c 7c 20 63 6f 6c 20 3e 3d 20 77 6f 72 6b 62 .|| col >= workb
5740: 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 ook->active_shee
5750: 74 2d 3e 63 6f 6c 75 6d 6e 73 29 0a 09 72 65 74 t->columns)..ret
5760: 75 72 6e 20 46 52 45 45 58 4c 5f 49 4c 4c 45 47 urn FREEXL_ILLEG
5770: 41 4c 5f 43 45 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b AL_CELL_ROW_COL;
5780: 0a 0a 20 20 20 20 70 5f 63 65 6c 6c 20 3d 0a 09 .. p_cell =..
5790: 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 workbook->active
57a0: 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f 76 61 6c _sheet->cell_val
57b0: 75 65 73 20 2b 0a 09 28 72 6f 77 20 2a 20 77 6f ues +..(row * wo
57c0: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
57d0: 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 20 2b heet->columns) +
57e0: 20 63 6f 6c 3b 0a 20 20 20 20 69 66 20 28 21 74 col;. if (!t
57f0: 65 78 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 ext). {..
5800: 70 5f 63 65 6c 6c 2d 3e 74 79 70 65 20 3d 20 46 p_cell->type = F
5810: 52 45 45 58 4c 5f 43 45 4c 4c 5f 4e 55 4c 4c 3b REEXL_CELL_NULL;
5820: 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 .. return FREEX
5830: 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 L_OK;. }.
5840: 20 20 70 5f 63 65 6c 6c 2d 3e 74 79 70 65 20 3d p_cell->type =
5850: 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 54 45 58 FREEXL_CELL_TEX
5860: 54 3b 0a 20 20 20 20 70 5f 63 65 6c 6c 2d 3e 76 T;. p_cell->v
5870: 61 6c 75 65 2e 74 65 78 74 5f 76 61 6c 75 65 20 alue.text_value
5880: 3d 20 74 65 78 74 3b 0a 20 20 20 20 72 65 74 75 = text;. retu
5890: 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 7d 0a rn FREEXL_OK;.}.
58a0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 73 65 74 5f .static int.set_
58b0: 73 73 74 5f 76 61 6c 75 65 20 28 62 69 66 66 5f sst_value (biff_
58c0: 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 workbook * workb
58d0: 6f 6f 6b 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e ook, unsigned in
58e0: 74 20 72 6f 77 2c 20 75 6e 73 69 67 6e 65 64 20 t row, unsigned
58f0: 73 68 6f 72 74 20 63 6f 6c 2c 0a 09 20 20 20 20 short col,..
5900: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 const char *t
5910: 65 78 74 29 0a 7b 0a 2f 2a 20 73 65 74 74 69 6e ext).{./* settin
5920: 67 20 61 6e 20 53 53 54 2d 54 45 58 54 20 76 61 g an SST-TEXT va
5930: 6c 75 65 20 74 6f 20 73 6f 6d 65 20 63 65 6c 6c lue to some cell
5940: 20 2a 2f 0a 20 20 20 20 62 69 66 66 5f 63 65 6c */. biff_cel
5950: 6c 5f 76 61 6c 75 65 20 2a 70 5f 63 65 6c 6c 3b l_value *p_cell;
5960: 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f .. if (workbo
5970: 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 ok->active_sheet
5980: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 == NULL)..retur
5990: 6e 20 46 52 45 45 58 4c 5f 49 4c 4c 45 47 41 4c n FREEXL_ILLEGAL
59a0: 5f 43 45 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 _CELL_ROW_COL;.
59b0: 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d if (workbook-
59c0: 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 >active_sheet->c
59d0: 65 6c 6c 5f 76 61 6c 75 65 73 20 3d 3d 20 4e 55 ell_values == NU
59e0: 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 LL)..return FREE
59f0: 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f XL_ILLEGAL_CELL_
5a00: 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 20 69 66 20 ROW_COL;. if
5a10: 28 72 6f 77 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b (row >= workbook
5a20: 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e ->active_sheet->
5a30: 72 6f 77 73 0a 09 7c 7c 20 63 6f 6c 20 3e 3d 20 rows..|| col >=
5a40: 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 workbook->active
5a50: 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 29 _sheet->columns)
5a60: 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f ..return FREEXL_
5a70: 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 ILLEGAL_CELL_ROW
5a80: 5f 43 4f 4c 3b 0a 0a 20 20 20 20 70 5f 63 65 6c _COL;.. p_cel
5a90: 6c 20 3d 0a 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 l =..workbook->a
5aa0: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c ctive_sheet->cel
5ab0: 6c 5f 76 61 6c 75 65 73 20 2b 0a 09 28 72 6f 77 l_values +..(row
5ac0: 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 * workbook->act
5ad0: 69 76 65 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d ive_sheet->colum
5ae0: 6e 73 29 20 2b 20 63 6f 6c 3b 0a 20 20 20 20 69 ns) + col;. i
5af0: 66 20 28 21 74 65 78 74 29 0a 20 20 20 20 20 20 f (!text).
5b00: 7b 0a 09 20 20 70 5f 63 65 6c 6c 2d 3e 74 79 70 {.. p_cell->typ
5b10: 65 20 3d 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f e = FREEXL_CELL_
5b20: 4e 55 4c 4c 3b 0a 09 20 20 72 65 74 75 72 6e 20 NULL;.. return
5b30: 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 FREEXL_OK;.
5b40: 20 7d 0a 20 20 20 20 70 5f 63 65 6c 6c 2d 3e 74 }. p_cell->t
5b50: 79 70 65 20 3d 20 46 52 45 45 58 4c 5f 43 45 4c ype = FREEXL_CEL
5b60: 4c 5f 53 53 54 5f 54 45 58 54 3b 0a 20 20 20 20 L_SST_TEXT;.
5b70: 70 5f 63 65 6c 6c 2d 3e 76 61 6c 75 65 2e 73 73 p_cell->value.ss
5b80: 74 5f 76 61 6c 75 65 20 3d 20 74 65 78 74 3b 0a t_value = text;.
5b90: 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 return FREEX
5ba0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 L_OK;.}..static
5bb0: 66 61 74 5f 63 68 61 69 6e 20 2a 0a 61 6c 6c 6f fat_chain *.allo
5bc0: 63 5f 66 61 74 5f 63 68 61 69 6e 20 28 69 6e 74 c_fat_chain (int
5bd0: 20 73 77 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 swap, unsigned
5be0: 73 68 6f 72 74 20 73 65 63 74 6f 72 5f 73 68 69 short sector_shi
5bf0: 66 74 2c 0a 09 09 20 75 6e 73 69 67 6e 65 64 20 ft,... unsigned
5c00: 69 6e 74 20 64 69 72 65 63 74 6f 72 79 5f 73 74 int directory_st
5c10: 61 72 74 29 0a 7b 0a 2f 2a 20 61 6c 6c 6f 63 61 art).{./* alloca
5c20: 74 69 6e 67 20 74 68 65 20 46 41 54 20 63 68 61 ting the FAT cha
5c30: 69 6e 20 2a 2f 0a 20 20 20 20 66 61 74 5f 63 68 in */. fat_ch
5c40: 61 69 6e 20 2a 63 68 61 69 6e 20 3d 20 6d 61 6c ain *chain = mal
5c50: 6c 6f 63 20 28 73 69 7a 65 6f 66 20 28 66 61 74 loc (sizeof (fat
5c60: 5f 63 68 61 69 6e 29 29 3b 0a 20 20 20 20 69 66 _chain));. if
5c70: 20 28 21 63 68 61 69 6e 29 0a 09 72 65 74 75 72 (!chain)..retur
5c80: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 69 n NULL;. chai
5c90: 6e 2d 3e 73 77 61 70 20 3d 20 73 77 61 70 3b 0a n->swap = swap;.
5ca0: 20 20 20 20 69 66 20 28 73 65 63 74 6f 72 5f 73 if (sector_s
5cb0: 68 69 66 74 20 3d 3d 20 31 32 29 0a 09 63 68 61 hift == 12)..cha
5cc0: 69 6e 2d 3e 73 65 63 74 6f 72 5f 73 69 7a 65 20 in->sector_size
5cd0: 3d 20 34 30 39 36 3b 0a 20 20 20 20 65 6c 73 65 = 4096;. else
5ce0: 0a 09 63 68 61 69 6e 2d 3e 73 65 63 74 6f 72 5f ..chain->sector_
5cf0: 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 size = 512;.
5d00: 63 68 61 69 6e 2d 3e 6e 65 78 74 5f 73 65 63 74 chain->next_sect
5d10: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 69 or = 0;. chai
5d20: 6e 2d 3e 64 69 72 65 63 74 6f 72 79 5f 73 74 61 n->directory_sta
5d30: 72 74 20 3d 20 64 69 72 65 63 74 6f 72 79 5f 73 rt = directory_s
5d40: 74 61 72 74 3b 0a 20 20 20 20 63 68 61 69 6e 2d tart;. chain-
5d50: 3e 66 69 72 73 74 20 3d 20 4e 55 4c 4c 3b 0a 20 >first = NULL;.
5d60: 20 20 20 63 68 61 69 6e 2d 3e 6c 61 73 74 20 3d chain->last =
5d70: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 69 6e NULL;. chain
5d80: 2d 3e 66 61 74 5f 61 72 72 61 79 20 3d 20 4e 55 ->fat_array = NU
5d90: 4c 4c 3b 0a 20 20 20 20 63 68 61 69 6e 2d 3e 66 LL;. chain->f
5da0: 61 74 5f 61 72 72 61 79 5f 63 6f 75 6e 74 20 3d at_array_count =
5db0: 20 30 3b 0a 20 20 20 20 63 68 61 69 6e 2d 3e 6d 0;. chain->m
5dc0: 69 6e 69 43 75 74 4f 66 66 20 3d 20 30 3b 0a 20 iniCutOff = 0;.
5dd0: 20 20 20 63 68 61 69 6e 2d 3e 6e 65 78 74 5f 73 chain->next_s
5de0: 65 63 74 6f 72 4d 69 6e 69 20 3d 20 30 3b 0a 20 ectorMini = 0;.
5df0: 20 20 20 63 68 61 69 6e 2d 3e 66 69 72 73 74 4d chain->firstM
5e00: 69 6e 69 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ini = NULL;.
5e10: 63 68 61 69 6e 2d 3e 6c 61 73 74 4d 69 6e 69 20 chain->lastMini
5e20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 69 = NULL;. chai
5e30: 6e 2d 3e 6d 69 6e 69 46 41 54 5f 61 72 72 61 79 n->miniFAT_array
5e40: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
5e50: 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f 61 72 72 61 in->miniFAT_arra
5e60: 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 y_count = 0;.
5e70: 20 63 68 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f chain->miniFAT_
5e80: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 len = 0;. cha
5e90: 69 6e 2d 3e 6d 69 6e 69 53 74 72 65 61 6d 20 3d in->miniStream =
5ea0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 NULL;. retur
5eb0: 6e 20 63 68 61 69 6e 3b 0a 7d 0a 0a 73 74 61 74 n chain;.}..stat
5ec0: 69 63 20 76 6f 69 64 0a 64 65 73 74 72 6f 79 5f ic void.destroy_
5ed0: 66 61 74 5f 63 68 61 69 6e 20 28 66 61 74 5f 63 fat_chain (fat_c
5ee0: 68 61 69 6e 20 2a 20 63 68 61 69 6e 29 0a 7b 0a hain * chain).{.
5ef0: 2f 2a 20 64 65 73 74 72 6f 79 69 6e 67 20 61 20 /* destroying a
5f00: 46 41 54 20 63 68 61 69 6e 20 2a 2f 0a 20 20 20 FAT chain */.
5f10: 20 66 61 74 5f 65 6e 74 72 79 20 2a 65 6e 74 72 fat_entry *entr
5f20: 79 3b 0a 20 20 20 20 66 61 74 5f 65 6e 74 72 79 y;. fat_entry
5f30: 20 2a 65 6e 74 72 79 5f 6e 3b 0a 20 20 20 20 69 *entry_n;. i
5f40: 66 20 28 21 63 68 61 69 6e 29 0a 09 72 65 74 75 f (!chain)..retu
5f50: 72 6e 3b 0a 2f 2a 20 64 65 73 74 72 6f 79 69 6e rn;./* destroyin
5f60: 67 20 74 68 65 20 6d 61 69 6e 20 46 41 54 20 2a g the main FAT *
5f70: 2f 0a 20 20 20 20 65 6e 74 72 79 20 3d 20 63 68 /. entry = ch
5f80: 61 69 6e 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20 ain->first;.
5f90: 77 68 69 6c 65 20 28 65 6e 74 72 79 29 0a 20 20 while (entry).
5fa0: 20 20 20 20 7b 0a 09 20 20 65 6e 74 72 79 5f 6e {.. entry_n
5fb0: 20 3d 20 65 6e 74 72 79 2d 3e 6e 65 78 74 3b 0a = entry->next;.
5fc0: 09 20 20 66 72 65 65 20 28 65 6e 74 72 79 29 3b . free (entry);
5fd0: 0a 09 20 20 65 6e 74 72 79 20 3d 20 65 6e 74 72 .. entry = entr
5fe0: 79 5f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 y_n;. }.
5ff0: 20 69 66 20 28 63 68 61 69 6e 2d 3e 66 61 74 5f if (chain->fat_
6000: 61 72 72 61 79 29 0a 09 66 72 65 65 20 28 63 68 array)..free (ch
6010: 61 69 6e 2d 3e 66 61 74 5f 61 72 72 61 79 29 3b ain->fat_array);
6020: 0a 2f 2a 20 64 65 73 74 72 6f 79 69 6e 67 20 74 ./* destroying t
6030: 68 65 20 6d 69 6e 69 46 41 54 20 2a 2f 0a 20 20 he miniFAT */.
6040: 20 20 65 6e 74 72 79 20 3d 20 63 68 61 69 6e 2d entry = chain-
6050: 3e 66 69 72 73 74 4d 69 6e 69 3b 0a 20 20 20 20 >firstMini;.
6060: 77 68 69 6c 65 20 28 65 6e 74 72 79 29 0a 20 20 while (entry).
6070: 20 20 20 20 7b 0a 09 20 20 65 6e 74 72 79 5f 6e {.. entry_n
6080: 20 3d 20 65 6e 74 72 79 2d 3e 6e 65 78 74 3b 0a = entry->next;.
6090: 09 20 20 66 72 65 65 20 28 65 6e 74 72 79 29 3b . free (entry);
60a0: 0a 09 20 20 65 6e 74 72 79 20 3d 20 65 6e 74 72 .. entry = entr
60b0: 79 5f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 y_n;. }.
60c0: 20 69 66 20 28 63 68 61 69 6e 2d 3e 6d 69 6e 69 if (chain->mini
60d0: 46 41 54 5f 61 72 72 61 79 29 0a 09 66 72 65 65 FAT_array)..free
60e0: 20 28 63 68 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 (chain->miniFAT
60f0: 5f 61 72 72 61 79 29 3b 0a 20 20 20 20 69 66 20 _array);. if
6100: 28 63 68 61 69 6e 2d 3e 6d 69 6e 69 53 74 72 65 (chain->miniStre
6110: 61 6d 29 0a 09 66 72 65 65 20 28 63 68 61 69 6e am)..free (chain
6120: 2d 3e 6d 69 6e 69 53 74 72 65 61 6d 29 3b 0a 20 ->miniStream);.
6130: 20 20 20 66 72 65 65 20 28 63 68 61 69 6e 29 3b free (chain);
6140: 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 .}..static unsig
6150: 6e 65 64 20 69 6e 74 0a 67 65 74 5f 77 6f 72 6b ned int.get_work
6160: 73 68 65 65 74 5f 63 6f 75 6e 74 20 28 62 69 66 sheet_count (bif
6170: 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 f_workbook * wor
6180: 6b 62 6f 6f 6b 29 0a 7b 0a 2f 2a 20 63 6f 75 6e kbook).{./* coun
6190: 74 69 6e 67 20 68 6f 77 20 6d 61 6e 79 20 57 6f ting how many Wo
61a0: 72 6b 73 68 65 65 74 20 61 72 65 20 69 6e 74 6f rksheet are into
61b0: 20 74 68 65 20 57 6f 72 6b 62 6f 6f 6b 20 2a 2f the Workbook */
61c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e . unsigned in
61d0: 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 t count = 0;.
61e0: 20 62 69 66 66 5f 73 68 65 65 74 20 2a 70 5f 73 biff_sheet *p_s
61f0: 68 65 65 74 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d heet = workbook-
6200: 3e 66 69 72 73 74 5f 73 68 65 65 74 3b 0a 20 20 >first_sheet;.
6210: 20 20 77 68 69 6c 65 20 28 70 5f 73 68 65 65 74 while (p_sheet
6220: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 6f 75 ). {.. cou
6230: 6e 74 2b 2b 3b 0a 09 20 20 70 5f 73 68 65 65 74 nt++;.. p_sheet
6240: 20 3d 20 70 5f 73 68 65 65 74 2d 3e 6e 65 78 74 = p_sheet->next
6250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 ;. }. re
6260: 74 75 72 6e 20 63 6f 75 6e 74 3b 0a 7d 0a 0a 73 turn count;.}..s
6270: 74 61 74 69 63 20 76 6f 69 64 0a 64 65 73 74 72 tatic void.destr
6280: 6f 79 5f 63 65 6c 6c 20 28 62 69 66 66 5f 63 65 oy_cell (biff_ce
6290: 6c 6c 5f 76 61 6c 75 65 20 2a 20 63 65 6c 6c 29 ll_value * cell)
62a0: 0a 7b 0a 2f 2a 20 64 65 73 74 72 6f 79 69 6e 67 .{./* destroying
62b0: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 69 a cell */. i
62c0: 66 20 28 63 65 6c 6c 2d 3e 74 79 70 65 20 3d 3d f (cell->type ==
62d0: 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 54 45 58 FREEXL_CELL_TEX
62e0: 54 20 7c 7c 20 63 65 6c 6c 2d 3e 74 79 70 65 20 T || cell->type
62f0: 3d 3d 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 44 == FREEXL_CELL_D
6300: 41 54 45 0a 09 7c 7c 20 63 65 6c 6c 2d 3e 74 79 ATE..|| cell->ty
6310: 70 65 20 3d 3d 20 46 52 45 45 58 4c 5f 43 45 4c pe == FREEXL_CEL
6320: 4c 5f 44 41 54 45 54 49 4d 45 20 7c 7c 20 63 65 L_DATETIME || ce
6330: 6c 6c 2d 3e 74 79 70 65 20 3d 3d 20 46 52 45 45 ll->type == FREE
6340: 58 4c 5f 43 45 4c 4c 5f 54 49 4d 45 29 0a 20 20 XL_CELL_TIME).
6350: 20 20 20 20 7b 0a 09 20 20 69 66 20 28 63 65 6c {.. if (cel
6360: 6c 2d 3e 76 61 6c 75 65 2e 74 65 78 74 5f 76 61 l->value.text_va
6370: 6c 75 65 29 0a 09 20 20 20 20 20 20 66 72 65 65 lue).. free
6380: 20 28 63 65 6c 6c 2d 3e 76 61 6c 75 65 2e 74 65 (cell->value.te
6390: 78 74 5f 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 xt_value);.
63a0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 }.}..static voi
63b0: 64 0a 64 65 73 74 72 6f 79 5f 73 68 65 65 74 20 d.destroy_sheet
63c0: 28 62 69 66 66 5f 73 68 65 65 74 20 2a 20 73 68 (biff_sheet * sh
63d0: 65 65 74 29 0a 7b 0a 2f 2a 20 64 65 73 74 72 6f eet).{./* destro
63e0: 79 69 6e 67 20 61 20 53 68 65 65 74 20 73 74 72 ying a Sheet str
63f0: 75 63 74 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 uct */. unsig
6400: 6e 65 64 20 69 6e 74 20 72 6f 77 3b 0a 20 20 20 ned int row;.
6410: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 6f unsigned int co
6420: 6c 3b 0a 20 20 20 20 62 69 66 66 5f 63 65 6c 6c l;. biff_cell
6430: 5f 76 61 6c 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a _value *p_cell;.
6440: 0a 20 20 20 20 69 66 20 28 21 73 68 65 65 74 29 . if (!sheet)
6450: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 ..return;. if
6460: 20 28 73 68 65 65 74 2d 3e 75 74 66 38 5f 6e 61 (sheet->utf8_na
6470: 6d 65 29 0a 09 66 72 65 65 20 28 73 68 65 65 74 me)..free (sheet
6480: 2d 3e 75 74 66 38 5f 6e 61 6d 65 29 3b 0a 20 20 ->utf8_name);.
6490: 20 20 69 66 20 28 73 68 65 65 74 2d 3e 63 65 6c if (sheet->cel
64a0: 6c 5f 76 61 6c 75 65 73 29 0a 20 20 20 20 20 20 l_values).
64b0: 7b 0a 09 20 20 66 6f 72 20 28 72 6f 77 20 3d 20 {.. for (row =
64c0: 30 3b 20 72 6f 77 20 3c 20 73 68 65 65 74 2d 3e 0; row < sheet->
64d0: 72 6f 77 73 3b 20 72 6f 77 2b 2b 29 0a 09 20 20 rows; row++)..
64e0: 20 20 7b 0a 09 09 2f 2a 20 64 65 73 74 72 6f 79 {.../* destroy
64f0: 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 09 09 70 5f ing rows */...p_
6500: 63 65 6c 6c 20 3d 20 73 68 65 65 74 2d 3e 63 65 cell = sheet->ce
6510: 6c 6c 5f 76 61 6c 75 65 73 20 2b 20 28 72 6f 77 ll_values + (row
6520: 20 2a 20 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e * sheet->column
6530: 73 29 3b 0a 09 09 66 6f 72 20 28 63 6f 6c 20 3d s);...for (col =
6540: 20 30 3b 20 63 6f 6c 20 3c 20 73 68 65 65 74 2d 0; col < sheet-
6550: 3e 63 6f 6c 75 6d 6e 73 3b 20 63 6f 6c 2b 2b 29 >columns; col++)
6560: 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f ... {... /
6570: 2a 20 64 65 73 74 72 6f 79 69 6e 67 20 63 65 6c * destroying cel
6580: 6c 73 20 2a 2f 0a 09 09 20 20 20 20 20 20 64 65 ls */... de
6590: 73 74 72 6f 79 5f 63 65 6c 6c 20 28 70 5f 63 65 stroy_cell (p_ce
65a0: 6c 6c 29 3b 0a 09 09 20 20 20 20 20 20 70 5f 63 ll);... p_c
65b0: 65 6c 6c 2b 2b 3b 0a 09 09 20 20 7d 0a 09 20 20 ell++;... }..
65c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
65d0: 66 72 65 65 20 28 73 68 65 65 74 2d 3e 63 65 6c free (sheet->cel
65e0: 6c 5f 76 61 6c 75 65 73 29 3b 0a 20 20 20 20 66 l_values);. f
65f0: 72 65 65 20 28 73 68 65 65 74 29 3b 0a 7d 0a 0a ree (sheet);.}..
6600: 73 74 61 74 69 63 20 69 6e 74 0a 61 6c 6c 6f 63 static int.alloc
6610: 61 74 65 5f 63 65 6c 6c 73 20 28 62 69 66 66 5f ate_cells (biff_
6620: 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 workbook * workb
6630: 6f 6f 6b 29 0a 7b 0a 2f 2a 20 61 6c 6c 6f 63 61 ook).{./* alloca
6640: 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 61 6e ting the rows an
6650: 64 20 63 65 6c 6c 73 20 66 6f 72 20 74 68 65 20 d cells for the
6660: 61 63 74 69 76 65 20 57 6f 72 6b 73 68 65 65 74 active Worksheet
6670: 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 */. unsigned
6680: 20 69 6e 74 20 72 6f 77 3b 0a 20 20 20 20 75 6e int row;. un
6690: 73 69 67 6e 65 64 20 69 6e 74 20 63 6f 6c 3b 0a signed int col;.
66a0: 20 20 20 20 62 69 66 66 5f 63 65 6c 6c 5f 76 61 biff_cell_va
66b0: 6c 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a 0a 20 20 lue *p_cell;..
66c0: 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 20 3d if (workbook =
66d0: 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 = NULL)..return
66e0: 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 41 52 47 55 FREEXL_NULL_ARGU
66f0: 4d 45 4e 54 3b 0a 20 20 20 20 69 66 20 28 77 6f MENT;. if (wo
6700: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
6710: 68 65 65 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 heet == NULL)..r
6720: 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 4c eturn FREEXL_NUL
6730: 4c 5f 41 52 47 55 4d 45 4e 54 3b 0a 0a 2f 2a 20 L_ARGUMENT;../*
6740: 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 63 allocating the c
6750: 65 6c 6c 20 76 61 6c 75 65 73 20 61 72 72 61 79 ell values array
6760: 20 2a 2f 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b */. workbook
6770: 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e ->active_sheet->
6780: 63 65 6c 6c 5f 76 61 6c 75 65 73 20 3d 0a 09 6d cell_values =..m
6790: 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 28 62 alloc (sizeof (b
67a0: 69 66 66 5f 63 65 6c 6c 5f 76 61 6c 75 65 29 20 iff_cell_value)
67b0: 2a 0a 09 09 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 *...(workbook->a
67c0: 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 ctive_sheet->row
67d0: 73 20 2a 0a 09 09 20 77 6f 72 6b 62 6f 6f 6b 2d s *... workbook-
67e0: 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 >active_sheet->c
67f0: 6f 6c 75 6d 6e 73 29 29 3b 0a 20 20 20 20 69 66 olumns));. if
6800: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 (workbook->acti
6810: 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f 76 ve_sheet->cell_v
6820: 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c 29 0a 09 alues == NULL)..
6830: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e return FREEXL_IN
6840: 53 55 46 46 49 43 49 45 4e 54 5f 4d 45 4d 4f 52 SUFFICIENT_MEMOR
6850: 59 3b 0a 20 20 20 20 66 6f 72 20 28 72 6f 77 20 Y;. for (row
6860: 3d 20 30 3b 20 72 6f 77 20 3c 20 77 6f 72 6b 62 = 0; row < workb
6870: 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 ook->active_shee
6880: 74 2d 3e 72 6f 77 73 3b 20 72 6f 77 2b 2b 29 0a t->rows; row++).
6890: 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 69 6e {.. /* in
68a0: 69 74 69 61 6c 69 7a 69 6e 67 20 4e 55 4c 4c 20 itializing NULL
68b0: 63 65 6c 6c 20 76 61 6c 75 65 73 20 2a 2f 0a 09 cell values */..
68c0: 20 20 70 5f 63 65 6c 6c 20 3d 0a 09 20 20 20 20 p_cell =..
68d0: 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 workbook->acti
68e0: 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c 5f 76 ve_sheet->cell_v
68f0: 61 6c 75 65 73 20 2b 0a 09 20 20 20 20 20 20 28 alues +.. (
6900: 72 6f 77 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2d 3e row * workbook->
6910: 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 6f active_sheet->co
6920: 6c 75 6d 6e 73 29 3b 0a 09 20 20 66 6f 72 20 28 lumns);.. for (
6930: 63 6f 6c 20 3d 20 30 3b 20 63 6f 6c 20 3c 20 77 col = 0; col < w
6940: 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f orkbook->active_
6950: 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 3b 20 sheet->columns;
6960: 63 6f 6c 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 col++).. {...
6970: 70 5f 63 65 6c 6c 2d 3e 74 79 70 65 20 3d 20 46 p_cell->type = F
6980: 52 45 45 58 4c 5f 43 45 4c 4c 5f 4e 55 4c 4c 3b REEXL_CELL_NULL;
6990: 0a 09 09 70 5f 63 65 6c 6c 2b 2b 3b 0a 09 20 20 ...p_cell++;..
69a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 }. }..
69b0: 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f return FREEXL_O
69c0: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 K;.}..static int
69d0: 0a 61 64 64 5f 73 68 65 65 74 5f 74 6f 5f 77 6f .add_sheet_to_wo
69e0: 72 6b 62 6f 6f 6b 20 28 62 69 66 66 5f 77 6f 72 rkbook (biff_wor
69f0: 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b kbook * workbook
6a00: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f , unsigned int o
6a10: 66 66 73 65 74 2c 0a 09 09 20 20 20 20 20 20 20 ffset,...
6a20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 69 unsigned char vi
6a30: 73 69 62 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 sible, unsigned
6a40: 63 68 61 72 20 74 79 70 65 2c 20 63 68 61 72 20 char type, char
6a50: 2a 6e 61 6d 65 29 0a 7b 0a 2f 2a 20 61 70 70 65 *name).{./* appe
6a60: 6e 64 69 6e 67 20 61 20 66 75 72 74 68 65 72 20 nding a further
6a70: 53 68 65 65 74 20 74 6f 20 74 68 65 20 57 6f 72 Sheet to the Wor
6a80: 6b 62 6f 6f 6b 20 2a 2f 0a 20 20 20 20 62 69 66 kbook */. bif
6a90: 66 5f 73 68 65 65 74 20 2a 73 68 65 65 74 20 3d f_sheet *sheet =
6aa0: 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 malloc (sizeof
6ab0: 28 62 69 66 66 5f 73 68 65 65 74 29 29 3b 0a 20 (biff_sheet));.
6ac0: 20 20 20 69 66 20 28 21 73 68 65 65 74 29 0a 09 if (!sheet)..
6ad0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 73 68 return 0;. sh
6ae0: 65 65 74 2d 3e 73 74 61 72 74 5f 6f 66 66 73 65 eet->start_offse
6af0: 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 t = offset;.
6b00: 73 68 65 65 74 2d 3e 76 69 73 69 62 6c 65 20 3d sheet->visible =
6b10: 20 76 69 73 69 62 6c 65 3b 0a 20 20 20 20 73 68 visible;. sh
6b20: 65 65 74 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 eet->type = type
6b30: 3b 0a 20 20 20 20 73 68 65 65 74 2d 3e 75 74 66 ;. sheet->utf
6b40: 38 5f 6e 61 6d 65 20 3d 20 6e 61 6d 65 3b 0a 20 8_name = name;.
6b50: 20 20 20 73 68 65 65 74 2d 3e 72 6f 77 73 20 3d sheet->rows =
6b60: 20 30 3b 0a 20 20 20 20 73 68 65 65 74 2d 3e 63 0;. sheet->c
6b70: 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 olumns = 0;.
6b80: 73 68 65 65 74 2d 3e 63 65 6c 6c 5f 76 61 6c 75 sheet->cell_valu
6b90: 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 es = NULL;. s
6ba0: 68 65 65 74 2d 3e 76 61 6c 69 64 5f 64 69 6d 65 heet->valid_dime
6bb0: 6e 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 73 nsion = 0;. s
6bc0: 68 65 65 74 2d 3e 61 6c 72 65 61 64 79 5f 64 6f heet->already_do
6bd0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 73 68 65 65 ne = 0;. shee
6be0: 74 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a t->next = NULL;.
6bf0: 0a 2f 2a 20 75 70 64 61 74 69 6e 67 20 74 68 65 ./* updating the
6c00: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f 0a linked list */.
6c10: 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b if (workbook
6c20: 2d 3e 66 69 72 73 74 5f 73 68 65 65 74 20 3d 3d ->first_sheet ==
6c30: 20 4e 55 4c 4c 29 0a 09 77 6f 72 6b 62 6f 6f 6b NULL)..workbook
6c40: 2d 3e 66 69 72 73 74 5f 73 68 65 65 74 20 3d 20 ->first_sheet =
6c50: 73 68 65 65 74 3b 0a 20 20 20 20 69 66 20 28 77 sheet;. if (w
6c60: 6f 72 6b 62 6f 6f 6b 2d 3e 6c 61 73 74 5f 73 68 orkbook->last_sh
6c70: 65 65 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 77 6f eet != NULL)..wo
6c80: 72 6b 62 6f 6f 6b 2d 3e 6c 61 73 74 5f 73 68 65 rkbook->last_she
6c90: 65 74 2d 3e 6e 65 78 74 20 3d 20 73 68 65 65 74 et->next = sheet
6ca0: 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ;. workbook->
6cb0: 6c 61 73 74 5f 73 68 65 65 74 20 3d 20 73 68 65 last_sheet = she
6cc0: 65 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 et;. return 1
6cd0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 ;.}..static void
6ce0: 0a 64 65 73 74 72 6f 79 5f 77 6f 72 6b 62 6f 6f .destroy_workboo
6cf0: 6b 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b k (biff_workbook
6d00: 20 2a 20 77 6f 72 6b 62 6f 6f 6b 29 0a 7b 0a 2f * workbook).{./
6d10: 2a 20 64 65 73 74 72 6f 79 6e 67 20 74 68 65 20 * destroyng the
6d20: 57 6f 72 6b 62 6f 6f 6b 20 73 74 72 75 63 74 20 Workbook struct
6d30: 2a 2f 0a 20 20 20 20 62 69 66 66 5f 73 68 65 65 */. biff_shee
6d40: 74 20 2a 70 5f 73 68 65 65 74 3b 0a 20 20 20 20 t *p_sheet;.
6d50: 62 69 66 66 5f 73 68 65 65 74 20 2a 70 5f 73 68 biff_sheet *p_sh
6d60: 65 65 74 5f 6e 3b 0a 20 20 20 20 69 66 20 28 77 eet_n;. if (w
6d70: 6f 72 6b 62 6f 6f 6b 29 0a 20 20 20 20 20 20 7b orkbook). {
6d80: 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b .. if (workbook
6d90: 2d 3e 78 6c 73 29 0a 09 20 20 20 20 20 20 66 63 ->xls).. fc
6da0: 6c 6f 73 65 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e lose (workbook->
6db0: 78 6c 73 29 3b 0a 09 20 20 69 66 20 28 77 6f 72 xls);.. if (wor
6dc0: 6b 62 6f 6f 6b 2d 3e 75 74 66 38 5f 63 6f 6e 76 kbook->utf8_conv
6dd0: 65 72 74 65 72 29 0a 09 20 20 20 20 20 20 69 63 erter).. ic
6de0: 6f 6e 76 5f 63 6c 6f 73 65 20 28 77 6f 72 6b 62 onv_close (workb
6df0: 6f 6f 6b 2d 3e 75 74 66 38 5f 63 6f 6e 76 65 72 ook->utf8_conver
6e00: 74 65 72 29 3b 0a 09 20 20 69 66 20 28 77 6f 72 ter);.. if (wor
6e10: 6b 62 6f 6f 6b 2d 3e 75 74 66 31 36 5f 63 6f 6e kbook->utf16_con
6e20: 76 65 72 74 65 72 29 0a 09 20 20 20 20 20 20 69 verter).. i
6e30: 63 6f 6e 76 5f 63 6c 6f 73 65 20 28 77 6f 72 6b conv_close (work
6e40: 62 6f 6f 6b 2d 3e 75 74 66 31 36 5f 63 6f 6e 76 book->utf16_conv
6e50: 65 72 74 65 72 29 3b 0a 09 20 20 69 66 20 28 77 erter);.. if (w
6e60: 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f orkbook->shared_
6e70: 73 74 72 69 6e 67 73 2e 75 74 66 38 5f 73 74 72 strings.utf8_str
6e80: 69 6e 67 73 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 ings != NULL)..
6e90: 20 20 20 7b 0a 09 09 2f 2a 20 64 65 73 74 72 6f {.../* destro
6ea0: 79 69 6e 67 20 74 68 65 20 53 68 61 72 65 64 20 ying the Shared
6eb0: 53 74 72 69 6e 67 73 20 54 61 62 6c 65 20 5b 53 Strings Table [S
6ec0: 53 54 5d 20 2a 2f 0a 09 09 75 6e 73 69 67 6e 65 ST] */...unsigne
6ed0: 64 20 69 6e 74 20 69 3b 0a 09 09 66 6f 72 20 28 d int i;...for (
6ee0: 69 20 3d 20 30 3b 20 69 20 3c 20 77 6f 72 6b 62 i = 0; i < workb
6ef0: 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 ook->shared_stri
6f00: 6e 67 73 2e 73 74 72 69 6e 67 5f 63 6f 75 6e 74 ngs.string_count
6f10: 3b 20 69 2b 2b 29 0a 09 09 20 20 7b 0a 09 09 20 ; i++)... {...
6f20: 20 20 20 20 20 63 68 61 72 20 2a 73 74 72 69 6e char *strin
6f30: 67 20 3d 0a 09 09 09 20 20 2a 28 77 6f 72 6b 62 g =.... *(workb
6f40: 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 ook->shared_stri
6f50: 6e 67 73 2e 75 74 66 38 5f 73 74 72 69 6e 67 73 ngs.utf8_strings
6f60: 20 2b 20 69 29 3b 0a 09 09 20 20 20 20 20 20 69 + i);... i
6f70: 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e 55 4c f (string != NUL
6f80: 4c 29 0a 09 09 09 20 20 66 72 65 65 20 28 73 74 L).... free (st
6f90: 72 69 6e 67 29 3b 0a 09 09 20 20 7d 0a 09 09 66 ring);... }...f
6fa0: 72 65 65 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 ree (workbook->s
6fb0: 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 75 74 hared_strings.ut
6fc0: 66 38 5f 73 74 72 69 6e 67 73 29 3b 0a 09 20 20 f8_strings);..
6fd0: 20 20 7d 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 }.. if (workb
6fe0: 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 ook->shared_stri
6ff0: 6e 67 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 ngs.current_utf1
7000: 36 5f 62 75 66 29 0a 09 20 20 20 20 20 20 66 72 6_buf).. fr
7010: 65 65 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 ee (workbook->sh
7020: 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 ared_strings.cur
7030: 72 65 6e 74 5f 75 74 66 31 36 5f 62 75 66 29 3b rent_utf16_buf);
7040: 0a 09 20 20 70 5f 73 68 65 65 74 20 3d 20 77 6f .. p_sheet = wo
7050: 72 6b 62 6f 6f 6b 2d 3e 66 69 72 73 74 5f 73 68 rkbook->first_sh
7060: 65 65 74 3b 0a 09 20 20 77 68 69 6c 65 20 28 70 eet;.. while (p
7070: 5f 73 68 65 65 74 29 0a 09 20 20 20 20 7b 0a 09 _sheet).. {..
7080: 09 70 5f 73 68 65 65 74 5f 6e 20 3d 20 70 5f 73 .p_sheet_n = p_s
7090: 68 65 65 74 2d 3e 6e 65 78 74 3b 0a 09 09 64 65 heet->next;...de
70a0: 73 74 72 6f 79 5f 73 68 65 65 74 20 28 70 5f 73 stroy_sheet (p_s
70b0: 68 65 65 74 29 3b 0a 09 09 70 5f 73 68 65 65 74 heet);...p_sheet
70c0: 20 3d 20 70 5f 73 68 65 65 74 5f 6e 3b 0a 09 20 = p_sheet_n;..
70d0: 20 20 20 7d 0a 09 20 20 69 66 20 28 77 6f 72 6b }.. if (work
70e0: 62 6f 6f 6b 2d 3e 66 61 74 29 0a 09 20 20 20 20 book->fat)..
70f0: 20 20 64 65 73 74 72 6f 79 5f 66 61 74 5f 63 68 destroy_fat_ch
7100: 61 69 6e 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 ain (workbook->f
7110: 61 74 29 3b 0a 09 20 20 66 72 65 65 20 28 77 6f at);.. free (wo
7120: 72 6b 62 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 7d rkbook);. }
7130: 0a 7d 0a 0a 73 74 61 74 69 63 20 62 69 66 66 5f .}..static biff_
7140: 77 6f 72 6b 62 6f 6f 6b 20 2a 0a 61 6c 6c 6f 63 workbook *.alloc
7150: 5f 77 6f 72 6b 62 6f 6f 6b 20 28 69 6e 74 20 6d _workbook (int m
7160: 61 67 69 63 29 0a 7b 0a 2f 2a 20 61 6c 6c 6f 63 agic).{./* alloc
7170: 61 74 69 6e 67 20 61 6e 64 20 69 6e 69 74 69 61 ating and initia
7180: 6c 69 7a 69 6e 67 20 74 68 65 20 57 6f 72 6b 62 lizing the Workb
7190: 6f 6f 6b 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 ook struct */.
71a0: 20 20 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 biff_workbook
71b0: 2a 77 6f 72 6b 62 6f 6f 6b 20 3d 20 6d 61 6c 6c *workbook = mall
71c0: 6f 63 20 28 73 69 7a 65 6f 66 20 28 62 69 66 66 oc (sizeof (biff
71d0: 5f 77 6f 72 6b 62 6f 6f 6b 29 29 3b 0a 20 20 20 _workbook));.
71e0: 20 69 66 20 28 21 77 6f 72 6b 62 6f 6f 6b 29 0a if (!workbook).
71f0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
7200: 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 workbook->magi
7210: 63 31 20 3d 20 6d 61 67 69 63 3b 0a 20 20 20 20 c1 = magic;.
7220: 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 32 workbook->magic2
7230: 20 3d 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f = FREEXL_MAGIC_
7240: 45 4e 44 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f END;. workboo
7250: 6b 2d 3e 78 6c 73 20 3d 20 4e 55 4c 4c 3b 0a 20 k->xls = NULL;.
7260: 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 workbook->fat
7270: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 6f 72 = NULL;. wor
7280: 6b 62 6f 6f 6b 2d 3e 63 66 62 66 5f 76 65 72 73 kbook->cfbf_vers
7290: 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 77 6f 72 ion = 0;. wor
72a0: 6b 62 6f 6f 6b 2d 3e 63 66 62 66 5f 73 65 63 74 kbook->cfbf_sect
72b0: 6f 72 5f 73 69 7a 65 20 3d 20 30 3b 0a 20 20 20 or_size = 0;.
72c0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 74 61 72 74 workbook->start
72d0: 5f 73 65 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 _sector = 0;.
72e0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 69 7a 65 20 workbook->size
72f0: 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f = 0;. workboo
7300: 6b 2d 3e 63 75 72 72 65 6e 74 5f 73 65 63 74 6f k->current_secto
7310: 72 20 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 r = 0;. workb
7320: 6f 6f 6b 2d 3e 62 79 74 65 73 5f 72 65 61 64 20 ook->bytes_read
7330: 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f = 0;. workboo
7340: 6b 2d 3e 63 75 72 72 65 6e 74 5f 6f 66 66 73 65 k->current_offse
7350: 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 t = 0;. memse
7360: 74 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 t (workbook->sec
7370: 74 6f 72 5f 62 75 66 2c 20 30 2c 20 73 69 7a 65 tor_buf, 0, size
7380: 6f 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 of (workbook->se
7390: 63 74 6f 72 5f 62 75 66 29 29 3b 0a 20 20 20 20 ctor_buf));.
73a0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 20 3d workbook->p_in =
73b0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f workbook->secto
73c0: 72 5f 62 75 66 3b 0a 20 20 20 20 77 6f 72 6b 62 r_buf;. workb
73d0: 6f 6f 6b 2d 3e 73 65 63 74 6f 72 5f 65 6e 64 20 ook->sector_end
73e0: 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f = 0;. workboo
73f0: 6b 2d 3e 73 65 63 74 6f 72 5f 72 65 61 64 79 20 k->sector_ready
7400: 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f = 0;. workboo
7410: 6b 2d 3e 6f 6b 5f 62 6f 66 20 3d 20 2d 31 3b 0a k->ok_bof = -1;.
7420: 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 workbook->bi
7430: 66 66 5f 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a ff_version = 0;.
7440: 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 workbook->bi
7450: 66 66 5f 6d 61 78 5f 72 65 63 6f 72 64 5f 73 69 ff_max_record_si
7460: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b ze = 0;. work
7470: 62 6f 6f 6b 2d 3e 62 69 66 66 5f 63 6f 6e 74 65 book->biff_conte
7480: 6e 74 5f 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 nt_type = 0;.
7490: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f workbook->biff_
74a0: 63 6f 64 65 5f 70 61 67 65 20 3d 20 30 3b 0a 20 code_page = 0;.
74b0: 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 workbook->bif
74c0: 66 5f 62 6f 6f 6b 5f 63 6f 64 65 5f 70 61 67 65 f_book_code_page
74d0: 20 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f = 0;. workbo
74e0: 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f ok->biff_date_mo
74f0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b de = 0;. work
7500: 62 6f 6f 6b 2d 3e 62 69 66 66 5f 6f 62 66 75 73 book->biff_obfus
7510: 63 61 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 77 cated = 0;. w
7520: 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 38 5f 63 6f orkbook->utf8_co
7530: 6e 76 65 72 74 65 72 20 3d 20 4e 55 4c 4c 3b 0a nverter = NULL;.
7540: 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 workbook->ut
7550: 66 31 36 5f 63 6f 6e 76 65 72 74 65 72 20 3d 20 f16_converter =
7560: 4e 55 4c 4c 3b 0a 20 20 20 20 6d 65 6d 73 65 74 NULL;. memset
7570: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f (workbook->reco
7580: 72 64 2c 20 30 2c 20 73 69 7a 65 6f 66 20 28 77 rd, 0, sizeof (w
7590: 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 29 orkbook->record)
75a0: 29 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d );. workbook-
75b0: 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 3d 20 30 >record_type = 0
75c0: 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ;. workbook->
75d0: 70 72 65 76 5f 72 65 63 6f 72 64 5f 74 79 70 65 prev_record_type
75e0: 20 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f = 0;. workbo
75f0: 6f 6b 2d 3e 72 65 63 6f 72 64 5f 73 69 7a 65 20 ok->record_size
7600: 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f = 0;. workboo
7610: 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 k->shared_string
7620: 73 2e 73 74 72 69 6e 67 5f 63 6f 75 6e 74 20 3d s.string_count =
7630: 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 0;. workbook
7640: 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 ->shared_strings
7650: 2e 75 74 66 38 5f 73 74 72 69 6e 67 73 20 3d 20 .utf8_strings =
7660: 4e 55 4c 4c 3b 0a 20 20 20 20 77 6f 72 6b 62 6f NULL;. workbo
7670: 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e ok->shared_strin
7680: 67 73 2e 63 75 72 72 65 6e 74 5f 69 6e 64 65 78 gs.current_index
7690: 20 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f = 0;. workbo
76a0: 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e ok->shared_strin
76b0: 67 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 36 gs.current_utf16
76c0: 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 _buf = NULL;.
76d0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 workbook->share
76e0: 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 65 6e d_strings.curren
76f0: 74 5f 75 74 66 31 36 5f 6c 65 6e 20 3d 20 30 3b t_utf16_len = 0;
7700: 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 . workbook->s
7710: 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 hared_strings.cu
7720: 72 72 65 6e 74 5f 75 74 66 31 36 5f 6f 66 66 20 rrent_utf16_off
7730: 3d 20 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f = 0;. workboo
7740: 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 k->shared_string
7750: 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 36 5f s.current_utf16_
7760: 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 77 6f skip = 0;. wo
7770: 72 6b 62 6f 6f 6b 2d 3e 66 69 72 73 74 5f 73 68 rkbook->first_sh
7780: 65 65 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 eet = NULL;.
7790: 77 6f 72 6b 62 6f 6f 6b 2d 3e 6c 61 73 74 5f 73 workbook->last_s
77a0: 68 65 65 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 heet = NULL;.
77b0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 workbook->activ
77c0: 65 5f 73 68 65 65 74 20 3d 20 4e 55 4c 4c 3b 0a e_sheet = NULL;.
77d0: 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 workbook->se
77e0: 63 6f 6e 64 5f 70 61 73 73 20 3d 20 30 3b 0a 20 cond_pass = 0;.
77f0: 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 78 workbook->max
7800: 5f 66 6f 72 6d 61 74 5f 69 6e 64 65 78 20 3d 20 _format_index =
7810: 30 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 0;. workbook-
7820: 3e 62 69 66 66 5f 78 66 5f 6e 65 78 74 5f 69 6e >biff_xf_next_in
7830: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 dex = 0;. ret
7840: 75 72 6e 20 77 6f 72 6b 62 6f 6f 6b 3b 0a 7d 0a urn workbook;.}.
7850: 0a 73 74 61 74 69 63 20 69 6e 74 0a 69 6e 73 65 .static int.inse
7860: 72 74 5f 69 6e 74 6f 5f 66 61 74 5f 63 68 61 69 rt_into_fat_chai
7870: 6e 20 28 66 61 74 5f 63 68 61 69 6e 20 2a 20 63 n (fat_chain * c
7880: 68 61 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 hain, unsigned i
7890: 6e 74 20 73 65 63 74 6f 72 29 0a 7b 0a 2f 2a 20 nt sector).{./*
78a0: 69 6e 73 65 72 74 69 6e 67 20 61 20 73 65 63 74 inserting a sect
78b0: 6f 72 20 69 6e 74 6f 20 74 68 65 20 46 41 54 20 or into the FAT
78c0: 63 68 61 69 6e 20 5b 6c 69 6e 6b 65 64 20 6c 69 chain [linked li
78d0: 73 74 5d 20 2a 2f 0a 20 20 20 20 66 61 74 5f 65 st] */. fat_e
78e0: 6e 74 72 79 20 2a 65 6e 74 72 79 20 3d 20 6d 61 ntry *entry = ma
78f0: 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 28 66 61 lloc (sizeof (fa
7900: 74 5f 65 6e 74 72 79 29 29 3b 0a 20 20 20 20 69 t_entry));. i
7910: 66 20 28 65 6e 74 72 79 20 3d 3d 20 4e 55 4c 4c f (entry == NULL
7920: 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
7930: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 4d 45 _INSUFFICIENT_ME
7940: 4d 4f 52 59 3b 0a 20 20 20 20 65 6e 74 72 79 2d MORY;. entry-
7950: 3e 63 75 72 72 65 6e 74 5f 73 65 63 74 6f 72 20 >current_sector
7960: 3d 20 63 68 61 69 6e 2d 3e 6e 65 78 74 5f 73 65 = chain->next_se
7970: 63 74 6f 72 3b 0a 20 20 20 20 63 68 61 69 6e 2d ctor;. chain-
7980: 3e 6e 65 78 74 5f 73 65 63 74 6f 72 20 2b 3d 20 >next_sector +=
7990: 31 3b 0a 20 20 20 20 65 6e 74 72 79 2d 3e 6e 65 1;. entry->ne
79a0: 78 74 5f 73 65 63 74 6f 72 20 3d 20 73 65 63 74 xt_sector = sect
79b0: 6f 72 3b 0a 20 20 20 20 65 6e 74 72 79 2d 3e 6e or;. entry->n
79c0: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 ext = NULL;.
79d0: 69 66 20 28 63 68 61 69 6e 2d 3e 66 69 72 73 74 if (chain->first
79e0: 20 3d 3d 20 4e 55 4c 4c 29 0a 09 63 68 61 69 6e == NULL)..chain
79f0: 2d 3e 66 69 72 73 74 20 3d 20 65 6e 74 72 79 3b ->first = entry;
7a00: 0a 20 20 20 20 69 66 20 28 63 68 61 69 6e 2d 3e . if (chain->
7a10: 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 63 last != NULL)..c
7a20: 68 61 69 6e 2d 3e 6c 61 73 74 2d 3e 6e 65 78 74 hain->last->next
7a30: 20 3d 20 65 6e 74 72 79 3b 0a 20 20 20 20 63 68 = entry;. ch
7a40: 61 69 6e 2d 3e 6c 61 73 74 20 3d 20 65 6e 74 72 ain->last = entr
7a50: 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 y;. return FR
7a60: 45 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 EEXL_OK;.}..stat
7a70: 69 63 20 69 6e 74 0a 69 6e 73 65 72 74 5f 69 6e ic int.insert_in
7a80: 74 6f 5f 6d 69 6e 69 46 41 54 5f 63 68 61 69 6e to_miniFAT_chain
7a90: 20 28 66 61 74 5f 63 68 61 69 6e 20 2a 20 63 68 (fat_chain * ch
7aa0: 61 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e ain, unsigned in
7ab0: 74 20 73 65 63 74 6f 72 29 0a 7b 0a 2f 2a 20 69 t sector).{./* i
7ac0: 6e 73 65 72 74 69 6e 67 20 61 20 73 65 63 74 6f nserting a secto
7ad0: 72 20 69 6e 74 6f 20 74 68 65 20 6d 69 6e 69 46 r into the miniF
7ae0: 41 54 20 63 68 61 69 6e 20 5b 6c 69 6e 6b 65 64 AT chain [linked
7af0: 20 6c 69 73 74 5d 20 2a 2f 0a 20 20 20 20 66 61 list] */. fa
7b00: 74 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 20 3d t_entry *entry =
7b10: 20 6d 61 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 malloc (sizeof
7b20: 28 66 61 74 5f 65 6e 74 72 79 29 29 3b 0a 20 20 (fat_entry));.
7b30: 20 20 69 66 20 28 65 6e 74 72 79 20 3d 3d 20 4e if (entry == N
7b40: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 52 45 ULL)..return FRE
7b50: 45 58 4c 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 EXL_INSUFFICIENT
7b60: 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 65 6e 74 _MEMORY;. ent
7b70: 72 79 2d 3e 63 75 72 72 65 6e 74 5f 73 65 63 74 ry->current_sect
7b80: 6f 72 20 3d 20 63 68 61 69 6e 2d 3e 6e 65 78 74 or = chain->next
7b90: 5f 73 65 63 74 6f 72 4d 69 6e 69 3b 0a 20 20 20 _sectorMini;.
7ba0: 20 63 68 61 69 6e 2d 3e 6e 65 78 74 5f 73 65 63 chain->next_sec
7bb0: 74 6f 72 4d 69 6e 69 20 2b 3d 20 31 3b 0a 20 20 torMini += 1;.
7bc0: 20 20 65 6e 74 72 79 2d 3e 6e 65 78 74 5f 73 65 entry->next_se
7bd0: 63 74 6f 72 20 3d 20 73 65 63 74 6f 72 3b 0a 20 ctor = sector;.
7be0: 20 20 20 65 6e 74 72 79 2d 3e 6e 65 78 74 20 3d entry->next =
7bf0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 NULL;. if (c
7c00: 68 61 69 6e 2d 3e 66 69 72 73 74 4d 69 6e 69 20 hain->firstMini
7c10: 3d 3d 20 4e 55 4c 4c 29 0a 09 63 68 61 69 6e 2d == NULL)..chain-
7c20: 3e 66 69 72 73 74 4d 69 6e 69 20 3d 20 65 6e 74 >firstMini = ent
7c30: 72 79 3b 0a 20 20 20 20 69 66 20 28 63 68 61 69 ry;. if (chai
7c40: 6e 2d 3e 6c 61 73 74 4d 69 6e 69 20 21 3d 20 4e n->lastMini != N
7c50: 55 4c 4c 29 0a 09 63 68 61 69 6e 2d 3e 6c 61 73 ULL)..chain->las
7c60: 74 4d 69 6e 69 2d 3e 6e 65 78 74 20 3d 20 65 6e tMini->next = en
7c70: 74 72 79 3b 0a 20 20 20 20 63 68 61 69 6e 2d 3e try;. chain->
7c80: 6c 61 73 74 4d 69 6e 69 20 3d 20 65 6e 74 72 79 lastMini = entry
7c90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 ;. return FRE
7ca0: 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 EXL_OK;.}..stati
7cb0: 63 20 66 61 74 5f 65 6e 74 72 79 20 2a 0a 67 65 c fat_entry *.ge
7cc0: 74 5f 66 61 74 5f 65 6e 74 72 79 20 28 66 61 74 t_fat_entry (fat
7cd0: 5f 63 68 61 69 6e 20 2a 20 63 68 61 69 6e 2c 20 _chain * chain,
7ce0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 5f 73 unsigned int i_s
7cf0: 65 63 74 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 ect).{./* attemp
7d00: 74 69 6e 67 20 74 6f 20 72 65 74 72 69 65 76 65 ting to retrieve
7d10: 20 61 20 46 41 54 20 69 74 65 6d 20 5b 73 65 63 a FAT item [sec
7d20: 74 6f 72 5d 20 2a 2f 0a 20 20 20 20 69 66 20 28 tor] */. if (
7d30: 21 63 68 61 69 6e 29 0a 09 72 65 74 75 72 6e 20 !chain)..return
7d40: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 69 5f NULL;. if (i_
7d50: 73 65 63 74 20 3c 20 63 68 61 69 6e 2d 3e 66 61 sect < chain->fa
7d60: 74 5f 61 72 72 61 79 5f 63 6f 75 6e 74 29 0a 09 t_array_count)..
7d70: 72 65 74 75 72 6e 20 2a 28 63 68 61 69 6e 2d 3e return *(chain->
7d80: 66 61 74 5f 61 72 72 61 79 20 2b 20 69 5f 73 65 fat_array + i_se
7d90: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 ct);. return
7da0: 4e 55 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 NULL;.}..static
7db0: 69 6e 74 0a 62 75 69 6c 64 5f 66 61 74 5f 61 72 int.build_fat_ar
7dc0: 72 61 79 73 20 28 66 61 74 5f 63 68 61 69 6e 20 rays (fat_chain
7dd0: 2a 20 63 68 61 69 6e 29 0a 7b 0a 2f 2a 20 62 75 * chain).{./* bu
7de0: 69 6c 64 69 6e 67 20 46 41 54 20 73 65 63 74 6f ilding FAT secto
7df0: 72 73 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 rs array */.
7e00: 66 61 74 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 fat_entry *entry
7e10: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 ;. int i;..
7e20: 20 20 69 66 20 28 21 63 68 61 69 6e 29 0a 09 72 if (!chain)..r
7e30: 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 4c eturn FREEXL_NUL
7e40: 4c 5f 41 52 47 55 4d 45 4e 54 3b 0a 20 20 20 20 L_ARGUMENT;.
7e50: 69 66 20 28 63 68 61 69 6e 2d 3e 66 61 74 5f 61 if (chain->fat_a
7e60: 72 72 61 79 29 0a 09 66 72 65 65 20 28 63 68 61 rray)..free (cha
7e70: 69 6e 2d 3e 66 61 74 5f 61 72 72 61 79 29 3b 0a in->fat_array);.
7e80: 20 20 20 20 63 68 61 69 6e 2d 3e 66 61 74 5f 61 chain->fat_a
7e90: 72 72 61 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 rray = NULL;.
7ea0: 20 63 68 61 69 6e 2d 3e 66 61 74 5f 61 72 72 61 chain->fat_arra
7eb0: 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 y_count = 0;.
7ec0: 20 69 66 20 28 63 68 61 69 6e 2d 3e 6d 69 6e 69 if (chain->mini
7ed0: 46 41 54 5f 61 72 72 61 79 29 0a 09 66 72 65 65 FAT_array)..free
7ee0: 20 28 63 68 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 (chain->miniFAT
7ef0: 5f 61 72 72 61 79 29 3b 0a 20 20 20 20 63 68 61 _array);. cha
7f00: 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f 61 72 72 61 in->miniFAT_arra
7f10: 79 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 y = NULL;. ch
7f20: 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f 61 72 72 ain->miniFAT_arr
7f30: 61 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 20 ay_count = 0;..
7f40: 20 20 20 65 6e 74 72 79 20 3d 20 63 68 61 69 6e entry = chain
7f50: 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20 77 68 69 ->first;. whi
7f60: 6c 65 20 28 65 6e 74 72 79 29 0a 20 20 20 20 20 le (entry).
7f70: 20 7b 0a 09 20 20 2f 2a 20 63 6f 75 6e 74 69 6e {.. /* countin
7f80: 67 20 68 6f 77 20 6d 61 6e 79 20 73 65 63 74 6f g how many secto
7f90: 72 73 20 61 72 65 20 69 6e 74 6f 20 74 68 65 20 rs are into the
7fa0: 46 41 54 20 6c 69 73 74 20 2a 2f 0a 09 20 20 63 FAT list */.. c
7fb0: 68 61 69 6e 2d 3e 66 61 74 5f 61 72 72 61 79 5f hain->fat_array_
7fc0: 63 6f 75 6e 74 20 2b 3d 20 31 3b 0a 09 20 20 65 count += 1;.. e
7fd0: 6e 74 72 79 20 3d 20 65 6e 74 72 79 2d 3e 6e 65 ntry = entry->ne
7fe0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 xt;. }.
7ff0: 69 66 20 28 63 68 61 69 6e 2d 3e 66 61 74 5f 61 if (chain->fat_a
8000: 72 72 61 79 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 rray_count == 0)
8010: 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f ..return FREEXL_
8020: 43 46 42 46 5f 45 4d 50 54 59 5f 46 41 54 5f 43 CFBF_EMPTY_FAT_C
8030: 48 41 49 4e 3b 0a 0a 2f 2a 20 61 6c 6c 6f 63 61 HAIN;../* alloca
8040: 74 69 6e 67 20 74 68 65 20 46 41 54 20 73 65 63 ting the FAT sec
8050: 74 6f 72 73 20 61 72 72 61 79 20 2a 2f 0a 20 20 tors array */.
8060: 20 20 63 68 61 69 6e 2d 3e 66 61 74 5f 61 72 72 chain->fat_arr
8070: 61 79 20 3d 20 6d 61 6c 6c 6f 63 20 28 73 69 7a ay = malloc (siz
8080: 65 6f 66 20 28 66 61 74 5f 65 6e 74 72 79 20 2a eof (fat_entry *
8090: 29 20 2a 20 63 68 61 69 6e 2d 3e 66 61 74 5f 61 ) * chain->fat_a
80a0: 72 72 61 79 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 rray_count);.
80b0: 20 69 66 20 28 63 68 61 69 6e 2d 3e 66 61 74 5f if (chain->fat_
80c0: 61 72 72 61 79 20 3d 3d 20 4e 55 4c 4c 29 0a 09 array == NULL)..
80d0: 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e return FREEXL_IN
80e0: 53 55 46 46 49 43 49 45 4e 54 5f 4d 45 4d 4f 52 SUFFICIENT_MEMOR
80f0: 59 3b 0a 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 Y;.. i = 0;.
8100: 20 20 20 65 6e 74 72 79 20 3d 20 63 68 61 69 6e entry = chain
8110: 2d 3e 66 69 72 73 74 3b 0a 20 20 20 20 77 68 69 ->first;. whi
8120: 6c 65 20 28 65 6e 74 72 79 29 0a 20 20 20 20 20 le (entry).
8130: 20 7b 0a 09 20 20 2f 2a 20 70 6f 70 75 6c 61 74 {.. /* populat
8140: 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 ing the pointer
8150: 61 72 72 61 79 20 2a 2f 0a 09 20 20 2a 28 63 68 array */.. *(ch
8160: 61 69 6e 2d 3e 66 61 74 5f 61 72 72 61 79 20 2b ain->fat_array +
8170: 20 69 29 20 3d 20 65 6e 74 72 79 3b 0a 09 20 20 i) = entry;..
8180: 69 2b 2b 3b 0a 09 20 20 65 6e 74 72 79 20 3d 20 i++;.. entry =
8190: 65 6e 74 72 79 2d 3e 6e 65 78 74 3b 0a 20 20 20 entry->next;.
81a0: 20 20 20 7d 0a 0a 20 20 20 20 65 6e 74 72 79 20 }.. entry
81b0: 3d 20 63 68 61 69 6e 2d 3e 66 69 72 73 74 4d 69 = chain->firstMi
81c0: 6e 69 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 65 ni;. while (e
81d0: 6e 74 72 79 29 0a 20 20 20 20 20 20 7b 0a 09 20 ntry). {..
81e0: 20 2f 2a 20 63 6f 75 6e 74 69 6e 67 20 68 6f 77 /* counting how
81f0: 20 6d 61 6e 79 20 73 65 63 74 6f 72 73 20 61 72 many sectors ar
8200: 65 20 69 6e 74 6f 20 74 68 65 20 6d 69 6e 69 46 e into the miniF
8210: 41 54 20 6c 69 73 74 20 2a 2f 0a 09 20 20 63 68 AT list */.. ch
8220: 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f 61 72 72 ain->miniFAT_arr
8230: 61 79 5f 63 6f 75 6e 74 20 2b 3d 20 31 3b 0a 09 ay_count += 1;..
8240: 20 20 65 6e 74 72 79 20 3d 20 65 6e 74 72 79 2d entry = entry-
8250: 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 >next;. }.
8260: 20 20 20 69 66 20 28 63 68 61 69 6e 2d 3e 6d 69 if (chain->mi
8270: 6e 69 46 41 54 5f 61 72 72 61 79 5f 63 6f 75 6e niFAT_array_coun
8280: 74 20 3e 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 t > 0). {..
8290: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 /* allocating
82a0: 74 68 65 20 6d 69 6e 69 46 41 54 20 73 65 63 74 the miniFAT sect
82b0: 6f 72 73 20 61 72 72 61 79 20 2a 2f 0a 09 20 20 ors array */..
82c0: 63 68 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f 61 chain->miniFAT_a
82d0: 72 72 61 79 20 3d 0a 09 20 20 20 20 20 20 6d 61 rray =.. ma
82e0: 6c 6c 6f 63 20 28 73 69 7a 65 6f 66 20 28 66 61 lloc (sizeof (fa
82f0: 74 5f 65 6e 74 72 79 20 2a 29 20 2a 20 63 68 61 t_entry *) * cha
8300: 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f 61 72 72 61 in->miniFAT_arra
8310: 79 5f 63 6f 75 6e 74 29 3b 0a 09 20 20 69 66 20 y_count);.. if
8320: 28 63 68 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 5f (chain->miniFAT_
8330: 61 72 72 61 79 20 3d 3d 20 4e 55 4c 4c 29 0a 09 array == NULL)..
8340: 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 return FRE
8350: 45 58 4c 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 EXL_INSUFFICIENT
8360: 5f 4d 45 4d 4f 52 59 3b 0a 0a 09 20 20 69 20 3d _MEMORY;... i =
8370: 20 30 3b 0a 09 20 20 65 6e 74 72 79 20 3d 20 63 0;.. entry = c
8380: 68 61 69 6e 2d 3e 66 69 72 73 74 4d 69 6e 69 3b hain->firstMini;
8390: 0a 09 20 20 77 68 69 6c 65 20 28 65 6e 74 72 79 .. while (entry
83a0: 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 70 6f ).. {.../* po
83b0: 70 75 6c 61 74 69 6e 67 20 74 68 65 20 70 6f 69 pulating the poi
83c0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 09 09 nter array */...
83d0: 2a 28 63 68 61 69 6e 2d 3e 6d 69 6e 69 46 41 54 *(chain->miniFAT
83e0: 5f 61 72 72 61 79 20 2b 20 69 29 20 3d 20 65 6e _array + i) = en
83f0: 74 72 79 3b 0a 09 09 69 2b 2b 3b 0a 09 09 65 6e try;...i++;...en
8400: 74 72 79 20 3d 20 65 6e 74 72 79 2d 3e 6e 65 78 try = entry->nex
8410: 74 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 t;.. }.
8420: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 }. return FRE
8430: 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 EXL_OK;.}..stati
8440: 63 20 76 6f 69 64 0a 73 65 6c 65 63 74 5f 61 63 c void.select_ac
8450: 74 69 76 65 5f 73 68 65 65 74 20 28 62 69 66 66 tive_sheet (biff
8460: 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b _workbook * work
8470: 62 6f 6f 6b 2c 20 75 6e 73 69 67 6e 65 64 20 69 book, unsigned i
8480: 6e 74 20 63 75 72 72 65 6e 74 5f 6f 66 66 73 65 nt current_offse
8490: 74 29 0a 7b 0a 2f 2a 20 73 65 6c 65 63 74 69 6e t).{./* selectin
84a0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 g the currently
84b0: 61 63 72 69 76 65 20 53 68 65 65 74 20 28 69 66 acrive Sheet (if
84c0: 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 62 69 66 any) */. bif
84d0: 66 5f 73 68 65 65 74 20 2a 70 5f 73 68 65 65 74 f_sheet *p_sheet
84e0: 3b 0a 20 20 20 20 70 5f 73 68 65 65 74 20 3d 20 ;. p_sheet =
84f0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 69 72 73 74 5f workbook->first_
8500: 73 68 65 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 sheet;. while
8510: 20 28 70 5f 73 68 65 65 74 29 0a 20 20 20 20 20 (p_sheet).
8520: 20 7b 0a 09 20 20 69 66 20 28 70 5f 73 68 65 65 {.. if (p_shee
8530: 74 2d 3e 73 74 61 72 74 5f 6f 66 66 73 65 74 20 t->start_offset
8540: 3d 3d 20 63 75 72 72 65 6e 74 5f 6f 66 66 73 65 == current_offse
8550: 74 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6f t).. {.../* o
8560: 6b 2c 20 74 68 69 73 20 6f 6e 65 20 69 73 20 74 k, this one is t
8570: 68 65 20 63 75 72 72 65 6e 74 20 53 68 65 65 74 he current Sheet
8580: 20 2a 2f 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e */...workbook->
8590: 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d 20 70 active_sheet = p
85a0: 5f 73 68 65 65 74 3b 0a 09 09 72 65 74 75 72 6e _sheet;...return
85b0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 70 5f 73 68 ;.. }.. p_sh
85c0: 65 65 74 20 3d 20 70 5f 73 68 65 65 74 2d 3e 6e eet = p_sheet->n
85d0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ext;. }.
85e0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 workbook->activ
85f0: 65 5f 73 68 65 65 74 20 3d 20 4e 55 4c 4c 3b 0a e_sheet = NULL;.
8600: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 72 65 }..static int.re
8610: 61 64 5f 66 61 74 5f 73 65 63 74 6f 72 20 28 46 ad_fat_sector (F
8620: 49 4c 45 20 2a 20 78 6c 73 2c 20 66 61 74 5f 63 ILE * xls, fat_c
8630: 68 61 69 6e 20 2a 20 63 68 61 69 6e 2c 20 75 6e hain * chain, un
8640: 73 69 67 6e 65 64 20 69 6e 74 20 73 65 63 74 6f signed int secto
8650: 72 29 0a 7b 0a 2f 2a 20 72 65 61 64 69 6e 67 20 r).{./* reading
8660: 61 20 46 41 54 20 63 68 61 69 6e 20 73 65 63 74 a FAT chain sect
8670: 6f 72 20 2a 2f 0a 20 20 20 20 6c 6f 6e 67 20 77 or */. long w
8680: 68 65 72 65 20 3d 20 28 73 65 63 74 6f 72 20 2b here = (sector +
8690: 20 31 29 20 2a 20 63 68 61 69 6e 2d 3e 73 65 63 1) * chain->sec
86a0: 74 6f 72 5f 73 69 7a 65 3b 0a 20 20 20 20 75 6e tor_size;. un
86b0: 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 5b signed char buf[
86c0: 34 30 39 36 5d 3b 0a 20 20 20 20 75 6e 73 69 67 4096];. unsig
86d0: 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 75 66 20 ned char *p_buf
86e0: 3d 20 62 75 66 3b 0a 20 20 20 20 69 6e 74 20 69 = buf;. int i
86f0: 5f 66 61 74 3b 0a 20 20 20 20 69 6e 74 20 6d 61 _fat;. int ma
8700: 78 5f 66 61 74 3b 0a 20 20 20 20 69 66 20 28 66 x_fat;. if (f
8710: 73 65 65 6b 20 28 78 6c 73 2c 20 77 68 65 72 65 seek (xls, where
8720: 2c 20 53 45 45 4b 5f 53 45 54 29 20 21 3d 20 30 , SEEK_SET) != 0
8730: 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
8740: 5f 43 46 42 46 5f 53 45 45 4b 5f 45 52 52 4f 52 _CFBF_SEEK_ERROR
8750: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 69 6e 2d ;. if (chain-
8760: 3e 73 65 63 74 6f 72 5f 73 69 7a 65 20 3d 3d 20 >sector_size ==
8770: 34 30 39 36 29 0a 09 6d 61 78 5f 66 61 74 20 3d 4096)..max_fat =
8780: 20 31 30 32 34 3b 0a 20 20 20 20 65 6c 73 65 0a 1024;. else.
8790: 09 6d 61 78 5f 66 61 74 20 3d 20 31 32 38 3b 0a .max_fat = 128;.
87a0: 0a 2f 2a 20 72 65 61 64 69 6e 67 20 61 20 46 41 ./* reading a FA
87b0: 54 20 73 65 63 74 6f 72 20 2a 2f 0a 20 20 20 20 T sector */.
87c0: 69 66 20 28 66 72 65 61 64 20 28 62 75 66 2c 20 if (fread (buf,
87d0: 31 2c 20 63 68 61 69 6e 2d 3e 73 65 63 74 6f 72 1, chain->sector
87e0: 5f 73 69 7a 65 2c 20 78 6c 73 29 20 21 3d 20 63 _size, xls) != c
87f0: 68 61 69 6e 2d 3e 73 65 63 74 6f 72 5f 73 69 7a hain->sector_siz
8800: 65 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 e)..return FREEX
8810: 4c 5f 43 46 42 46 5f 52 45 41 44 5f 45 52 52 4f L_CFBF_READ_ERRO
8820: 52 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 5f 66 R;.. for (i_f
8830: 61 74 20 3d 20 30 3b 20 69 5f 66 61 74 20 3c 20 at = 0; i_fat <
8840: 6d 61 78 5f 66 61 74 3b 20 69 5f 66 61 74 2b 2b max_fat; i_fat++
8850: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 69 6e 74 ). {.. int
8860: 20 72 65 74 3b 0a 09 20 20 62 69 66 66 5f 77 6f ret;.. biff_wo
8870: 72 64 33 32 20 66 61 74 3b 0a 09 20 20 6d 65 6d rd32 fat;.. mem
8880: 63 70 79 20 28 66 61 74 2e 62 79 74 65 73 2c 20 cpy (fat.bytes,
8890: 70 5f 62 75 66 2c 20 34 29 3b 0a 09 20 20 70 5f p_buf, 4);.. p_
88a0: 62 75 66 20 2b 3d 20 34 3b 0a 09 20 20 69 66 20 buf += 4;.. if
88b0: 28 63 68 61 69 6e 2d 3e 73 77 61 70 29 0a 09 20 (chain->swap)..
88c0: 20 20 20 20 20 73 77 61 70 33 32 20 28 26 66 61 swap32 (&fa
88d0: 74 29 3b 0a 09 20 20 72 65 74 20 3d 20 69 6e 73 t);.. ret = ins
88e0: 65 72 74 5f 69 6e 74 6f 5f 66 61 74 5f 63 68 61 ert_into_fat_cha
88f0: 69 6e 20 28 63 68 61 69 6e 2c 20 66 61 74 2e 76 in (chain, fat.v
8900: 61 6c 75 65 29 3b 0a 09 20 20 69 66 20 28 72 65 alue);.. if (re
8910: 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a t != FREEXL_OK).
8920: 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 . return re
8930: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 t;. }. r
8940: 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b eturn FREEXL_OK;
8950: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 72 .}..static int.r
8960: 65 61 64 5f 64 69 66 61 74 5f 73 65 63 74 6f 72 ead_difat_sector
8970: 73 20 28 46 49 4c 45 20 2a 20 78 6c 73 2c 20 66 s (FILE * xls, f
8980: 61 74 5f 63 68 61 69 6e 20 2a 20 63 68 61 69 6e at_chain * chain
8990: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 , unsigned int s
89a0: 65 63 74 6f 72 2c 0a 09 09 20 20 20 20 75 6e 73 ector,... uns
89b0: 69 67 6e 65 64 20 69 6e 74 20 6e 75 6d 5f 73 65 igned int num_se
89c0: 63 74 6f 72 73 29 0a 7b 0a 2f 2a 20 72 65 61 64 ctors).{./* read
89d0: 69 6e 67 20 61 20 44 49 46 41 54 20 28 44 6f 75 ing a DIFAT (Dou
89e0: 62 6c 65 49 6e 64 69 72 65 63 74 29 20 63 68 61 bleIndirect) cha
89f0: 69 6e 20 73 65 63 74 6f 72 20 2a 2f 0a 20 20 20 in sector */.
8a00: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 unsigned int ne
8a10: 78 74 5f 73 65 63 74 6f 72 20 3d 20 73 65 63 74 xt_sector = sect
8a20: 6f 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 or;. unsigned
8a30: 20 69 6e 74 20 62 6c 6f 63 6b 73 20 3d 20 30 3b int blocks = 0;
8a40: 0a 20 20 20 20 6c 6f 6e 67 20 77 68 65 72 65 20 . long where
8a50: 3d 20 28 73 65 63 74 6f 72 20 2b 20 31 29 20 2a = (sector + 1) *
8a60: 20 63 68 61 69 6e 2d 3e 73 65 63 74 6f 72 5f 73 chain->sector_s
8a70: 69 7a 65 3b 0a 20 20 20 20 62 69 66 66 5f 77 6f ize;. biff_wo
8a80: 72 64 33 32 20 64 69 66 61 74 5b 31 30 32 34 5d rd32 difat[1024]
8a90: 3b 0a 20 20 20 20 69 6e 74 20 69 5f 64 69 66 61 ;. int i_difa
8aa0: 74 3b 0a 20 20 20 20 69 6e 74 20 6d 61 78 5f 64 t;. int max_d
8ab0: 69 66 61 74 3b 0a 20 20 20 20 69 6e 74 20 65 6e ifat;. int en
8ac0: 64 5f 6f 66 5f 63 68 61 69 6e 20 3d 20 30 3b 0a d_of_chain = 0;.
8ad0: 0a 20 20 20 20 69 66 20 28 63 68 61 69 6e 2d 3e . if (chain->
8ae0: 73 65 63 74 6f 72 5f 73 69 7a 65 20 3d 3d 20 34 sector_size == 4
8af0: 30 39 36 29 0a 09 6d 61 78 5f 64 69 66 61 74 20 096)..max_difat
8b00: 3d 20 31 30 32 34 3b 0a 20 20 20 20 65 6c 73 65 = 1024;. else
8b10: 0a 09 6d 61 78 5f 64 69 66 61 74 20 3d 20 31 32 ..max_difat = 12
8b20: 38 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 31 8;.. while (1
8b30: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 77 68 65 ). {.. whe
8b40: 72 65 20 3d 20 28 6e 65 78 74 5f 73 65 63 74 6f re = (next_secto
8b50: 72 20 2b 20 31 29 20 2a 20 63 68 61 69 6e 2d 3e r + 1) * chain->
8b60: 73 65 63 74 6f 72 5f 73 69 7a 65 3b 0a 09 20 20 sector_size;..
8b70: 69 66 20 28 66 73 65 65 6b 20 28 78 6c 73 2c 20 if (fseek (xls,
8b80: 77 68 65 72 65 2c 20 53 45 45 4b 5f 53 45 54 29 where, SEEK_SET)
8b90: 20 21 3d 20 30 29 0a 09 20 20 20 20 20 20 72 65 != 0).. re
8ba0: 74 75 72 6e 20 46 52 45 45 58 4c 5f 43 46 42 46 turn FREEXL_CFBF
8bb0: 5f 53 45 45 4b 5f 45 52 52 4f 52 3b 0a 09 20 20 _SEEK_ERROR;..
8bc0: 2f 2a 20 72 65 61 64 69 6e 67 20 61 20 44 49 46 /* reading a DIF
8bd0: 41 54 20 73 65 63 74 6f 72 20 2a 2f 0a 09 20 20 AT sector */..
8be0: 69 66 20 28 66 72 65 61 64 20 28 26 64 69 66 61 if (fread (&difa
8bf0: 74 2c 20 31 2c 20 63 68 61 69 6e 2d 3e 73 65 63 t, 1, chain->sec
8c00: 74 6f 72 5f 73 69 7a 65 2c 20 78 6c 73 29 20 21 tor_size, xls) !
8c10: 3d 20 63 68 61 69 6e 2d 3e 73 65 63 74 6f 72 5f = chain->sector_
8c20: 73 69 7a 65 29 0a 09 20 20 20 20 20 20 72 65 74 size).. ret
8c30: 75 72 6e 20 46 52 45 45 58 4c 5f 43 46 42 46 5f urn FREEXL_CFBF_
8c40: 52 45 41 44 5f 45 52 52 4f 52 3b 0a 09 20 20 62 READ_ERROR;.. b
8c50: 6c 6f 63 6b 73 2b 2b 3b 0a 09 20 20 69 66 20 28 locks++;.. if (
8c60: 63 68 61 69 6e 2d 3e 73 77 61 70 29 0a 09 20 20 chain->swap)..
8c70: 20 20 7b 0a 09 09 66 6f 72 20 28 69 5f 64 69 66 {...for (i_dif
8c80: 61 74 20 3d 20 30 3b 20 69 5f 64 69 66 61 74 20 at = 0; i_difat
8c90: 3c 20 6d 61 78 5f 64 69 66 61 74 3b 20 69 5f 64 < max_difat; i_d
8ca0: 69 66 61 74 2b 2b 29 0a 09 09 20 20 20 20 73 77 ifat++)... sw
8cb0: 61 70 33 32 20 28 64 69 66 61 74 20 2b 20 69 5f ap32 (difat + i_
8cc0: 64 69 66 61 74 29 3b 0a 09 20 20 20 20 7d 0a 0a difat);.. }..
8cd0: 09 20 20 66 6f 72 20 28 69 5f 64 69 66 61 74 20 . for (i_difat
8ce0: 3d 20 30 3b 20 69 5f 64 69 66 61 74 20 3c 20 6d = 0; i_difat < m
8cf0: 61 78 5f 64 69 66 61 74 3b 20 69 5f 64 69 66 61 ax_difat; i_difa
8d00: 74 2b 2b 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 t++).. {...if
8d10: 20 28 64 69 66 61 74 5b 69 5f 64 69 66 61 74 5d (difat[i_difat]
8d20: 2e 76 61 6c 75 65 20 3d 3d 20 30 78 46 46 46 46 .value == 0xFFFF
8d30: 46 46 46 45 29 0a 09 09 20 20 7b 0a 09 09 20 20 FFFE)... {...
8d40: 20 20 20 20 65 6e 64 5f 6f 66 5f 63 68 61 69 6e end_of_chain
8d50: 20 3d 20 31 3b 09 2f 2a 20 65 6e 64 20 6f 66 20 = 1;./* end of
8d60: 46 41 54 20 63 68 61 69 6e 20 2a 2f 0a 09 09 20 FAT chain */...
8d70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 break;...
8d80: 7d 0a 09 09 69 66 20 28 69 5f 64 69 66 61 74 20 }...if (i_difat
8d90: 3d 3d 20 6d 61 78 5f 64 69 66 61 74 20 2d 20 31 == max_difat - 1
8da0: 29 0a 09 09 20 20 20 20 6e 65 78 74 5f 73 65 63 )... next_sec
8db0: 74 6f 72 20 3d 20 64 69 66 61 74 5b 69 5f 64 69 tor = difat[i_di
8dc0: 66 61 74 5d 2e 76 61 6c 75 65 3b 0a 09 09 65 6c fat].value;...el
8dd0: 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 se... {...
8de0: 20 69 6e 74 20 72 65 74 3b 0a 09 09 20 20 20 20 int ret;...
8df0: 20 20 69 66 20 28 64 69 66 61 74 5b 69 5f 64 69 if (difat[i_di
8e00: 66 61 74 5d 2e 76 61 6c 75 65 20 3d 3d 20 30 78 fat].value == 0x
8e10: 46 46 46 46 46 46 46 46 29 0a 09 09 09 20 20 63 FFFFFFFF).... c
8e20: 6f 6e 74 69 6e 75 65 3b 09 2f 2a 20 75 6e 75 73 ontinue;./* unus
8e30: 65 64 20 73 65 63 74 6f 72 20 2a 2f 0a 09 09 20 ed sector */...
8e40: 20 20 20 20 20 72 65 74 20 3d 20 72 65 61 64 5f ret = read_
8e50: 66 61 74 5f 73 65 63 74 6f 72 20 28 78 6c 73 2c fat_sector (xls,
8e60: 20 63 68 61 69 6e 2c 20 64 69 66 61 74 5b 69 5f chain, difat[i_
8e70: 64 69 66 61 74 5d 2e 76 61 6c 75 65 29 3b 0a 09 difat].value);..
8e80: 09 20 20 20 20 20 20 69 66 20 28 72 65 74 20 21 . if (ret !
8e90: 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 09 09 = FREEXL_OK)....
8ea0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 09 09 return ret;...
8eb0: 20 20 7d 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 }.. }.. if
8ec0: 20 28 62 6c 6f 63 6b 73 20 3d 3d 20 6e 75 6d 5f (blocks == num_
8ed0: 73 65 63 74 6f 72 73 29 0a 09 20 20 20 20 20 20 sectors)..
8ee0: 62 72 65 61 6b 3b 0a 09 20 20 69 66 20 28 65 6e break;.. if (en
8ef0: 64 5f 6f 66 5f 63 68 61 69 6e 29 0a 09 20 20 20 d_of_chain)..
8f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
8f10: 7d 0a 20 20 20 20 69 66 20 28 62 6c 6f 63 6b 73 }. if (blocks
8f20: 20 21 3d 20 6e 75 6d 5f 73 65 63 74 6f 72 73 29 != num_sectors)
8f30: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
8f40: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 return 1;.}..sta
8f50: 74 69 63 20 69 6e 74 0a 72 65 61 64 5f 6d 69 6e tic int.read_min
8f60: 69 46 41 54 5f 73 65 63 74 6f 72 73 20 28 46 49 iFAT_sectors (FI
8f70: 4c 45 20 2a 20 78 6c 73 2c 20 66 61 74 5f 63 68 LE * xls, fat_ch
8f80: 61 69 6e 20 2a 20 63 68 61 69 6e 2c 20 75 6e 73 ain * chain, uns
8f90: 69 67 6e 65 64 20 69 6e 74 20 73 65 63 74 6f 72 igned int sector
8fa0: 2c 0a 09 09 20 20 20 20 20 20 75 6e 73 69 67 6e ,... unsign
8fb0: 65 64 20 69 6e 74 20 6e 75 6d 5f 73 65 63 74 6f ed int num_secto
8fc0: 72 73 29 0a 7b 0a 2f 2a 20 72 65 61 64 69 6e 67 rs).{./* reading
8fd0: 20 6d 69 6e 69 46 41 54 20 63 68 61 69 6e 20 73 miniFAT chain s
8fe0: 65 63 74 6f 72 73 20 2a 2f 0a 20 20 20 20 6c 6f ectors */. lo
8ff0: 6e 67 20 77 68 65 72 65 20 3d 20 28 73 65 63 74 ng where = (sect
9000: 6f 72 20 2d 20 31 29 20 2a 20 63 68 61 69 6e 2d or - 1) * chain-
9010: 3e 73 65 63 74 6f 72 5f 73 69 7a 65 3b 0a 20 20 >sector_size;.
9020: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
9030: 62 75 66 5b 34 30 39 36 5d 3b 0a 20 20 20 20 69 buf[4096];. i
9040: 6e 74 20 69 5f 66 61 74 3b 0a 20 20 20 20 69 6e nt i_fat;. in
9050: 74 20 6d 61 78 5f 66 61 74 3b 0a 20 20 20 20 75 t max_fat;. u
9060: 6e 73 69 67 6e 65 64 20 69 6e 74 20 62 6c 6f 63 nsigned int bloc
9070: 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 k = 0;.. if (
9080: 63 68 61 69 6e 2d 3e 73 65 63 74 6f 72 5f 73 69 chain->sector_si
9090: 7a 65 20 3d 3d 20 34 30 39 36 29 0a 09 6d 61 78 ze == 4096)..max
90a0: 5f 66 61 74 20 3d 20 31 30 32 34 3b 0a 20 20 20 _fat = 1024;.
90b0: 20 65 6c 73 65 0a 09 6d 61 78 5f 66 61 74 20 3d else..max_fat =
90c0: 20 31 32 38 3b 0a 0a 20 20 20 20 69 66 20 28 66 128;.. if (f
90d0: 73 65 65 6b 20 28 78 6c 73 2c 20 77 68 65 72 65 seek (xls, where
90e0: 2c 20 53 45 45 4b 5f 53 45 54 29 20 21 3d 20 30 , SEEK_SET) != 0
90f0: 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
9100: 5f 43 46 42 46 5f 53 45 45 4b 5f 45 52 52 4f 52 _CFBF_SEEK_ERROR
9110: 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 62 6c 6f ;. while (blo
9120: 63 6b 20 3c 20 6e 75 6d 5f 73 65 63 74 6f 72 73 ck < num_sectors
9130: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 75 6e 73 ). {.. uns
9140: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f 62 75 igned char *p_bu
9150: 66 20 3d 20 62 75 66 3b 0a 09 20 20 62 6c 6f 63 f = buf;.. bloc
9160: 6b 2b 2b 3b 0a 09 20 20 2f 2a 20 72 65 61 64 69 k++;.. /* readi
9170: 6e 67 20 61 20 6d 69 6e 69 46 41 54 20 73 65 63 ng a miniFAT sec
9180: 74 6f 72 20 2a 2f 0a 09 20 20 69 66 20 28 66 72 tor */.. if (fr
9190: 65 61 64 20 28 26 62 75 66 2c 20 31 2c 20 63 68 ead (&buf, 1, ch
91a0: 61 69 6e 2d 3e 73 65 63 74 6f 72 5f 73 69 7a 65 ain->sector_size
91b0: 2c 20 78 6c 73 29 20 21 3d 20 63 68 61 69 6e 2d , xls) != chain-
91c0: 3e 73 65 63 74 6f 72 5f 73 69 7a 65 29 0a 09 20 >sector_size)..
91d0: 20 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 return FREE
91e0: 58 4c 5f 43 46 42 46 5f 52 45 41 44 5f 45 52 52 XL_CFBF_READ_ERR
91f0: 4f 52 3b 0a 09 20 20 66 6f 72 20 28 69 5f 66 61 OR;.. for (i_fa
9200: 74 20 3d 20 30 3b 20 69 5f 66 61 74 20 3c 20 6d t = 0; i_fat < m
9210: 61 78 5f 66 61 74 3b 20 69 5f 66 61 74 2b 2b 29 ax_fat; i_fat++)
9220: 0a 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 72 65 .. {...int re
9230: 74 3b 0a 09 09 62 69 66 66 5f 77 6f 72 64 33 32 t;...biff_word32
9240: 20 66 61 74 3b 0a 09 09 6d 65 6d 63 70 79 20 28 fat;...memcpy (
9250: 66 61 74 2e 62 79 74 65 73 2c 20 70 5f 62 75 66 fat.bytes, p_buf
9260: 2c 20 34 29 3b 0a 09 09 70 5f 62 75 66 20 2b 3d , 4);...p_buf +=
9270: 20 34 3b 0a 09 09 69 66 20 28 63 68 61 69 6e 2d 4;...if (chain-
9280: 3e 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 >swap)... swa
9290: 70 33 32 20 28 26 66 61 74 29 3b 0a 09 09 72 65 p32 (&fat);...re
92a0: 74 20 3d 20 69 6e 73 65 72 74 5f 69 6e 74 6f 5f t = insert_into_
92b0: 6d 69 6e 69 46 41 54 5f 63 68 61 69 6e 20 28 63 miniFAT_chain (c
92c0: 68 61 69 6e 2c 20 66 61 74 2e 76 61 6c 75 65 29 hain, fat.value)
92d0: 3b 0a 09 09 69 66 20 28 72 65 74 20 21 3d 20 46 ;...if (ret != F
92e0: 52 45 45 58 4c 5f 4f 4b 29 0a 09 09 20 20 20 20 REEXL_OK)...
92f0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 09 20 20 20 return ret;..
9300: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 }. }. r
9310: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 eturn 1;.}..stat
9320: 69 63 20 66 61 74 5f 63 68 61 69 6e 20 2a 0a 72 ic fat_chain *.r
9330: 65 61 64 5f 63 66 62 66 5f 68 65 61 64 65 72 20 ead_cfbf_header
9340: 28 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a (biff_workbook *
9350: 20 77 6f 72 6b 62 6f 6f 6b 2c 20 69 6e 74 20 73 workbook, int s
9360: 77 61 70 2c 20 69 6e 74 20 2a 65 72 72 5f 63 6f wap, int *err_co
9370: 64 65 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 de).{./* attempt
9380: 69 6e 67 20 74 6f 20 72 65 61 64 20 61 6e 64 20 ing to read and
9390: 63 68 65 63 6b 20 46 41 54 20 68 65 61 64 65 72 check FAT header
93a0: 20 2a 2f 0a 20 20 20 20 63 66 62 66 5f 68 65 61 */. cfbf_hea
93b0: 64 65 72 20 68 65 61 64 65 72 3b 0a 20 20 20 20 der header;.
93c0: 66 61 74 5f 63 68 61 69 6e 20 2a 63 68 61 69 6e fat_chain *chain
93d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 = NULL;. int
93e0: 20 69 5f 66 61 74 3b 0a 20 20 20 20 69 6e 74 20 i_fat;. int
93f0: 72 65 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 ret;. unsigne
9400: 64 20 63 68 61 72 20 2a 70 5f 66 61 74 20 3d 20 d char *p_fat =
9410: 68 65 61 64 65 72 2e 66 61 74 5f 73 65 63 74 6f header.fat_secto
9420: 72 5f 6d 61 70 3b 0a 0a 20 20 20 20 69 66 20 28 r_map;.. if (
9430: 66 72 65 61 64 20 28 26 68 65 61 64 65 72 2c 20 fread (&header,
9440: 31 2c 20 35 31 32 2c 20 77 6f 72 6b 62 6f 6f 6b 1, 512, workbook
9450: 2d 3e 78 6c 73 29 20 21 3d 20 35 31 32 29 0a 20 ->xls) != 512).
9460: 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72 5f 63 {.. *err_c
9470: 6f 64 65 20 3d 20 46 52 45 45 58 4c 5f 43 46 42 ode = FREEXL_CFB
9480: 46 5f 52 45 41 44 5f 45 52 52 4f 52 3b 0a 09 20 F_READ_ERROR;..
9490: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 return NULL;.
94a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 77 }. if (sw
94b0: 61 70 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f ap). {.. /
94c0: 2a 20 42 49 47 20 65 6e 64 69 61 6e 20 61 72 63 * BIG endian arc
94d0: 68 3a 20 73 77 61 70 20 72 65 71 75 69 72 65 64 h: swap required
94e0: 20 2a 2f 0a 09 20 20 73 77 61 70 31 36 20 28 26 */.. swap16 (&
94f0: 28 68 65 61 64 65 72 2e 6d 69 6e 6f 72 5f 76 65 (header.minor_ve
9500: 72 73 69 6f 6e 29 29 3b 0a 09 20 20 73 77 61 70 rsion));.. swap
9510: 31 36 20 28 26 28 68 65 61 64 65 72 2e 6d 61 6a 16 (&(header.maj
9520: 6f 72 5f 76 65 72 73 69 6f 6e 29 29 3b 0a 09 20 or_version));..
9530: 20 73 77 61 70 31 36 20 28 26 28 68 65 61 64 65 swap16 (&(heade
9540: 72 2e 62 79 74 65 5f 6f 72 64 65 72 29 29 3b 0a r.byte_order));.
9550: 09 20 20 73 77 61 70 31 36 20 28 26 28 68 65 61 . swap16 (&(hea
9560: 64 65 72 2e 73 65 63 74 6f 72 5f 73 68 69 66 74 der.sector_shift
9570: 29 29 3b 0a 09 20 20 73 77 61 70 31 36 20 28 26 ));.. swap16 (&
9580: 28 68 65 61 64 65 72 2e 6d 69 6e 69 5f 73 65 63 (header.mini_sec
9590: 74 6f 72 5f 73 68 69 66 74 29 29 3b 0a 09 20 20 tor_shift));..
95a0: 73 77 61 70 31 36 20 28 26 28 68 65 61 64 65 72 swap16 (&(header
95b0: 2e 72 65 73 65 72 76 65 64 31 29 29 3b 0a 09 20 .reserved1));..
95c0: 20 73 77 61 70 33 32 20 28 26 28 68 65 61 64 65 swap32 (&(heade
95d0: 72 2e 72 65 73 65 72 76 65 64 32 29 29 3b 0a 09 r.reserved2));..
95e0: 20 20 73 77 61 70 33 32 20 28 26 28 68 65 61 64 swap32 (&(head
95f0: 65 72 2e 64 69 72 65 63 74 6f 72 79 5f 73 65 63 er.directory_sec
9600: 74 6f 72 73 29 29 3b 0a 09 20 20 73 77 61 70 33 tors));.. swap3
9610: 32 20 28 26 28 68 65 61 64 65 72 2e 66 61 74 5f 2 (&(header.fat_
9620: 73 65 63 74 6f 72 73 29 29 3b 0a 09 20 20 73 77 sectors));.. sw
9630: 61 70 33 32 20 28 26 28 68 65 61 64 65 72 2e 64 ap32 (&(header.d
9640: 69 72 65 63 74 6f 72 79 5f 73 74 61 72 74 29 29 irectory_start))
9650: 3b 0a 09 20 20 73 77 61 70 33 32 20 28 26 28 68 ;.. swap32 (&(h
9660: 65 61 64 65 72 2e 74 72 61 6e 73 61 63 74 69 6f eader.transactio
9670: 6e 5f 73 69 67 6e 61 74 75 72 65 29 29 3b 0a 09 n_signature));..
9680: 20 20 73 77 61 70 33 32 20 28 26 28 68 65 61 64 swap32 (&(head
9690: 65 72 2e 6d 69 6e 69 5f 63 75 74 6f 66 66 29 29 er.mini_cutoff))
96a0: 3b 0a 09 20 20 73 77 61 70 33 32 20 28 26 28 68 ;.. swap32 (&(h
96b0: 65 61 64 65 72 2e 6d 69 6e 69 5f 66 61 74 5f 73 eader.mini_fat_s
96c0: 74 61 72 74 29 29 3b 0a 09 20 20 73 77 61 70 33 tart));.. swap3
96d0: 32 20 28 26 28 68 65 61 64 65 72 2e 6d 69 6e 69 2 (&(header.mini
96e0: 5f 66 61 74 5f 73 65 63 74 6f 72 73 29 29 3b 0a _fat_sectors));.
96f0: 09 20 20 73 77 61 70 33 32 20 28 26 28 68 65 61 . swap32 (&(hea
9700: 64 65 72 2e 64 69 66 61 74 5f 73 74 61 72 74 29 der.difat_start)
9710: 29 3b 0a 09 20 20 73 77 61 70 33 32 20 28 26 28 );.. swap32 (&(
9720: 68 65 61 64 65 72 2e 64 69 66 61 74 5f 73 65 63 header.difat_sec
9730: 74 6f 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a tors));. }.
9740: 0a 20 20 20 20 69 66 20 28 68 65 61 64 65 72 2e . if (header.
9750: 73 69 67 6e 61 74 75 72 65 5b 30 5d 20 3d 3d 20 signature[0] ==
9760: 30 78 64 30 20 26 26 20 68 65 61 64 65 72 2e 73 0xd0 && header.s
9770: 69 67 6e 61 74 75 72 65 5b 31 5d 20 3d 3d 20 30 ignature[1] == 0
9780: 78 63 66 0a 09 26 26 20 68 65 61 64 65 72 2e 73 xcf..&& header.s
9790: 69 67 6e 61 74 75 72 65 5b 32 5d 20 3d 3d 20 30 ignature[2] == 0
97a0: 78 31 31 20 26 26 20 68 65 61 64 65 72 2e 73 69 x11 && header.si
97b0: 67 6e 61 74 75 72 65 5b 33 5d 20 3d 3d 20 30 78 gnature[3] == 0x
97c0: 65 30 0a 09 26 26 20 68 65 61 64 65 72 2e 73 69 e0..&& header.si
97d0: 67 6e 61 74 75 72 65 5b 34 5d 20 3d 3d 20 30 78 gnature[4] == 0x
97e0: 61 31 20 26 26 20 68 65 61 64 65 72 2e 73 69 67 a1 && header.sig
97f0: 6e 61 74 75 72 65 5b 35 5d 20 3d 3d 20 30 78 62 nature[5] == 0xb
9800: 31 0a 09 26 26 20 68 65 61 64 65 72 2e 73 69 67 1..&& header.sig
9810: 6e 61 74 75 72 65 5b 36 5d 20 3d 3d 20 30 78 31 nature[6] == 0x1
9820: 61 20 26 26 20 68 65 61 64 65 72 2e 73 69 67 6e a && header.sign
9830: 61 74 75 72 65 5b 37 5d 20 3d 3d 20 30 78 65 31 ature[7] == 0xe1
9840: 29 0a 09 3b 09 09 09 2f 2a 20 6d 61 67 69 63 20 )..;.../* magic
9850: 73 69 67 6e 61 74 75 72 65 20 4f 4b 20 2a 2f 0a signature OK */.
9860: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b else. {
9870: 0a 09 20 20 2a 65 72 72 5f 63 6f 64 65 20 3d 20 .. *err_code =
9880: 46 52 45 45 58 4c 5f 43 46 42 46 5f 49 4e 56 41 FREEXL_CFBF_INVA
9890: 4c 49 44 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 LID_SIGNATURE;..
98a0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 return NULL;.
98b0: 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 68 }. if (h
98c0: 65 61 64 65 72 2e 73 65 63 74 6f 72 5f 73 68 69 eader.sector_shi
98d0: 66 74 2e 76 61 6c 75 65 20 3d 3d 20 39 20 7c 7c ft.value == 9 ||
98e0: 20 68 65 61 64 65 72 2e 73 65 63 74 6f 72 5f 73 header.sector_s
98f0: 68 69 66 74 2e 76 61 6c 75 65 20 3d 3d 20 31 32 hift.value == 12
9900: 29 0a 09 3b 09 09 09 2f 2a 20 6f 6b 2c 20 76 61 )..;.../* ok, va
9910: 6c 69 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 lid sector size
9920: 2a 2f 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 */. else.
9930: 20 20 7b 0a 09 20 20 2a 65 72 72 5f 63 6f 64 65 {.. *err_code
9940: 20 3d 20 46 52 45 45 58 4c 5f 43 46 42 46 5f 49 = FREEXL_CFBF_I
9950: 4e 56 41 4c 49 44 5f 53 45 43 54 4f 52 5f 53 49 NVALID_SECTOR_SI
9960: 5a 45 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 ZE;.. return NU
9970: 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 LL;. }..
9980: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 63 66 62 66 5f workbook->cfbf_
9990: 76 65 72 73 69 6f 6e 20 3d 20 68 65 61 64 65 72 version = header
99a0: 2e 6d 61 6a 6f 72 5f 76 65 72 73 69 6f 6e 2e 76 .major_version.v
99b0: 61 6c 75 65 3b 0a 20 20 20 20 69 66 20 28 68 65 alue;. if (he
99c0: 61 64 65 72 2e 73 65 63 74 6f 72 5f 73 68 69 66 ader.sector_shif
99d0: 74 2e 76 61 6c 75 65 20 3d 3d 20 39 29 0a 09 77 t.value == 9)..w
99e0: 6f 72 6b 62 6f 6f 6b 2d 3e 63 66 62 66 5f 73 65 orkbook->cfbf_se
99f0: 63 74 6f 72 5f 73 69 7a 65 20 3d 20 35 31 32 3b ctor_size = 512;
9a00: 0a 20 20 20 20 69 66 20 28 68 65 61 64 65 72 2e . if (header.
9a10: 73 65 63 74 6f 72 5f 73 68 69 66 74 2e 76 61 6c sector_shift.val
9a20: 75 65 20 3d 3d 20 31 32 29 0a 09 77 6f 72 6b 62 ue == 12)..workb
9a30: 6f 6f 6b 2d 3e 63 66 62 66 5f 73 65 63 74 6f 72 ook->cfbf_sector
9a40: 5f 73 69 7a 65 20 3d 20 34 30 39 36 3b 0a 0a 20 _size = 4096;..
9a50: 20 20 20 63 68 61 69 6e 20 3d 0a 09 61 6c 6c 6f chain =..allo
9a60: 63 5f 66 61 74 5f 63 68 61 69 6e 20 28 73 77 61 c_fat_chain (swa
9a70: 70 2c 20 68 65 61 64 65 72 2e 73 65 63 74 6f 72 p, header.sector
9a80: 5f 73 68 69 66 74 2e 76 61 6c 75 65 2c 0a 09 09 _shift.value,...
9a90: 09 20 68 65 61 64 65 72 2e 64 69 72 65 63 74 6f . header.directo
9aa0: 72 79 5f 73 74 61 72 74 2e 76 61 6c 75 65 29 3b ry_start.value);
9ab0: 0a 20 20 20 20 69 66 20 28 21 63 68 61 69 6e 29 . if (!chain)
9ac0: 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72 . {.. *err
9ad0: 5f 63 6f 64 65 20 3d 20 46 52 45 45 58 4c 5f 49 _code = FREEXL_I
9ae0: 4e 53 55 46 46 49 43 49 45 4e 54 5f 4d 45 4d 4f NSUFFICIENT_MEMO
9af0: 52 59 3b 0a 09 20 20 72 65 74 75 72 6e 20 4e 55 RY;.. return NU
9b00: 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 LL;. }.
9b10: 66 6f 72 20 28 69 5f 66 61 74 20 3d 20 30 3b 20 for (i_fat = 0;
9b20: 69 5f 66 61 74 20 3c 20 31 30 39 3b 20 69 5f 66 i_fat < 109; i_f
9b30: 61 74 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 20 at++). {..
9b40: 20 2f 2a 20 72 65 61 64 69 6e 67 20 46 41 54 20 /* reading FAT
9b50: 73 65 63 74 6f 72 73 20 2a 2f 0a 09 20 20 62 69 sectors */.. bi
9b60: 66 66 5f 77 6f 72 64 33 32 20 66 61 74 3b 0a 09 ff_word32 fat;..
9b70: 20 20 6d 65 6d 63 70 79 20 28 66 61 74 2e 62 79 memcpy (fat.by
9b80: 74 65 73 2c 20 70 5f 66 61 74 2c 20 34 29 3b 0a tes, p_fat, 4);.
9b90: 09 20 20 70 5f 66 61 74 20 2b 3d 20 34 3b 0a 09 . p_fat += 4;..
9ba0: 20 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 if (swap)..
9bb0: 20 20 20 73 77 61 70 33 32 20 28 26 66 61 74 29 swap32 (&fat)
9bc0: 3b 0a 09 20 20 69 66 20 28 66 61 74 2e 76 61 6c ;.. if (fat.val
9bd0: 75 65 20 3d 3d 20 30 78 46 46 46 46 46 46 46 46 ue == 0xFFFFFFFF
9be0: 29 0a 09 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 ).. continu
9bf0: 65 3b 09 09 2f 2a 20 75 6e 75 73 65 64 20 73 65 e;../* unused se
9c00: 63 74 6f 72 20 2a 2f 0a 09 20 20 72 65 74 20 3d ctor */.. ret =
9c10: 20 72 65 61 64 5f 66 61 74 5f 73 65 63 74 6f 72 read_fat_sector
9c20: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 2c (workbook->xls,
9c30: 20 63 68 61 69 6e 2c 20 66 61 74 2e 76 61 6c 75 chain, fat.valu
9c40: 65 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 e);.. if (ret !
9c50: 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 20 20 = FREEXL_OK)..
9c60: 20 20 7b 0a 09 09 2a 65 72 72 5f 63 6f 64 65 20 {...*err_code
9c70: 3d 20 72 65 74 3b 0a 09 09 64 65 73 74 72 6f 79 = ret;...destroy
9c80: 5f 66 61 74 5f 63 68 61 69 6e 20 28 63 68 61 69 _fat_chain (chai
9c90: 6e 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c n);...return NUL
9ca0: 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 L;.. }.
9cb0: 7d 0a 0a 20 20 20 20 69 66 20 28 68 65 61 64 65 }.. if (heade
9cc0: 72 2e 64 69 66 61 74 5f 73 65 63 74 6f 72 73 2e r.difat_sectors.
9cd0: 76 61 6c 75 65 20 3e 20 30 29 0a 20 20 20 20 20 value > 0).
9ce0: 20 7b 0a 09 20 20 2f 2a 20 72 65 61 64 69 6e 67 {.. /* reading
9cf0: 20 44 6f 75 62 6c 65 49 6e 64 69 72 65 63 74 20 DoubleIndirect
9d00: 5b 44 49 46 41 54 5d 20 73 65 63 74 6f 72 73 20 [DIFAT] sectors
9d10: 2a 2f 0a 09 20 20 69 66 20 28 21 72 65 61 64 5f */.. if (!read_
9d20: 64 69 66 61 74 5f 73 65 63 74 6f 72 73 0a 09 20 difat_sectors..
9d30: 20 20 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e (workbook->
9d40: 78 6c 73 2c 20 63 68 61 69 6e 2c 20 68 65 61 64 xls, chain, head
9d50: 65 72 2e 64 69 66 61 74 5f 73 74 61 72 74 2e 76 er.difat_start.v
9d60: 61 6c 75 65 2c 0a 09 20 20 20 20 20 20 20 68 65 alue,.. he
9d70: 61 64 65 72 2e 64 69 66 61 74 5f 73 65 63 74 6f ader.difat_secto
9d80: 72 73 2e 76 61 6c 75 65 29 29 0a 09 20 20 20 20 rs.value))..
9d90: 7b 0a 09 09 2a 65 72 72 5f 63 6f 64 65 20 3d 20 {...*err_code =
9da0: 46 52 45 45 58 4c 5f 43 46 42 46 5f 52 45 41 44 FREEXL_CFBF_READ
9db0: 5f 45 52 52 4f 52 3b 0a 09 09 64 65 73 74 72 6f _ERROR;...destro
9dc0: 79 5f 66 61 74 5f 63 68 61 69 6e 20 28 63 68 61 y_fat_chain (cha
9dd0: 69 6e 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 in);...return NU
9de0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 LL;.. }.
9df0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 68 65 61 64 }.. if (head
9e00: 65 72 2e 6d 69 6e 69 5f 66 61 74 5f 73 65 63 74 er.mini_fat_sect
9e10: 6f 72 73 2e 76 61 6c 75 65 20 3e 20 30 29 0a 20 ors.value > 0).
9e20: 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 74 68 65 {.. /* the
9e30: 72 65 20 69 73 20 61 20 6d 69 6e 69 46 41 54 20 re is a miniFAT
9e40: 72 65 71 75 69 72 69 6e 67 20 74 6f 20 62 65 20 requiring to be
9e50: 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 09 20 20 supported */..
9e60: 63 68 61 69 6e 2d 3e 6d 69 6e 69 43 75 74 4f 66 chain->miniCutOf
9e70: 66 20 3d 20 68 65 61 64 65 72 2e 6d 69 6e 69 5f f = header.mini_
9e80: 63 75 74 6f 66 66 2e 76 61 6c 75 65 3b 0a 09 20 cutoff.value;..
9e90: 20 69 66 20 28 21 72 65 61 64 5f 6d 69 6e 69 46 if (!read_miniF
9ea0: 41 54 5f 73 65 63 74 6f 72 73 0a 09 20 20 20 20 AT_sectors..
9eb0: 20 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 (workbook->xls
9ec0: 2c 20 63 68 61 69 6e 2c 20 68 65 61 64 65 72 2e , chain, header.
9ed0: 6d 69 6e 69 5f 66 61 74 5f 73 74 61 72 74 2e 76 mini_fat_start.v
9ee0: 61 6c 75 65 2c 0a 09 20 20 20 20 20 20 20 68 65 alue,.. he
9ef0: 61 64 65 72 2e 6d 69 6e 69 5f 66 61 74 5f 73 65 ader.mini_fat_se
9f00: 63 74 6f 72 73 2e 76 61 6c 75 65 29 29 0a 09 20 ctors.value))..
9f10: 20 20 20 7b 0a 09 09 2a 65 72 72 5f 63 6f 64 65 {...*err_code
9f20: 20 3d 20 46 52 45 45 58 4c 5f 43 46 42 46 5f 52 = FREEXL_CFBF_R
9f30: 45 41 44 5f 45 52 52 4f 52 3b 0a 09 09 64 65 73 EAD_ERROR;...des
9f40: 74 72 6f 79 5f 66 61 74 5f 63 68 61 69 6e 20 28 troy_fat_chain (
9f50: 63 68 61 69 6e 29 3b 0a 09 09 72 65 74 75 72 6e chain);...return
9f60: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 20 20 NULL;.. }.
9f70: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 20 3d }.. ret =
9f80: 20 62 75 69 6c 64 5f 66 61 74 5f 61 72 72 61 79 build_fat_array
9f90: 73 20 28 63 68 61 69 6e 29 3b 0a 20 20 20 20 69 s (chain);. i
9fa0: 66 20 28 72 65 74 20 21 3d 20 46 52 45 45 58 4c f (ret != FREEXL
9fb0: 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 _OK). {..
9fc0: 2a 65 72 72 5f 63 6f 64 65 20 3d 20 72 65 74 3b *err_code = ret;
9fd0: 0a 09 20 20 64 65 73 74 72 6f 79 5f 66 61 74 5f .. destroy_fat_
9fe0: 63 68 61 69 6e 20 28 63 68 61 69 6e 29 3b 0a 09 chain (chain);..
9ff0: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 return NULL;.
a000: 20 20 20 20 20 7d 0a 0a 20 20 20 20 2a 65 72 72 }.. *err
a010: 5f 63 6f 64 65 20 3d 20 46 52 45 45 58 4c 5f 4f _code = FREEXL_O
a020: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 63 68 K;. return ch
a030: 61 69 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 ain;.}..static i
a040: 6e 74 0a 72 65 61 64 5f 6d 69 6e 69 5f 73 74 72 nt.read_mini_str
a050: 65 61 6d 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f eam (biff_workbo
a060: 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 69 ok * workbook, i
a070: 6e 74 20 2a 65 72 72 63 6f 64 65 29 0a 7b 0a 2f nt *errcode).{./
a080: 2a 20 6c 6f 61 64 69 6e 67 20 69 6e 20 6d 65 6d * loading in mem
a090: 6f 72 79 20 74 68 65 20 77 68 6f 6c 65 20 6d 69 ory the whole mi
a0a0: 6e 69 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 nistream */.
a0b0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
a0c0: 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e = 0;. unsign
a0d0: 65 64 20 69 6e 74 20 73 65 63 74 6f 72 20 3d 20 ed int sector =
a0e0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 6d workbook->fat->m
a0f0: 69 6e 69 46 41 54 5f 73 74 61 72 74 3b 0a 20 20 iniFAT_start;.
a100: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
a110: 62 75 66 5b 34 30 39 36 5d 3b 0a 20 20 20 20 75 buf[4096];. u
a120: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6d 69 nsigned char *mi
a130: 6e 69 53 74 72 65 61 6d 3b 0a 20 20 20 20 66 61 niStream;. fa
a140: 74 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a t_entry *entry;.
a150: 20 20 20 20 69 6e 74 20 65 6f 66 20 3d 20 30 3b int eof = 0;
a160: 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f .. if (workbo
a170: 6f 6b 2d 3e 66 61 74 2d 3e 6d 69 6e 69 53 74 72 ok->fat->miniStr
a180: 65 61 6d 29 0a 09 66 72 65 65 20 28 77 6f 72 6b eam)..free (work
a190: 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 6d 69 6e 69 53 book->fat->miniS
a1a0: 74 72 65 61 6d 29 3b 0a 20 20 20 20 77 6f 72 6b tream);. work
a1b0: 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 6d 69 6e 69 53 book->fat->miniS
a1c0: 74 72 65 61 6d 20 3d 20 4e 55 4c 4c 3b 0a 20 20 tream = NULL;.
a1d0: 20 20 6d 69 6e 69 53 74 72 65 61 6d 20 3d 20 6d miniStream = m
a1e0: 61 6c 6c 6f 63 20 28 77 6f 72 6b 62 6f 6f 6b 2d alloc (workbook-
a1f0: 3e 66 61 74 2d 3e 6d 69 6e 69 46 41 54 5f 6c 65 >fat->miniFAT_le
a200: 6e 29 3b 0a 20 20 20 20 69 66 20 28 6d 69 6e 69 n);. if (mini
a210: 53 74 72 65 61 6d 20 3d 3d 20 4e 55 4c 4c 29 0a Stream == NULL).
a220: 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72 63 {.. *errc
a230: 6f 64 65 20 3d 20 46 52 45 45 58 4c 5f 49 4e 53 ode = FREEXL_INS
a240: 55 46 46 49 43 49 45 4e 54 5f 4d 45 4d 4f 52 59 UFFICIENT_MEMORY
a250: 3b 0a 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 ;.. return 0;.
a260: 20 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 }. while
a270: 20 28 6c 65 6e 20 3c 20 77 6f 72 6b 62 6f 6f 6b (len < workbook
a280: 2d 3e 66 61 74 2d 3e 6d 69 6e 69 46 41 54 5f 6c ->fat->miniFAT_l
a290: 65 6e 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f en). {.. /
a2a0: 2a 20 72 65 61 64 69 6e 67 20 6f 6e 65 20 73 65 * reading one se
a2b0: 63 74 6f 72 20 2a 2f 0a 09 20 20 75 6e 73 69 67 ctor */.. unsig
a2c0: 6e 65 64 20 69 6e 74 20 73 69 7a 65 3b 0a 09 20 ned int size;..
a2d0: 20 6c 6f 6e 67 20 77 68 65 72 65 20 3d 20 28 73 long where = (s
a2e0: 65 63 74 6f 72 20 2b 20 31 29 20 2a 20 77 6f 72 ector + 1) * wor
a2f0: 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 kbook->fat->sect
a300: 6f 72 5f 73 69 7a 65 3b 0a 09 20 20 69 66 20 28 or_size;.. if (
a310: 66 73 65 65 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2d fseek (workbook-
a320: 3e 78 6c 73 2c 20 77 68 65 72 65 2c 20 53 45 45 >xls, where, SEE
a330: 4b 5f 53 45 54 29 20 21 3d 20 30 29 0a 09 20 20 K_SET) != 0)..
a340: 20 20 7b 0a 09 09 2a 65 72 72 63 6f 64 65 20 3d {...*errcode =
a350: 20 46 52 45 45 58 4c 5f 43 46 42 46 5f 53 45 45 FREEXL_CFBF_SEE
a360: 4b 5f 45 52 52 4f 52 3b 0a 09 09 72 65 74 75 72 K_ERROR;...retur
a370: 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 n 0;.. }.. i
a380: 66 20 28 66 72 65 61 64 20 28 62 75 66 2c 20 31 f (fread (buf, 1
a390: 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d , workbook->fat-
a3a0: 3e 73 65 63 74 6f 72 5f 73 69 7a 65 2c 20 77 6f >sector_size, wo
a3b0: 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 29 20 21 3d 0a rkbook->xls) !=.
a3c0: 09 20 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d . workbook-
a3d0: 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 7a >fat->sector_siz
a3e0: 65 29 0a 09 20 20 20 20 7b 0a 09 09 2a 65 72 72 e).. {...*err
a3f0: 63 6f 64 65 20 3d 20 46 52 45 45 58 4c 5f 43 46 code = FREEXL_CF
a400: 42 46 5f 52 45 41 44 5f 45 52 52 4f 52 3b 0a 09 BF_READ_ERROR;..
a410: 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 .return 0;..
a420: 7d 0a 09 20 20 73 69 7a 65 20 3d 20 77 6f 72 6b }.. size = work
a430: 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f book->fat->secto
a440: 72 5f 73 69 7a 65 3b 0a 09 20 20 69 66 20 28 28 r_size;.. if ((
a450: 6c 65 6e 20 2b 20 73 69 7a 65 29 20 3e 20 77 6f len + size) > wo
a460: 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 6d 69 6e rkbook->fat->min
a470: 69 46 41 54 5f 6c 65 6e 29 0a 09 20 20 20 20 20 iFAT_len)..
a480: 20 73 69 7a 65 20 3d 20 77 6f 72 6b 62 6f 6f 6b size = workbook
a490: 2d 3e 66 61 74 2d 3e 6d 69 6e 69 46 41 54 5f 6c ->fat->miniFAT_l
a4a0: 65 6e 20 2d 20 6c 65 6e 3b 0a 09 20 20 6d 65 6d en - len;.. mem
a4b0: 63 70 79 20 28 6d 69 6e 69 53 74 72 65 61 6d 20 cpy (miniStream
a4c0: 2b 20 6c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 + len, buf, size
a4d0: 29 3b 0a 09 20 20 6c 65 6e 20 2b 3d 20 73 69 7a );.. len += siz
a4e0: 65 3b 0a 09 20 20 65 6e 74 72 79 20 3d 20 67 65 e;.. entry = ge
a4f0: 74 5f 66 61 74 5f 65 6e 74 72 79 20 28 77 6f 72 t_fat_entry (wor
a500: 6b 62 6f 6f 6b 2d 3e 66 61 74 2c 20 73 65 63 74 kbook->fat, sect
a510: 6f 72 29 3b 0a 09 20 20 69 66 20 28 65 6e 74 72 or);.. if (entr
a520: 79 20 3d 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 y == NULL)..
a530: 7b 0a 09 09 2a 65 72 72 63 6f 64 65 20 3d 20 46 {...*errcode = F
a540: 52 45 45 58 4c 5f 43 46 42 46 5f 49 4c 4c 45 47 REEXL_CFBF_ILLEG
a550: 41 4c 5f 46 41 54 5f 45 4e 54 52 59 3b 0a 09 09 AL_FAT_ENTRY;...
a560: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d return 0;.. }
a570: 0a 09 20 20 69 66 20 28 65 6e 74 72 79 2d 3e 6e .. if (entry->n
a580: 65 78 74 5f 73 65 63 74 6f 72 20 3d 3d 20 30 78 ext_sector == 0x
a590: 66 66 66 66 66 66 66 65 29 0a 09 20 20 20 20 7b fffffffe).. {
a5a0: 0a 09 09 2f 2a 20 45 4f 46 3a 20 65 6e 64 2d 6f .../* EOF: end-o
a5b0: 66 2d 63 68 61 69 6e 20 6d 61 72 6b 65 72 20 66 f-chain marker f
a5c0: 6f 75 6e 64 20 2a 2f 0a 09 09 65 6f 66 20 3d 20 ound */...eof =
a5d0: 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 1;...break;..
a5e0: 20 7d 0a 09 20 20 73 65 63 74 6f 72 20 3d 20 65 }.. sector = e
a5f0: 6e 74 72 79 2d 3e 6e 65 78 74 5f 73 65 63 74 6f ntry->next_secto
a600: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 69 r;. }. i
a610: 66 20 28 21 65 6f 66 20 7c 7c 20 6c 65 6e 20 21 f (!eof || len !
a620: 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d = workbook->fat-
a630: 3e 6d 69 6e 69 46 41 54 5f 6c 65 6e 29 0a 20 20 >miniFAT_len).
a640: 20 20 20 20 7b 0a 09 20 20 66 72 65 65 20 28 6d {.. free (m
a650: 69 6e 69 53 74 72 65 61 6d 29 3b 0a 09 20 20 2a iniStream);.. *
a660: 65 72 72 63 6f 64 65 20 3d 20 46 52 45 45 58 4c errcode = FREEXL
a670: 5f 49 4e 56 41 4c 49 44 5f 4d 49 4e 49 5f 53 54 _INVALID_MINI_ST
a680: 52 45 41 4d 3b 0a 09 20 20 72 65 74 75 72 6e 20 REAM;.. return
a690: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 77 0;. }. w
a6a0: 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 6d 69 orkbook->fat->mi
a6b0: 6e 69 53 74 72 65 61 6d 20 3d 20 6d 69 6e 69 53 niStream = miniS
a6c0: 74 72 65 61 6d 3b 0a 20 20 20 20 72 65 74 75 72 tream;. retur
a6d0: 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 n 1;.}..static c
a6e0: 6f 6e 73 74 20 63 68 61 72 20 2a 0a 66 69 6e 64 onst char *.find
a6f0: 5f 69 6e 5f 53 53 54 20 28 62 69 66 66 5f 77 6f _in_SST (biff_wo
a700: 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f rkbook * workboo
a710: 6b 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 k, unsigned int
a720: 73 74 72 69 6e 67 5f 69 6e 64 65 78 29 0a 7b 0a string_index).{.
a730: 2f 2a 20 72 65 74 69 65 76 69 6e 67 20 61 20 73 /* retieving a s
a740: 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 53 tring from the S
a750: 53 54 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 77 ST */. if (!w
a760: 6f 72 6b 62 6f 6f 6b 29 0a 09 72 65 74 75 72 6e orkbook)..return
a770: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 77 NULL;. if (w
a780: 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f orkbook->shared_
a790: 73 74 72 69 6e 67 73 2e 75 74 66 38 5f 73 74 72 strings.utf8_str
a7a0: 69 6e 67 73 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 ings == NULL)..r
a7b0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 eturn NULL;.
a7c0: 69 66 20 28 73 74 72 69 6e 67 5f 69 6e 64 65 78 if (string_index
a7d0: 20 3c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 < workbook->sha
a7e0: 72 65 64 5f 73 74 72 69 6e 67 73 2e 73 74 72 69 red_strings.stri
a7f0: 6e 67 5f 63 6f 75 6e 74 29 0a 09 72 65 74 75 72 ng_count)..retur
a800: 6e 20 2a 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 n *(workbook->sh
a810: 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 75 74 66 ared_strings.utf
a820: 38 5f 73 74 72 69 6e 67 73 20 2b 20 73 74 72 69 8_strings + stri
a830: 6e 67 5f 69 6e 64 65 78 29 3b 0a 20 20 20 20 72 ng_index);. r
a840: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0a 73 eturn NULL;.}..s
a850: 74 61 74 69 63 20 69 6e 74 0a 70 61 72 73 65 5f tatic int.parse_
a860: 53 53 54 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f SST (biff_workbo
a870: 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 69 ok * workbook, i
a880: 6e 74 20 73 77 61 70 29 0a 7b 0a 2f 2a 20 61 74 nt swap).{./* at
a890: 74 65 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 tempting to pars
a8a0: 65 20 61 20 53 68 61 72 65 64 20 53 74 72 69 6e e a Shared Strin
a8b0: 67 20 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 75 g Table */. u
a8c0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 5f 73 74 nsigned int i_st
a8d0: 72 69 6e 67 3b 0a 20 20 20 20 75 6e 73 69 67 6e ring;. unsign
a8e0: 65 64 20 63 68 61 72 20 2a 70 5f 73 74 72 69 6e ed char *p_strin
a8f0: 67 3b 0a 20 20 20 20 62 69 66 66 5f 77 6f 72 64 g;. biff_word
a900: 33 32 20 6e 5f 73 74 72 69 6e 67 73 3b 0a 20 20 32 n_strings;.
a910: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 unsigned int r
a920: 65 71 75 69 72 65 64 3b 0a 20 20 20 20 75 6e 73 equired;. uns
a930: 69 67 6e 65 64 20 69 6e 74 20 61 76 61 69 6c 61 igned int availa
a940: 62 6c 65 3b 0a 0a 20 20 20 20 69 66 20 28 77 6f ble;.. if (wo
a950: 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 rkbook->shared_s
a960: 74 72 69 6e 67 73 2e 73 74 72 69 6e 67 5f 63 6f trings.string_co
a970: 75 6e 74 20 3d 3d 20 30 0a 09 26 26 20 77 6f 72 unt == 0..&& wor
a980: 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 kbook->shared_st
a990: 72 69 6e 67 73 2e 75 74 66 38 5f 73 74 72 69 6e rings.utf8_strin
a9a0: 67 73 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 gs == NULL).
a9b0: 20 20 7b 0a 09 20 20 2f 2a 20 6d 61 69 6e 20 53 {.. /* main S
a9c0: 53 54 20 72 65 63 6f 72 64 20 5b 69 6e 69 74 69 ST record [initi
a9d0: 61 6c 69 7a 69 6e 67 5d 20 2a 2f 0a 09 20 20 6d alizing] */.. m
a9e0: 65 6d 63 70 79 20 28 6e 5f 73 74 72 69 6e 67 73 emcpy (n_strings
a9f0: 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b .bytes, workbook
aa00: 2d 3e 72 65 63 6f 72 64 20 2b 20 34 2c 20 34 29 ->record + 4, 4)
aa10: 3b 0a 09 20 20 69 66 20 28 73 77 61 70 29 0a 09 ;.. if (swap)..
aa20: 20 20 20 20 20 20 73 77 61 70 33 32 20 28 26 6e swap32 (&n
aa30: 5f 73 74 72 69 6e 67 73 29 3b 0a 09 20 20 70 5f _strings);.. p_
aa40: 73 74 72 69 6e 67 20 3d 20 77 6f 72 6b 62 6f 6f string = workboo
aa50: 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 38 3b 0a 09 k->record + 8;..
aa60: 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 workbook->shar
aa70: 65 64 5f 73 74 72 69 6e 67 73 2e 73 74 72 69 6e ed_strings.strin
aa80: 67 5f 63 6f 75 6e 74 20 3d 20 6e 5f 73 74 72 69 g_count = n_stri
aa90: 6e 67 73 2e 76 61 6c 75 65 3b 0a 09 20 20 69 66 ngs.value;.. if
aaa0: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 (workbook->shar
aab0: 65 64 5f 73 74 72 69 6e 67 73 2e 73 74 72 69 6e ed_strings.strin
aac0: 67 5f 63 6f 75 6e 74 20 3e 20 31 30 32 34 20 2a g_count > 1024 *
aad0: 20 31 30 32 34 29 0a 09 20 20 20 20 7b 0a 09 09 1024).. {...
aae0: 2f 2a 20 75 6e 65 78 70 65 63 74 65 64 20 68 75 /* unexpected hu
aaf0: 67 65 20 63 6f 75 6e 74 20 2e 2e 2e 20 63 6f 77 ge count ... cow
ab00: 61 72 64 6c 79 20 67 69 76 69 6e 67 20 75 70 20 ardly giving up
ab10: 2e 2e 2e 20 2a 2f 0a 09 09 72 65 74 75 72 6e 20 ... */...return
ab20: 46 52 45 45 58 4c 5f 49 4e 53 55 46 46 49 43 49 FREEXL_INSUFFICI
ab30: 45 4e 54 5f 4d 45 4d 4f 52 59 3b 0a 09 20 20 20 ENT_MEMORY;..
ab40: 20 7d 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e }.. workbook->
ab50: 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 75 shared_strings.u
ab60: 74 66 38 5f 73 74 72 69 6e 67 73 20 3d 0a 09 20 tf8_strings =..
ab70: 20 20 20 20 20 6d 61 6c 6c 6f 63 20 28 73 69 7a malloc (siz
ab80: 65 6f 66 20 28 63 68 61 72 20 2a 2a 29 20 2a 20 eof (char **) *
ab90: 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 workbook->shared
aba0: 5f 73 74 72 69 6e 67 73 2e 73 74 72 69 6e 67 5f _strings.string_
abb0: 63 6f 75 6e 74 29 3b 0a 09 20 20 66 6f 72 20 28 count);.. for (
abc0: 69 5f 73 74 72 69 6e 67 20 3d 20 30 3b 20 69 5f i_string = 0; i_
abd0: 73 74 72 69 6e 67 20 3c 20 77 6f 72 6b 62 6f 6f string < workboo
abe0: 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 k->shared_string
abf0: 73 2e 73 74 72 69 6e 67 5f 63 6f 75 6e 74 3b 0a s.string_count;.
ac00: 09 20 20 20 20 20 20 20 69 5f 73 74 72 69 6e 67 . i_string
ac10: 2b 2b 29 0a 09 20 20 20 20 20 20 2a 28 77 6f 72 ++).. *(wor
ac20: 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 kbook->shared_st
ac30: 72 69 6e 67 73 2e 75 74 66 38 5f 73 74 72 69 6e rings.utf8_strin
ac40: 67 73 20 2b 20 69 5f 73 74 72 69 6e 67 29 20 3d gs + i_string) =
ac50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 NULL;. }.
ac60: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a else. {.
ac70: 09 20 20 2f 2a 20 53 53 54 2d 43 4f 4e 54 49 4e . /* SST-CONTIN
ac80: 55 45 20 2a 2f 0a 09 20 20 63 68 61 72 20 2a 75 UE */.. char *u
ac90: 74 66 38 5f 73 74 72 69 6e 67 3b 0a 09 20 20 75 tf8_string;.. u
aca0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 nsigned char mas
acb0: 6b 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 69 k;.. unsigned i
acc0: 6e 74 20 6c 65 6e 3b 0a 09 20 20 69 6e 74 20 75 nt len;.. int u
acd0: 74 66 31 36 20 3d 20 30 3b 0a 09 20 20 69 6e 74 tf16 = 0;.. int
ace0: 20 65 72 72 3b 0a 09 20 20 75 6e 73 69 67 6e 65 err;.. unsigne
acf0: 64 20 69 6e 74 20 75 74 66 31 36 5f 6c 65 6e 20 d int utf16_len
ad00: 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 = workbook->shar
ad10: 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 65 ed_strings.curre
ad20: 6e 74 5f 75 74 66 31 36 5f 6c 65 6e 3b 0a 09 20 nt_utf16_len;..
ad30: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 74 unsigned int ut
ad40: 66 31 36 5f 6f 66 66 20 3d 20 77 6f 72 6b 62 6f f16_off = workbo
ad50: 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e ok->shared_strin
ad60: 67 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 36 gs.current_utf16
ad70: 5f 6f 66 66 3b 0a 09 20 20 75 6e 73 69 67 6e 65 _off;.. unsigne
ad80: 64 20 69 6e 74 20 75 74 66 31 36 5f 73 6b 69 70 d int utf16_skip
ad90: 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 = workbook->sha
ada0: 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 red_strings.curr
adb0: 65 6e 74 5f 75 74 66 31 36 5f 73 6b 69 70 3b 0a ent_utf16_skip;.
adc0: 09 20 20 63 68 61 72 20 2a 75 74 66 31 36 5f 62 . char *utf16_b
add0: 75 66 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 uf = workbook->s
ade0: 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 hared_strings.cu
adf0: 72 72 65 6e 74 5f 75 74 66 31 36 5f 62 75 66 3b rrent_utf16_buf;
ae00: 0a 09 20 20 70 5f 73 74 72 69 6e 67 20 3d 20 77 .. p_string = w
ae10: 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 3b orkbook->record;
ae20: 0a 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f ... if (workboo
ae30: 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 k->shared_string
ae40: 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 36 5f s.current_utf16_
ae50: 6c 65 6e 20 3e 20 30 29 0a 09 20 20 20 20 7b 0a len > 0).. {.
ae60: 09 09 2f 2a 20 63 6f 6d 70 6c 65 74 69 6e 67 20 ../* completing
ae70: 74 68 65 20 6c 61 73 74 20 73 75 73 70 65 6e 64 the last suspend
ae80: 65 64 20 73 74 72 69 6e 67 20 5b 73 70 6c 69 74 ed string [split
ae90: 20 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 between records
aea0: 5d 20 2a 2f 0a 09 09 6d 61 73 6b 20 3d 20 2a 70 ] */...mask = *p
aeb0: 5f 73 74 72 69 6e 67 3b 0a 09 09 70 5f 73 74 72 _string;...p_str
aec0: 69 6e 67 2b 2b 3b 0a 09 09 6c 65 6e 20 3d 20 75 ing++;...len = u
aed0: 74 66 31 36 5f 6c 65 6e 20 2d 20 75 74 66 31 36 tf16_len - utf16
aee0: 5f 6f 66 66 3b 0a 0a 09 09 69 66 20 28 28 6d 61 _off;....if ((ma
aef0: 73 6b 20 26 20 30 78 30 31 29 20 3d 3d 20 30 78 sk & 0x01) == 0x
af00: 30 31 29 0a 09 09 20 20 20 20 75 74 66 31 36 20 01)... utf16
af10: 3d 20 31 3b 0a 09 09 69 66 20 28 21 75 74 66 31 = 1;...if (!utf1
af20: 36 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 6)... {...
af30: 20 2f 2a 20 27 73 74 72 69 70 70 65 64 27 20 55 /* 'stripped' U
af40: 54 46 2d 31 36 3a 20 72 65 71 75 69 72 65 73 20 TF-16: requires
af50: 70 61 64 64 69 6e 67 20 2a 2f 0a 09 09 20 20 20 padding */...
af60: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
af70: 69 3b 0a 09 09 20 20 20 20 20 20 66 6f 72 20 28 i;... for (
af80: 69 20 3d 20 30 3b 20 69 20 3c 20 6c 65 6e 3b 20 i = 0; i < len;
af90: 69 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 i++)....{....
afa0: 20 2a 28 75 74 66 31 36 5f 62 75 66 20 2b 20 28 *(utf16_buf + (
afb0: 75 74 66 31 36 5f 6f 66 66 20 2a 20 32 29 20 2b utf16_off * 2) +
afc0: 20 28 69 20 2a 20 32 29 29 20 3d 0a 09 09 09 09 (i * 2)) =.....
afd0: 2a 70 5f 73 74 72 69 6e 67 3b 0a 09 09 09 20 20 *p_string;....
afe0: 20 20 70 5f 73 74 72 69 6e 67 2b 2b 3b 0a 09 09 p_string++;...
aff0: 09 20 20 20 20 2a 28 75 74 66 31 36 5f 62 75 66 . *(utf16_buf
b000: 20 2b 20 28 75 74 66 31 36 5f 6f 66 66 20 2a 20 + (utf16_off *
b010: 32 29 20 2b 20 28 28 69 20 2a 20 32 29 20 2b 20 2) + ((i * 2) +
b020: 31 29 29 20 3d 0a 09 09 09 09 30 78 30 30 3b 0a 1)) =.....0x00;.
b030: 09 09 09 7d 0a 09 09 20 20 7d 0a 09 09 65 6c 73 ...}... }...els
b040: 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 e... {...
b050: 2f 2a 20 61 6c 72 65 61 64 79 20 65 6e 63 6f 64 /* already encod
b060: 65 64 20 61 73 20 55 54 46 2d 31 36 20 2a 2f 0a ed as UTF-16 */.
b070: 09 09 20 20 20 20 20 20 6d 65 6d 63 70 79 20 28 .. memcpy (
b080: 75 74 66 31 36 5f 62 75 66 20 2b 20 28 75 74 66 utf16_buf + (utf
b090: 31 36 5f 6f 66 66 20 2a 20 32 29 2c 20 70 5f 73 16_off * 2), p_s
b0a0: 74 72 69 6e 67 2c 20 6c 65 6e 20 2a 20 32 29 3b tring, len * 2);
b0b0: 0a 09 09 20 20 20 20 20 20 70 5f 73 74 72 69 6e ... p_strin
b0c0: 67 20 2b 3d 20 6c 65 6e 20 2a 20 32 3b 0a 09 09 g += len * 2;...
b0d0: 20 20 7d 0a 0a 09 09 2f 2a 20 73 6b 69 70 70 69 }..../* skippi
b0e0: 6e 67 20 65 78 74 72 61 20 64 61 74 61 20 28 69 ng extra data (i
b0f0: 66 20 61 6e 79 29 20 2a 2f 0a 09 09 70 5f 73 74 f any) */...p_st
b100: 72 69 6e 67 20 2b 3d 20 75 74 66 31 36 5f 73 6b ring += utf16_sk
b110: 69 70 3b 0a 0a 09 09 2f 2a 20 63 6f 6e 76 65 72 ip;..../* conver
b120: 74 69 6e 67 20 74 65 78 74 20 74 6f 20 55 54 46 ting text to UTF
b130: 2d 38 20 2a 2f 0a 09 09 75 74 66 38 5f 73 74 72 -8 */...utf8_str
b140: 69 6e 67 20 3d 0a 09 09 20 20 20 20 63 6f 6e 76 ing =... conv
b150: 65 72 74 5f 74 6f 5f 75 74 66 38 20 28 77 6f 72 ert_to_utf8 (wor
b160: 6b 62 6f 6f 6b 2d 3e 75 74 66 31 36 5f 63 6f 6e kbook->utf16_con
b170: 76 65 72 74 65 72 2c 20 75 74 66 31 36 5f 62 75 verter, utf16_bu
b180: 66 2c 0a 09 09 09 09 20 20 20 20 20 75 74 66 31 f,..... utf1
b190: 36 5f 6c 65 6e 20 2a 20 32 2c 20 26 65 72 72 29 6_len * 2, &err)
b1a0: 3b 0a 09 09 69 66 20 28 65 72 72 29 0a 09 09 20 ;...if (err)...
b1b0: 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c return FREEXL
b1c0: 5f 49 4e 56 41 4c 49 44 5f 43 48 41 52 41 43 54 _INVALID_CHARACT
b1d0: 45 52 3b 0a 09 09 2a 28 77 6f 72 6b 62 6f 6f 6b ER;...*(workbook
b1e0: 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 ->shared_strings
b1f0: 2e 75 74 66 38 5f 73 74 72 69 6e 67 73 20 2b 0a .utf8_strings +.
b200: 09 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 .. workbook->sh
b210: 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 ared_strings.cur
b220: 72 65 6e 74 5f 69 6e 64 65 78 29 20 3d 20 75 74 rent_index) = ut
b230: 66 38 5f 73 74 72 69 6e 67 3b 0a 09 09 66 72 65 f8_string;...fre
b240: 65 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 e (workbook->sha
b250: 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 red_strings.curr
b260: 65 6e 74 5f 75 74 66 31 36 5f 62 75 66 29 3b 0a ent_utf16_buf);.
b270: 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 ..workbook->shar
b280: 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 65 ed_strings.curre
b290: 6e 74 5f 75 74 66 31 36 5f 62 75 66 20 3d 20 4e nt_utf16_buf = N
b2a0: 55 4c 4c 3b 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d ULL;...workbook-
b2b0: 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e >shared_strings.
b2c0: 63 75 72 72 65 6e 74 5f 75 74 66 31 36 5f 6c 65 current_utf16_le
b2d0: 6e 20 3d 20 30 3b 0a 09 09 77 6f 72 6b 62 6f 6f n = 0;...workboo
b2e0: 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 k->shared_string
b2f0: 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 36 5f s.current_utf16_
b300: 6f 66 66 20 3d 20 30 3b 0a 09 09 77 6f 72 6b 62 off = 0;...workb
b310: 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 ook->shared_stri
b320: 6e 67 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 ngs.current_utf1
b330: 36 5f 73 6b 69 70 20 3d 20 30 3b 0a 09 09 77 6f 6_skip = 0;...wo
b340: 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 rkbook->shared_s
b350: 74 72 69 6e 67 73 2e 63 75 72 72 65 6e 74 5f 69 trings.current_i
b360: 6e 64 65 78 20 2b 3d 20 31 3b 0a 09 20 20 20 20 ndex += 1;..
b370: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 66 }. }.. f
b380: 6f 72 20 28 69 5f 73 74 72 69 6e 67 20 3d 20 77 or (i_string = w
b390: 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f orkbook->shared_
b3a0: 73 74 72 69 6e 67 73 2e 63 75 72 72 65 6e 74 5f strings.current_
b3b0: 69 6e 64 65 78 3b 0a 09 20 69 5f 73 74 72 69 6e index;.. i_strin
b3c0: 67 20 3c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 g < workbook->sh
b3d0: 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 73 74 72 ared_strings.str
b3e0: 69 6e 67 5f 63 6f 75 6e 74 3b 20 69 5f 73 74 72 ing_count; i_str
b3f0: 69 6e 67 2b 2b 29 0a 20 20 20 20 20 20 7b 0a 09 ing++). {..
b400: 20 20 2f 2a 20 70 61 72 73 69 6e 67 20 73 74 72 /* parsing str
b410: 69 6e 67 73 20 2a 2f 0a 09 20 20 63 68 61 72 20 ings */.. char
b420: 2a 75 74 66 38 5f 73 74 72 69 6e 67 3b 0a 09 20 *utf8_string;..
b430: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 unsigned int le
b440: 6e 3b 0a 09 20 20 69 6e 74 20 75 74 66 31 36 20 n;.. int utf16
b450: 3d 20 30 3b 0a 09 20 20 62 69 66 66 5f 77 6f 72 = 0;.. biff_wor
b460: 64 31 36 20 77 6f 72 64 31 36 3b 0a 09 20 20 75 d16 word16;.. u
b470: 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 74 61 72 nsigned int star
b480: 74 5f 6f 66 66 73 65 74 3b 0a 09 20 20 75 6e 73 t_offset;.. uns
b490: 69 67 6e 65 64 20 69 6e 74 20 65 78 74 72 61 5f igned int extra_
b4a0: 73 6b 69 70 3b 0a 0a 09 20 20 69 66 20 28 28 75 skip;... if ((u
b4b0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 28 70 5f nsigned int) (p_
b4c0: 73 74 72 69 6e 67 20 2d 20 77 6f 72 6b 62 6f 6f string - workboo
b4d0: 6b 2d 3e 72 65 63 6f 72 64 29 20 3e 3d 0a 09 20 k->record) >=..
b4e0: 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 workbook->r
b4f0: 65 63 6f 72 64 5f 73 69 7a 65 29 0a 09 20 20 20 ecord_size)..
b500: 20 7b 0a 09 09 2f 2a 20 65 6e 64 20 6f 66 20 72 {.../* end of r
b510: 65 63 6f 72 64 20 2a 2f 0a 09 09 72 65 74 75 72 ecord */...retur
b520: 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 09 20 20 n FREEXL_OK;..
b530: 20 20 7d 0a 0a 09 20 20 6d 65 6d 63 70 79 20 28 }... memcpy (
b540: 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 70 5f word16.bytes, p_
b550: 73 74 72 69 6e 67 2c 20 32 29 3b 0a 09 20 20 69 string, 2);.. i
b560: 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 20 f (swap)..
b570: 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 swap16 (&word16)
b580: 3b 0a 09 20 20 6c 65 6e 20 3d 20 77 6f 72 64 31 ;.. len = word1
b590: 36 2e 76 61 6c 75 65 3b 0a 09 20 20 70 5f 73 74 6.value;.. p_st
b5a0: 72 69 6e 67 20 2b 3d 20 32 3b 0a 0a 09 20 20 67 ring += 2;... g
b5b0: 65 74 5f 75 6e 69 63 6f 64 65 5f 70 61 72 61 6d et_unicode_param
b5c0: 73 20 28 70 5f 73 74 72 69 6e 67 2c 20 73 77 61 s (p_string, swa
b5d0: 70 2c 20 26 73 74 61 72 74 5f 6f 66 66 73 65 74 p, &start_offset
b5e0: 2c 20 26 75 74 66 31 36 2c 0a 09 09 09 20 20 20 , &utf16,....
b5f0: 20 20 20 26 65 78 74 72 61 5f 73 6b 69 70 29 3b &extra_skip);
b600: 0a 09 20 20 70 5f 73 74 72 69 6e 67 20 2b 3d 20 .. p_string +=
b610: 73 74 61 72 74 5f 6f 66 66 73 65 74 3b 0a 0a 09 start_offset;...
b620: 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69 7a 69 6e /* initializin
b630: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 55 54 g the current UT
b640: 46 2d 31 36 20 76 61 72 69 61 62 6c 65 73 20 2a F-16 variables *
b650: 2f 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 /.. workbook->s
b660: 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 hared_strings.cu
b670: 72 72 65 6e 74 5f 75 74 66 31 36 5f 73 6b 69 70 rrent_utf16_skip
b680: 20 3d 20 65 78 74 72 61 5f 73 6b 69 70 3b 0a 09 = extra_skip;..
b690: 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 workbook->shar
b6a0: 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 65 ed_strings.curre
b6b0: 6e 74 5f 75 74 66 31 36 5f 6f 66 66 20 3d 20 30 nt_utf16_off = 0
b6c0: 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 ;.. workbook->s
b6d0: 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 hared_strings.cu
b6e0: 72 72 65 6e 74 5f 75 74 66 31 36 5f 6c 65 6e 20 rrent_utf16_len
b6f0: 3d 20 6c 65 6e 3b 0a 09 20 20 77 6f 72 6b 62 6f = len;.. workbo
b700: 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e ok->shared_strin
b710: 67 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 36 gs.current_utf16
b720: 5f 62 75 66 20 3d 0a 09 20 20 20 20 20 20 6d 61 _buf =.. ma
b730: 6c 6c 6f 63 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e lloc (workbook->
b740: 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 shared_strings.c
b750: 75 72 72 65 6e 74 5f 75 74 66 31 36 5f 6c 65 6e urrent_utf16_len
b760: 20 2a 20 32 29 3b 0a 0a 09 20 20 69 66 20 28 21 * 2);... if (!
b770: 75 74 66 31 36 29 0a 09 20 20 20 20 20 20 72 65 utf16).. re
b780: 71 75 69 72 65 64 20 3d 20 6c 65 6e 3b 0a 09 20 quired = len;..
b790: 20 65 6c 73 65 0a 09 20 20 20 20 20 20 72 65 71 else.. req
b7a0: 75 69 72 65 64 20 3d 20 6c 65 6e 20 2a 20 32 3b uired = len * 2;
b7b0: 0a 09 20 20 61 76 61 69 6c 61 62 6c 65 20 3d 20 .. available =
b7c0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
b7d0: 5f 73 69 7a 65 20 2d 20 28 70 5f 73 74 72 69 6e _size - (p_strin
b7e0: 67 20 2d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 g - workbook->re
b7f0: 63 6f 72 64 29 3b 0a 09 20 20 69 66 20 28 72 65 cord);.. if (re
b800: 71 75 69 72 65 64 20 3e 20 61 76 61 69 6c 61 62 quired > availab
b810: 6c 65 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 le).. {.../*
b820: 6e 6f 74 20 65 6e 6f 75 67 68 20 69 6e 70 75 74 not enough input
b830: 20 62 79 74 65 73 3a 20 64 61 74 61 20 73 70 61 bytes: data spa
b840: 6e 6e 69 6e 67 20 6f 6e 20 6e 65 78 74 20 43 4f nning on next CO
b850: 4e 54 49 4e 55 45 20 72 65 63 6f 72 64 20 2a 2f NTINUE record */
b860: 0a 09 09 63 68 61 72 20 2a 75 74 66 31 36 5f 62 ...char *utf16_b
b870: 75 66 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 uf = workbook->s
b880: 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 hared_strings.cu
b890: 72 72 65 6e 74 5f 75 74 66 31 36 5f 62 75 66 3b rrent_utf16_buf;
b8a0: 0a 09 09 69 66 20 28 21 75 74 66 31 36 29 0a 09 ...if (!utf16)..
b8b0: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 . {... /*
b8c0: 27 73 74 72 69 70 70 65 64 27 20 55 54 46 2d 31 'stripped' UTF-1
b8d0: 36 3a 20 72 65 71 75 69 72 65 73 20 70 61 64 64 6: requires padd
b8e0: 69 6e 67 20 2a 2f 0a 09 09 20 20 20 20 20 20 75 ing */... u
b8f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 09 nsigned int i;..
b900: 09 20 20 20 20 20 20 66 6f 72 20 28 69 20 3d 20 . for (i =
b910: 30 3b 20 69 20 3c 20 61 76 61 69 6c 61 62 6c 65 0; i < available
b920: 3b 20 69 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 ; i++)....{....
b930: 20 20 20 2a 28 75 74 66 31 36 5f 62 75 66 20 2b *(utf16_buf +
b940: 20 28 69 20 2a 20 32 29 29 20 3d 20 2a 70 5f 73 (i * 2)) = *p_s
b950: 74 72 69 6e 67 3b 0a 09 09 09 20 20 20 20 70 5f tring;.... p_
b960: 73 74 72 69 6e 67 2b 2b 3b 0a 09 09 09 20 20 20 string++;....
b970: 20 2a 28 75 74 66 31 36 5f 62 75 66 20 2b 20 28 *(utf16_buf + (
b980: 28 69 20 2a 20 32 29 20 2b 20 31 29 29 20 3d 20 (i * 2) + 1)) =
b990: 30 78 30 30 3b 0a 09 09 09 7d 0a 09 09 20 20 20 0x00;....}...
b9a0: 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 workbook->sha
b9b0: 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 red_strings.curr
b9c0: 65 6e 74 5f 75 74 66 31 36 5f 6f 66 66 20 3d 20 ent_utf16_off =
b9d0: 61 76 61 69 6c 61 62 6c 65 3b 0a 09 09 20 20 7d available;... }
b9e0: 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 ...else... {...
b9f0: 20 20 20 20 20 20 2f 2a 20 61 6c 72 65 61 64 79 /* already
ba00: 20 65 6e 63 6f 64 65 64 20 61 73 20 55 54 46 2d encoded as UTF-
ba10: 31 36 20 2a 2f 0a 09 09 20 20 20 20 20 20 6d 65 16 */... me
ba20: 6d 63 70 79 20 28 75 74 66 31 36 5f 62 75 66 2c mcpy (utf16_buf,
ba30: 20 70 5f 73 74 72 69 6e 67 2c 20 61 76 61 69 6c p_string, avail
ba40: 61 62 6c 65 29 3b 0a 09 09 20 20 20 20 20 20 77 able);... w
ba50: 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f orkbook->shared_
ba60: 73 74 72 69 6e 67 73 2e 63 75 72 72 65 6e 74 5f strings.current_
ba70: 75 74 66 31 36 5f 6f 66 66 20 3d 0a 09 09 09 20 utf16_off =....
ba80: 20 61 76 61 69 6c 61 62 6c 65 20 2f 20 32 3b 0a available / 2;.
ba90: 09 09 20 20 7d 0a 09 09 72 65 74 75 72 6e 20 46 .. }...return F
baa0: 52 45 45 58 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d REEXL_OK;.. }
bab0: 0a 0a 09 20 20 69 66 20 28 21 70 61 72 73 65 5f ... if (!parse_
bac0: 75 6e 69 63 6f 64 65 5f 73 74 72 69 6e 67 0a 09 unicode_string..
bad0: 20 20 20 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2d (workbook-
bae0: 3e 75 74 66 31 36 5f 63 6f 6e 76 65 72 74 65 72 >utf16_converter
baf0: 2c 20 6c 65 6e 2c 20 75 74 66 31 36 2c 20 70 5f , len, utf16, p_
bb00: 73 74 72 69 6e 67 2c 20 26 75 74 66 38 5f 73 74 string, &utf8_st
bb10: 72 69 6e 67 29 29 0a 09 20 20 20 20 20 20 72 65 ring)).. re
bb20: 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e 56 41 turn FREEXL_INVA
bb30: 4c 49 44 5f 43 48 41 52 41 43 54 45 52 3b 0a 0a LID_CHARACTER;..
bb40: 09 20 20 2f 2a 20 73 6b 69 70 70 69 6e 67 20 73 . /* skipping s
bb50: 74 72 69 6e 67 20 64 61 74 61 20 2a 2f 0a 09 20 tring data */..
bb60: 20 69 66 20 28 21 75 74 66 31 36 29 0a 09 20 20 if (!utf16)..
bb70: 20 20 20 20 70 5f 73 74 72 69 6e 67 20 2b 3d 20 p_string +=
bb80: 6c 65 6e 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 len;.. else..
bb90: 20 20 20 20 70 5f 73 74 72 69 6e 67 20 2b 3d 20 p_string +=
bba0: 6c 65 6e 20 2a 20 32 3b 0a 09 20 20 2f 2a 20 73 len * 2;.. /* s
bbb0: 6b 69 70 70 69 6e 67 20 65 78 74 72 61 20 64 61 kipping extra da
bbc0: 74 61 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 09 ta (if any) */..
bbd0: 20 20 70 5f 73 74 72 69 6e 67 20 2b 3d 20 77 6f p_string += wo
bbe0: 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 rkbook->shared_s
bbf0: 74 72 69 6e 67 73 2e 63 75 72 72 65 6e 74 5f 75 trings.current_u
bc00: 74 66 31 36 5f 73 6b 69 70 3b 0a 0a 09 20 20 2a tf16_skip;... *
bc10: 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 (workbook->share
bc20: 64 5f 73 74 72 69 6e 67 73 2e 75 74 66 38 5f 73 d_strings.utf8_s
bc30: 74 72 69 6e 67 73 20 2b 20 69 5f 73 74 72 69 6e trings + i_strin
bc40: 67 29 20 3d 20 75 74 66 38 5f 73 74 72 69 6e 67 g) = utf8_string
bc50: 3b 0a 09 20 20 66 72 65 65 20 28 77 6f 72 6b 62 ;.. free (workb
bc60: 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 ook->shared_stri
bc70: 6e 67 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 ngs.current_utf1
bc80: 36 5f 62 75 66 29 3b 0a 09 20 20 77 6f 72 6b 62 6_buf);.. workb
bc90: 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 ook->shared_stri
bca0: 6e 67 73 2e 63 75 72 72 65 6e 74 5f 75 74 66 31 ngs.current_utf1
bcb0: 36 5f 62 75 66 20 3d 20 4e 55 4c 4c 3b 0a 09 20 6_buf = NULL;..
bcc0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 workbook->share
bcd0: 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 72 65 6e d_strings.curren
bce0: 74 5f 75 74 66 31 36 5f 6c 65 6e 20 3d 20 30 3b t_utf16_len = 0;
bcf0: 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 .. workbook->sh
bd00: 61 72 65 64 5f 73 74 72 69 6e 67 73 2e 63 75 72 ared_strings.cur
bd10: 72 65 6e 74 5f 75 74 66 31 36 5f 6f 66 66 20 3d rent_utf16_off =
bd20: 20 30 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 0;.. workbook-
bd30: 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 2e >shared_strings.
bd40: 63 75 72 72 65 6e 74 5f 75 74 66 31 36 5f 73 6b current_utf16_sk
bd50: 69 70 20 3d 20 30 3b 0a 09 20 20 77 6f 72 6b 62 ip = 0;.. workb
bd60: 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 ook->shared_stri
bd70: 6e 67 73 2e 63 75 72 72 65 6e 74 5f 69 6e 64 65 ngs.current_inde
bd80: 78 20 3d 20 69 5f 73 74 72 69 6e 67 20 2b 20 31 x = i_string + 1
bd90: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 72 ;. }.. r
bda0: 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b eturn FREEXL_OK;
bdb0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a .}..static void.
bdc0: 63 68 65 63 6b 5f 66 6f 72 6d 61 74 20 28 63 68 check_format (ch
bdd0: 61 72 20 2a 75 74 66 38 5f 73 74 72 69 6e 67 2c ar *utf8_string,
bde0: 20 69 6e 74 20 2a 69 73 5f 64 61 74 65 2c 20 69 int *is_date, i
bdf0: 6e 74 20 2a 69 73 5f 64 61 74 65 74 69 6d 65 2c nt *is_datetime,
be00: 20 69 6e 74 20 2a 69 73 5f 74 69 6d 65 29 0a 7b int *is_time).{
be10: 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 ./* attempting t
be20: 6f 20 69 64 65 6e 74 69 66 79 20 44 41 54 45 2c o identify DATE,
be30: 20 44 41 54 45 54 49 4d 45 20 6f 72 20 54 49 4d DATETIME or TIM
be40: 45 20 66 6f 72 6d 61 74 73 20 2a 2f 0a 20 20 20 E formats */.
be50: 20 69 6e 74 20 79 20 3d 20 30 3b 0a 20 20 20 20 int y = 0;.
be60: 69 6e 74 20 6d 20 3d 20 30 3b 0a 20 20 20 20 69 int m = 0;. i
be70: 6e 74 20 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e nt d = 0;. in
be80: 74 20 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 t h = 0;. int
be90: 20 73 20 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 s = 0;. unsi
bea0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 gned int i;.
beb0: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 for (i = 0; i <
bec0: 73 74 72 6c 65 6e 20 28 75 74 66 38 5f 73 74 72 strlen (utf8_str
bed0: 69 6e 67 29 3b 20 69 2b 2b 29 0a 20 20 20 20 20 ing); i++).
bee0: 20 7b 0a 09 20 20 73 77 69 74 63 68 20 28 75 74 {.. switch (ut
bef0: 66 38 5f 73 74 72 69 6e 67 5b 69 5d 29 0a 09 20 f8_string[i])..
bf00: 20 20 20 7b 0a 09 20 20 20 20 63 61 73 65 20 27 {.. case '
bf10: 59 27 3a 0a 09 20 20 20 20 63 61 73 65 20 27 79 Y':.. case 'y
bf20: 27 3a 0a 09 09 79 2b 2b 3b 0a 09 09 62 72 65 61 ':...y++;...brea
bf30: 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 27 4d 27 k;.. case 'M'
bf40: 3a 0a 09 20 20 20 20 63 61 73 65 20 27 6d 27 3a :.. case 'm':
bf50: 0a 09 09 6d 2b 2b 3b 0a 09 09 62 72 65 61 6b 3b ...m++;...break;
bf60: 0a 09 20 20 20 20 63 61 73 65 20 27 44 27 3a 0a .. case 'D':.
bf70: 09 20 20 20 20 63 61 73 65 20 27 64 27 3a 0a 09 . case 'd':..
bf80: 09 64 2b 2b 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 .d++;...break;..
bf90: 20 20 20 20 63 61 73 65 20 27 48 27 3a 0a 09 20 case 'H':..
bfa0: 20 20 20 63 61 73 65 20 27 68 27 3a 0a 09 09 68 case 'h':...h
bfb0: 2b 2b 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 ++;...break;..
bfc0: 20 20 63 61 73 65 20 27 53 27 3a 0a 09 20 20 20 case 'S':..
bfd0: 20 63 61 73 65 20 27 73 27 3a 0a 09 09 73 2b 2b case 's':...s++
bfe0: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
bff0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 2a 69 }. }. *i
c000: 73 5f 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 s_date = 0;.
c010: 2a 69 73 5f 64 61 74 65 74 69 6d 65 20 3d 20 30 *is_datetime = 0
c020: 3b 0a 20 20 20 20 2a 69 73 5f 74 69 6d 65 20 3d ;. *is_time =
c030: 20 30 3b 0a 20 20 20 20 69 66 20 28 79 20 26 26 0;. if (y &&
c040: 20 6d 20 26 26 20 64 20 26 26 20 68 29 0a 20 20 m && d && h).
c050: 20 20 20 20 7b 0a 09 20 20 2a 69 73 5f 64 61 74 {.. *is_dat
c060: 65 74 69 6d 65 20 3d 20 31 3b 0a 09 20 20 72 65 etime = 1;.. re
c070: 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 turn;. }.
c080: 20 20 69 66 20 28 28 79 20 26 26 20 6d 29 20 7c if ((y && m) |
c090: 7c 20 28 6d 20 26 26 20 64 29 29 0a 20 20 20 20 | (m && d)).
c0a0: 20 20 7b 0a 09 20 20 2a 69 73 5f 64 61 74 65 20 {.. *is_date
c0b0: 3d 20 31 3b 0a 09 20 20 72 65 74 75 72 6e 3b 0a = 1;.. return;.
c0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 }. if (
c0d0: 28 68 20 26 26 20 6d 29 20 7c 7c 20 28 6d 20 26 (h && m) || (m &
c0e0: 26 20 73 29 29 0a 09 2a 69 73 5f 74 69 6d 65 20 & s))..*is_time
c0f0: 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 = 1;.}..static v
c100: 6f 69 64 0a 61 64 64 5f 66 6f 72 6d 61 74 5f 74 oid.add_format_t
c110: 6f 5f 77 6f 72 6b 62 6f 6f 6b 20 28 62 69 66 66 o_workbook (biff
c120: 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b _workbook * work
c130: 62 6f 6f 6b 2c 20 75 6e 73 69 67 6e 65 64 20 73 book, unsigned s
c140: 68 6f 72 74 20 66 6f 72 6d 61 74 5f 69 6e 64 65 hort format_inde
c150: 78 2c 0a 09 09 09 69 6e 74 20 69 73 5f 64 61 74 x,....int is_dat
c160: 65 2c 20 69 6e 74 20 69 73 5f 64 61 74 65 74 69 e, int is_dateti
c170: 6d 65 2c 20 69 6e 74 20 69 73 5f 74 69 6d 65 29 me, int is_time)
c180: 0a 7b 0a 2f 2a 20 61 64 64 69 6e 67 20 61 20 6e .{./* adding a n
c190: 65 77 20 44 41 54 45 2f 44 41 54 45 54 49 4d 45 ew DATE/DATETIME
c1a0: 2f 54 49 4d 45 20 66 6f 72 6d 61 74 20 74 6f 20 /TIME format to
c1b0: 74 68 65 20 57 6f 72 6b 62 6f 6f 6b 20 2a 2f 0a the Workbook */.
c1c0: 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b if (workbook
c1d0: 2d 3e 6d 61 78 5f 66 6f 72 6d 61 74 5f 69 6e 64 ->max_format_ind
c1e0: 65 78 20 3c 20 42 49 46 46 5f 4d 41 58 5f 46 4f ex < BIFF_MAX_FO
c1f0: 52 4d 41 54 29 0a 20 20 20 20 20 20 7b 0a 09 20 RMAT). {..
c200: 20 62 69 66 66 5f 66 6f 72 6d 61 74 20 2a 66 6f biff_format *fo
c210: 72 6d 61 74 20 3d 0a 09 20 20 20 20 20 20 77 6f rmat =.. wo
c220: 72 6b 62 6f 6f 6b 2d 3e 66 6f 72 6d 61 74 5f 61 rkbook->format_a
c230: 72 72 61 79 20 2b 20 77 6f 72 6b 62 6f 6f 6b 2d rray + workbook-
c240: 3e 6d 61 78 5f 66 6f 72 6d 61 74 5f 69 6e 64 65 >max_format_inde
c250: 78 3b 0a 09 20 20 66 6f 72 6d 61 74 2d 3e 66 6f x;.. format->fo
c260: 72 6d 61 74 5f 69 6e 64 65 78 20 3d 20 66 6f 72 rmat_index = for
c270: 6d 61 74 5f 69 6e 64 65 78 3b 0a 09 20 20 66 6f mat_index;.. fo
c280: 72 6d 61 74 2d 3e 69 73 5f 64 61 74 65 20 3d 20 rmat->is_date =
c290: 69 73 5f 64 61 74 65 3b 0a 09 20 20 66 6f 72 6d is_date;.. form
c2a0: 61 74 2d 3e 69 73 5f 64 61 74 65 74 69 6d 65 20 at->is_datetime
c2b0: 3d 20 69 73 5f 64 61 74 65 74 69 6d 65 3b 0a 09 = is_datetime;..
c2c0: 20 20 66 6f 72 6d 61 74 2d 3e 69 73 5f 74 69 6d format->is_tim
c2d0: 65 20 3d 20 69 73 5f 74 69 6d 65 3b 0a 09 20 20 e = is_time;..
c2e0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 78 5f 66 6f workbook->max_fo
c2f0: 72 6d 61 74 5f 69 6e 64 65 78 20 2b 3d 20 31 3b rmat_index += 1;
c300: 0a 20 20 20 20 20 20 7d 0a 7d 0a 0a 73 74 61 74 . }.}..stat
c310: 69 63 20 76 6f 69 64 0a 61 64 64 5f 78 66 5f 74 ic void.add_xf_t
c320: 6f 5f 77 6f 72 6b 62 6f 6f 6b 20 28 62 69 66 66 o_workbook (biff
c330: 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b _workbook * work
c340: 62 6f 6f 6b 2c 20 75 6e 73 69 67 6e 65 64 20 73 book, unsigned s
c350: 68 6f 72 74 20 66 6f 72 6d 61 74 5f 69 6e 64 65 hort format_inde
c360: 78 29 0a 7b 0a 2f 2a 20 61 64 64 69 6e 67 20 61 x).{./* adding a
c370: 20 6e 65 77 20 58 46 20 74 6f 20 74 68 65 20 57 new XF to the W
c380: 6f 72 6b 62 6f 6f 6b 20 2a 2f 0a 20 20 20 20 69 orkbook */. i
c390: 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 f (workbook->bif
c3a0: 66 5f 78 66 5f 6e 65 78 74 5f 69 6e 64 65 78 20 f_xf_next_index
c3b0: 3c 20 42 49 46 46 5f 4d 41 58 5f 58 46 29 0a 09 < BIFF_MAX_XF)..
c3c0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 78 workbook->biff_x
c3d0: 66 5f 61 72 72 61 79 5b 77 6f 72 6b 62 6f 6f 6b f_array[workbook
c3e0: 2d 3e 62 69 66 66 5f 78 66 5f 6e 65 78 74 5f 69 ->biff_xf_next_i
c3f0: 6e 64 65 78 5d 20 3d 20 66 6f 72 6d 61 74 5f 69 ndex] = format_i
c400: 6e 64 65 78 3b 0a 20 20 20 20 77 6f 72 6b 62 6f ndex;. workbo
c410: 6f 6b 2d 3e 62 69 66 66 5f 78 66 5f 6e 65 78 74 ok->biff_xf_next
c420: 5f 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 7d 0a 0a _index += 1;.}..
c430: 73 74 61 74 69 63 20 69 6e 74 0a 6c 65 67 61 63 static int.legac
c440: 79 5f 65 6d 65 72 67 65 6e 63 79 5f 64 69 6d 65 y_emergency_dime
c450: 6e 73 69 6f 6e 20 28 62 69 66 66 5f 77 6f 72 6b nsion (biff_work
c460: 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c book * workbook,
c470: 20 69 6e 74 20 73 77 61 70 2c 0a 09 09 09 20 20 int swap,....
c480: 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 unsigned short
c490: 20 74 79 70 65 2c 20 75 6e 73 69 67 6e 65 64 20 type, unsigned
c4a0: 73 68 6f 72 74 20 73 69 7a 65 2c 0a 09 09 09 20 short size,....
c4b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 unsigned int
c4c0: 2a 72 6f 77 73 2c 20 75 6e 73 69 67 6e 65 64 20 *rows, unsigned
c4d0: 73 68 6f 72 74 20 2a 63 6f 6c 75 6d 6e 73 29 0a short *columns).
c4e0: 7b 0a 2f 2a 20 70 65 72 66 6f 72 6d 69 6e 67 20 {./* performing
c4f0: 61 20 70 72 65 6c 69 6d 69 6e 61 72 79 20 70 61 a preliminary pa
c500: 73 73 20 73 6f 20 74 6f 20 67 65 74 20 44 49 4d ss so to get DIM
c510: 45 4e 53 49 4f 4e 20 2a 2f 0a 20 20 20 20 62 69 ENSION */. bi
c520: 66 66 5f 77 6f 72 64 31 36 20 72 65 63 6f 72 64 ff_word16 record
c530: 5f 74 79 70 65 3b 0a 20 20 20 20 62 69 66 66 5f _type;. biff_
c540: 77 6f 72 64 31 36 20 72 65 63 6f 72 64 5f 73 69 word16 record_si
c550: 7a 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 ze;. unsigned
c560: 20 63 68 61 72 20 62 75 66 5b 31 36 5d 3b 0a 20 char buf[16];.
c570: 20 20 20 69 6e 74 20 66 69 72 73 74 20 3d 20 31 int first = 1
c580: 3b 0a 20 20 20 20 6c 6f 6e 67 20 77 68 65 72 65 ;. long where
c590: 3b 0a 20 20 20 20 6c 6f 6e 67 20 72 65 73 74 61 ;. long resta
c5a0: 72 74 5f 6f 66 66 20 3d 20 66 74 65 6c 6c 20 28 rt_off = ftell (
c5b0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 29 3b 0a workbook->xls);.
c5c0: 0a 20 20 20 20 72 65 63 6f 72 64 5f 74 79 70 65 . record_type
c5d0: 2e 76 61 6c 75 65 20 3d 20 74 79 70 65 3b 0a 20 .value = type;.
c5e0: 20 20 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 record_size.v
c5f0: 61 6c 75 65 20 3d 20 73 69 7a 65 3b 0a 0a 20 20 alue = size;..
c600: 20 20 77 68 69 6c 65 20 28 31 29 0a 20 20 20 20 while (1).
c610: 20 20 7b 0a 09 20 20 2f 2a 20 6c 6f 6f 70 69 6e {.. /* loopin
c620: 67 20 6f 6e 20 42 49 46 46 20 72 65 63 6f 72 64 g on BIFF record
c630: 73 20 2a 2f 0a 09 20 20 69 66 20 28 21 66 69 72 s */.. if (!fir
c640: 73 74 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 20 st).. {...if
c650: 28 66 72 65 61 64 20 28 26 62 75 66 2c 20 31 2c (fread (&buf, 1,
c660: 20 34 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 4, workbook->xl
c670: 73 29 20 21 3d 20 34 29 0a 09 09 20 20 20 20 72 s) != 4)... r
c680: 65 74 75 72 6e 20 30 3b 0a 09 09 6d 65 6d 63 70 eturn 0;...memcp
c690: 79 20 28 72 65 63 6f 72 64 5f 74 79 70 65 2e 62 y (record_type.b
c6a0: 79 74 65 73 2c 20 62 75 66 2c 20 32 29 3b 0a 09 ytes, buf, 2);..
c6b0: 09 6d 65 6d 63 70 79 20 28 72 65 63 6f 72 64 5f .memcpy (record_
c6c0: 73 69 7a 65 2e 62 79 74 65 73 2c 20 62 75 66 20 size.bytes, buf
c6d0: 2b 20 32 2c 20 32 29 3b 0a 09 20 20 20 20 7d 0a + 2, 2);.. }.
c6e0: 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 66 . else.. f
c6f0: 69 72 73 74 20 3d 20 30 3b 0a 09 20 20 69 66 20 irst = 0;.. if
c700: 28 73 77 61 70 29 0a 09 20 20 20 20 7b 0a 09 09 (swap).. {...
c710: 2f 2a 20 42 49 47 20 65 6e 64 69 61 6e 20 61 72 /* BIG endian ar
c720: 63 68 3a 20 73 77 61 70 20 72 65 71 75 69 72 65 ch: swap require
c730: 64 20 2a 2f 0a 09 09 73 77 61 70 31 36 20 28 26 d */...swap16 (&
c740: 72 65 63 6f 72 64 5f 74 79 70 65 29 3b 0a 09 09 record_type);...
c750: 73 77 61 70 31 36 20 28 26 72 65 63 6f 72 64 5f swap16 (&record_
c760: 73 69 7a 65 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 size);.. }...
c770: 20 20 69 66 20 28 72 65 63 6f 72 64 5f 74 79 70 if (record_typ
c780: 65 2e 76 61 6c 75 65 20 3d 3d 20 42 49 46 46 5f e.value == BIFF_
c790: 45 4f 46 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a EOF).. {.../*
c7a0: 20 45 4f 46 20 6d 61 72 6b 65 72 20 66 6f 75 6e EOF marker foun
c7b0: 64 3a 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 d: the current s
c7c0: 74 72 65 61 6d 20 69 73 20 74 65 72 6d 69 6e 61 tream is termina
c7d0: 74 65 64 20 2a 2f 0a 09 09 62 72 65 61 6b 3b 0a ted */...break;.
c7e0: 09 20 20 20 20 7d 0a 0a 09 20 20 69 66 20 28 72 . }... if (r
c7f0: 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 ecord_type.value
c800: 20 3d 3d 20 42 49 46 46 5f 49 4e 54 45 47 45 52 == BIFF_INTEGER
c810: 5f 32 0a 09 20 20 20 20 20 20 26 26 20 77 6f 72 _2.. && wor
c820: 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 kbook->biff_vers
c830: 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 ion == FREEXL_BI
c840: 46 46 5f 56 45 52 5f 32 29 0a 09 20 20 20 20 7b FF_VER_2).. {
c850: 0a 09 09 2f 2a 20 49 4e 54 45 47 45 52 20 6d 61 .../* INTEGER ma
c860: 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 09 rker found */...
c870: 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 biff_word16 word
c880: 31 36 3b 0a 0a 09 09 69 66 20 28 66 72 65 61 64 16;....if (fread
c890: 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f 6b ... (workbook
c8a0: 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 72 65 63 ->record, 1, rec
c8b0: 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 2c 0a ord_size.value,.
c8c0: 09 09 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d .. workbook-
c8d0: 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f 72 64 5f >xls) != record_
c8e0: 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 09 20 20 size.value)...
c8f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 09 6d return 0;....m
c900: 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 emcpy (word16.by
c910: 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 tes, workbook->r
c920: 65 63 6f 72 64 2c 20 32 29 3b 0a 09 09 69 66 20 ecord, 2);...if
c930: 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 (swap)... swa
c940: 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 p16 (&word16);..
c950: 09 69 66 20 28 77 6f 72 64 31 36 2e 76 61 6c 75 .if (word16.valu
c960: 65 20 3e 20 2a 72 6f 77 73 29 0a 09 09 20 20 20 e > *rows)...
c970: 20 2a 72 6f 77 73 20 3d 20 77 6f 72 64 31 36 2e *rows = word16.
c980: 76 61 6c 75 65 3b 0a 09 09 6d 65 6d 63 70 79 20 value;...memcpy
c990: 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 (word16.bytes, w
c9a0: 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 orkbook->record
c9b0: 2b 20 32 2c 20 32 29 3b 0a 09 09 69 66 20 28 73 + 2, 2);...if (s
c9c0: 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 70 31 wap)... swap1
c9d0: 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 09 69 6 (&word16);...i
c9e0: 66 20 28 77 6f 72 64 31 36 2e 76 61 6c 75 65 20 f (word16.value
c9f0: 3e 20 2a 63 6f 6c 75 6d 6e 73 29 0a 09 09 20 20 > *columns)...
ca00: 20 20 2a 63 6f 6c 75 6d 6e 73 20 3d 20 77 6f 72 *columns = wor
ca10: 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 63 6f 6e d16.value;...con
ca20: 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 tinue;.. }...
ca30: 20 20 69 66 20 28 28 72 65 63 6f 72 64 5f 74 79 if ((record_ty
ca40: 70 65 2e 76 61 6c 75 65 20 3d 3d 20 42 49 46 46 pe.value == BIFF
ca50: 5f 4e 55 4d 42 45 52 5f 32 0a 09 20 20 20 20 20 _NUMBER_2..
ca60: 20 20 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 && workbook->b
ca70: 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 iff_version == F
ca80: 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 32 REEXL_BIFF_VER_2
ca90: 29 0a 09 20 20 20 20 20 20 7c 7c 20 28 72 65 63 ).. || (rec
caa0: 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d ord_type.value =
cab0: 3d 20 42 49 46 46 5f 4e 55 4d 42 45 52 0a 09 09 = BIFF_NUMBER...
cac0: 20 20 26 26 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e && (workbook->
cad0: 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 biff_version ==
cae0: 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
caf0: 33 0a 09 09 20 20 20 20 20 20 7c 7c 20 77 6f 72 3... || wor
cb00: 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 kbook->biff_vers
cb10: 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 ion == FREEXL_BI
cb20: 46 46 5f 56 45 52 5f 34 29 29 29 0a 09 20 20 20 FF_VER_4)))..
cb30: 20 7b 0a 09 09 2f 2a 20 4e 55 4d 42 45 52 20 6d {.../* NUMBER m
cb40: 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 arker found */..
cb50: 09 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 .biff_word16 wor
cb60: 64 31 36 3b 0a 0a 09 09 69 66 20 28 66 72 65 61 d16;....if (frea
cb70: 64 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f d... (workboo
cb80: 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 72 65 k->record, 1, re
cb90: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 2c cord_size.value,
cba0: 0a 09 09 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b ... workbook
cbb0: 2d 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f 72 64 ->xls) != record
cbc0: 5f 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 09 20 _size.value)...
cbd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 09 return 0;....
cbe0: 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 memcpy (word16.b
cbf0: 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
cc00: 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 09 69 66 record, 2);...if
cc10: 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 (swap)... sw
cc20: 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a ap16 (&word16);.
cc30: 09 09 69 66 20 28 77 6f 72 64 31 36 2e 76 61 6c ..if (word16.val
cc40: 75 65 20 3e 20 2a 72 6f 77 73 29 0a 09 09 20 20 ue > *rows)...
cc50: 20 20 2a 72 6f 77 73 20 3d 20 77 6f 72 64 31 36 *rows = word16
cc60: 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 6d 63 70 79 .value;...memcpy
cc70: 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 (word16.bytes,
cc80: 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
cc90: 20 2b 20 32 2c 20 32 29 3b 0a 09 09 69 66 20 28 + 2, 2);...if (
cca0: 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 70 swap)... swap
ccb0: 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 09 16 (&word16);...
ccc0: 69 66 20 28 77 6f 72 64 31 36 2e 76 61 6c 75 65 if (word16.value
ccd0: 20 3e 20 2a 63 6f 6c 75 6d 6e 73 29 0a 09 09 20 > *columns)...
cce0: 20 20 20 2a 63 6f 6c 75 6d 6e 73 20 3d 20 77 6f *columns = wo
ccf0: 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 63 6f rd16.value;...co
cd00: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a ntinue;.. }..
cd10: 09 20 20 69 66 20 28 28 72 65 63 6f 72 64 5f 74 . if ((record_t
cd20: 79 70 65 2e 76 61 6c 75 65 20 3d 3d 20 42 49 46 ype.value == BIF
cd30: 46 5f 42 4f 4f 4c 45 52 52 5f 32 0a 09 20 20 20 F_BOOLERR_2..
cd40: 20 20 20 20 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d && workbook-
cd50: 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d >biff_version ==
cd60: 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 FREEXL_BIFF_VER
cd70: 5f 32 29 0a 09 20 20 20 20 20 20 7c 7c 20 28 72 _2).. || (r
cd80: 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 ecord_type.value
cd90: 20 3d 3d 20 42 49 46 46 5f 42 4f 4f 4c 45 52 52 == BIFF_BOOLERR
cda0: 0a 09 09 20 20 26 26 20 28 77 6f 72 6b 62 6f 6f ... && (workboo
cdb0: 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
cdc0: 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
cdd0: 45 52 5f 33 0a 09 09 20 20 20 20 20 20 7c 7c 20 ER_3... ||
cde0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 workbook->biff_v
cdf0: 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c ersion == FREEXL
ce00: 5f 42 49 46 46 5f 56 45 52 5f 34 29 29 29 0a 09 _BIFF_VER_4)))..
ce10: 20 20 20 20 7b 0a 09 09 2f 2a 20 42 4f 4f 4c 45 {.../* BOOLE
ce20: 52 52 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 RR marker found
ce30: 2a 2f 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 36 */...biff_word16
ce40: 20 77 6f 72 64 31 36 3b 0a 0a 09 09 69 66 20 28 word16;....if (
ce50: 66 72 65 61 64 0a 09 09 20 20 20 20 28 77 6f 72 fread... (wor
ce60: 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 kbook->record, 1
ce70: 2c 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 , record_size.va
ce80: 6c 75 65 2c 0a 09 09 20 20 20 20 20 77 6f 72 6b lue,... work
ce90: 62 6f 6f 6b 2d 3e 78 6c 73 29 20 21 3d 20 72 65 book->xls) != re
cea0: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 29 cord_size.value)
ceb0: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b ... return 0;
cec0: 0a 0a 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 ....memcpy (word
ced0: 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 16.bytes, workbo
cee0: 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a ok->record, 2);.
cef0: 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 ..if (swap)...
cf00: 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 swap16 (&word1
cf10: 36 29 3b 0a 09 09 69 66 20 28 77 6f 72 64 31 36 6);...if (word16
cf20: 2e 76 61 6c 75 65 20 3e 20 2a 72 6f 77 73 29 0a .value > *rows).
cf30: 09 09 20 20 20 20 2a 72 6f 77 73 20 3d 20 77 6f .. *rows = wo
cf40: 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 rd16.value;...me
cf50: 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 mcpy (word16.byt
cf60: 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 es, workbook->re
cf70: 63 6f 72 64 20 2b 20 32 2c 20 32 29 3b 0a 09 09 cord + 2, 2);...
cf80: 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 if (swap)...
cf90: 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 swap16 (&word16)
cfa0: 3b 0a 09 09 69 66 20 28 77 6f 72 64 31 36 2e 76 ;...if (word16.v
cfb0: 61 6c 75 65 20 3e 20 2a 63 6f 6c 75 6d 6e 73 29 alue > *columns)
cfc0: 0a 09 09 20 20 20 20 2a 63 6f 6c 75 6d 6e 73 20 ... *columns
cfd0: 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
cfe0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 ..continue;..
cff0: 20 7d 0a 0a 09 20 20 69 66 20 28 72 65 63 6f 72 }... if (recor
d000: 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d 3d 20 d_type.value ==
d010: 42 49 46 46 5f 52 4b 0a 09 20 20 20 20 20 20 26 BIFF_RK.. &
d020: 26 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 & (workbook->bif
d030: 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 f_version == FRE
d040: 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 33 0a 09 EXL_BIFF_VER_3..
d050: 09 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e . || workbook->
d060: 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 biff_version ==
d070: 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
d080: 34 29 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 4)).. {.../*
d090: 52 4b 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 RK marker found
d0a0: 2a 2f 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 36 */...biff_word16
d0b0: 20 77 6f 72 64 31 36 3b 0a 0a 09 09 69 66 20 28 word16;....if (
d0c0: 66 72 65 61 64 0a 09 09 20 20 20 20 28 77 6f 72 fread... (wor
d0d0: 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 kbook->record, 1
d0e0: 2c 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 , record_size.va
d0f0: 6c 75 65 2c 0a 09 09 20 20 20 20 20 77 6f 72 6b lue,... work
d100: 62 6f 6f 6b 2d 3e 78 6c 73 29 20 21 3d 20 72 65 book->xls) != re
d110: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 29 cord_size.value)
d120: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b ... return 0;
d130: 0a 0a 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 ....memcpy (word
d140: 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 16.bytes, workbo
d150: 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a ok->record, 2);.
d160: 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 ..if (swap)...
d170: 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 swap16 (&word1
d180: 36 29 3b 0a 09 09 69 66 20 28 77 6f 72 64 31 36 6);...if (word16
d190: 2e 76 61 6c 75 65 20 3e 20 2a 72 6f 77 73 29 0a .value > *rows).
d1a0: 09 09 20 20 20 20 2a 72 6f 77 73 20 3d 20 77 6f .. *rows = wo
d1b0: 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 rd16.value;...me
d1c0: 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 mcpy (word16.byt
d1d0: 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 es, workbook->re
d1e0: 63 6f 72 64 20 2b 20 32 2c 20 32 29 3b 0a 09 09 cord + 2, 2);...
d1f0: 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 if (swap)...
d200: 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 swap16 (&word16)
d210: 3b 0a 09 09 69 66 20 28 77 6f 72 64 31 36 2e 76 ;...if (word16.v
d220: 61 6c 75 65 20 3e 20 2a 63 6f 6c 75 6d 6e 73 29 alue > *columns)
d230: 0a 09 09 20 20 20 20 2a 63 6f 6c 75 6d 6e 73 20 ... *columns
d240: 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
d250: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 ..continue;..
d260: 20 7d 0a 0a 09 20 20 69 66 20 28 28 72 65 63 6f }... if ((reco
d270: 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d 3d rd_type.value ==
d280: 20 42 49 46 46 5f 4c 41 42 45 4c 5f 32 0a 09 20 BIFF_LABEL_2..
d290: 20 20 20 20 20 20 26 26 20 77 6f 72 6b 62 6f 6f && workboo
d2a0: 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
d2b0: 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
d2c0: 45 52 5f 32 29 0a 09 20 20 20 20 20 20 7c 7c 20 ER_2).. ||
d2d0: 28 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c (record_type.val
d2e0: 75 65 20 3d 3d 20 42 49 46 46 5f 4c 41 42 45 4c ue == BIFF_LABEL
d2f0: 0a 09 09 20 20 26 26 20 28 77 6f 72 6b 62 6f 6f ... && (workboo
d300: 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
d310: 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
d320: 45 52 5f 33 0a 09 09 20 20 20 20 20 20 7c 7c 20 ER_3... ||
d330: 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 workbook->biff_v
d340: 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c ersion == FREEXL
d350: 5f 42 49 46 46 5f 56 45 52 5f 34 29 29 29 0a 09 _BIFF_VER_4)))..
d360: 20 20 20 20 7b 0a 09 09 2f 2a 20 4c 41 42 45 4c {.../* LABEL
d370: 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f marker found */
d380: 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 36 20 77 ...biff_word16 w
d390: 6f 72 64 31 36 3b 0a 0a 09 09 69 66 20 28 66 72 ord16;....if (fr
d3a0: 65 61 64 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 ead... (workb
d3b0: 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 ook->record, 1,
d3c0: 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 record_size.valu
d3d0: 65 2c 0a 09 09 20 20 20 20 20 77 6f 72 6b 62 6f e,... workbo
d3e0: 6f 6b 2d 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f ok->xls) != reco
d3f0: 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 rd_size.value)..
d400: 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a . return 0;..
d410: 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 ..memcpy (word16
d420: 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b .bytes, workbook
d430: 2d 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 09 ->record, 2);...
d440: 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 if (swap)...
d450: 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 swap16 (&word16)
d460: 3b 0a 09 09 69 66 20 28 77 6f 72 64 31 36 2e 76 ;...if (word16.v
d470: 61 6c 75 65 20 3e 20 2a 72 6f 77 73 29 0a 09 09 alue > *rows)...
d480: 20 20 20 20 2a 72 6f 77 73 20 3d 20 77 6f 72 64 *rows = word
d490: 31 36 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 6d 63 16.value;...memc
d4a0: 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 py (word16.bytes
d4b0: 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f , workbook->reco
d4c0: 72 64 20 2b 20 32 2c 20 32 29 3b 0a 09 09 69 66 rd + 2, 2);...if
d4d0: 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 (swap)... sw
d4e0: 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a ap16 (&word16);.
d4f0: 09 09 69 66 20 28 77 6f 72 64 31 36 2e 76 61 6c ..if (word16.val
d500: 75 65 20 3e 20 2a 63 6f 6c 75 6d 6e 73 29 0a 09 ue > *columns)..
d510: 09 20 20 20 20 2a 63 6f 6c 75 6d 6e 73 20 3d 20 . *columns =
d520: 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 word16.value;...
d530: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d continue;.. }
d540: 0a 0a 09 20 20 2f 2a 20 73 6b 69 70 70 69 6e 67 ... /* skipping
d550: 20 74 6f 20 6e 65 78 74 20 72 65 63 6f 72 64 20 to next record
d560: 2a 2f 0a 09 20 20 77 68 65 72 65 20 3d 20 72 65 */.. where = re
d570: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 3b cord_size.value;
d580: 0a 09 20 20 69 66 20 28 66 73 65 65 6b 20 28 77 .. if (fseek (w
d590: 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 2c 20 77 68 orkbook->xls, wh
d5a0: 65 72 65 2c 20 53 45 45 4b 5f 43 55 52 29 20 21 ere, SEEK_CUR) !
d5b0: 3d 20 30 29 0a 09 20 20 20 20 20 20 72 65 74 75 = 0).. retu
d5c0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 2f rn 0;. }../
d5d0: 2a 20 72 65 70 6f 73 69 74 69 6f 6e 69 6e 67 20 * repositioning
d5e0: 74 68 65 20 73 74 72 65 61 6d 20 6f 66 66 73 65 the stream offse
d5f0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 73 65 t */. if (fse
d600: 65 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c ek (workbook->xl
d610: 73 2c 20 72 65 73 74 61 72 74 5f 6f 66 66 2c 20 s, restart_off,
d620: 53 45 45 4b 5f 53 45 54 29 20 21 3d 20 30 29 0a SEEK_SET) != 0).
d630: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 .return 0;. r
d640: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 eturn 1;.}..stat
d650: 69 63 20 69 6e 74 0a 63 68 65 63 6b 5f 6c 65 67 ic int.check_leg
d660: 61 63 79 5f 75 6e 64 65 63 6c 61 72 65 64 5f 64 acy_undeclared_d
d670: 69 6d 65 6e 73 69 6f 6e 20 28 62 69 66 66 5f 77 imension (biff_w
d680: 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f orkbook * workbo
d690: 6f 6b 2c 20 69 6e 74 20 73 77 61 70 2c 0a 09 09 ok, int swap,...
d6a0: 09 09 20 20 20 75 6e 73 69 67 6e 65 64 20 73 68 .. unsigned sh
d6b0: 6f 72 74 20 74 79 70 65 2c 20 75 6e 73 69 67 6e ort type, unsign
d6c0: 65 64 20 73 68 6f 72 74 20 73 69 7a 65 29 0a 7b ed short size).{
d6d0: 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 28 61 6e ./* checking (an
d6e0: 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 73 61 6e d eventually san
d6f0: 69 6e 67 29 20 6d 69 73 73 69 6e 67 20 44 49 4d ing) missing DIM
d700: 45 4e 53 49 4f 4e 20 2a 2f 0a 20 20 20 20 69 66 ENSION */. if
d710: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 (workbook->acti
d720: 76 65 5f 73 68 65 65 74 20 3d 3d 20 4e 55 4c 4c ve_sheet == NULL
d730: 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 63 68 61 ). {.. cha
d740: 72 20 2a 75 74 66 38 5f 6e 61 6d 65 3b 0a 09 20 r *utf8_name;..
d750: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 6f unsigned int ro
d760: 77 73 20 3d 20 30 3b 0a 09 20 20 75 6e 73 69 67 ws = 0;.. unsig
d770: 6e 65 64 20 73 68 6f 72 74 20 63 6f 6c 75 6d 6e ned short column
d780: 73 20 3d 20 30 3b 0a 09 20 20 69 66 20 28 21 6c s = 0;.. if (!l
d790: 65 67 61 63 79 5f 65 6d 65 72 67 65 6e 63 79 5f egacy_emergency_
d7a0: 64 69 6d 65 6e 73 69 6f 6e 0a 09 20 20 20 20 20 dimension..
d7b0: 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 (workbook, swap
d7c0: 2c 20 74 79 70 65 2c 20 73 69 7a 65 2c 20 26 72 , type, size, &r
d7d0: 6f 77 73 2c 20 26 63 6f 6c 75 6d 6e 73 29 29 0a ows, &columns)).
d7e0: 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b . return 0;
d7f0: 0a 09 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69 7a .. /* initializ
d800: 69 6e 67 20 74 68 65 20 77 6f 72 6b 73 68 65 65 ing the workshee
d810: 74 20 2a 2f 0a 09 20 20 75 74 66 38 5f 6e 61 6d t */.. utf8_nam
d820: 65 20 3d 20 6d 61 6c 6c 6f 63 20 28 31 30 29 3b e = malloc (10);
d830: 0a 09 20 20 73 74 72 63 70 79 20 28 75 74 66 38 .. strcpy (utf8
d840: 5f 6e 61 6d 65 2c 20 22 57 6f 72 6b 73 68 65 65 _name, "Workshee
d850: 74 22 29 3b 0a 09 20 20 69 66 20 28 21 61 64 64 t");.. if (!add
d860: 5f 73 68 65 65 74 5f 74 6f 5f 77 6f 72 6b 62 6f _sheet_to_workbo
d870: 6f 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 30 2c ok (workbook, 0,
d880: 20 30 2c 20 30 2c 20 75 74 66 38 5f 6e 61 6d 65 0, 0, utf8_name
d890: 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e )).. return
d8a0: 20 30 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 0;.. workbook-
d8b0: 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d 20 >active_sheet =
d8c0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 69 72 73 74 5f workbook->first_
d8d0: 73 68 65 65 74 3b 0a 09 20 20 69 66 20 28 77 6f sheet;.. if (wo
d8e0: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
d8f0: 68 65 65 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 heet != NULL)..
d900: 20 20 20 7b 0a 09 09 2f 2a 20 73 65 74 74 69 6e {.../* settin
d910: 67 20 53 68 65 65 74 20 64 69 6d 65 6e 73 69 6f g Sheet dimensio
d920: 6e 73 20 2a 2f 0a 09 09 69 6e 74 20 72 65 74 3b ns */...int ret;
d930: 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 ...workbook->act
d940: 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 73 20 ive_sheet->rows
d950: 3d 20 72 6f 77 73 20 2b 20 31 3b 0a 09 09 77 6f = rows + 1;...wo
d960: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
d970: 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 20 3d 20 heet->columns =
d980: 63 6f 6c 75 6d 6e 73 20 2b 20 31 3b 0a 09 09 72 columns + 1;...r
d990: 65 74 20 3d 20 61 6c 6c 6f 63 61 74 65 5f 63 65 et = allocate_ce
d9a0: 6c 6c 73 20 28 77 6f 72 6b 62 6f 6f 6b 29 3b 0a lls (workbook);.
d9b0: 09 09 69 66 20 28 72 65 74 20 21 3d 20 46 52 45 ..if (ret != FRE
d9c0: 45 58 4c 5f 4f 4b 29 0a 09 09 20 20 20 20 72 65 EXL_OK)... re
d9d0: 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 20 turn 0;.. }.
d9e0: 20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 }. retur
d9f0: 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 n 1;.}..static i
da00: 6e 74 0a 72 65 61 64 5f 6c 65 67 61 63 79 5f 62 nt.read_legacy_b
da10: 69 66 66 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f iff (biff_workbo
da20: 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 69 ok * workbook, i
da30: 6e 74 20 73 77 61 70 29 0a 7b 0a 2f 2a 20 0a 20 nt swap).{./* .
da40: 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 * attempting to
da50: 72 65 61 64 20 6c 65 67 61 63 79 20 42 49 46 46 read legacy BIFF
da60: 20 28 76 65 72 73 69 6f 6e 73 20 32 2c 33 2c 34 (versions 2,3,4
da70: 29 0a 20 2a 20 6e 6f 20 43 46 42 46 3a 20 73 69 ). * no CFBF: si
da80: 6d 70 6c 79 20 61 20 42 49 46 46 20 73 74 72 65 mply a BIFF stre
da90: 61 6d 20 28 6f 6e 65 20 6f 6e 6c 79 20 57 6f 72 am (one only Wor
daa0: 6b 73 68 65 65 74 29 0a 20 2a 2f 0a 20 20 20 20 ksheet). */.
dab0: 6c 6f 6e 67 20 77 68 65 72 65 3b 0a 20 20 20 20 long where;.
dac0: 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 biff_word16 word
dad0: 31 36 3b 0a 20 20 20 20 62 69 66 66 5f 77 6f 72 16;. biff_wor
dae0: 64 31 36 20 72 65 63 6f 72 64 5f 74 79 70 65 3b d16 record_type;
daf0: 0a 20 20 20 20 62 69 66 66 5f 77 6f 72 64 31 36 . biff_word16
db00: 20 72 65 63 6f 72 64 5f 73 69 7a 65 3b 0a 20 20 record_size;.
db10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
db20: 62 75 66 5b 31 36 5d 3b 0a 20 20 20 20 75 6e 73 buf[16];. uns
db30: 69 67 6e 65 64 20 73 68 6f 72 74 20 66 6f 72 6d igned short form
db40: 61 74 5f 69 6e 64 65 78 20 3d 20 30 3b 0a 0a 2f at_index = 0;../
db50: 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 * attempting to
db60: 67 65 74 20 74 68 65 20 6d 61 69 6e 20 42 4f 46 get the main BOF
db70: 20 2a 2f 0a 20 20 20 20 72 65 77 69 6e 64 20 28 */. rewind (
db80: 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 29 3b 0a workbook->xls);.
db90: 20 20 20 20 69 66 20 28 66 72 65 61 64 20 28 26 if (fread (&
dba0: 62 75 66 2c 20 31 2c 20 34 2c 20 77 6f 72 6b 62 buf, 1, 4, workb
dbb0: 6f 6f 6b 2d 3e 78 6c 73 29 20 21 3d 20 34 29 0a ook->xls) != 4).
dbc0: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6d .return 0;. m
dbd0: 65 6d 63 70 79 20 28 72 65 63 6f 72 64 5f 74 79 emcpy (record_ty
dbe0: 70 65 2e 62 79 74 65 73 2c 20 62 75 66 2c 20 32 pe.bytes, buf, 2
dbf0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 20 28 72 );. memcpy (r
dc00: 65 63 6f 72 64 5f 73 69 7a 65 2e 62 79 74 65 73 ecord_size.bytes
dc10: 2c 20 62 75 66 20 2b 20 32 2c 20 32 29 3b 0a 20 , buf + 2, 2);.
dc20: 20 20 20 69 66 20 28 73 77 61 70 29 0a 20 20 20 if (swap).
dc30: 20 20 20 7b 0a 09 20 20 2f 2a 20 42 49 47 20 65 {.. /* BIG e
dc40: 6e 64 69 61 6e 20 61 72 63 68 3a 20 73 77 61 70 ndian arch: swap
dc50: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 20 20 required */..
dc60: 73 77 61 70 31 36 20 28 26 72 65 63 6f 72 64 5f swap16 (&record_
dc70: 74 79 70 65 29 3b 0a 09 20 20 73 77 61 70 31 36 type);.. swap16
dc80: 20 28 26 72 65 63 6f 72 64 5f 73 69 7a 65 29 3b (&record_size);
dc90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 73 77 69 . }. swi
dca0: 74 63 68 20 28 72 65 63 6f 72 64 5f 74 79 70 65 tch (record_type
dcb0: 2e 76 61 6c 75 65 29 0a 20 20 20 20 20 20 7b 0a .value). {.
dcc0: 20 20 20 20 20 20 63 61 73 65 20 42 49 46 46 5f case BIFF_
dcd0: 42 4f 46 5f 32 3a 09 09 2f 2a 20 42 49 46 46 32 BOF_2:../* BIFF2
dce0: 20 2a 2f 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d */.. workbook-
dcf0: 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 20 >biff_version =
dd00: 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
dd10: 32 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 2;.. workbook->
dd20: 6f 6b 5f 62 6f 66 20 3d 20 31 3b 0a 09 20 20 62 ok_bof = 1;.. b
dd30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 reak;. case
dd40: 20 42 49 46 46 5f 42 4f 46 5f 33 3a 09 09 2f 2a BIFF_BOF_3:../*
dd50: 20 42 49 46 46 33 20 2a 2f 0a 09 20 20 77 6f 72 BIFF3 */.. wor
dd60: 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 kbook->biff_vers
dd70: 69 6f 6e 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 ion = FREEXL_BIF
dd80: 46 5f 56 45 52 5f 33 3b 0a 09 20 20 77 6f 72 6b F_VER_3;.. work
dd90: 62 6f 6f 6b 2d 3e 6f 6b 5f 62 6f 66 20 3d 20 31 book->ok_bof = 1
dda0: 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 ;.. break;.
ddb0: 20 20 63 61 73 65 20 42 49 46 46 5f 42 4f 46 5f case BIFF_BOF_
ddc0: 34 3a 09 09 2f 2a 20 42 49 46 46 34 20 2a 2f 0a 4:../* BIFF4 */.
ddd0: 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 . workbook->bif
dde0: 66 5f 76 65 72 73 69 6f 6e 20 3d 20 46 52 45 45 f_version = FREE
ddf0: 58 4c 5f 42 49 46 46 5f 56 45 52 5f 34 3b 0a 09 XL_BIFF_VER_4;..
de00: 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6f 6b 5f 62 workbook->ok_b
de10: 6f 66 20 3d 20 31 3b 0a 09 20 20 62 72 65 61 6b of = 1;.. break
de20: 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 69 ;. };. i
de30: 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 6f 6b 5f f (workbook->ok_
de40: 62 6f 66 20 21 3d 20 31 29 0a 09 72 65 74 75 72 bof != 1)..retur
de50: 6e 20 30 3b 0a 0a 20 20 20 20 77 68 65 72 65 20 n 0;.. where
de60: 3d 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 = record_size.va
de70: 6c 75 65 3b 0a 20 20 20 20 69 66 20 28 66 73 65 lue;. if (fse
de80: 65 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c ek (workbook->xl
de90: 73 2c 20 77 68 65 72 65 2c 20 53 45 45 4b 5f 43 s, where, SEEK_C
dea0: 55 52 29 20 21 3d 20 30 29 0a 09 72 65 74 75 72 UR) != 0)..retur
deb0: 6e 20 30 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 n 0;.. while
dec0: 28 31 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f (1). {.. /
ded0: 2a 20 6c 6f 6f 70 69 6e 67 20 6f 6e 20 42 49 46 * looping on BIF
dee0: 46 20 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 09 20 F records */...
def0: 20 69 66 20 28 66 72 65 61 64 20 28 26 62 75 66 if (fread (&buf
df00: 2c 20 31 2c 20 34 2c 20 77 6f 72 6b 62 6f 6f 6b , 1, 4, workbook
df10: 2d 3e 78 6c 73 29 20 21 3d 20 34 29 0a 09 20 20 ->xls) != 4)..
df20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 20 return 0;..
df30: 20 6d 65 6d 63 70 79 20 28 72 65 63 6f 72 64 5f memcpy (record_
df40: 74 79 70 65 2e 62 79 74 65 73 2c 20 62 75 66 2c type.bytes, buf,
df50: 20 32 29 3b 0a 09 20 20 6d 65 6d 63 70 79 20 28 2);.. memcpy (
df60: 72 65 63 6f 72 64 5f 73 69 7a 65 2e 62 79 74 65 record_size.byte
df70: 73 2c 20 62 75 66 20 2b 20 32 2c 20 32 29 3b 0a s, buf + 2, 2);.
df80: 09 20 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 . if (swap)..
df90: 20 20 7b 0a 09 09 2f 2a 20 42 49 47 20 65 6e 64 {.../* BIG end
dfa0: 69 61 6e 20 61 72 63 68 3a 20 73 77 61 70 20 72 ian arch: swap r
dfb0: 65 71 75 69 72 65 64 20 2a 2f 0a 09 09 73 77 61 equired */...swa
dfc0: 70 31 36 20 28 26 72 65 63 6f 72 64 5f 74 79 70 p16 (&record_typ
dfd0: 65 29 3b 0a 09 09 73 77 61 70 31 36 20 28 26 72 e);...swap16 (&r
dfe0: 65 63 6f 72 64 5f 73 69 7a 65 29 3b 0a 09 20 20 ecord_size);..
dff0: 20 20 7d 0a 0a 09 20 20 69 66 20 28 72 65 63 6f }... if (reco
e000: 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d 3d rd_type.value ==
e010: 20 42 49 46 46 5f 53 48 45 45 54 53 4f 46 46 53 BIFF_SHEETSOFFS
e020: 45 54 29 0a 09 20 20 20 20 7b 0a 2f 2a 20 75 6e ET).. {./* un
e030: 73 75 70 70 6f 72 74 65 64 20 42 49 46 46 34 57 supported BIFF4W
e040: 20 66 6f 72 6d 61 74 20 2a 2f 0a 09 09 72 65 74 format */...ret
e050: 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 urn 0;.. }...
e060: 20 20 69 66 20 28 72 65 63 6f 72 64 5f 74 79 70 if (record_typ
e070: 65 2e 76 61 6c 75 65 20 3d 3d 20 42 49 46 46 5f e.value == BIFF_
e080: 45 4f 46 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a EOF).. {.../*
e090: 20 45 4f 46 20 6d 61 72 6b 65 72 20 66 6f 75 6e EOF marker foun
e0a0: 64 3a 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 d: the current s
e0b0: 74 72 65 61 6d 20 69 73 20 74 65 72 6d 69 6e 61 tream is termina
e0c0: 74 65 64 20 2a 2f 0a 09 09 72 65 74 75 72 6e 20 ted */...return
e0d0: 31 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 69 66 1;.. }... if
e0e0: 20 28 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 (record_type.va
e0f0: 6c 75 65 20 3d 3d 20 42 49 46 46 5f 43 4f 44 45 lue == BIFF_CODE
e100: 50 41 47 45 29 0a 09 20 20 20 20 7b 0a 09 09 2f PAGE).. {.../
e110: 2a 20 43 4f 44 45 50 41 47 45 20 6d 61 72 6b 65 * CODEPAGE marke
e120: 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 09 69 66 20 r found */...if
e130: 28 66 72 65 61 64 0a 09 09 20 20 20 20 28 77 6f (fread... (wo
e140: 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 rkbook->record,
e150: 31 2c 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 1, record_size.v
e160: 61 6c 75 65 2c 0a 09 09 20 20 20 20 20 77 6f 72 alue,... wor
e170: 6b 62 6f 6f 6b 2d 3e 78 6c 73 29 20 21 3d 20 72 kbook->xls) != r
e180: 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 ecord_size.value
e190: 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 )... return 0
e1a0: 3b 0a 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 ;...memcpy (word
e1b0: 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 16.bytes, workbo
e1c0: 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a ok->record, 2);.
e1d0: 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 ..if (swap)...
e1e0: 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 swap16 (&word1
e1f0: 36 29 3b 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 6);...workbook->
e200: 62 69 66 66 5f 63 6f 64 65 5f 70 61 67 65 20 3d biff_code_page =
e210: 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 word16.value;..
e220: 09 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 6f .if (workbook->o
e230: 6b 5f 62 6f 66 20 3d 3d 20 31 29 0a 09 09 20 20 k_bof == 1)...
e240: 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 workbook->biff
e250: 5f 62 6f 6f 6b 5f 63 6f 64 65 5f 70 61 67 65 20 _book_code_page
e260: 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
e270: 09 09 69 66 20 28 21 62 69 66 66 5f 73 65 74 5f ..if (!biff_set_
e280: 75 74 66 38 5f 63 6f 6e 76 65 72 74 65 72 20 28 utf8_converter (
e290: 77 6f 72 6b 62 6f 6f 6b 29 29 0a 09 09 20 20 20 workbook))...
e2a0: 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 63 6f 6e return 0;...con
e2b0: 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 tinue;.. }...
e2c0: 20 20 69 66 20 28 72 65 63 6f 72 64 5f 74 79 70 if (record_typ
e2d0: 65 2e 76 61 6c 75 65 20 3d 3d 20 42 49 46 46 5f e.value == BIFF_
e2e0: 44 41 54 45 4d 4f 44 45 29 0a 09 20 20 20 20 7b DATEMODE).. {
e2f0: 0a 09 09 2f 2a 20 44 41 54 45 4d 4f 44 45 20 6d .../* DATEMODE m
e300: 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 arker found */..
e310: 09 69 66 20 28 66 72 65 61 64 0a 09 09 20 20 20 .if (fread...
e320: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f (workbook->reco
e330: 72 64 2c 20 31 2c 20 72 65 63 6f 72 64 5f 73 69 rd, 1, record_si
e340: 7a 65 2e 76 61 6c 75 65 2c 0a 09 09 20 20 20 20 ze.value,...
e350: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 29 20 workbook->xls)
e360: 21 3d 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 != record_size.v
e370: 61 6c 75 65 29 0a 09 09 20 20 20 20 72 65 74 75 alue)... retu
e380: 72 6e 20 30 3b 0a 09 09 6d 65 6d 63 70 79 20 28 rn 0;...memcpy (
e390: 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 6f word16.bytes, wo
e3a0: 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 rkbook->record,
e3b0: 32 29 3b 0a 09 09 69 66 20 28 73 77 61 70 29 0a 2);...if (swap).
e3c0: 09 09 20 20 20 20 73 77 61 70 31 36 20 28 26 77 .. swap16 (&w
e3d0: 6f 72 64 31 36 29 3b 0a 09 09 77 6f 72 6b 62 6f ord16);...workbo
e3e0: 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f ok->biff_date_mo
e3f0: 64 65 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 de = word16.valu
e400: 65 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 e;...continue;..
e410: 20 20 20 20 7d 0a 0a 09 20 20 69 66 20 28 72 65 }... if (re
e420: 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 cord_type.value
e430: 3d 3d 20 42 49 46 46 5f 46 49 4c 45 50 41 53 53 == BIFF_FILEPASS
e440: 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 50 41 ).. {.../* PA
e450: 53 53 57 4f 52 44 20 6d 61 72 6b 65 72 20 66 6f SSWORD marker fo
e460: 75 6e 64 20 2a 2f 0a 09 09 77 6f 72 6b 62 6f 6f und */...workboo
e470: 6b 2d 3e 62 69 66 66 5f 6f 62 66 75 73 63 61 74 k->biff_obfuscat
e480: 65 64 20 3d 20 31 3b 0a 09 09 67 6f 74 6f 20 73 ed = 1;...goto s
e490: 6b 69 70 5f 74 6f 5f 6e 65 78 74 3b 0a 09 20 20 kip_to_next;..
e4a0: 20 20 7d 0a 0a 09 20 20 69 66 20 28 28 72 65 63 }... if ((rec
e4b0: 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d ord_type.value =
e4c0: 3d 20 42 49 46 46 5f 46 4f 52 4d 41 54 5f 32 0a = BIFF_FORMAT_2.
e4d0: 09 20 20 20 20 20 20 20 26 26 20 28 77 6f 72 6b . && (work
e4e0: 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 book->biff_versi
e4f0: 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 on == FREEXL_BIF
e500: 46 5f 56 45 52 5f 32 0a 09 09 20 20 20 7c 7c 20 F_VER_2... ||
e510: 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 workbook->biff_v
e520: 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c ersion == FREEXL
e530: 5f 42 49 46 46 5f 56 45 52 5f 33 29 29 0a 09 20 _BIFF_VER_3))..
e540: 20 20 20 20 20 7c 7c 20 28 72 65 63 6f 72 64 5f || (record_
e550: 74 79 70 65 2e 76 61 6c 75 65 20 3d 3d 20 42 49 type.value == BI
e560: 46 46 5f 46 4f 52 4d 41 54 0a 09 09 20 20 26 26 FF_FORMAT... &&
e570: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 (workbook->biff
e580: 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 _version == FREE
e590: 58 4c 5f 42 49 46 46 5f 56 45 52 5f 34 29 29 29 XL_BIFF_VER_4)))
e5a0: 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 46 4f 52 .. {.../* FOR
e5b0: 4d 41 54 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 MAT marker found
e5c0: 20 2a 2f 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 */...biff_word1
e5d0: 36 20 77 6f 72 64 31 36 3b 0a 09 09 63 68 61 72 6 word16;...char
e5e0: 20 2a 73 74 72 69 6e 67 3b 0a 09 09 63 68 61 72 *string;...char
e5f0: 20 2a 75 74 66 38 5f 73 74 72 69 6e 67 3b 0a 09 *utf8_string;..
e600: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 .unsigned int le
e610: 6e 3b 0a 09 09 69 6e 74 20 65 72 72 3b 0a 09 09 n;...int err;...
e620: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 unsigned char *p
e630: 5f 73 74 72 69 6e 67 3b 0a 09 09 69 6e 74 20 69 _string;...int i
e640: 73 5f 64 61 74 65 20 3d 20 30 3b 0a 09 09 69 6e s_date = 0;...in
e650: 74 20 69 73 5f 64 61 74 65 74 69 6d 65 20 3d 20 t is_datetime =
e660: 30 3b 0a 09 09 69 6e 74 20 69 73 5f 74 69 6d 65 0;...int is_time
e670: 20 3d 20 30 3b 0a 09 09 69 66 20 28 66 72 65 61 = 0;...if (frea
e680: 64 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f d... (workboo
e690: 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 72 65 k->record, 1, re
e6a0: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 2c cord_size.value,
e6b0: 0a 09 09 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b ... workbook
e6c0: 2d 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f 72 64 ->xls) != record
e6d0: 5f 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 09 20 _size.value)...
e6e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 09 return 0;....
e6f0: 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 if (workbook->bi
e700: 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 ff_version == FR
e710: 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 32 0a EEXL_BIFF_VER_2.
e720: 09 09 20 20 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f .. || workboo
e730: 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
e740: 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
e750: 45 52 5f 33 29 0a 09 09 20 20 7b 0a 09 09 20 20 ER_3)... {...
e760: 20 20 20 20 6c 65 6e 20 3d 20 2a 77 6f 72 6b 62 len = *workb
e770: 6f 6f 6b 2d 3e 72 65 63 6f 72 64 3b 0a 09 09 20 ook->record;...
e780: 20 20 20 20 20 70 5f 73 74 72 69 6e 67 20 3d 20 p_string =
e790: 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
e7a0: 20 2b 20 31 3b 0a 09 09 20 20 20 20 20 20 73 74 + 1;... st
e7b0: 72 69 6e 67 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c ring = malloc (l
e7c0: 65 6e 29 3b 0a 09 09 20 20 20 20 20 20 6d 65 6d en);... mem
e7d0: 63 70 79 20 28 73 74 72 69 6e 67 2c 20 70 5f 73 cpy (string, p_s
e7e0: 74 72 69 6e 67 2c 20 6c 65 6e 29 3b 0a 09 09 20 tring, len);...
e7f0: 20 20 20 20 20 2f 2a 20 63 6f 6e 76 65 72 74 69 /* converti
e800: 6e 67 20 74 65 78 74 20 74 6f 20 55 54 46 2d 38 ng text to UTF-8
e810: 20 2a 2f 0a 09 09 20 20 20 20 20 20 75 74 66 38 */... utf8
e820: 5f 73 74 72 69 6e 67 20 3d 0a 09 09 09 20 20 63 _string =.... c
e830: 6f 6e 76 65 72 74 5f 74 6f 5f 75 74 66 38 20 28 onvert_to_utf8 (
e840: 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 38 5f 63 workbook->utf8_c
e850: 6f 6e 76 65 72 74 65 72 2c 20 73 74 72 69 6e 67 onverter, string
e860: 2c 0a 09 09 09 09 09 20 20 20 6c 65 6e 2c 20 26 ,...... len, &
e870: 65 72 72 29 3b 0a 09 09 20 20 20 20 20 20 66 72 err);... fr
e880: 65 65 20 28 73 74 72 69 6e 67 29 3b 0a 09 09 20 ee (string);...
e890: 20 20 20 20 20 69 66 20 28 65 72 72 29 0a 09 09 if (err)...
e8a0: 09 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 20 . return 0;...
e8b0: 20 20 20 20 20 63 68 65 63 6b 5f 66 6f 72 6d 61 check_forma
e8c0: 74 20 28 75 74 66 38 5f 73 74 72 69 6e 67 2c 20 t (utf8_string,
e8d0: 26 69 73 5f 64 61 74 65 2c 20 26 69 73 5f 64 61 &is_date, &is_da
e8e0: 74 65 74 69 6d 65 2c 0a 09 09 09 09 20 20 20 20 tetime,.....
e8f0: 26 69 73 5f 74 69 6d 65 29 3b 0a 09 09 20 20 20 &is_time);...
e900: 20 20 20 66 72 65 65 20 28 75 74 66 38 5f 73 74 free (utf8_st
e910: 72 69 6e 67 29 3b 0a 09 09 20 20 20 20 20 20 69 ring);... i
e920: 66 20 28 69 73 5f 64 61 74 65 20 7c 7c 20 69 73 f (is_date || is
e930: 5f 64 61 74 65 74 69 6d 65 20 7c 7c 20 69 73 5f _datetime || is_
e940: 74 69 6d 65 29 0a 09 09 09 20 20 61 64 64 5f 66 time).... add_f
e950: 6f 72 6d 61 74 5f 74 6f 5f 77 6f 72 6b 62 6f 6f ormat_to_workboo
e960: 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 66 6f 72 k (workbook, for
e970: 6d 61 74 5f 69 6e 64 65 78 2c 0a 09 09 09 09 09 mat_index,......
e980: 09 20 20 69 73 5f 64 61 74 65 2c 20 69 73 5f 64 . is_date, is_d
e990: 61 74 65 74 69 6d 65 2c 0a 09 09 09 09 09 09 20 atetime,.......
e9a0: 20 69 73 5f 74 69 6d 65 29 3b 0a 09 09 20 20 7d is_time);... }
e9b0: 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 09 09 ...else... {...
e9c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 20 28 77 6f memcpy (wo
e9d0: 72 64 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b rd16.bytes, work
e9e0: 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 32 book->record + 2
e9f0: 2c 20 32 29 3b 0a 09 09 20 20 20 20 20 20 69 66 , 2);... if
ea00: 20 28 73 77 61 70 29 0a 09 09 09 20 20 73 77 61 (swap).... swa
ea10: 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 p16 (&word16);..
ea20: 09 20 20 20 20 20 20 6c 65 6e 20 3d 20 77 6f 72 . len = wor
ea30: 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 20 20 20 d16.value;...
ea40: 20 20 20 70 5f 73 74 72 69 6e 67 20 3d 20 77 6f p_string = wo
ea50: 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b rkbook->record +
ea60: 20 34 3b 0a 0a 09 09 20 20 20 20 20 20 6c 65 6e 4;.... len
ea70: 20 3d 20 2a 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 = *(workbook->r
ea80: 65 63 6f 72 64 20 2b 20 32 29 3b 0a 09 09 20 20 ecord + 2);...
ea90: 20 20 20 20 70 5f 73 74 72 69 6e 67 20 3d 20 77 p_string = w
eaa0: 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 orkbook->record
eab0: 2b 20 33 3b 0a 09 09 20 20 20 20 20 20 73 74 72 + 3;... str
eac0: 69 6e 67 20 3d 20 6d 61 6c 6c 6f 63 20 28 6c 65 ing = malloc (le
ead0: 6e 29 3b 0a 09 09 20 20 20 20 20 20 6d 65 6d 63 n);... memc
eae0: 70 79 20 28 73 74 72 69 6e 67 2c 20 70 5f 73 74 py (string, p_st
eaf0: 72 69 6e 67 2c 20 6c 65 6e 29 3b 0a 09 09 20 20 ring, len);...
eb00: 20 20 20 20 2f 2a 20 63 6f 6e 76 65 72 74 69 6e /* convertin
eb10: 67 20 74 65 78 74 20 74 6f 20 55 54 46 2d 38 20 g text to UTF-8
eb20: 2a 2f 0a 09 09 20 20 20 20 20 20 75 74 66 38 5f */... utf8_
eb30: 73 74 72 69 6e 67 20 3d 0a 09 09 09 20 20 63 6f string =.... co
eb40: 6e 76 65 72 74 5f 74 6f 5f 75 74 66 38 20 28 77 nvert_to_utf8 (w
eb50: 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 38 5f 63 6f orkbook->utf8_co
eb60: 6e 76 65 72 74 65 72 2c 20 73 74 72 69 6e 67 2c nverter, string,
eb70: 0a 09 09 09 09 09 20 20 20 6c 65 6e 2c 20 26 65 ...... len, &e
eb80: 72 72 29 3b 0a 09 09 20 20 20 20 20 20 66 72 65 rr);... fre
eb90: 65 20 28 73 74 72 69 6e 67 29 3b 0a 09 09 20 20 e (string);...
eba0: 20 20 20 20 69 66 20 28 65 72 72 29 0a 09 09 09 if (err)....
ebb0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 20 20 return 0;...
ebc0: 20 20 20 20 63 68 65 63 6b 5f 66 6f 72 6d 61 74 check_format
ebd0: 20 28 75 74 66 38 5f 73 74 72 69 6e 67 2c 20 26 (utf8_string, &
ebe0: 69 73 5f 64 61 74 65 2c 20 26 69 73 5f 64 61 74 is_date, &is_dat
ebf0: 65 74 69 6d 65 2c 0a 09 09 09 09 20 20 20 20 26 etime,..... &
ec00: 69 73 5f 74 69 6d 65 29 3b 0a 09 09 20 20 20 20 is_time);...
ec10: 20 20 66 72 65 65 20 28 75 74 66 38 5f 73 74 72 free (utf8_str
ec20: 69 6e 67 29 3b 0a 09 09 20 20 20 20 20 20 69 66 ing);... if
ec30: 20 28 69 73 5f 64 61 74 65 20 7c 7c 20 69 73 5f (is_date || is_
ec40: 64 61 74 65 74 69 6d 65 20 7c 7c 20 69 73 5f 74 datetime || is_t
ec50: 69 6d 65 29 0a 09 09 09 20 20 61 64 64 5f 66 6f ime).... add_fo
ec60: 72 6d 61 74 5f 74 6f 5f 77 6f 72 6b 62 6f 6f 6b rmat_to_workbook
ec70: 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 66 6f 72 6d (workbook, form
ec80: 61 74 5f 69 6e 64 65 78 2c 0a 09 09 09 09 09 09 at_index,.......
ec90: 20 20 69 73 5f 64 61 74 65 2c 20 69 73 5f 64 61 is_date, is_da
eca0: 74 65 74 69 6d 65 2c 0a 09 09 09 09 09 09 20 20 tetime,.......
ecb0: 69 73 5f 74 69 6d 65 29 3b 0a 09 09 20 20 7d 0a is_time);... }.
ecc0: 09 09 66 6f 72 6d 61 74 5f 69 6e 64 65 78 2b 2b ..format_index++
ecd0: 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 ;...continue;..
ece0: 20 20 20 7d 0a 0a 09 20 20 69 66 20 28 28 72 65 }... if ((re
ecf0: 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 cord_type.value
ed00: 3d 3d 20 42 49 46 46 5f 58 46 5f 32 0a 09 20 20 == BIFF_XF_2..
ed10: 20 20 20 20 20 26 26 20 77 6f 72 6b 62 6f 6f 6b && workbook
ed20: 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d ->biff_version =
ed30: 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 = FREEXL_BIFF_VE
ed40: 52 5f 32 29 0a 09 20 20 20 20 20 20 7c 7c 20 28 R_2).. || (
ed50: 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 record_type.valu
ed60: 65 20 3d 3d 20 42 49 46 46 5f 58 46 5f 33 0a 09 e == BIFF_XF_3..
ed70: 09 20 20 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e . && workbook->
ed80: 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 biff_version ==
ed90: 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
eda0: 33 29 0a 09 20 20 20 20 20 20 7c 7c 20 28 72 65 3).. || (re
edb0: 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 cord_type.value
edc0: 3d 3d 20 42 49 46 46 5f 58 46 5f 34 0a 09 09 20 == BIFF_XF_4...
edd0: 20 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 && workbook->bi
ede0: 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 ff_version == FR
edf0: 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 34 29 EEXL_BIFF_VER_4)
ee00: 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 58 46 ).. {.../* XF
ee10: 20 5b 45 78 74 65 6e 64 65 64 20 46 6f 72 6d 61 [Extended Forma
ee20: 74 5d 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 t] marker found
ee30: 2a 2f 0a 09 09 75 6e 73 69 67 6e 65 64 20 63 68 */...unsigned ch
ee40: 61 72 20 66 6f 72 6d 61 74 3b 0a 09 09 75 6e 73 ar format;...uns
ee50: 69 67 6e 65 64 20 73 68 6f 72 74 20 73 5f 66 6f igned short s_fo
ee60: 72 6d 61 74 3b 0a 09 09 69 66 20 28 66 72 65 61 rmat;...if (frea
ee70: 64 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f d... (workboo
ee80: 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 72 65 k->record, 1, re
ee90: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 2c cord_size.value,
eea0: 0a 09 09 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b ... workbook
eeb0: 2d 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f 72 64 ->xls) != record
eec0: 5f 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 09 20 _size.value)...
eed0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 73 return 0;...s
eee0: 77 69 74 63 68 20 28 77 6f 72 6b 62 6f 6f 6b 2d witch (workbook-
eef0: 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 29 0a 09 >biff_version)..
ef00: 09 20 20 7b 0a 09 09 20 20 63 61 73 65 20 46 52 . {... case FR
ef10: 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 32 3a EEXL_BIFF_VER_2:
ef20: 0a 09 09 20 20 20 20 20 20 66 6f 72 6d 61 74 20 ... format
ef30: 3d 20 2a 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 = *(workbook->re
ef40: 63 6f 72 64 20 2b 20 32 29 3b 0a 09 09 20 20 20 cord + 2);...
ef50: 20 20 20 66 6f 72 6d 61 74 20 26 3d 20 30 78 33 format &= 0x3
ef60: 46 3b 0a 09 09 20 20 20 20 20 20 73 5f 66 6f 72 F;... s_for
ef70: 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b 0a 09 09 mat = format;...
ef80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 20 break;...
ef90: 20 63 61 73 65 20 46 52 45 45 58 4c 5f 42 49 46 case FREEXL_BIF
efa0: 46 5f 56 45 52 5f 33 3a 0a 09 09 20 20 63 61 73 F_VER_3:... cas
efb0: 65 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 e FREEXL_BIFF_VE
efc0: 52 5f 34 3a 0a 09 09 20 20 20 20 20 20 66 6f 72 R_4:... for
efd0: 6d 61 74 20 3d 20 2a 28 77 6f 72 6b 62 6f 6f 6b mat = *(workbook
efe0: 2d 3e 72 65 63 6f 72 64 20 2b 20 31 29 3b 0a 09 ->record + 1);..
eff0: 09 20 20 20 20 20 20 73 5f 66 6f 72 6d 61 74 20 . s_format
f000: 3d 20 66 6f 72 6d 61 74 3b 0a 09 09 20 20 20 20 = format;...
f010: 20 20 62 72 65 61 6b 3b 0a 09 09 20 20 7d 3b 0a break;... };.
f020: 09 09 61 64 64 5f 78 66 5f 74 6f 5f 77 6f 72 6b ..add_xf_to_work
f030: 62 6f 6f 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 book (workbook,
f040: 73 5f 66 6f 72 6d 61 74 29 3b 0a 09 09 63 6f 6e s_format);...con
f050: 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 tinue;.. }...
f060: 20 20 69 66 20 28 28 72 65 63 6f 72 64 5f 74 79 if ((record_ty
f070: 70 65 2e 76 61 6c 75 65 20 3d 3d 20 30 78 30 30 pe.value == 0x00
f080: 30 30 0a 09 20 20 20 20 20 20 20 26 26 20 77 6f 00.. && wo
f090: 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 rkbook->biff_ver
f0a0: 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 sion == FREEXL_B
f0b0: 49 46 46 5f 56 45 52 5f 32 29 0a 09 20 20 20 20 IFF_VER_2)..
f0c0: 20 20 7c 7c 20 28 72 65 63 6f 72 64 5f 74 79 70 || (record_typ
f0d0: 65 2e 76 61 6c 75 65 20 3d 3d 20 42 49 46 46 5f e.value == BIFF_
f0e0: 44 49 4d 45 4e 53 49 4f 4e 0a 09 09 20 20 26 26 DIMENSION... &&
f0f0: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 (workbook->biff
f100: 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 _version == FREE
f110: 58 4c 5f 42 49 46 46 5f 56 45 52 5f 33 0a 09 09 XL_BIFF_VER_3...
f120: 20 20 20 20 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f || workboo
f130: 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
f140: 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
f150: 45 52 5f 34 29 29 29 0a 09 20 20 20 20 7b 0a 09 ER_4))).. {..
f160: 09 2f 2a 20 44 49 4d 45 4e 53 49 4f 4e 20 6d 61 ./* DIMENSION ma
f170: 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 09 rker found */...
f180: 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 biff_word16 word
f190: 31 36 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 69 16;...unsigned i
f1a0: 6e 74 20 72 6f 77 73 3b 0a 09 09 75 6e 73 69 67 nt rows;...unsig
f1b0: 6e 65 64 20 73 68 6f 72 74 20 63 6f 6c 75 6d 6e ned short column
f1c0: 73 3b 0a 09 09 63 68 61 72 20 2a 75 74 66 38 5f s;...char *utf8_
f1d0: 6e 61 6d 65 3b 0a 09 09 69 66 20 28 66 72 65 61 name;...if (frea
f1e0: 64 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f d... (workboo
f1f0: 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 72 65 k->record, 1, re
f200: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 2c cord_size.value,
f210: 0a 09 09 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b ... workbook
f220: 2d 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f 72 64 ->xls) != record
f230: 5f 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 09 20 _size.value)...
f240: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 09 return 0;....
f250: 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 memcpy (word16.b
f260: 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
f270: 72 65 63 6f 72 64 20 2b 20 32 2c 20 32 29 3b 0a record + 2, 2);.
f280: 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 ..if (swap)...
f290: 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 swap16 (&word1
f2a0: 36 29 3b 0a 09 09 72 6f 77 73 20 3d 20 77 6f 72 6);...rows = wor
f2b0: 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 6d d16.value;...mem
f2c0: 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 cpy (word16.byte
f2d0: 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 s, workbook->rec
f2e0: 6f 72 64 20 2b 20 36 2c 20 32 29 3b 0a 09 09 69 ord + 6, 2);...i
f2f0: 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 f (swap)... s
f300: 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b wap16 (&word16);
f310: 0a 09 09 63 6f 6c 75 6d 6e 73 20 3d 20 77 6f 72 ...columns = wor
f320: 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 75 74 66 d16.value;...utf
f330: 38 5f 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 20 8_name = malloc
f340: 28 31 30 29 3b 0a 09 09 73 74 72 63 70 79 20 28 (10);...strcpy (
f350: 75 74 66 38 5f 6e 61 6d 65 2c 20 22 57 6f 72 6b utf8_name, "Work
f360: 73 68 65 65 74 22 29 3b 0a 09 09 69 66 20 28 21 sheet");...if (!
f370: 61 64 64 5f 73 68 65 65 74 5f 74 6f 5f 77 6f 72 add_sheet_to_wor
f380: 6b 62 6f 6f 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2c kbook (workbook,
f390: 20 30 2c 20 30 2c 20 30 2c 20 75 74 66 38 5f 6e 0, 0, 0, utf8_n
f3a0: 61 6d 65 29 29 0a 09 09 20 20 20 20 72 65 74 75 ame))... retu
f3b0: 72 6e 20 30 3b 0a 09 09 77 6f 72 6b 62 6f 6f 6b rn 0;...workbook
f3c0: 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d ->active_sheet =
f3d0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 69 72 73 74 workbook->first
f3e0: 5f 73 68 65 65 74 3b 0a 09 09 69 66 20 28 77 6f _sheet;...if (wo
f3f0: 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
f400: 68 65 65 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 09 heet != NULL)...
f410: 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 73 {... /* s
f420: 65 74 74 69 6e 67 20 53 68 65 65 74 20 64 69 6d etting Sheet dim
f430: 65 6e 73 69 6f 6e 73 20 2a 2f 0a 09 09 20 20 20 ensions */...
f440: 20 20 20 69 6e 74 20 72 65 74 3b 0a 09 09 20 20 int ret;...
f450: 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 workbook->ac
f460: 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 73 tive_sheet->rows
f470: 20 3d 20 72 6f 77 73 3b 0a 09 09 20 20 20 20 20 = rows;...
f480: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 workbook->activ
f490: 65 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 e_sheet->columns
f4a0: 20 3d 20 63 6f 6c 75 6d 6e 73 3b 0a 09 09 20 20 = columns;...
f4b0: 20 20 20 20 72 65 74 20 3d 20 61 6c 6c 6f 63 61 ret = alloca
f4c0: 74 65 5f 63 65 6c 6c 73 20 28 77 6f 72 6b 62 6f te_cells (workbo
f4d0: 6f 6b 29 3b 0a 09 09 20 20 20 20 20 20 69 66 20 ok);... if
f4e0: 28 72 65 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f (ret != FREEXL_O
f4f0: 4b 29 0a 09 09 09 20 20 72 65 74 75 72 6e 20 30 K).... return 0
f500: 3b 0a 09 09 20 20 7d 0a 09 09 63 6f 6e 74 69 6e ;... }...contin
f510: 75 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 69 ue;.. }... i
f520: 66 20 28 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 f (record_type.v
f530: 61 6c 75 65 20 3d 3d 20 42 49 46 46 5f 49 4e 54 alue == BIFF_INT
f540: 45 47 45 52 5f 32 0a 09 20 20 20 20 20 20 26 26 EGER_2.. &&
f550: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f workbook->biff_
f560: 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 version == FREEX
f570: 4c 5f 42 49 46 46 5f 56 45 52 5f 32 29 0a 09 20 L_BIFF_VER_2)..
f580: 20 20 20 7b 0a 09 09 2f 2a 20 49 4e 54 45 47 45 {.../* INTEGE
f590: 52 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a R marker found *
f5a0: 2f 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 36 20 /...biff_word16
f5b0: 77 6f 72 64 31 36 3b 0a 09 09 75 6e 73 69 67 6e word16;...unsign
f5c0: 65 64 20 73 68 6f 72 74 20 72 6f 77 3b 0a 09 09 ed short row;...
f5d0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 63 unsigned short c
f5e0: 6f 6c 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 73 ol;...unsigned s
f5f0: 68 6f 72 74 20 78 66 5f 69 6e 64 65 78 20 3d 20 hort xf_index =
f600: 30 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 73 68 0;...unsigned sh
f610: 6f 72 74 20 6e 75 6d 3b 0a 09 09 69 6e 74 20 69 ort num;...int i
f620: 73 5f 64 61 74 65 3b 0a 09 09 69 6e 74 20 69 73 s_date;...int is
f630: 5f 64 61 74 65 74 69 6d 65 3b 0a 09 09 69 6e 74 _datetime;...int
f640: 20 69 73 5f 74 69 6d 65 3b 0a 09 09 69 6e 74 20 is_time;...int
f650: 72 65 74 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 ret;...unsigned
f660: 63 68 61 72 20 66 6f 72 6d 61 74 3b 0a 0a 09 09 char format;....
f670: 69 66 20 28 21 63 68 65 63 6b 5f 6c 65 67 61 63 if (!check_legac
f680: 79 5f 75 6e 64 65 63 6c 61 72 65 64 5f 64 69 6d y_undeclared_dim
f690: 65 6e 73 69 6f 6e 0a 09 09 20 20 20 20 28 77 6f ension... (wo
f6a0: 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 2c 20 72 65 rkbook, swap, re
f6b0: 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 2c cord_type.value,
f6c0: 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c record_size.val
f6d0: 75 65 29 29 0a 09 09 20 20 20 20 72 65 74 75 72 ue))... retur
f6e0: 6e 20 30 3b 0a 0a 09 09 69 66 20 28 66 72 65 61 n 0;....if (frea
f6f0: 64 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f d... (workboo
f700: 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 72 65 k->record, 1, re
f710: 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 2c cord_size.value,
f720: 0a 09 09 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b ... workbook
f730: 2d 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f 72 64 ->xls) != record
f740: 5f 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 09 20 _size.value)...
f750: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 09 return 0;....
f760: 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 memcpy (word16.b
f770: 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
f780: 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 09 69 66 record, 2);...if
f790: 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 (swap)... sw
f7a0: 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a ap16 (&word16);.
f7b0: 09 09 72 6f 77 20 3d 20 77 6f 72 64 31 36 2e 76 ..row = word16.v
f7c0: 61 6c 75 65 3b 0a 09 09 6d 65 6d 63 70 79 20 28 alue;...memcpy (
f7d0: 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 6f word16.bytes, wo
f7e0: 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b rkbook->record +
f7f0: 20 32 2c 20 32 29 3b 0a 09 09 69 66 20 28 73 77 2, 2);...if (sw
f800: 61 70 29 0a 09 09 20 20 20 20 73 77 61 70 31 36 ap)... swap16
f810: 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 09 63 6f (&word16);...co
f820: 6c 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 l = word16.value
f830: 3b 0a 0a 09 09 66 6f 72 6d 61 74 20 3d 20 2a 28 ;....format = *(
f840: 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
f850: 20 2b 20 34 29 3b 0a 09 09 66 6f 72 6d 61 74 20 + 4);...format
f860: 26 3d 20 30 78 33 46 3b 0a 09 09 78 66 5f 69 6e &= 0x3F;...xf_in
f870: 64 65 78 20 3d 20 66 6f 72 6d 61 74 3b 0a 09 09 dex = format;...
f880: 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 memcpy (word16.b
f890: 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
f8a0: 72 65 63 6f 72 64 20 2b 20 37 2c 20 32 29 3b 0a record + 7, 2);.
f8b0: 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 ..if (swap)...
f8c0: 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 swap16 (&word1
f8d0: 36 29 3b 0a 09 09 6e 75 6d 20 3d 20 77 6f 72 64 6);...num = word
f8e0: 31 36 2e 76 61 6c 75 65 3b 0a 0a 09 09 69 66 20 16.value;....if
f8f0: 28 21 63 68 65 63 6b 5f 78 66 5f 64 61 74 65 74 (!check_xf_datet
f900: 69 6d 65 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 ime... (workb
f910: 6f 6f 6b 2c 20 78 66 5f 69 6e 64 65 78 2c 20 26 ook, xf_index, &
f920: 69 73 5f 64 61 74 65 2c 20 26 69 73 5f 64 61 74 is_date, &is_dat
f930: 65 74 69 6d 65 2c 20 26 69 73 5f 74 69 6d 65 29 etime, &is_time)
f940: 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
f950: 69 73 5f 64 61 74 65 20 3d 20 30 3b 0a 09 09 20 is_date = 0;...
f960: 20 20 20 20 20 69 73 5f 64 61 74 65 74 69 6d 65 is_datetime
f970: 20 3d 20 30 3b 0a 09 09 20 20 20 20 20 20 69 73 = 0;... is
f980: 5f 74 69 6d 65 20 3d 20 30 3b 0a 09 09 20 20 7d _time = 0;... }
f990: 0a 09 09 69 66 20 28 69 73 5f 64 61 74 65 29 0a ...if (is_date).
f9a0: 09 09 20 20 20 20 72 65 74 20 3d 0a 09 09 09 73 .. ret =....s
f9b0: 65 74 5f 64 61 74 65 5f 69 6e 74 5f 76 61 6c 75 et_date_int_valu
f9c0: 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 e (workbook, row
f9d0: 2c 20 63 6f 6c 2c 0a 09 09 09 09 09 20 20 20 20 , col,......
f9e0: 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 workbook->biff_d
f9f0: 61 74 65 5f 6d 6f 64 65 2c 20 6e 75 6d 29 3b 0a ate_mode, num);.
fa00: 09 09 65 6c 73 65 20 69 66 20 28 69 73 5f 64 61 ..else if (is_da
fa10: 74 65 74 69 6d 65 29 0a 09 09 20 20 20 20 72 65 tetime)... re
fa20: 74 20 3d 0a 09 09 09 73 65 74 5f 64 61 74 65 74 t =....set_datet
fa30: 69 6d 65 5f 69 6e 74 5f 76 61 6c 75 65 20 28 77 ime_int_value (w
fa40: 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f orkbook, row, co
fa50: 6c 2c 0a 09 09 09 09 09 09 77 6f 72 6b 62 6f 6f l,.......workboo
fa60: 6b 2d 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f 64 k->biff_date_mod
fa70: 65 2c 20 6e 75 6d 29 3b 0a 09 09 65 6c 73 65 20 e, num);...else
fa80: 69 66 20 28 69 73 5f 74 69 6d 65 29 0a 09 09 20 if (is_time)...
fa90: 20 20 20 72 65 74 20 3d 20 73 65 74 5f 74 69 6d ret = set_tim
faa0: 65 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 e_double_value (
fab0: 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 workbook, row, c
fac0: 6f 6c 2c 20 30 2e 30 29 3b 0a 09 09 65 6c 73 65 ol, 0.0);...else
fad0: 0a 09 09 20 20 20 20 72 65 74 20 3d 20 73 65 74 ... ret = set
fae0: 5f 69 6e 74 5f 76 61 6c 75 65 20 28 77 6f 72 6b _int_value (work
faf0: 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 20 book, row, col,
fb00: 6e 75 6d 29 3b 0a 09 09 69 66 20 28 72 65 74 20 num);...if (ret
fb10: 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 09 != FREEXL_OK)...
fb20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 09 return 0;...
fb30: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d continue;.. }
fb40: 0a 0a 09 20 20 69 66 20 28 28 72 65 63 6f 72 64 ... if ((record
fb50: 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d 3d 20 42 _type.value == B
fb60: 49 46 46 5f 4e 55 4d 42 45 52 5f 32 0a 09 20 20 IFF_NUMBER_2..
fb70: 20 20 20 20 20 26 26 20 77 6f 72 6b 62 6f 6f 6b && workbook
fb80: 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d ->biff_version =
fb90: 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 = FREEXL_BIFF_VE
fba0: 52 5f 32 29 0a 09 20 20 20 20 20 20 7c 7c 20 28 R_2).. || (
fbb0: 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 record_type.valu
fbc0: 65 20 3d 3d 20 42 49 46 46 5f 4e 55 4d 42 45 52 e == BIFF_NUMBER
fbd0: 0a 09 09 20 20 26 26 20 28 77 6f 72 6b 62 6f 6f ... && (workboo
fbe0: 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
fbf0: 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
fc00: 45 52 5f 33 0a 09 09 20 20 20 20 20 20 7c 7c 20 ER_3... ||
fc10: 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 workbook->biff_v
fc20: 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c ersion == FREEXL
fc30: 5f 42 49 46 46 5f 56 45 52 5f 34 29 29 29 0a 09 _BIFF_VER_4)))..
fc40: 20 20 20 20 7b 0a 09 09 2f 2a 20 4e 55 4d 42 45 {.../* NUMBE
fc50: 52 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a R marker found *
fc60: 2f 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 36 20 /...biff_word16
fc70: 77 6f 72 64 31 36 3b 0a 09 09 62 69 66 66 5f 66 word16;...biff_f
fc80: 6c 6f 61 74 20 77 6f 72 64 5f 66 6c 6f 61 74 3b loat word_float;
fc90: 0a 09 09 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 ...unsigned shor
fca0: 74 20 72 6f 77 3b 0a 09 09 75 6e 73 69 67 6e 65 t row;...unsigne
fcb0: 64 20 73 68 6f 72 74 20 63 6f 6c 3b 0a 09 09 75 d short col;...u
fcc0: 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 78 66 nsigned short xf
fcd0: 5f 69 6e 64 65 78 20 3d 20 30 3b 0a 09 09 64 6f _index = 0;...do
fce0: 75 62 6c 65 20 6e 75 6d 3b 0a 09 09 69 6e 74 20 uble num;...int
fcf0: 69 73 5f 64 61 74 65 3b 0a 09 09 69 6e 74 20 69 is_date;...int i
fd00: 73 5f 64 61 74 65 74 69 6d 65 3b 0a 09 09 69 6e s_datetime;...in
fd10: 74 20 69 73 5f 74 69 6d 65 3b 0a 09 09 69 6e 74 t is_time;...int
fd20: 20 72 65 74 3b 0a 0a 09 09 69 66 20 28 21 63 68 ret;....if (!ch
fd30: 65 63 6b 5f 6c 65 67 61 63 79 5f 75 6e 64 65 63 eck_legacy_undec
fd40: 6c 61 72 65 64 5f 64 69 6d 65 6e 73 69 6f 6e 0a lared_dimension.
fd50: 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2c .. (workbook,
fd60: 20 73 77 61 70 2c 20 72 65 63 6f 72 64 5f 74 79 swap, record_ty
fd70: 70 65 2e 76 61 6c 75 65 2c 20 72 65 63 6f 72 64 pe.value, record
fd80: 5f 73 69 7a 65 2e 76 61 6c 75 65 29 29 0a 09 09 _size.value))...
fd90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 return 0;...
fda0: 09 69 66 20 28 66 72 65 61 64 0a 09 09 20 20 20 .if (fread...
fdb0: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f (workbook->reco
fdc0: 72 64 2c 20 31 2c 20 72 65 63 6f 72 64 5f 73 69 rd, 1, record_si
fdd0: 7a 65 2e 76 61 6c 75 65 2c 0a 09 09 20 20 20 20 ze.value,...
fde0: 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 29 20 workbook->xls)
fdf0: 21 3d 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 != record_size.v
fe00: 61 6c 75 65 29 0a 09 09 20 20 20 20 72 65 74 75 alue)... retu
fe10: 72 6e 20 30 3b 0a 0a 09 09 6d 65 6d 63 70 79 20 rn 0;....memcpy
fe20: 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 (word16.bytes, w
fe30: 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c orkbook->record,
fe40: 20 32 29 3b 0a 09 09 69 66 20 28 73 77 61 70 29 2);...if (swap)
fe50: 0a 09 09 20 20 20 20 73 77 61 70 31 36 20 28 26 ... swap16 (&
fe60: 77 6f 72 64 31 36 29 3b 0a 09 09 72 6f 77 20 3d word16);...row =
fe70: 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 word16.value;..
fe80: 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e .memcpy (word16.
fe90: 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
fea0: 3e 72 65 63 6f 72 64 20 2b 20 32 2c 20 32 29 3b >record + 2, 2);
feb0: 0a 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 ...if (swap)...
fec0: 20 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 swap16 (&word
fed0: 31 36 29 3b 0a 09 09 63 6f 6c 20 3d 20 77 6f 72 16);...col = wor
fee0: 64 31 36 2e 76 61 6c 75 65 3b 0a 0a 09 09 69 66 d16.value;....if
fef0: 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 (workbook->biff
ff00: 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 _version == FREE
ff10: 58 4c 5f 42 49 46 46 5f 56 45 52 5f 32 29 0a 09 XL_BIFF_VER_2)..
ff20: 09 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 . {... /*
ff30: 42 49 46 46 32 20 2a 2f 0a 09 09 20 20 20 20 20 BIFF2 */...
ff40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 unsigned char f
ff50: 6f 72 6d 61 74 20 3d 20 2a 28 77 6f 72 6b 62 6f ormat = *(workbo
ff60: 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 34 29 3b ok->record + 4);
ff70: 0a 09 09 20 20 20 20 20 20 66 6f 72 6d 61 74 20 ... format
ff80: 26 3d 20 30 78 33 46 3b 0a 09 09 20 20 20 20 20 &= 0x3F;...
ff90: 20 78 66 5f 69 6e 64 65 78 20 3d 20 66 6f 72 6d xf_index = form
ffa0: 61 74 3b 0a 09 09 20 20 20 20 20 20 6d 65 6d 63 at;... memc
ffb0: 70 79 20 28 77 6f 72 64 5f 66 6c 6f 61 74 2e 62 py (word_float.b
ffc0: 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
ffd0: 72 65 63 6f 72 64 20 2b 20 37 2c 20 38 29 3b 0a record + 7, 8);.
ffe0: 09 09 20 20 20 20 20 20 69 66 20 28 73 77 61 70 .. if (swap
fff0: 29 0a 09 09 09 20 20 73 77 61 70 5f 66 6c 6f 61 ).... swap_floa
10000 74 20 28 26 77 6f 72 64 5f 66 6c 6f 61 74 29 3b t (&word_float);
10010 0a 09 09 20 20 20 20 20 20 6e 75 6d 20 3d 20 77 ... num = w
10020 6f 72 64 5f 66 6c 6f 61 74 2e 76 61 6c 75 65 3b ord_float.value;
10030 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 ... }...else...
10040 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 61 {... /* a
10050 6e 79 20 6f 74 68 65 72 20 73 65 62 73 65 71 75 ny other sebsequ
10060 65 6e 74 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 ent version */..
10070 09 20 20 20 20 20 20 6d 65 6d 63 70 79 20 28 77 . memcpy (w
10080 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 ord16.bytes, wor
10090 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 kbook->record +
100a0 34 2c 20 32 29 3b 0a 09 09 20 20 20 20 20 20 69 4, 2);... i
100b0 66 20 28 73 77 61 70 29 0a 09 09 09 20 20 73 77 f (swap).... sw
100c0 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a ap16 (&word16);.
100d0 09 09 20 20 20 20 20 20 78 66 5f 69 6e 64 65 78 .. xf_index
100e0 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b = word16.value;
100f0 0a 09 09 20 20 20 20 20 20 6d 65 6d 63 70 79 20 ... memcpy
10100 28 77 6f 72 64 5f 66 6c 6f 61 74 2e 62 79 74 65 (word_float.byte
10110 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 s, workbook->rec
10120 6f 72 64 20 2b 20 36 2c 20 38 29 3b 0a 09 09 20 ord + 6, 8);...
10130 20 20 20 20 20 69 66 20 28 73 77 61 70 29 0a 09 if (swap)..
10140 09 09 20 20 73 77 61 70 5f 66 6c 6f 61 74 20 28 .. swap_float (
10150 26 77 6f 72 64 5f 66 6c 6f 61 74 29 3b 0a 09 09 &word_float);...
10160 20 20 20 20 20 20 6e 75 6d 20 3d 20 77 6f 72 64 num = word
10170 5f 66 6c 6f 61 74 2e 76 61 6c 75 65 3b 0a 09 09 _float.value;...
10180 20 20 7d 0a 09 09 69 66 20 28 21 63 68 65 63 6b }...if (!check
10190 5f 78 66 5f 64 61 74 65 74 69 6d 65 0a 09 09 20 _xf_datetime...
101a0 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 78 66 (workbook, xf
101b0 5f 69 6e 64 65 78 2c 20 26 69 73 5f 64 61 74 65 _index, &is_date
101c0 2c 20 26 69 73 5f 64 61 74 65 74 69 6d 65 2c 20 , &is_datetime,
101d0 26 69 73 5f 74 69 6d 65 29 29 0a 09 09 20 20 7b &is_time))... {
101e0 0a 09 09 20 20 20 20 20 20 69 73 5f 64 61 74 65 ... is_date
101f0 20 3d 20 30 3b 0a 09 09 20 20 20 20 20 20 69 73 = 0;... is
10200 5f 64 61 74 65 74 69 6d 65 20 3d 20 30 3b 0a 09 _datetime = 0;..
10210 09 20 20 20 20 20 20 69 73 5f 74 69 6d 65 20 3d . is_time =
10220 20 30 3b 0a 09 09 20 20 7d 0a 09 09 69 66 20 28 0;... }...if (
10230 69 73 5f 64 61 74 65 29 0a 09 09 20 20 20 20 72 is_date)... r
10240 65 74 20 3d 0a 09 09 09 73 65 74 5f 64 61 74 65 et =....set_date
10250 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 77 _double_value (w
10260 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f orkbook, row, co
10270 6c 2c 0a 09 09 09 09 09 20 20 20 20 20 20 20 77 l,...... w
10280 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 61 orkbook->biff_da
10290 74 65 5f 6d 6f 64 65 2c 20 6e 75 6d 29 3b 0a 09 te_mode, num);..
102a0 09 65 6c 73 65 20 69 66 20 28 69 73 5f 64 61 74 .else if (is_dat
102b0 65 74 69 6d 65 29 0a 09 09 20 20 20 20 72 65 74 etime)... ret
102c0 20 3d 0a 09 09 09 73 65 74 5f 64 61 74 65 74 69 =....set_dateti
102d0 6d 65 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 me_double_value
102e0 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 (workbook, row,
102f0 63 6f 6c 2c 0a 09 09 09 09 09 09 20 20 20 77 6f col,....... wo
10300 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 rkbook->biff_dat
10310 65 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 09 20 20 e_mode,.......
10320 20 6e 75 6d 29 3b 0a 09 09 65 6c 73 65 20 69 66 num);...else if
10330 20 28 69 73 5f 74 69 6d 65 29 0a 09 09 20 20 20 (is_time)...
10340 20 72 65 74 20 3d 20 73 65 74 5f 74 69 6d 65 5f ret = set_time_
10350 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 77 6f double_value (wo
10360 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c rkbook, row, col
10370 2c 20 6e 75 6d 29 3b 0a 09 09 65 6c 73 65 0a 09 , num);...else..
10380 09 20 20 20 20 72 65 74 20 3d 20 73 65 74 5f 64 . ret = set_d
10390 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 77 6f 72 ouble_value (wor
103a0 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c kbook, row, col,
103b0 20 6e 75 6d 29 3b 0a 09 09 69 66 20 28 72 65 74 num);...if (ret
103c0 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 != FREEXL_OK)..
103d0 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 . return 0;..
103e0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 .continue;..
103f0 7d 0a 0a 09 20 20 69 66 20 28 28 72 65 63 6f 72 }... if ((recor
10400 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d 3d 20 d_type.value ==
10410 42 49 46 46 5f 42 4f 4f 4c 45 52 52 5f 32 0a 09 BIFF_BOOLERR_2..
10420 20 20 20 20 20 20 20 26 26 20 77 6f 72 6b 62 6f && workbo
10430 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e ok->biff_version
10440 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f == FREEXL_BIFF_
10450 56 45 52 5f 32 29 0a 09 20 20 20 20 20 20 7c 7c VER_2).. ||
10460 20 28 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 (record_type.va
10470 6c 75 65 20 3d 3d 20 42 49 46 46 5f 42 4f 4f 4c lue == BIFF_BOOL
10480 45 52 52 0a 09 09 20 20 26 26 20 28 77 6f 72 6b ERR... && (work
10490 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 book->biff_versi
104a0 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 on == FREEXL_BIF
104b0 46 5f 56 45 52 5f 33 0a 09 09 20 20 20 20 20 20 F_VER_3...
104c0 7c 7c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 || workbook->bif
104d0 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 f_version == FRE
104e0 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 34 29 29 EXL_BIFF_VER_4))
104f0 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 42 4f ).. {.../* BO
10500 4f 4c 45 52 52 20 6d 61 72 6b 65 72 20 66 6f 75 OLERR marker fou
10510 6e 64 20 2a 2f 0a 09 09 62 69 66 66 5f 77 6f 72 nd */...biff_wor
10520 64 31 36 20 77 6f 72 64 31 36 3b 0a 09 09 75 6e d16 word16;...un
10530 73 69 67 6e 65 64 20 73 68 6f 72 74 20 72 6f 77 signed short row
10540 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 73 68 6f ;...unsigned sho
10550 72 74 20 63 6f 6c 3b 0a 09 09 75 6e 73 69 67 6e rt col;...unsign
10560 65 64 20 63 68 61 72 20 76 61 6c 75 65 3b 0a 09 ed char value;..
10570 09 69 6e 74 20 72 65 74 3b 0a 0a 09 09 69 66 20 .int ret;....if
10580 28 21 63 68 65 63 6b 5f 6c 65 67 61 63 79 5f 75 (!check_legacy_u
10590 6e 64 65 63 6c 61 72 65 64 5f 64 69 6d 65 6e 73 ndeclared_dimens
105a0 69 6f 6e 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 ion... (workb
105b0 6f 6f 6b 2c 20 73 77 61 70 2c 20 72 65 63 6f 72 ook, swap, recor
105c0 64 5f 74 79 70 65 2e 76 61 6c 75 65 2c 20 72 65 d_type.value, re
105d0 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 29 cord_size.value)
105e0 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 )... return 0
105f0 3b 0a 0a 09 09 69 66 20 28 66 72 65 61 64 0a 09 ;....if (fread..
10600 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e . (workbook->
10610 72 65 63 6f 72 64 2c 20 31 2c 20 72 65 63 6f 72 record, 1, recor
10620 64 5f 73 69 7a 65 2e 76 61 6c 75 65 2c 0a 09 09 d_size.value,...
10630 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 workbook->x
10640 6c 73 29 20 21 3d 20 72 65 63 6f 72 64 5f 73 69 ls) != record_si
10650 7a 65 2e 76 61 6c 75 65 29 0a 09 09 20 20 20 20 ze.value)...
10660 72 65 74 75 72 6e 20 30 3b 0a 0a 09 09 6d 65 6d return 0;....mem
10670 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 cpy (word16.byte
10680 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 s, workbook->rec
10690 6f 72 64 2c 20 32 29 3b 0a 09 09 69 66 20 28 73 ord, 2);...if (s
106a0 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 70 31 wap)... swap1
106b0 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 09 72 6 (&word16);...r
106c0 6f 77 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 ow = word16.valu
106d0 65 3b 0a 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 e;...memcpy (wor
106e0 64 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 d16.bytes, workb
106f0 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 32 2c ook->record + 2,
10700 20 32 29 3b 0a 09 09 69 66 20 28 73 77 61 70 29 2);...if (swap)
10710 0a 09 09 20 20 20 20 73 77 61 70 31 36 20 28 26 ... swap16 (&
10720 77 6f 72 64 31 36 29 3b 0a 09 09 63 6f 6c 20 3d word16);...col =
10730 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 0a word16.value;..
10740 09 09 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e ..if (workbook->
10750 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 biff_version ==
10760 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
10770 32 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 2)... {...
10780 20 2f 2a 20 42 49 46 46 32 20 2a 2f 0a 09 09 20 /* BIFF2 */...
10790 20 20 20 20 20 76 61 6c 75 65 20 3d 20 2a 28 77 value = *(w
107a0 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 orkbook->record
107b0 2b 20 37 29 3b 0a 09 09 20 20 7d 0a 09 09 65 6c + 7);... }...el
107c0 73 65 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 se... {...
107d0 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 73 65 /* any other se
107e0 62 73 65 71 75 65 6e 74 20 76 65 72 73 69 6f 6e bsequent version
107f0 20 2a 2f 0a 09 09 20 20 20 20 20 20 76 61 6c 75 */... valu
10800 65 20 3d 20 2a 28 77 6f 72 6b 62 6f 6f 6b 2d 3e e = *(workbook->
10810 72 65 63 6f 72 64 20 2b 20 36 29 3b 0a 09 09 20 record + 6);...
10820 20 7d 0a 09 09 69 66 20 28 76 61 6c 75 65 20 21 }...if (value !
10830 3d 20 30 29 0a 09 09 20 20 20 20 76 61 6c 75 65 = 0)... value
10840 20 3d 20 31 3b 0a 09 09 72 65 74 20 3d 20 73 65 = 1;...ret = se
10850 74 5f 69 6e 74 5f 76 61 6c 75 65 20 28 77 6f 72 t_int_value (wor
10860 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c kbook, row, col,
10870 20 76 61 6c 75 65 29 3b 0a 09 09 69 66 20 28 72 value);...if (r
10880 65 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 et != FREEXL_OK)
10890 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b ... return 0;
108a0 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 ...continue;..
108b0 20 20 7d 0a 0a 09 20 20 69 66 20 28 72 65 63 6f }... if (reco
108c0 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 3d 3d rd_type.value ==
108d0 20 42 49 46 46 5f 52 4b 0a 09 20 20 20 20 20 20 BIFF_RK..
108e0 26 26 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 && (workbook->bi
108f0 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 ff_version == FR
10900 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 33 0a EEXL_BIFF_VER_3.
10910 09 09 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b 2d .. || workbook-
10920 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d >biff_version ==
10930 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 FREEXL_BIFF_VER
10940 5f 34 29 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a _4)).. {.../*
10950 20 52 4b 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 RK marker found
10960 20 2a 2f 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 */...biff_word1
10970 36 20 77 6f 72 64 31 36 3b 0a 09 09 62 69 66 66 6 word16;...biff
10980 5f 77 6f 72 64 33 32 20 77 6f 72 64 33 32 3b 0a _word32 word32;.
10990 09 09 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 ..unsigned short
109a0 20 72 6f 77 3b 0a 09 09 75 6e 73 69 67 6e 65 64 row;...unsigned
109b0 20 73 68 6f 72 74 20 63 6f 6c 3b 0a 09 09 75 6e short col;...un
109c0 73 69 67 6e 65 64 20 73 68 6f 72 74 20 78 66 5f signed short xf_
109d0 69 6e 64 65 78 3b 0a 09 09 69 6e 74 20 69 6e 74 index;...int int
109e0 5f 76 61 6c 75 65 3b 0a 09 09 64 6f 75 62 6c 65 _value;...double
109f0 20 64 62 6c 5f 76 61 6c 75 65 3b 0a 09 09 69 6e dbl_value;...in
10a00 74 20 69 73 5f 64 61 74 65 3b 0a 09 09 69 6e 74 t is_date;...int
10a10 20 69 73 5f 64 61 74 65 74 69 6d 65 3b 0a 09 09 is_datetime;...
10a20 69 6e 74 20 69 73 5f 74 69 6d 65 3b 0a 09 09 69 int is_time;...i
10a30 6e 74 20 72 65 74 3b 0a 0a 09 09 69 66 20 28 21 nt ret;....if (!
10a40 63 68 65 63 6b 5f 6c 65 67 61 63 79 5f 75 6e 64 check_legacy_und
10a50 65 63 6c 61 72 65 64 5f 64 69 6d 65 6e 73 69 6f eclared_dimensio
10a60 6e 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f n... (workboo
10a70 6b 2c 20 73 77 61 70 2c 20 72 65 63 6f 72 64 5f k, swap, record_
10a80 74 79 70 65 2e 76 61 6c 75 65 2c 20 72 65 63 6f type.value, reco
10a90 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 29 29 0a rd_size.value)).
10aa0 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a .. return 0;.
10ab0 0a 09 09 69 66 20 28 66 72 65 61 64 0a 09 09 20 ...if (fread...
10ac0 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 (workbook->re
10ad0 63 6f 72 64 2c 20 31 2c 20 72 65 63 6f 72 64 5f cord, 1, record_
10ae0 73 69 7a 65 2e 76 61 6c 75 65 2c 0a 09 09 20 20 size.value,...
10af0 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 workbook->xls
10b00 29 20 21 3d 20 72 65 63 6f 72 64 5f 73 69 7a 65 ) != record_size
10b10 2e 76 61 6c 75 65 29 0a 09 09 20 20 20 20 72 65 .value)... re
10b20 74 75 72 6e 20 30 3b 0a 0a 09 09 6d 65 6d 63 70 turn 0;....memcp
10b30 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c y (word16.bytes,
10b40 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 workbook->recor
10b50 64 2c 20 32 29 3b 0a 09 09 69 66 20 28 73 77 61 d, 2);...if (swa
10b60 70 29 0a 09 09 20 20 20 20 73 77 61 70 31 36 20 p)... swap16
10b70 28 26 77 6f 72 64 31 36 29 3b 0a 09 09 72 6f 77 (&word16);...row
10b80 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b = word16.value;
10b90 0a 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 ...memcpy (word1
10ba0 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6.bytes, workboo
10bb0 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 32 2c 20 32 k->record + 2, 2
10bc0 29 3b 0a 09 09 69 66 20 28 73 77 61 70 29 0a 09 );...if (swap)..
10bd0 09 20 20 20 20 73 77 61 70 31 36 20 28 26 77 6f . swap16 (&wo
10be0 72 64 31 36 29 3b 0a 09 09 63 6f 6c 20 3d 20 77 rd16);...col = w
10bf0 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 6d ord16.value;...m
10c00 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 emcpy (word16.by
10c10 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 tes, workbook->r
10c20 65 63 6f 72 64 20 2b 20 34 2c 20 32 29 3b 0a 09 ecord + 4, 2);..
10c30 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 .if (swap)...
10c40 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
10c50 29 3b 0a 09 09 78 66 5f 69 6e 64 65 78 20 3d 20 );...xf_index =
10c60 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 word16.value;...
10c70 6d 65 6d 63 70 79 20 28 77 6f 72 64 33 32 2e 62 memcpy (word32.b
10c80 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
10c90 72 65 63 6f 72 64 20 2b 20 36 2c 20 34 29 3b 0a record + 6, 4);.
10ca0 09 09 69 66 20 28 64 65 63 6f 64 65 5f 72 6b 5f ..if (decode_rk_
10cb0 69 6e 74 65 67 65 72 20 28 77 6f 72 64 33 32 2e integer (word32.
10cc0 62 79 74 65 73 2c 20 26 69 6e 74 5f 76 61 6c 75 bytes, &int_valu
10cd0 65 2c 20 73 77 61 70 29 29 0a 09 09 20 20 7b 0a e, swap))... {.
10ce0 09 09 20 20 20 20 20 20 69 66 20 28 21 63 68 65 .. if (!che
10cf0 63 6b 5f 78 66 5f 64 61 74 65 74 69 6d 65 0a 09 ck_xf_datetime..
10d00 09 09 20 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 78 .. (workbook, x
10d10 66 5f 69 6e 64 65 78 2c 20 26 69 73 5f 64 61 74 f_index, &is_dat
10d20 65 2c 20 26 69 73 5f 64 61 74 65 74 69 6d 65 2c e, &is_datetime,
10d30 0a 09 09 09 20 20 20 26 69 73 5f 74 69 6d 65 29 .... &is_time)
10d40 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 69 73 )....{.... is
10d50 5f 64 61 74 65 20 3d 20 30 3b 0a 09 09 09 20 20 _date = 0;....
10d60 20 20 69 73 5f 64 61 74 65 74 69 6d 65 20 3d 20 is_datetime =
10d70 30 3b 0a 09 09 09 20 20 20 20 69 73 5f 74 69 6d 0;.... is_tim
10d80 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 20 20 e = 0;....}...
10d90 20 20 20 20 69 66 20 28 69 73 5f 64 61 74 65 29 if (is_date)
10da0 0a 09 09 09 20 20 72 65 74 20 3d 0a 09 09 09 20 .... ret =....
10db0 20 20 20 20 20 73 65 74 5f 64 61 74 65 5f 69 6e set_date_in
10dc0 74 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f 6f t_value (workboo
10dd0 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 0a 09 09 09 k, row, col,....
10de0 09 09 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 ... workbook->b
10df0 69 66 66 5f 64 61 74 65 5f 6d 6f 64 65 2c 0a 09 iff_date_mode,..
10e00 09 09 09 09 09 20 20 69 6e 74 5f 76 61 6c 75 65 ..... int_value
10e10 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 20 );... else
10e20 69 66 20 28 69 73 5f 64 61 74 65 74 69 6d 65 29 if (is_datetime)
10e30 0a 09 09 09 20 20 72 65 74 20 3d 0a 09 09 09 20 .... ret =....
10e40 20 20 20 20 20 73 65 74 5f 64 61 74 65 74 69 6d set_datetim
10e50 65 5f 69 6e 74 5f 76 61 6c 75 65 20 28 77 6f 72 e_int_value (wor
10e60 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c kbook, row, col,
10e70 0a 09 09 09 09 09 09 20 20 20 20 20 20 77 6f 72 ....... wor
10e80 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 kbook->biff_date
10e90 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 09 20 20 20 _mode,.......
10ea0 20 20 20 69 6e 74 5f 76 61 6c 75 65 29 3b 0a 09 int_value);..
10eb0 09 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 . else if (
10ec0 69 73 5f 74 69 6d 65 29 0a 09 09 09 20 20 72 65 is_time).... re
10ed0 74 20 3d 20 73 65 74 5f 74 69 6d 65 5f 64 6f 75 t = set_time_dou
10ee0 62 6c 65 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 ble_value (workb
10ef0 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 20 30 ook, row, col, 0
10f00 2e 30 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 .0);... els
10f10 65 0a 09 09 09 20 20 72 65 74 20 3d 20 73 65 74 e.... ret = set
10f20 5f 69 6e 74 5f 76 61 6c 75 65 20 28 77 6f 72 6b _int_value (work
10f30 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 20 book, row, col,
10f40 69 6e 74 5f 76 61 6c 75 65 29 3b 0a 09 09 20 20 int_value);...
10f50 20 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 46 if (ret != F
10f60 52 45 45 58 4c 5f 4f 4b 29 0a 09 09 09 20 20 72 REEXL_OK).... r
10f70 65 74 75 72 6e 20 30 3b 0a 09 09 20 20 7d 0a 09 eturn 0;... }..
10f80 09 65 6c 73 65 20 69 66 20 28 64 65 63 6f 64 65 .else if (decode
10f90 5f 72 6b 5f 66 6c 6f 61 74 20 28 77 6f 72 64 33 _rk_float (word3
10fa0 32 2e 62 79 74 65 73 2c 20 26 64 62 6c 5f 76 61 2.bytes, &dbl_va
10fb0 6c 75 65 2c 20 73 77 61 70 29 29 0a 09 09 20 20 lue, swap))...
10fc0 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 21 63 {... if (!c
10fd0 68 65 63 6b 5f 78 66 5f 64 61 74 65 74 69 6d 65 heck_xf_datetime
10fe0 0a 09 09 09 20 20 28 77 6f 72 6b 62 6f 6f 6b 2c .... (workbook,
10ff0 20 78 66 5f 69 6e 64 65 78 2c 20 26 69 73 5f 64 xf_index, &is_d
11000 61 74 65 2c 20 26 69 73 5f 64 61 74 65 74 69 6d ate, &is_datetim
11010 65 2c 0a 09 09 09 20 20 20 26 69 73 5f 74 69 6d e,.... &is_tim
11020 65 29 29 0a 09 09 09 7b 0a 09 09 09 20 20 20 20 e))....{....
11030 69 73 5f 64 61 74 65 20 3d 20 30 3b 0a 09 09 09 is_date = 0;....
11040 20 20 20 20 69 73 5f 64 61 74 65 74 69 6d 65 20 is_datetime
11050 3d 20 30 3b 0a 09 09 09 20 20 20 20 69 73 5f 74 = 0;.... is_t
11060 69 6d 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 ime = 0;....}...
11070 20 20 20 20 20 20 69 66 20 28 69 73 5f 64 61 74 if (is_dat
11080 65 29 0a 09 09 09 20 20 72 65 74 20 3d 0a 09 09 e).... ret =...
11090 09 20 20 20 20 20 20 73 65 74 5f 64 61 74 65 5f . set_date_
110a0 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 77 6f double_value (wo
110b0 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c rkbook, row, col
110c0 2c 0a 09 09 09 09 09 09 20 20 20 20 20 77 6f 72 ,....... wor
110d0 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 kbook->biff_date
110e0 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 09 20 20 20 _mode,.......
110f0 20 20 64 62 6c 5f 76 61 6c 75 65 29 3b 0a 09 09 dbl_value);...
11100 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 69 else if (i
11110 73 5f 64 61 74 65 74 69 6d 65 29 0a 09 09 09 20 s_datetime)....
11120 20 72 65 74 20 3d 0a 09 09 09 20 20 20 20 20 20 ret =....
11130 73 65 74 5f 64 61 74 65 74 69 6d 65 5f 64 6f 75 set_datetime_dou
11140 62 6c 65 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 ble_value (workb
11150 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 0a 09 ook, row, col,..
11160 09 09 09 09 09 09 20 77 6f 72 6b 62 6f 6f 6b 2d ...... workbook-
11170 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f 64 65 2c >biff_date_mode,
11180 0a 09 09 09 09 09 09 09 20 64 62 6c 5f 76 61 6c ........ dbl_val
11190 75 65 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 ue);... els
111a0 65 20 69 66 20 28 69 73 5f 74 69 6d 65 29 0a 09 e if (is_time)..
111b0 09 09 20 20 72 65 74 20 3d 0a 09 09 09 20 20 20 .. ret =....
111c0 20 20 20 73 65 74 5f 74 69 6d 65 5f 64 6f 75 62 set_time_doub
111d0 6c 65 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f le_value (workbo
111e0 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 0a 09 09 ok, row, col,...
111f0 09 09 09 09 20 20 20 20 20 64 62 6c 5f 76 61 6c .... dbl_val
11200 75 65 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 ue);... els
11210 65 0a 09 09 09 20 20 72 65 74 20 3d 0a 09 09 09 e.... ret =....
11220 20 20 20 20 20 20 73 65 74 5f 64 6f 75 62 6c 65 set_double
11230 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b _value (workbook
11240 2c 20 72 6f 77 2c 20 63 6f 6c 2c 20 64 62 6c 5f , row, col, dbl_
11250 76 61 6c 75 65 29 3b 0a 09 09 20 20 20 20 20 20 value);...
11260 69 66 20 28 72 65 74 20 21 3d 20 46 52 45 45 58 if (ret != FREEX
11270 4c 5f 4f 4b 29 0a 09 09 09 20 20 72 65 74 75 72 L_OK).... retur
11280 6e 20 30 3b 0a 09 09 20 20 7d 0a 09 09 65 6c 73 n 0;... }...els
11290 65 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 30 e... return 0
112a0 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 ;...continue;..
112b0 20 20 20 7d 0a 0a 09 20 20 69 66 20 28 28 72 65 }... if ((re
112c0 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 65 20 cord_type.value
112d0 3d 3d 20 42 49 46 46 5f 4c 41 42 45 4c 5f 32 0a == BIFF_LABEL_2.
112e0 09 20 20 20 20 20 20 20 26 26 20 77 6f 72 6b 62 . && workb
112f0 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f ook->biff_versio
11300 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 n == FREEXL_BIFF
11310 5f 56 45 52 5f 32 29 0a 09 20 20 20 20 20 20 7c _VER_2).. |
11320 7c 20 28 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 | (record_type.v
11330 61 6c 75 65 20 3d 3d 20 42 49 46 46 5f 4c 41 42 alue == BIFF_LAB
11340 45 4c 0a 09 09 20 20 26 26 20 28 77 6f 72 6b 62 EL... && (workb
11350 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f ook->biff_versio
11360 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 n == FREEXL_BIFF
11370 5f 56 45 52 5f 33 0a 09 09 20 20 20 20 20 20 7c _VER_3... |
11380 7c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 | workbook->biff
11390 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 _version == FREE
113a0 58 4c 5f 42 49 46 46 5f 56 45 52 5f 34 29 29 29 XL_BIFF_VER_4)))
113b0 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 4c 41 42 .. {.../* LAB
113c0 45 4c 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 EL marker found
113d0 2a 2f 0a 09 09 62 69 66 66 5f 77 6f 72 64 31 36 */...biff_word16
113e0 20 77 6f 72 64 31 36 3b 0a 09 09 63 68 61 72 20 word16;...char
113f0 2a 73 74 72 69 6e 67 3b 0a 09 09 63 68 61 72 20 *string;...char
11400 2a 75 74 66 38 5f 73 74 72 69 6e 67 3b 0a 09 09 *utf8_string;...
11410 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e unsigned int len
11420 3b 0a 09 09 69 6e 74 20 65 72 72 3b 0a 09 09 75 ;...int err;...u
11430 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 72 6f nsigned short ro
11440 77 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 73 68 w;...unsigned sh
11450 6f 72 74 20 63 6f 6c 3b 0a 09 09 75 6e 73 69 67 ort col;...unsig
11460 6e 65 64 20 63 68 61 72 20 2a 70 5f 73 74 72 69 ned char *p_stri
11470 6e 67 3b 0a 09 09 69 6e 74 20 72 65 74 3b 0a 0a ng;...int ret;..
11480 09 09 69 66 20 28 21 63 68 65 63 6b 5f 6c 65 67 ..if (!check_leg
11490 61 63 79 5f 75 6e 64 65 63 6c 61 72 65 64 5f 64 acy_undeclared_d
114a0 69 6d 65 6e 73 69 6f 6e 0a 09 09 20 20 20 20 28 imension... (
114b0 77 6f 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 2c 20 workbook, swap,
114c0 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 record_type.valu
114d0 65 2c 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 e, record_size.v
114e0 61 6c 75 65 29 29 0a 09 09 20 20 20 20 72 65 74 alue))... ret
114f0 75 72 6e 20 30 3b 0a 0a 09 09 69 66 20 28 66 72 urn 0;....if (fr
11500 65 61 64 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 ead... (workb
11510 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 31 2c 20 ook->record, 1,
11520 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 record_size.valu
11530 65 2c 0a 09 09 20 20 20 20 20 77 6f 72 6b 62 6f e,... workbo
11540 6f 6b 2d 3e 78 6c 73 29 20 21 3d 20 72 65 63 6f ok->xls) != reco
11550 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 29 0a 09 rd_size.value)..
11560 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a . return 0;..
11570 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 ..memcpy (word16
11580 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b .bytes, workbook
11590 2d 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 09 ->record, 2);...
115a0 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 if (swap)...
115b0 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 swap16 (&word16)
115c0 3b 0a 09 09 72 6f 77 20 3d 20 77 6f 72 64 31 36 ;...row = word16
115d0 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 6d 63 70 79 .value;...memcpy
115e0 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 (word16.bytes,
115f0 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
11600 20 2b 20 32 2c 20 32 29 3b 0a 09 09 69 66 20 28 + 2, 2);...if (
11610 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 70 swap)... swap
11620 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 09 16 (&word16);...
11630 63 6f 6c 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c col = word16.val
11640 75 65 3b 0a 0a 09 09 69 66 20 28 77 6f 72 6b 62 ue;....if (workb
11650 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f ook->biff_versio
11660 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 n == FREEXL_BIFF
11670 5f 56 45 52 5f 32 29 0a 09 09 20 20 7b 0a 09 09 _VER_2)... {...
11680 20 20 20 20 20 20 6c 65 6e 20 3d 20 2a 28 77 6f len = *(wo
11690 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b rkbook->record +
116a0 20 37 29 3b 0a 09 09 20 20 20 20 20 20 70 5f 73 7);... p_s
116b0 74 72 69 6e 67 20 3d 20 77 6f 72 6b 62 6f 6f 6b tring = workbook
116c0 2d 3e 72 65 63 6f 72 64 20 2b 20 38 3b 0a 09 09 ->record + 8;...
116d0 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b }...else... {
116e0 0a 09 09 20 20 20 20 20 20 6d 65 6d 63 70 79 20 ... memcpy
116f0 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 (word16.bytes, w
11700 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 orkbook->record
11710 2b 20 36 2c 20 32 29 3b 0a 09 09 20 20 20 20 20 + 6, 2);...
11720 20 69 66 20 28 73 77 61 70 29 0a 09 09 09 20 20 if (swap)....
11730 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 swap16 (&word16)
11740 3b 0a 09 09 20 20 20 20 20 20 6c 65 6e 20 3d 20 ;... len =
11750 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 word16.value;...
11760 20 20 20 20 20 20 70 5f 73 74 72 69 6e 67 20 3d p_string =
11770 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 workbook->recor
11780 64 20 2b 20 38 3b 0a 09 09 20 20 7d 0a 0a 09 09 d + 8;... }....
11790 73 74 72 69 6e 67 20 3d 20 6d 61 6c 6c 6f 63 20 string = malloc
117a0 28 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 20 (len);...memcpy
117b0 28 73 74 72 69 6e 67 2c 20 70 5f 73 74 72 69 6e (string, p_strin
117c0 67 2c 20 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 63 g, len);..../* c
117d0 6f 6e 76 65 72 74 69 6e 67 20 74 65 78 74 20 74 onverting text t
117e0 6f 20 55 54 46 2d 38 20 2a 2f 0a 09 09 75 74 66 o UTF-8 */...utf
117f0 38 5f 73 74 72 69 6e 67 20 3d 0a 09 09 20 20 20 8_string =...
11800 20 63 6f 6e 76 65 72 74 5f 74 6f 5f 75 74 66 38 convert_to_utf8
11810 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 38 (workbook->utf8
11820 5f 63 6f 6e 76 65 72 74 65 72 2c 20 73 74 72 69 _converter, stri
11830 6e 67 2c 20 6c 65 6e 2c 0a 09 09 09 09 20 20 20 ng, len,.....
11840 20 20 26 65 72 72 29 3b 0a 09 09 66 72 65 65 20 &err);...free
11850 28 73 74 72 69 6e 67 29 3b 0a 09 09 69 66 20 28 (string);...if (
11860 65 72 72 29 0a 09 09 20 20 20 20 72 65 74 75 72 err)... retur
11870 6e 20 30 3b 0a 09 09 72 65 74 20 3d 20 73 65 74 n 0;...ret = set
11880 5f 74 65 78 74 5f 76 61 6c 75 65 20 28 77 6f 72 _text_value (wor
11890 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c kbook, row, col,
118a0 20 75 74 66 38 5f 73 74 72 69 6e 67 29 3b 0a 09 utf8_string);..
118b0 09 69 66 20 28 72 65 74 20 21 3d 20 46 52 45 45 .if (ret != FREE
118c0 58 4c 5f 4f 4b 29 0a 09 09 20 20 20 20 72 65 74 XL_OK)... ret
118d0 75 72 6e 20 30 3b 0a 09 09 63 6f 6e 74 69 6e 75 urn 0;...continu
118e0 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 2f 2a e;.. }... /*
118f0 20 73 6b 69 70 70 69 6e 67 20 74 6f 20 6e 65 78 skipping to nex
11900 74 20 72 65 63 6f 72 64 20 2a 2f 0a 09 73 6b 69 t record */..ski
11910 70 5f 74 6f 5f 6e 65 78 74 3a 0a 09 20 20 77 68 p_to_next:.. wh
11920 65 72 65 20 3d 20 72 65 63 6f 72 64 5f 73 69 7a ere = record_siz
11930 65 2e 76 61 6c 75 65 3b 0a 09 20 20 69 66 20 28 e.value;.. if (
11940 66 73 65 65 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2d fseek (workbook-
11950 3e 78 6c 73 2c 20 77 68 65 72 65 2c 20 53 45 45 >xls, where, SEE
11960 4b 5f 43 55 52 29 20 21 3d 20 30 29 0a 09 20 20 K_CUR) != 0)..
11970 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
11980 20 20 20 20 7d 0a 0a 2f 2a 20 73 61 76 69 6e 67 }../* saving
11990 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 the current rec
119a0 6f 72 64 20 2a 2f 0a 20 20 20 20 77 6f 72 6b 62 ord */. workb
119b0 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 65 ook->record_type
119c0 20 3d 20 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 = record_type.v
119d0 61 6c 75 65 3b 0a 20 20 20 20 77 6f 72 6b 62 6f alue;. workbo
119e0 6f 6b 2d 3e 72 65 63 6f 72 64 5f 73 69 7a 65 20 ok->record_size
119f0 3d 20 72 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 = record_size.va
11a00 6c 75 65 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e lue;.. return
11a10 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 0;.}..static in
11a20 74 0a 63 68 65 63 6b 5f 61 6c 72 65 61 64 79 5f t.check_already_
11a30 64 6f 6e 65 20 28 62 69 66 66 5f 77 6f 72 6b 62 done (biff_workb
11a40 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 29 0a ook * workbook).
11a50 7b 0a 2f 2a 20 63 68 65 63 6b 69 6e 67 20 69 66 {./* checking if
11a60 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 61 the currently a
11a70 63 74 69 76 65 20 73 68 65 65 74 20 68 61 73 20 ctive sheet has
11a80 62 65 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 61 been already loa
11a90 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 77 ded */. if (w
11aa0 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f orkbook->active_
11ab0 73 68 65 65 74 20 21 3d 20 4e 55 4c 4c 29 0a 20 sheet != NULL).
11ac0 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 77 6f {.. if (wo
11ad0 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
11ae0 68 65 65 74 2d 3e 61 6c 72 65 61 64 79 5f 64 6f heet->already_do
11af0 6e 65 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 ne).. {.../*
11b00 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 2a already loaded *
11b10 2f 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a 09 20 /...return 1;..
11b20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
11b30 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 return 0;.}..st
11b40 61 74 69 63 20 69 6e 74 0a 63 68 65 63 6b 5f 75 atic int.check_u
11b50 6e 64 65 63 6c 61 72 65 64 5f 64 69 6d 65 6e 73 ndeclared_dimens
11b60 69 6f 6e 20 28 62 69 66 66 5f 77 6f 72 6b 62 6f ion (biff_workbo
11b70 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c 20 75 ok * workbook, u
11b80 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 6f 77 2c nsigned int row,
11b90 0a 09 09 09 20 20 20 20 75 6e 73 69 67 6e 65 64 .... unsigned
11ba0 20 73 68 6f 72 74 20 63 6f 6c 29 0a 7b 0a 2f 2a short col).{./*
11bb0 20 63 68 65 63 6b 69 6e 67 20 69 66 20 44 49 4d checking if DIM
11bc0 45 4e 53 49 4f 4e 20 69 73 6e 27 74 20 79 65 74 ENSION isn't yet
11bd0 20 73 65 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 set */. if (
11be0 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 workbook->active
11bf0 5f 73 68 65 65 74 20 21 3d 20 4e 55 4c 4c 29 0a _sheet != NULL).
11c00 20 20 20 20 20 20 7b 0a 09 20 20 69 66 20 28 77 {.. if (w
11c10 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f orkbook->active_
11c20 73 68 65 65 74 2d 3e 76 61 6c 69 64 5f 64 69 6d sheet->valid_dim
11c30 65 6e 73 69 6f 6e 20 3d 3d 20 30 29 0a 09 20 20 ension == 0)..
11c40 20 20 7b 0a 09 09 2f 2a 20 6e 6f 74 20 79 65 74 {.../* not yet
11c50 20 73 65 74 20 2a 2f 0a 09 09 69 66 20 28 72 6f set */...if (ro
11c60 77 20 3e 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 w > workbook->ac
11c70 74 69 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 73 tive_sheet->rows
11c80 29 0a 09 09 20 20 20 20 77 6f 72 6b 62 6f 6f 6b )... workbook
11c90 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e ->active_sheet->
11ca0 72 6f 77 73 20 3d 20 72 6f 77 3b 0a 09 09 69 66 rows = row;...if
11cb0 20 28 63 6f 6c 20 3e 20 77 6f 72 6b 62 6f 6f 6b (col > workbook
11cc0 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e ->active_sheet->
11cd0 63 6f 6c 75 6d 6e 73 29 0a 09 09 20 20 20 20 77 columns)... w
11ce0 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f orkbook->active_
11cf0 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 20 3d sheet->columns =
11d00 20 63 6f 6c 3b 0a 09 09 72 65 74 75 72 6e 20 31 col;...return 1
11d10 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d ;.. }. }
11d20 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
11d30 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 70 61 72 ..static int.par
11d40 73 65 5f 62 69 66 66 5f 72 65 63 6f 72 64 20 28 se_biff_record (
11d50 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 biff_workbook *
11d60 77 6f 72 6b 62 6f 6f 6b 2c 20 69 6e 74 20 73 77 workbook, int sw
11d70 61 70 29 0a 7b 0a 2f 2a 20 0a 20 2a 20 61 74 74 ap).{./* . * att
11d80 65 6d 70 74 69 6e 67 20 74 6f 20 70 61 72 73 65 empting to parse
11d90 20 61 20 42 49 46 46 20 72 65 63 6f 72 64 20 0a a BIFF record .
11da0 20 2a 20 70 6c 65 61 73 65 20 6e 6f 74 65 20 77 * please note w
11db0 65 6c 6c 3a 20 42 49 46 46 35 20 61 6e 64 20 42 ell: BIFF5 and B
11dc0 49 46 46 38 20 76 65 72 73 69 6f 6e 73 20 6f 6e IFF8 versions on
11dd0 6c 79 0a 20 2a 0a 20 2a 20 6f 6c 64 65 73 74 20 ly. *. * oldest
11de0 42 49 46 46 32 2c 20 42 49 46 46 33 20 61 6e 64 BIFF2, BIFF3 and
11df0 20 42 49 46 46 34 20 61 72 65 20 70 72 6f 63 65 BIFF4 are proce
11e00 73 73 65 64 20 73 65 70 61 72 61 74 65 64 6c 79 ssed separatedly
11e10 0a 20 2a 20 62 79 20 72 65 61 64 5f 6c 65 67 61 . * by read_lega
11e20 63 79 5f 62 69 66 66 28 29 20 66 75 6e 63 74 69 cy_biff() functi
11e30 6f 6e 0a 20 2a 0a 20 2a 2f 0a 20 20 20 20 62 69 on. *. */. bi
11e40 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 31 36 ff_word16 word16
11e50 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
11e60 6e 74 20 62 61 73 65 5f 6f 66 66 73 65 74 20 3d nt base_offset =
11e70 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 63 75 72 72 65 workbook->curre
11e80 6e 74 5f 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 nt_offset;..
11e90 77 6f 72 6b 62 6f 6f 6b 2d 3e 63 75 72 72 65 6e workbook->curren
11ea0 74 5f 6f 66 66 73 65 74 20 2b 3d 20 77 6f 72 6b t_offset += work
11eb0 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 73 69 7a book->record_siz
11ec0 65 20 2b 20 34 3b 0a 0a 20 20 20 20 69 66 20 28 e + 4;.. if (
11ed0 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
11ee0 5f 74 79 70 65 20 3d 3d 20 42 49 46 46 5f 43 4f _type == BIFF_CO
11ef0 4e 54 49 4e 55 45 29 0a 20 20 20 20 20 20 7b 0a NTINUE). {.
11f00 09 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 6d . /* CONTINUE m
11f10 61 72 6b 65 72 20 66 6f 75 6e 64 3a 20 72 65 73 arker found: res
11f20 74 6f 72 69 6e 67 20 74 68 65 20 70 72 65 76 69 toring the previ
11f30 6f 75 73 20 72 65 63 6f 72 64 20 74 79 70 65 20 ous record type
11f40 2a 2f 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f */.. if (workbo
11f50 6f 6b 2d 3e 70 72 65 76 5f 72 65 63 6f 72 64 5f ok->prev_record_
11f60 74 79 70 65 20 3d 3d 20 42 49 46 46 5f 53 53 54 type == BIFF_SST
11f70 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 63 6f ).. {.../* co
11f80 6e 74 69 6e 75 69 6e 67 3a 20 53 53 54 20 5b 53 ntinuing: SST [S
11f90 68 61 72 65 64 20 53 74 72 69 6e 67 20 54 61 62 hared String Tab
11fa0 6c 65 5d 20 2a 2f 0a 09 09 69 66 20 28 77 6f 72 le] */...if (wor
11fb0 6b 62 6f 6f 6b 2d 3e 73 65 63 6f 6e 64 5f 70 61 kbook->second_pa
11fc0 73 73 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e ss)... return
11fd0 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 09 09 72 65 FREEXL_OK;...re
11fe0 74 75 72 6e 20 70 61 72 73 65 5f 53 53 54 20 28 turn parse_SST (
11ff0 77 6f 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 29 3b workbook, swap);
12000 0a 09 20 20 20 20 7d 0a 09 20 20 72 65 74 75 72 .. }.. retur
12010 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 n FREEXL_OK;.
12020 20 20 20 7d 0a 0a 20 20 20 20 77 6f 72 6b 62 6f }.. workbo
12030 6f 6b 2d 3e 70 72 65 76 5f 72 65 63 6f 72 64 5f ok->prev_record_
12040 74 79 70 65 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d type = workbook-
12050 3e 72 65 63 6f 72 64 5f 74 79 70 65 3b 0a 20 20 >record_type;.
12060 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e if (workbook->
12070 6f 6b 5f 62 6f 66 20 3d 3d 20 2d 31 29 0a 20 20 ok_bof == -1).
12080 20 20 20 20 7b 0a 09 20 20 2f 2a 20 0a 09 20 20 {.. /* ..
12090 20 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 63 * the first rec
120a0 6f 72 64 20 69 73 20 65 78 70 65 63 74 65 64 20 ord is expected
120b0 74 6f 20 62 65 20 6f 66 20 42 4f 46 20 74 79 70 to be of BOF typ
120c0 65 20 0a 09 20 20 20 2a 20 61 6e 64 20 63 6f 6e e .. * and con
120d0 74 61 69 6e 73 20 56 65 72 73 69 6f 6e 20 72 65 tains Version re
120e0 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f lated informatio
120f0 6e 20 0a 09 20 20 20 2a 2f 0a 09 20 20 73 77 69 n .. */.. swi
12100 74 63 68 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 tch (workbook->r
12110 65 63 6f 72 64 5f 74 79 70 65 29 0a 09 20 20 20 ecord_type)..
12120 20 7b 0a 09 20 20 20 20 63 61 73 65 20 42 49 46 {.. case BIF
12130 46 5f 42 4f 46 3a 09 2f 2a 20 42 49 46 46 35 20 F_BOF:./* BIFF5
12140 6f 72 20 42 49 46 46 38 20 2a 2f 0a 09 09 6d 65 or BIFF8 */...me
12150 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 mcpy (word16.byt
12160 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 es, workbook->re
12170 63 6f 72 64 2c 20 32 29 3b 0a 09 09 69 66 20 28 cord, 2);...if (
12180 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 70 swap)... swap
12190 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 09 16 (&word16);...
121a0 69 66 20 28 77 6f 72 64 31 36 2e 76 61 6c 75 65 if (word16.value
121b0 20 3d 3d 20 30 78 30 35 30 30 29 0a 09 09 20 20 == 0x0500)...
121c0 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 workbook->biff
121d0 5f 76 65 72 73 69 6f 6e 20 3d 20 46 52 45 45 58 _version = FREEX
121e0 4c 5f 42 49 46 46 5f 56 45 52 5f 35 3b 0a 09 09 L_BIFF_VER_5;...
121f0 65 6c 73 65 20 69 66 20 28 77 6f 72 64 31 36 2e else if (word16.
12200 76 61 6c 75 65 20 3d 3d 20 30 78 30 36 30 30 29 value == 0x0600)
12210 0a 09 09 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d ... workbook-
12220 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 20 >biff_version =
12230 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
12240 38 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 7b 0a 8;...else... {.
12250 09 09 20 20 20 20 20 20 2f 2a 20 75 6e 6b 6e 6f .. /* unkno
12260 77 6e 2c 20 70 72 6f 62 61 62 6c 79 20 77 72 6f wn, probably wro
12270 6e 67 20 6f 72 20 63 6f 72 72 75 70 74 65 64 20 ng or corrupted
12280 2a 2f 0a 09 09 20 20 20 20 20 20 77 6f 72 6b 62 */... workb
12290 6f 6f 6b 2d 3e 6f 6b 5f 62 6f 66 20 3d 20 30 3b ook->ok_bof = 0;
122a0 0a 09 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 ... return
122b0 46 52 45 45 58 4c 5f 42 49 46 46 5f 49 4e 56 41 FREEXL_BIFF_INVA
122c0 4c 49 44 5f 42 4f 46 3b 0a 09 09 20 20 7d 0a 09 LID_BOF;... }..
122d0 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 6f 6b 5f 62 6f .workbook->ok_bo
122e0 66 20 3d 20 31 3b 0a 09 09 62 72 65 61 6b 3b 0a f = 1;...break;.
122f0 09 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 09 . default:...
12300 77 6f 72 6b 62 6f 6f 6b 2d 3e 6f 6b 5f 62 6f 66 workbook->ok_bof
12310 20 3d 20 30 3b 0a 09 09 72 65 74 75 72 6e 20 46 = 0;...return F
12320 52 45 45 58 4c 5f 42 49 46 46 5f 49 4e 56 41 4c REEXL_BIFF_INVAL
12330 49 44 5f 42 4f 46 3b 0a 09 20 20 20 20 7d 3b 0a ID_BOF;.. };.
12340 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d . if (workbook-
12350 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d >biff_version ==
12360 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 FREEXL_BIFF_VER
12370 5f 38 29 0a 09 20 20 20 20 20 20 77 6f 72 6b 62 _8).. workb
12380 6f 6f 6b 2d 3e 62 69 66 66 5f 6d 61 78 5f 72 65 ook->biff_max_re
12390 63 6f 72 64 5f 73 69 7a 65 20 3d 20 38 32 32 34 cord_size = 8224
123a0 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 ;.. else..
123b0 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f workbook->biff_
123c0 6d 61 78 5f 72 65 63 6f 72 64 5f 73 69 7a 65 20 max_record_size
123d0 3d 20 32 30 38 30 3b 0a 09 20 20 6d 65 6d 63 70 = 2080;.. memcp
123e0 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c y (word16.bytes,
123f0 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 workbook->recor
12400 64 20 2b 20 32 2c 20 32 29 3b 0a 09 20 20 69 66 d + 2, 2);.. if
12410 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 20 73 (swap).. s
12420 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b wap16 (&word16);
12430 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 .. workbook->bi
12440 66 66 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 20 ff_content_type
12450 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
12460 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 . workbook->bif
12470 66 5f 63 6f 64 65 5f 70 61 67 65 20 3d 20 30 3b f_code_page = 0;
12480 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 .. return FREEX
12490 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 L_OK;. }.
124a0 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e if (workbook->
124b0 6f 6b 5f 62 6f 66 20 3d 3d 20 30 29 0a 20 20 20 ok_bof == 0).
124c0 20 20 20 7b 0a 09 20 20 2f 2a 20 77 65 20 61 72 {.. /* we ar
124d0 65 20 65 78 70 65 63 74 69 6e 67 20 74 6f 20 66 e expecting to f
124e0 69 6e 64 20 73 6f 6d 65 20 42 4f 46 20 72 65 63 ind some BOF rec
124f0 6f 72 64 20 68 65 72 65 20 28 6e 6f 74 20 74 68 ord here (not th
12500 65 20 6d 61 69 6e 20 6f 6e 65 29 20 2a 2f 0a 09 e main one) */..
12510 20 20 73 77 69 74 63 68 20 28 77 6f 72 6b 62 6f switch (workbo
12520 6f 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 65 29 ok->record_type)
12530 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 73 .. {.. cas
12540 65 20 42 49 46 46 5f 42 4f 46 3a 09 2f 2a 20 42 e BIFF_BOF:./* B
12550 49 46 46 35 20 6f 72 20 42 49 46 46 38 20 2a 2f IFF5 or BIFF8 */
12560 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 6f 6b 5f ...workbook->ok_
12570 62 6f 66 20 3d 20 31 3b 0a 09 09 6d 65 6d 63 70 bof = 1;...memcp
12580 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c y (word16.bytes,
12590 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 workbook->recor
125a0 64 20 2b 20 32 2c 20 32 29 3b 0a 09 09 69 66 20 d + 2, 2);...if
125b0 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 (swap)... swa
125c0 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 p16 (&word16);..
125d0 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f .workbook->biff_
125e0 63 6f 6e 74 65 6e 74 5f 74 79 70 65 20 3d 20 77 content_type = w
125f0 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 77 ord16.value;...w
12600 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 63 6f orkbook->biff_co
12610 64 65 5f 70 61 67 65 20 3d 20 30 3b 0a 09 09 62 de_page = 0;...b
12620 72 65 61 6b 3b 0a 09 20 20 20 20 64 65 66 61 75 reak;.. defau
12630 6c 74 3a 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e lt:...workbook->
12640 6f 6b 5f 62 6f 66 20 3d 20 30 3b 0a 09 09 72 65 ok_bof = 0;...re
12650 74 75 72 6e 20 46 52 45 45 58 4c 5f 42 49 46 46 turn FREEXL_BIFF
12660 5f 49 4e 56 41 4c 49 44 5f 42 4f 46 3b 0a 09 20 _INVALID_BOF;..
12670 20 20 20 7d 3b 0a 09 20 20 73 65 6c 65 63 74 5f };.. select_
12680 61 63 74 69 76 65 5f 73 68 65 65 74 20 28 77 6f active_sheet (wo
12690 72 6b 62 6f 6f 6b 2c 20 62 61 73 65 5f 6f 66 66 rkbook, base_off
126a0 73 65 74 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 set);.. return
126b0 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 FREEXL_OK;.
126c0 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 6b }.. if (work
126d0 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 book->record_typ
126e0 65 20 3d 3d 20 42 49 46 46 5f 45 4f 46 29 0a 20 e == BIFF_EOF).
126f0 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 45 4f 46 {.. /* EOF
12700 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 3a 20 74 marker found: t
12710 68 65 20 63 75 72 72 65 6e 74 20 73 74 72 65 61 he current strea
12720 6d 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 m is terminated
12730 2a 2f 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e */.. workbook->
12740 6f 6b 5f 62 6f 66 20 3d 20 30 3b 0a 09 20 20 77 ok_bof = 0;.. w
12750 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 63 6f orkbook->biff_co
12760 6e 74 65 6e 74 5f 74 79 70 65 20 3d 20 30 3b 0a ntent_type = 0;.
12770 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 . workbook->bif
12780 66 5f 63 6f 64 65 5f 70 61 67 65 20 3d 20 30 3b f_code_page = 0;
12790 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 .. return FREEX
127a0 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 L_OK;. }..
127b0 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d if (workbook-
127c0 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 3d 3d 20 >record_type ==
127d0 42 49 46 46 5f 53 53 54 29 0a 20 20 20 20 20 20 BIFF_SST).
127e0 7b 0a 09 20 20 2f 2a 20 53 53 54 20 5b 53 68 61 {.. /* SST [Sha
127f0 72 65 64 20 53 74 72 69 6e 67 20 54 61 62 6c 65 red String Table
12800 5d 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a ] marker found *
12810 2f 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f /.. if (workboo
12820 6b 2d 3e 73 65 63 6f 6e 64 5f 70 61 73 73 29 0a k->second_pass).
12830 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 52 . return FR
12840 45 45 58 4c 5f 4f 4b 3b 0a 09 20 20 72 65 74 75 EEXL_OK;.. retu
12850 72 6e 20 70 61 72 73 65 5f 53 53 54 20 28 77 6f rn parse_SST (wo
12860 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 29 3b 0a 20 rkbook, swap);.
12870 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 }.. if (
12880 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
12890 5f 74 79 70 65 20 3d 3d 20 42 49 46 46 5f 43 4f _type == BIFF_CO
128a0 44 45 50 41 47 45 29 0a 20 20 20 20 20 20 7b 0a DEPAGE). {.
128b0 09 20 20 2f 2a 20 43 4f 44 45 50 41 47 45 20 6d . /* CODEPAGE m
128c0 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 arker found */..
128d0 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 memcpy (word16
128e0 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b .bytes, workbook
128f0 2d 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 20 ->record, 2);..
12900 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 if (swap)..
12910 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 swap16 (&word1
12920 36 29 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 6);.. workbook-
12930 3e 62 69 66 66 5f 63 6f 64 65 5f 70 61 67 65 20 >biff_code_page
12940 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
12950 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d . if (workbook-
12960 3e 6f 6b 5f 62 6f 66 20 3d 3d 20 31 29 0a 09 20 >ok_bof == 1)..
12970 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 workbook->b
12980 69 66 66 5f 62 6f 6f 6b 5f 63 6f 64 65 5f 70 61 iff_book_code_pa
12990 67 65 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 ge = word16.valu
129a0 65 3b 0a 09 20 20 69 66 20 28 21 62 69 66 66 5f e;.. if (!biff_
129b0 73 65 74 5f 75 74 66 38 5f 63 6f 6e 76 65 72 74 set_utf8_convert
129c0 65 72 20 28 77 6f 72 6b 62 6f 6f 6b 29 29 0a 09 er (workbook))..
129d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 return FRE
129e0 45 58 4c 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f EXL_UNSUPPORTED_
129f0 43 48 41 52 53 45 54 3b 0a 09 20 20 72 65 74 75 CHARSET;.. retu
12a00 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 rn FREEXL_OK;.
12a10 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 }.. if (w
12a20 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f orkbook->record_
12a30 74 79 70 65 20 3d 3d 20 42 49 46 46 5f 44 41 54 type == BIFF_DAT
12a40 45 4d 4f 44 45 29 0a 20 20 20 20 20 20 7b 0a 09 EMODE). {..
12a50 20 20 2f 2a 20 44 41 54 45 4d 4f 44 45 20 6d 61 /* DATEMODE ma
12a60 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 rker found */..
12a70 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e memcpy (word16.
12a80 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
12a90 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 20 20 >record, 2);..
12aa0 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 if (swap)..
12ab0 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
12ac0 29 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e );.. workbook->
12ad0 62 69 66 66 5f 64 61 74 65 5f 6d 6f 64 65 20 3d biff_date_mode =
12ae0 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 word16.value;..
12af0 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f return FREEXL_
12b00 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 OK;. }..
12b10 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 if (workbook->r
12b20 65 63 6f 72 64 5f 74 79 70 65 20 3d 3d 20 42 49 ecord_type == BI
12b30 46 46 5f 46 49 4c 45 50 41 53 53 29 0a 20 20 20 FF_FILEPASS).
12b40 20 20 20 7b 0a 09 20 20 2f 2a 20 50 41 53 53 57 {.. /* PASSW
12b50 4f 52 44 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 ORD marker found
12b60 20 2a 2f 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d */.. workbook-
12b70 3e 62 69 66 66 5f 6f 62 66 75 73 63 61 74 65 64 >biff_obfuscated
12b80 20 3d 20 31 3b 0a 09 20 20 72 65 74 75 72 6e 20 = 1;.. return
12b90 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 FREEXL_OK;.
12ba0 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 6b }.. if (work
12bb0 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 book->record_typ
12bc0 65 20 3d 3d 20 42 49 46 46 5f 53 48 45 45 54 29 e == BIFF_SHEET)
12bd0 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 53 . {.. /* S
12be0 48 45 45 54 20 6d 61 72 6b 65 72 20 66 6f 75 6e HEET marker foun
12bf0 64 20 2a 2f 0a 09 20 20 63 68 61 72 20 2a 75 74 d */.. char *ut
12c00 66 38 5f 6e 61 6d 65 3b 0a 09 20 20 63 68 61 72 f8_name;.. char
12c10 20 6e 61 6d 65 5b 34 30 39 36 5d 3b 0a 09 20 20 name[4096];..
12c20 69 6e 74 20 65 72 72 3b 0a 09 20 20 69 6e 74 20 int err;.. int
12c30 6c 65 6e 3b 0a 09 20 20 62 69 66 66 5f 77 6f 72 len;.. biff_wor
12c40 64 33 32 20 6f 66 66 73 65 74 3b 0a 0a 09 20 20 d32 offset;...
12c50 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 if (workbook->se
12c60 63 6f 6e 64 5f 70 61 73 73 29 0a 09 20 20 20 20 cond_pass)..
12c70 7b 0a 09 09 69 66 20 28 77 6f 72 6b 62 6f 6f 6b {...if (workbook
12c80 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d ->active_sheet =
12c90 3d 20 4e 55 4c 4c 29 0a 09 09 20 20 20 20 77 6f = NULL)... wo
12ca0 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 rkbook->active_s
12cb0 68 65 65 74 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d heet = workbook-
12cc0 3e 66 69 72 73 74 5f 73 68 65 65 74 3b 0a 09 09 >first_sheet;...
12cd0 65 6c 73 65 0a 09 09 20 20 20 20 77 6f 72 6b 62 else... workb
12ce0 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 ook->active_shee
12cf0 74 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 t = workbook->ac
12d00 74 69 76 65 5f 73 68 65 65 74 2d 3e 6e 65 78 74 tive_sheet->next
12d10 3b 0a 09 09 72 65 74 75 72 6e 20 46 52 45 45 58 ;...return FREEX
12d20 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 L_OK;.. }...
12d30 20 6d 65 6d 63 70 79 20 28 6f 66 66 73 65 74 2e memcpy (offset.
12d40 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
12d50 3e 72 65 63 6f 72 64 2c 20 34 29 3b 0a 09 20 20 >record, 4);..
12d60 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 if (swap)..
12d70 20 73 77 61 70 33 32 20 28 26 6f 66 66 73 65 74 swap32 (&offset
12d80 29 3b 0a 09 20 20 6c 65 6e 20 3d 20 77 6f 72 6b );.. len = work
12d90 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5b 36 5d 3b book->record[6];
12da0 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b .. if (workbook
12db0 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d ->biff_version =
12dc0 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 = FREEXL_BIFF_VE
12dd0 52 5f 35 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a R_5).. {.../*
12de0 20 42 49 46 46 35 3a 20 63 6f 64 65 70 61 67 65 BIFF5: codepage
12df0 20 74 65 78 74 20 2a 2f 0a 09 09 6d 65 6d 63 70 text */...memcp
12e00 79 20 28 6e 61 6d 65 2c 20 77 6f 72 6b 62 6f 6f y (name, workboo
12e10 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 37 2c 20 6c k->record + 7, l
12e20 65 6e 29 3b 0a 09 09 75 74 66 38 5f 6e 61 6d 65 en);...utf8_name
12e30 20 3d 0a 09 09 20 20 20 20 63 6f 6e 76 65 72 74 =... convert
12e40 5f 74 6f 5f 75 74 66 38 20 28 77 6f 72 6b 62 6f _to_utf8 (workbo
12e50 6f 6b 2d 3e 75 74 66 38 5f 63 6f 6e 76 65 72 74 ok->utf8_convert
12e60 65 72 2c 20 6e 61 6d 65 2c 20 6c 65 6e 2c 20 26 er, name, len, &
12e70 65 72 72 29 3b 0a 09 09 69 66 20 28 65 72 72 29 err);...if (err)
12e80 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 46 52 ... return FR
12e90 45 45 58 4c 5f 49 4e 56 41 4c 49 44 5f 43 48 41 EEXL_INVALID_CHA
12ea0 52 41 43 54 45 52 3b 0a 09 20 20 20 20 7d 0a 09 RACTER;.. }..
12eb0 20 20 65 6c 73 65 0a 09 20 20 20 20 7b 0a 09 09 else.. {...
12ec0 2f 2a 20 42 49 46 46 38 3a 20 55 6e 69 63 6f 64 /* BIFF8: Unicod
12ed0 65 20 74 65 78 74 20 2a 2f 0a 09 09 69 66 20 28 e text */...if (
12ee0 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
12ef0 5b 37 5d 20 3d 3d 20 30 78 30 30 29 0a 09 09 20 [7] == 0x00)...
12f00 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 27 73 {... /* 's
12f10 74 72 69 70 70 65 64 27 20 55 54 46 2d 31 36 3a tripped' UTF-16:
12f20 20 72 65 71 75 69 72 65 73 20 70 61 64 64 69 6e requires paddin
12f30 67 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 6e 74 g */... int
12f40 20 69 3b 0a 09 09 20 20 20 20 20 20 66 6f 72 20 i;... for
12f50 28 69 20 3d 20 30 3b 20 69 20 3c 20 6c 65 6e 3b (i = 0; i < len;
12f60 20 69 2b 2b 29 0a 09 09 09 7b 0a 09 09 09 20 20 i++)....{....
12f70 20 20 6e 61 6d 65 5b 69 20 2a 20 32 5d 20 3d 20 name[i * 2] =
12f80 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
12f90 5b 38 20 2b 20 69 5d 3b 0a 09 09 09 20 20 20 20 [8 + i];....
12fa0 6e 61 6d 65 5b 28 69 20 2a 20 32 29 20 2b 20 31 name[(i * 2) + 1
12fb0 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 7d 0a 09 ] = 0x00;....}..
12fc0 09 20 20 20 20 20 20 6c 65 6e 20 2a 3d 20 32 3b . len *= 2;
12fd0 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 ... }...else...
12fe0 20 20 7b 0a 09 09 20 20 20 20 20 20 2f 2a 20 61 {... /* a
12ff0 6c 72 65 61 64 79 20 65 6e 63 6f 64 65 64 20 61 lready encoded a
13000 73 20 55 54 46 2d 31 36 20 2a 2f 0a 09 09 20 20 s UTF-16 */...
13010 20 20 20 20 6c 65 6e 20 2a 3d 20 32 3b 0a 09 09 len *= 2;...
13020 20 20 20 20 20 20 6d 65 6d 63 70 79 20 28 6e 61 memcpy (na
13030 6d 65 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 me, workbook->re
13040 63 6f 72 64 20 2b 20 38 2c 20 6c 65 6e 29 3b 0a cord + 8, len);.
13050 09 09 20 20 7d 0a 09 09 75 74 66 38 5f 6e 61 6d .. }...utf8_nam
13060 65 20 3d 0a 09 09 20 20 20 20 63 6f 6e 76 65 72 e =... conver
13070 74 5f 74 6f 5f 75 74 66 38 20 28 77 6f 72 6b 62 t_to_utf8 (workb
13080 6f 6f 6b 2d 3e 75 74 66 31 36 5f 63 6f 6e 76 65 ook->utf16_conve
13090 72 74 65 72 2c 20 6e 61 6d 65 2c 20 6c 65 6e 2c rter, name, len,
130a0 0a 09 09 09 09 20 20 20 20 20 26 65 72 72 29 3b ..... &err);
130b0 0a 09 09 69 66 20 28 65 72 72 29 0a 09 09 20 20 ...if (err)...
130c0 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f return FREEXL_
130d0 49 4e 56 41 4c 49 44 5f 43 48 41 52 41 43 54 45 INVALID_CHARACTE
130e0 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 R;.. }.. if
130f0 28 21 61 64 64 5f 73 68 65 65 74 5f 74 6f 5f 77 (!add_sheet_to_w
13100 6f 72 6b 62 6f 6f 6b 0a 09 20 20 20 20 20 20 28 orkbook.. (
13110 77 6f 72 6b 62 6f 6f 6b 2c 20 6f 66 66 73 65 74 workbook, offset
13120 2e 76 61 6c 75 65 2c 20 77 6f 72 6b 62 6f 6f 6b .value, workbook
13130 2d 3e 72 65 63 6f 72 64 5b 34 5d 2c 20 77 6f 72 ->record[4], wor
13140 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5b 35 5d kbook->record[5]
13150 2c 0a 09 20 20 20 20 20 20 20 75 74 66 38 5f 6e ,.. utf8_n
13160 61 6d 65 29 29 0a 09 20 20 20 20 20 20 72 65 74 ame)).. ret
13170 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e 53 55 46 urn FREEXL_INSUF
13180 46 49 43 49 45 4e 54 5f 4d 45 4d 4f 52 59 3b 0a FICIENT_MEMORY;.
13190 09 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c . return FREEXL
131a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 _OK;. }..
131b0 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e if (workbook->
131c0 72 65 63 6f 72 64 5f 74 79 70 65 20 3d 3d 20 42 record_type == B
131d0 49 46 46 5f 44 49 4d 45 4e 53 49 4f 4e 0a 09 26 IFF_DIMENSION..&
131e0 26 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 & (workbook->bif
131f0 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 f_version == FRE
13200 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 35 0a 09 EXL_BIFF_VER_5..
13210 20 20 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b 2d || workbook-
13220 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d >biff_version ==
13230 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 FREEXL_BIFF_VER
13240 5f 38 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 _8)). {..
13250 2f 2a 20 44 49 4d 45 4e 53 49 4f 4e 20 6d 61 72 /* DIMENSION mar
13260 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 20 ker found */..
13270 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 biff_word16 word
13280 31 36 3b 0a 09 20 20 62 69 66 66 5f 77 6f 72 64 16;.. biff_word
13290 33 32 20 77 6f 72 64 33 32 3b 0a 09 20 20 75 6e 32 word32;.. un
132a0 73 69 67 6e 65 64 20 69 6e 74 20 72 6f 77 73 3b signed int rows;
132b0 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f .. unsigned sho
132c0 72 74 20 63 6f 6c 75 6d 6e 73 3b 0a 0a 09 20 20 rt columns;...
132d0 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 if (workbook->se
132e0 63 6f 6e 64 5f 70 61 73 73 29 0a 09 20 20 20 20 cond_pass)..
132f0 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f return FREEXL_
13300 4f 4b 3b 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 OK;.. if (workb
13310 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f ook->biff_versio
13320 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 n == FREEXL_BIFF
13330 5f 56 45 52 5f 38 29 0a 09 20 20 20 20 7b 0a 09 _VER_8).. {..
13340 09 2f 2a 20 42 49 46 46 38 3a 20 33 32 2d 62 69 ./* BIFF8: 32-bi
13350 74 20 72 6f 77 20 69 6e 64 65 78 20 2a 2f 0a 09 t row index */..
13360 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 33 32 2e .memcpy (word32.
13370 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
13380 3e 72 65 63 6f 72 64 20 2b 20 34 2c 20 34 29 3b >record + 4, 4);
13390 0a 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 ...if (swap)...
133a0 20 20 20 73 77 61 70 33 32 20 28 26 77 6f 72 64 swap32 (&word
133b0 33 32 29 3b 0a 09 09 72 6f 77 73 20 3d 20 77 6f 32);...rows = wo
133c0 72 64 33 32 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 rd32.value;...me
133d0 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 mcpy (word16.byt
133e0 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 es, workbook->re
133f0 63 6f 72 64 20 2b 20 31 30 2c 20 32 29 3b 0a 09 cord + 10, 2);..
13400 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 .if (swap)...
13410 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
13420 29 3b 0a 09 09 63 6f 6c 75 6d 6e 73 20 3d 20 77 );...columns = w
13430 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 20 20 ord16.value;..
13440 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 }.. else..
13450 20 7b 0a 09 09 2f 2a 20 61 6e 79 20 70 72 65 76 {.../* any prev
13460 69 6f 75 73 20 76 65 72 73 69 6f 6e 3a 20 31 36 ious version: 16
13470 2d 62 69 74 20 72 6f 77 20 69 6e 64 65 78 20 2a -bit row index *
13480 2f 0a 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 /...memcpy (word
13490 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 16.bytes, workbo
134a0 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 32 2c 20 ok->record + 2,
134b0 32 29 3b 0a 09 09 69 66 20 28 73 77 61 70 29 0a 2);...if (swap).
134c0 09 09 20 20 20 20 73 77 61 70 31 36 20 28 26 77 .. swap16 (&w
134d0 6f 72 64 31 36 29 3b 0a 09 09 72 6f 77 73 20 3d ord16);...rows =
134e0 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 word16.value;..
134f0 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e .memcpy (word16.
13500 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
13510 3e 72 65 63 6f 72 64 20 2b 20 36 2c 20 32 29 3b >record + 6, 2);
13520 0a 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 20 ...if (swap)...
13530 20 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 swap16 (&word
13540 31 36 29 3b 0a 09 09 63 6f 6c 75 6d 6e 73 20 3d 16);...columns =
13550 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 word16.value;..
13560 20 20 20 20 7d 0a 09 20 20 69 66 20 28 77 6f 72 }.. if (wor
13570 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 kbook->active_sh
13580 65 65 74 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 eet != NULL)..
13590 20 20 7b 0a 09 09 2f 2a 20 73 65 74 74 69 6e 67 {.../* setting
135a0 20 53 68 65 65 74 20 64 69 6d 65 6e 73 69 6f 6e Sheet dimension
135b0 73 20 2a 2f 0a 09 09 69 6e 74 20 72 65 74 3b 0a s */...int ret;.
135c0 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 ..workbook->acti
135d0 76 65 5f 73 68 65 65 74 2d 3e 72 6f 77 73 20 3d ve_sheet->rows =
135e0 20 72 6f 77 73 3b 0a 09 09 77 6f 72 6b 62 6f 6f rows;...workboo
135f0 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 2d k->active_sheet-
13600 3e 63 6f 6c 75 6d 6e 73 20 3d 20 63 6f 6c 75 6d >columns = colum
13610 6e 73 3b 0a 09 09 72 65 74 20 3d 20 61 6c 6c 6f ns;...ret = allo
13620 63 61 74 65 5f 63 65 6c 6c 73 20 28 77 6f 72 6b cate_cells (work
13630 62 6f 6f 6b 29 3b 0a 09 09 69 66 20 28 72 65 74 book);...if (ret
13640 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 != FREEXL_OK)..
13650 09 20 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b . return ret;
13660 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 ...workbook->act
13670 69 76 65 5f 73 68 65 65 74 2d 3e 76 61 6c 69 64 ive_sheet->valid
13680 5f 64 69 6d 65 6e 73 69 6f 6e 20 3d 20 31 3b 0a _dimension = 1;.
13690 09 20 20 20 20 7d 0a 09 20 20 72 65 74 75 72 6e . }.. return
136a0 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 FREEXL_OK;.
136b0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 }.. if (wor
136c0 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 3d 3d kbook->magic1 ==
136d0 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f 49 4e FREEXL_MAGIC_IN
136e0 46 4f 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f FO). {.. /
136f0 2a 20 77 68 65 6e 20 6f 70 65 6e 20 69 6e 20 49 * when open in I
13700 4e 46 4f 20 6d 6f 64 65 20 77 65 20 63 61 6e 20 NFO mode we can
13710 73 61 66 65 6c 79 20 69 67 6e 6f 72 65 20 61 6e safely ignore an
13720 79 20 6f 74 68 65 72 20 2a 2f 0a 09 20 20 72 65 y other */.. re
13730 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a turn FREEXL_OK;.
13740 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }.. if
13750 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 (workbook->recor
13760 64 5f 74 79 70 65 20 3d 3d 20 42 49 46 46 5f 46 d_type == BIFF_F
13770 4f 52 4d 41 54 0a 09 26 26 20 28 77 6f 72 6b 62 ORMAT..&& (workb
13780 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f ook->biff_versio
13790 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 n == FREEXL_BIFF
137a0 5f 56 45 52 5f 35 0a 09 20 20 20 20 7c 7c 20 77 _VER_5.. || w
137b0 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 orkbook->biff_ve
137c0 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f rsion == FREEXL_
137d0 42 49 46 46 5f 56 45 52 5f 38 29 29 0a 20 20 20 BIFF_VER_8)).
137e0 20 20 20 7b 0a 09 20 20 2f 2a 20 46 4f 52 4d 41 {.. /* FORMA
137f0 54 20 6d 61 72 6b 65 72 20 66 6f 75 6e 64 20 2a T marker found *
13800 2f 0a 09 20 20 62 69 66 66 5f 77 6f 72 64 31 36 /.. biff_word16
13810 20 77 6f 72 64 31 36 3b 0a 09 20 20 63 68 61 72 word16;.. char
13820 20 2a 73 74 72 69 6e 67 3b 0a 09 20 20 63 68 61 *string;.. cha
13830 72 20 2a 75 74 66 38 5f 73 74 72 69 6e 67 3b 0a r *utf8_string;.
13840 09 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 . unsigned int
13850 6c 65 6e 3b 0a 09 20 20 69 6e 74 20 65 72 72 3b len;.. int err;
13860 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f .. unsigned sho
13870 72 74 20 66 6f 72 6d 61 74 5f 69 6e 64 65 78 3b rt format_index;
13880 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 .. unsigned cha
13890 72 20 2a 70 5f 73 74 72 69 6e 67 3b 0a 09 20 20 r *p_string;..
138a0 69 6e 74 20 69 73 5f 64 61 74 65 20 3d 20 30 3b int is_date = 0;
138b0 0a 09 20 20 69 6e 74 20 69 73 5f 64 61 74 65 74 .. int is_datet
138c0 69 6d 65 20 3d 20 30 3b 0a 09 20 20 69 6e 74 20 ime = 0;.. int
138d0 69 73 5f 74 69 6d 65 20 3d 20 30 3b 0a 0a 09 20 is_time = 0;...
138e0 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 if (workbook->s
138f0 65 63 6f 6e 64 5f 70 61 73 73 29 0a 09 20 20 20 econd_pass)..
13900 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c return FREEXL
13910 5f 4f 4b 3b 0a 09 20 20 69 66 20 28 77 6f 72 6b _OK;.. if (work
13920 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 book->biff_versi
13930 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 on == FREEXL_BIF
13940 46 5f 56 45 52 5f 35 29 0a 09 20 20 20 20 7b 0a F_VER_5).. {.
13950 09 09 2f 2a 20 43 4f 44 45 50 41 47 45 20 73 74 ../* CODEPAGE st
13960 72 69 6e 67 20 2a 2f 0a 09 09 6d 65 6d 63 70 79 ring */...memcpy
13970 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 (word16.bytes,
13980 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
13990 2c 20 32 29 3b 0a 09 09 69 66 20 28 73 77 61 70 , 2);...if (swap
139a0 29 0a 09 09 20 20 20 20 73 77 61 70 31 36 20 28 )... swap16 (
139b0 26 77 6f 72 64 31 36 29 3b 0a 09 09 66 6f 72 6d &word16);...form
139c0 61 74 5f 69 6e 64 65 78 20 3d 20 77 6f 72 64 31 at_index = word1
139d0 36 2e 76 61 6c 75 65 3b 0a 09 09 6c 65 6e 20 3d 6.value;...len =
139e0 20 2a 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 *(workbook->rec
139f0 6f 72 64 20 2b 20 33 29 3b 0a 09 09 70 5f 73 74 ord + 3);...p_st
13a00 72 69 6e 67 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d ring = workbook-
13a10 3e 72 65 63 6f 72 64 20 2b 20 33 3b 0a 09 09 73 >record + 3;...s
13a20 74 72 69 6e 67 20 3d 20 6d 61 6c 6c 6f 63 20 28 tring = malloc (
13a30 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 20 28 len);...memcpy (
13a40 73 74 72 69 6e 67 2c 20 70 5f 73 74 72 69 6e 67 string, p_string
13a50 2c 20 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 63 6f , len);..../* co
13a60 6e 76 65 72 74 69 6e 67 20 74 65 78 74 20 74 6f nverting text to
13a70 20 55 54 46 2d 38 20 2a 2f 0a 09 09 75 74 66 38 UTF-8 */...utf8
13a80 5f 73 74 72 69 6e 67 20 3d 0a 09 09 20 20 20 20 _string =...
13a90 63 6f 6e 76 65 72 74 5f 74 6f 5f 75 74 66 38 20 convert_to_utf8
13aa0 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 38 5f (workbook->utf8_
13ab0 63 6f 6e 76 65 72 74 65 72 2c 20 73 74 72 69 6e converter, strin
13ac0 67 2c 20 6c 65 6e 2c 0a 09 09 09 09 20 20 20 20 g, len,.....
13ad0 20 26 65 72 72 29 3b 0a 09 09 66 72 65 65 20 28 &err);...free (
13ae0 73 74 72 69 6e 67 29 3b 0a 09 09 69 66 20 28 65 string);...if (e
13af0 72 72 29 0a 09 09 20 20 20 20 72 65 74 75 72 6e rr)... return
13b00 20 46 52 45 45 58 4c 5f 49 4e 56 41 4c 49 44 5f FREEXL_INVALID_
13b10 43 48 41 52 41 43 54 45 52 3b 0a 09 09 63 68 65 CHARACTER;...che
13b20 63 6b 5f 66 6f 72 6d 61 74 20 28 75 74 66 38 5f ck_format (utf8_
13b30 73 74 72 69 6e 67 2c 20 26 69 73 5f 64 61 74 65 string, &is_date
13b40 2c 20 26 69 73 5f 64 61 74 65 74 69 6d 65 2c 20 , &is_datetime,
13b50 26 69 73 5f 74 69 6d 65 29 3b 0a 09 09 66 72 65 &is_time);...fre
13b60 65 20 28 75 74 66 38 5f 73 74 72 69 6e 67 29 3b e (utf8_string);
13b70 0a 09 09 69 66 20 28 69 73 5f 64 61 74 65 20 7c ...if (is_date |
13b80 7c 20 69 73 5f 64 61 74 65 74 69 6d 65 20 7c 7c | is_datetime ||
13b90 20 69 73 5f 74 69 6d 65 29 0a 09 09 20 20 20 20 is_time)...
13ba0 61 64 64 5f 66 6f 72 6d 61 74 5f 74 6f 5f 77 6f add_format_to_wo
13bb0 72 6b 62 6f 6f 6b 20 28 77 6f 72 6b 62 6f 6f 6b rkbook (workbook
13bc0 2c 20 66 6f 72 6d 61 74 5f 69 6e 64 65 78 2c 20 , format_index,
13bd0 69 73 5f 64 61 74 65 2c 0a 09 09 09 09 09 20 20 is_date,......
13be0 20 20 69 73 5f 64 61 74 65 74 69 6d 65 2c 20 69 is_datetime, i
13bf0 73 5f 74 69 6d 65 29 3b 0a 09 20 20 20 20 7d 0a s_time);.. }.
13c00 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d . if (workbook-
13c10 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d >biff_version ==
13c20 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 FREEXL_BIFF_VER
13c30 5f 38 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 _8).. {.../*
13c40 70 6c 65 61 73 65 20 6e 6f 74 65 3a 20 74 68 69 please note: thi
13c50 73 20 61 6c 77 61 79 73 20 69 73 20 55 54 46 2d s always is UTF-
13c60 31 36 20 2a 2f 0a 09 09 69 6e 74 20 75 74 66 31 16 */...int utf1
13c70 36 20 3d 20 30 3b 0a 09 09 75 6e 73 69 67 6e 65 6 = 0;...unsigne
13c80 64 20 69 6e 74 20 73 74 61 72 74 5f 6f 66 66 73 d int start_offs
13c90 65 74 3b 0a 09 09 75 6e 73 69 67 6e 65 64 20 69 et;...unsigned i
13ca0 6e 74 20 65 78 74 72 61 5f 73 6b 69 70 3b 0a 09 nt extra_skip;..
13cb0 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e .memcpy (word16.
13cc0 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
13cd0 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 09 69 >record, 2);...i
13ce0 66 20 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 f (swap)... s
13cf0 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b wap16 (&word16);
13d00 0a 09 09 66 6f 72 6d 61 74 5f 69 6e 64 65 78 20 ...format_index
13d10 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
13d20 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 ..memcpy (word16
13d30 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b .bytes, workbook
13d40 2d 3e 72 65 63 6f 72 64 20 2b 20 32 2c 20 32 29 ->record + 2, 2)
13d50 3b 0a 09 09 69 66 20 28 73 77 61 70 29 0a 09 09 ;...if (swap)...
13d60 20 20 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 swap16 (&wor
13d70 64 31 36 29 3b 0a 09 09 6c 65 6e 20 3d 20 77 6f d16);...len = wo
13d80 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 09 70 5f rd16.value;...p_
13d90 73 74 72 69 6e 67 20 3d 20 77 6f 72 6b 62 6f 6f string = workboo
13da0 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 34 3b 0a 09 k->record + 4;..
13db0 09 67 65 74 5f 75 6e 69 63 6f 64 65 5f 70 61 72 .get_unicode_par
13dc0 61 6d 73 20 28 70 5f 73 74 72 69 6e 67 2c 20 73 ams (p_string, s
13dd0 77 61 70 2c 20 26 73 74 61 72 74 5f 6f 66 66 73 wap, &start_offs
13de0 65 74 2c 20 26 75 74 66 31 36 2c 0a 09 09 09 09 et, &utf16,.....
13df0 20 20 20 20 26 65 78 74 72 61 5f 73 6b 69 70 29 &extra_skip)
13e00 3b 0a 09 09 70 5f 73 74 72 69 6e 67 20 2b 3d 20 ;...p_string +=
13e10 73 74 61 72 74 5f 6f 66 66 73 65 74 3b 0a 09 09 start_offset;...
13e20 69 66 20 28 21 70 61 72 73 65 5f 75 6e 69 63 6f if (!parse_unico
13e30 64 65 5f 73 74 72 69 6e 67 0a 09 09 20 20 20 20 de_string...
13e40 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 31 36 (workbook->utf16
13e50 5f 63 6f 6e 76 65 72 74 65 72 2c 20 6c 65 6e 2c _converter, len,
13e60 20 75 74 66 31 36 2c 20 70 5f 73 74 72 69 6e 67 utf16, p_string
13e70 2c 0a 09 09 20 20 20 20 20 26 75 74 66 38 5f 73 ,... &utf8_s
13e80 74 72 69 6e 67 29 29 0a 09 09 20 20 20 20 72 65 tring))... re
13e90 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e 56 41 turn FREEXL_INVA
13ea0 4c 49 44 5f 43 48 41 52 41 43 54 45 52 3b 0a 09 LID_CHARACTER;..
13eb0 09 63 68 65 63 6b 5f 66 6f 72 6d 61 74 20 28 75 .check_format (u
13ec0 74 66 38 5f 73 74 72 69 6e 67 2c 20 26 69 73 5f tf8_string, &is_
13ed0 64 61 74 65 2c 20 26 69 73 5f 64 61 74 65 74 69 date, &is_dateti
13ee0 6d 65 2c 20 26 69 73 5f 74 69 6d 65 29 3b 0a 09 me, &is_time);..
13ef0 09 66 72 65 65 20 28 75 74 66 38 5f 73 74 72 69 .free (utf8_stri
13f00 6e 67 29 3b 0a 09 09 69 66 20 28 69 73 5f 64 61 ng);...if (is_da
13f10 74 65 20 7c 7c 20 69 73 5f 64 61 74 65 74 69 6d te || is_datetim
13f20 65 20 7c 7c 20 69 73 5f 74 69 6d 65 29 0a 09 09 e || is_time)...
13f30 20 20 20 20 61 64 64 5f 66 6f 72 6d 61 74 5f 74 add_format_t
13f40 6f 5f 77 6f 72 6b 62 6f 6f 6b 20 28 77 6f 72 6b o_workbook (work
13f50 62 6f 6f 6b 2c 20 66 6f 72 6d 61 74 5f 69 6e 64 book, format_ind
13f60 65 78 2c 20 69 73 5f 64 61 74 65 2c 0a 09 09 09 ex, is_date,....
13f70 09 09 20 20 20 20 69 73 5f 64 61 74 65 74 69 6d .. is_datetim
13f80 65 2c 20 69 73 5f 74 69 6d 65 29 3b 0a 09 20 20 e, is_time);..
13f90 20 20 7d 0a 09 20 20 72 65 74 75 72 6e 20 46 52 }.. return FR
13fa0 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d EEXL_OK;. }
13fb0 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f .. if (workbo
13fc0 6f 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 ok->record_type
13fd0 3d 3d 20 42 49 46 46 5f 58 46 0a 09 26 26 20 28 == BIFF_XF..&& (
13fe0 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 workbook->biff_v
13ff0 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c ersion == FREEXL
14000 5f 42 49 46 46 5f 56 45 52 5f 35 0a 09 20 20 20 _BIFF_VER_5..
14010 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 || workbook->bi
14020 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 ff_version == FR
14030 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 38 29 EEXL_BIFF_VER_8)
14040 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 ). {.. /*
14050 58 46 20 5b 45 78 74 65 6e 64 65 64 20 46 6f 72 XF [Extended For
14060 6d 61 74 5d 20 6d 61 72 6b 65 72 20 66 6f 75 6e mat] marker foun
14070 64 20 2a 2f 0a 09 20 20 75 6e 73 69 67 6e 65 64 d */.. unsigned
14080 20 73 68 6f 72 74 20 73 5f 66 6f 72 6d 61 74 3b short s_format;
14090 0a 09 20 20 62 69 66 66 5f 77 6f 72 64 31 36 20 .. biff_word16
140a0 77 6f 72 64 31 36 3b 0a 09 20 20 69 66 20 28 77 word16;.. if (w
140b0 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 6f 6e 64 5f orkbook->second_
140c0 70 61 73 73 29 0a 09 20 20 20 20 20 20 72 65 74 pass).. ret
140d0 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 09 urn FREEXL_OK;..
140e0 20 20 73 77 69 74 63 68 20 28 77 6f 72 6b 62 6f switch (workbo
140f0 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e ok->biff_version
14100 29 0a 09 20 20 20 20 7b 0a 09 20 20 20 20 63 61 ).. {.. ca
14110 73 65 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 se FREEXL_BIFF_V
14120 45 52 5f 35 3a 0a 09 20 20 20 20 63 61 73 65 20 ER_5:.. case
14130 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
14140 38 3a 0a 09 09 6d 65 6d 63 70 79 20 28 77 6f 72 8:...memcpy (wor
14150 64 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 d16.bytes, workb
14160 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 32 2c ook->record + 2,
14170 20 32 29 3b 0a 09 09 69 66 20 28 73 77 61 70 29 2);...if (swap)
14180 0a 09 09 20 20 20 20 73 77 61 70 31 36 20 28 26 ... swap16 (&
14190 77 6f 72 64 31 36 29 3b 0a 09 09 73 5f 66 6f 72 word16);...s_for
141a0 6d 61 74 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c mat = word16.val
141b0 75 65 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 ue;...break;..
141c0 20 20 7d 3b 0a 09 20 20 61 64 64 5f 78 66 5f 74 };.. add_xf_t
141d0 6f 5f 77 6f 72 6b 62 6f 6f 6b 20 28 77 6f 72 6b o_workbook (work
141e0 62 6f 6f 6b 2c 20 73 5f 66 6f 72 6d 61 74 29 3b book, s_format);
141f0 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 .. return FREEX
14200 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 L_OK;. }..
14210 20 20 20 69 66 20 28 28 77 6f 72 6b 62 6f 6f 6b if ((workbook
14220 2d 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 3d 3d ->record_type ==
14230 20 42 49 46 46 5f 4e 55 4d 42 45 52 0a 09 20 26 BIFF_NUMBER.. &
14240 26 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 & (workbook->bif
14250 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 f_version == FRE
14260 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 35 0a 09 EXL_BIFF_VER_5..
14270 20 20 20 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b || workbook
14280 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d ->biff_version =
14290 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 = FREEXL_BIFF_VE
142a0 52 5f 38 29 29 29 0a 20 20 20 20 20 20 7b 0a 09 R_8))). {..
142b0 20 20 2f 2a 20 4e 55 4d 42 45 52 20 6d 61 72 6b /* NUMBER mark
142c0 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 20 62 er found */.. b
142d0 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 31 iff_word16 word1
142e0 36 3b 0a 09 20 20 62 69 66 66 5f 66 6c 6f 61 74 6;.. biff_float
142f0 20 77 6f 72 64 5f 66 6c 6f 61 74 3b 0a 09 20 20 word_float;..
14300 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 72 unsigned short r
14310 6f 77 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 ow;.. unsigned
14320 73 68 6f 72 74 20 63 6f 6c 3b 0a 09 20 20 75 6e short col;.. un
14330 73 69 67 6e 65 64 20 73 68 6f 72 74 20 78 66 5f signed short xf_
14340 69 6e 64 65 78 20 3d 20 30 3b 0a 09 20 20 64 6f index = 0;.. do
14350 75 62 6c 65 20 6e 75 6d 3b 0a 09 20 20 69 6e 74 uble num;.. int
14360 20 69 73 5f 64 61 74 65 3b 0a 09 20 20 69 6e 74 is_date;.. int
14370 20 69 73 5f 64 61 74 65 74 69 6d 65 3b 0a 09 20 is_datetime;..
14380 20 69 6e 74 20 69 73 5f 74 69 6d 65 3b 0a 09 20 int is_time;..
14390 20 69 6e 74 20 72 65 74 3b 0a 0a 09 20 20 69 66 int ret;... if
143a0 20 28 63 68 65 63 6b 5f 61 6c 72 65 61 64 79 5f (check_already_
143b0 64 6f 6e 65 20 28 77 6f 72 6b 62 6f 6f 6b 29 29 done (workbook))
143c0 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 .. return F
143d0 52 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 20 6d 65 REEXL_OK;... me
143e0 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 mcpy (word16.byt
143f0 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 es, workbook->re
14400 63 6f 72 64 2c 20 32 29 3b 0a 09 20 20 69 66 20 cord, 2);.. if
14410 28 73 77 61 70 29 0a 09 20 20 20 20 20 20 73 77 (swap).. sw
14420 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a ap16 (&word16);.
14430 09 20 20 72 6f 77 20 3d 20 77 6f 72 64 31 36 2e . row = word16.
14440 76 61 6c 75 65 3b 0a 09 20 20 6d 65 6d 63 70 79 value;.. memcpy
14450 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 (word16.bytes,
14460 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
14470 20 2b 20 32 2c 20 32 29 3b 0a 09 20 20 69 66 20 + 2, 2);.. if
14480 28 73 77 61 70 29 0a 09 20 20 20 20 20 20 73 77 (swap).. sw
14490 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a ap16 (&word16);.
144a0 09 20 20 63 6f 6c 20 3d 20 77 6f 72 64 31 36 2e . col = word16.
144b0 76 61 6c 75 65 3b 0a 0a 09 20 20 69 66 20 28 63 value;... if (c
144c0 68 65 63 6b 5f 75 6e 64 65 63 6c 61 72 65 64 5f heck_undeclared_
144d0 64 69 6d 65 6e 73 69 6f 6e 20 28 77 6f 72 6b 62 dimension (workb
144e0 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 29 29 0a ook, row, col)).
144f0 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 52 . return FR
14500 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 20 6d 65 6d EEXL_OK;... mem
14510 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 cpy (word16.byte
14520 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 s, workbook->rec
14530 6f 72 64 20 2b 20 34 2c 20 32 29 3b 0a 09 20 20 ord + 4, 2);..
14540 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 if (swap)..
14550 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
14560 29 3b 0a 09 20 20 78 66 5f 69 6e 64 65 78 20 3d );.. xf_index =
14570 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 word16.value;..
14580 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 5f 66 memcpy (word_f
14590 6c 6f 61 74 2e 62 79 74 65 73 2c 20 77 6f 72 6b loat.bytes, work
145a0 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 36 book->record + 6
145b0 2c 20 38 29 3b 0a 09 20 20 69 66 20 28 73 77 61 , 8);.. if (swa
145c0 70 29 0a 09 20 20 20 20 20 20 73 77 61 70 5f 66 p).. swap_f
145d0 6c 6f 61 74 20 28 26 77 6f 72 64 5f 66 6c 6f 61 loat (&word_floa
145e0 74 29 3b 0a 09 20 20 6e 75 6d 20 3d 20 77 6f 72 t);.. num = wor
145f0 64 5f 66 6c 6f 61 74 2e 76 61 6c 75 65 3b 0a 0a d_float.value;..
14600 09 20 20 69 66 20 28 21 63 68 65 63 6b 5f 78 66 . if (!check_xf
14610 5f 64 61 74 65 74 69 6d 65 5f 35 38 0a 09 20 20 _datetime_58..
14620 20 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 78 (workbook, x
14630 66 5f 69 6e 64 65 78 2c 20 26 69 73 5f 64 61 74 f_index, &is_dat
14640 65 2c 20 26 69 73 5f 64 61 74 65 74 69 6d 65 2c e, &is_datetime,
14650 20 26 69 73 5f 74 69 6d 65 29 29 0a 09 20 20 20 &is_time))..
14660 20 7b 0a 09 09 69 73 5f 64 61 74 65 20 3d 20 30 {...is_date = 0
14670 3b 0a 09 09 69 73 5f 64 61 74 65 74 69 6d 65 20 ;...is_datetime
14680 3d 20 30 3b 0a 09 09 69 73 5f 74 69 6d 65 20 3d = 0;...is_time =
14690 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 0;.. }.. if
146a0 20 28 69 73 5f 64 61 74 65 29 0a 09 20 20 20 20 (is_date)..
146b0 20 20 72 65 74 20 3d 0a 09 09 20 20 73 65 74 5f ret =... set_
146c0 64 61 74 65 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 date_double_valu
146d0 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 e (workbook, row
146e0 2c 20 63 6f 6c 2c 0a 09 09 09 09 09 20 77 6f 72 , col,...... wor
146f0 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 kbook->biff_date
14700 5f 6d 6f 64 65 2c 20 6e 75 6d 29 3b 0a 09 20 20 _mode, num);..
14710 65 6c 73 65 20 69 66 20 28 69 73 5f 64 61 74 65 else if (is_date
14720 74 69 6d 65 29 0a 09 20 20 20 20 20 20 72 65 74 time).. ret
14730 20 3d 0a 09 09 20 20 73 65 74 5f 64 61 74 65 74 =... set_datet
14740 69 6d 65 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 65 ime_double_value
14750 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c (workbook, row,
14760 20 63 6f 6c 2c 0a 09 09 09 09 09 20 20 20 20 20 col,......
14770 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 workbook->biff_d
14780 61 74 65 5f 6d 6f 64 65 2c 20 6e 75 6d 29 3b 0a ate_mode, num);.
14790 09 20 20 65 6c 73 65 20 69 66 20 28 69 73 5f 74 . else if (is_t
147a0 69 6d 65 29 0a 09 20 20 20 20 20 20 72 65 74 20 ime).. ret
147b0 3d 20 73 65 74 5f 74 69 6d 65 5f 64 6f 75 62 6c = set_time_doubl
147c0 65 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f 6f e_value (workboo
147d0 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 20 6e 75 6d k, row, col, num
147e0 29 3b 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 );.. else..
147f0 20 20 72 65 74 20 3d 20 73 65 74 5f 64 6f 75 62 ret = set_doub
14800 6c 65 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f le_value (workbo
14810 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 20 6e 75 ok, row, col, nu
14820 6d 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 m);.. if (ret !
14830 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 20 20 = FREEXL_OK)..
14840 20 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a return ret;.
14850 09 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c . return FREEXL
14860 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 _OK;. }..
14870 20 20 69 66 20 28 28 77 6f 72 6b 62 6f 6f 6b 2d if ((workbook-
14880 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 3d 3d 20 >record_type ==
14890 42 49 46 46 5f 42 4f 4f 4c 45 52 52 0a 09 20 26 BIFF_BOOLERR.. &
148a0 26 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 & (workbook->bif
148b0 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 f_version == FRE
148c0 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 35 0a 09 EXL_BIFF_VER_5..
148d0 20 20 20 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b || workbook
148e0 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d ->biff_version =
148f0 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 = FREEXL_BIFF_VE
14900 52 5f 38 29 29 29 0a 20 20 20 20 20 20 7b 0a 09 R_8))). {..
14910 20 20 2f 2a 20 42 4f 4f 4c 45 52 52 20 6d 61 72 /* BOOLERR mar
14920 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 20 ker found */..
14930 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 biff_word16 word
14940 31 36 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 16;.. unsigned
14950 73 68 6f 72 74 20 72 6f 77 3b 0a 09 20 20 75 6e short row;.. un
14960 73 69 67 6e 65 64 20 73 68 6f 72 74 20 63 6f 6c signed short col
14970 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 63 68 ;.. unsigned ch
14980 61 72 20 76 61 6c 75 65 3b 0a 09 20 20 69 6e 74 ar value;.. int
14990 20 72 65 74 3b 0a 0a 09 20 20 69 66 20 28 63 68 ret;... if (ch
149a0 65 63 6b 5f 61 6c 72 65 61 64 79 5f 64 6f 6e 65 eck_already_done
149b0 20 28 77 6f 72 6b 62 6f 6f 6b 29 29 0a 09 20 20 (workbook))..
149c0 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 return FREEX
149d0 4c 5f 4f 4b 3b 0a 0a 09 20 20 6d 65 6d 63 70 79 L_OK;... memcpy
149e0 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 (word16.bytes,
149f0 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
14a00 2c 20 32 29 3b 0a 09 20 20 69 66 20 28 73 77 61 , 2);.. if (swa
14a10 70 29 0a 09 20 20 20 20 20 20 73 77 61 70 31 36 p).. swap16
14a20 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 20 20 72 (&word16);.. r
14a30 6f 77 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 ow = word16.valu
14a40 65 3b 0a 09 20 20 6d 65 6d 63 70 79 20 28 77 6f e;.. memcpy (wo
14a50 72 64 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b rd16.bytes, work
14a60 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 32 book->record + 2
14a70 2c 20 32 29 3b 0a 09 20 20 69 66 20 28 73 77 61 , 2);.. if (swa
14a80 70 29 0a 09 20 20 20 20 20 20 73 77 61 70 31 36 p).. swap16
14a90 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 20 20 63 (&word16);.. c
14aa0 6f 6c 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 ol = word16.valu
14ab0 65 3b 0a 0a 09 20 20 69 66 20 28 63 68 65 63 6b e;... if (check
14ac0 5f 75 6e 64 65 63 6c 61 72 65 64 5f 64 69 6d 65 _undeclared_dime
14ad0 6e 73 69 6f 6e 20 28 77 6f 72 6b 62 6f 6f 6b 2c nsion (workbook,
14ae0 20 72 6f 77 2c 20 63 6f 6c 29 29 0a 09 20 20 20 row, col))..
14af0 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c return FREEXL
14b00 5f 4f 4b 3b 0a 0a 09 20 20 76 61 6c 75 65 20 3d _OK;... value =
14b10 20 2a 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 *(workbook->rec
14b20 6f 72 64 20 2b 20 36 29 3b 0a 09 20 20 69 66 20 ord + 6);.. if
14b30 28 76 61 6c 75 65 20 21 3d 20 30 29 0a 09 20 20 (value != 0)..
14b40 20 20 20 20 76 61 6c 75 65 20 3d 20 31 3b 0a 09 value = 1;..
14b50 20 20 72 65 74 20 3d 20 73 65 74 5f 69 6e 74 5f ret = set_int_
14b60 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c value (workbook,
14b70 20 72 6f 77 2c 20 63 6f 6c 2c 20 76 61 6c 75 65 row, col, value
14b80 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d );.. if (ret !=
14b90 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 20 20 20 FREEXL_OK)..
14ba0 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 09 return ret;..
14bb0 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f return FREEXL_
14bc0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 OK;. }..
14bd0 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 if (workbook->r
14be0 65 63 6f 72 64 5f 74 79 70 65 20 3d 3d 20 42 49 ecord_type == BI
14bf0 46 46 5f 52 4b 0a 09 26 26 20 28 77 6f 72 6b 62 FF_RK..&& (workb
14c00 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f ook->biff_versio
14c10 6e 20 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 n == FREEXL_BIFF
14c20 5f 56 45 52 5f 35 0a 09 20 20 20 20 7c 7c 20 77 _VER_5.. || w
14c30 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 orkbook->biff_ve
14c40 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 58 4c 5f rsion == FREEXL_
14c50 42 49 46 46 5f 56 45 52 5f 38 29 29 0a 20 20 20 BIFF_VER_8)).
14c60 20 20 20 7b 0a 09 20 20 2f 2a 20 52 4b 20 6d 61 {.. /* RK ma
14c70 72 6b 65 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 rker found */..
14c80 20 62 69 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 biff_word16 wor
14c90 64 31 36 3b 0a 09 20 20 62 69 66 66 5f 77 6f 72 d16;.. biff_wor
14ca0 64 33 32 20 77 6f 72 64 33 32 3b 0a 09 20 20 75 d32 word32;.. u
14cb0 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 72 6f nsigned short ro
14cc0 77 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 73 w;.. unsigned s
14cd0 68 6f 72 74 20 63 6f 6c 3b 0a 09 20 20 75 6e 73 hort col;.. uns
14ce0 69 67 6e 65 64 20 73 68 6f 72 74 20 78 66 5f 69 igned short xf_i
14cf0 6e 64 65 78 3b 0a 09 20 20 69 6e 74 20 69 6e 74 ndex;.. int int
14d00 5f 76 61 6c 75 65 3b 0a 09 20 20 64 6f 75 62 6c _value;.. doubl
14d10 65 20 64 62 6c 5f 76 61 6c 75 65 3b 0a 09 20 20 e dbl_value;..
14d20 69 6e 74 20 69 73 5f 64 61 74 65 3b 0a 09 20 20 int is_date;..
14d30 69 6e 74 20 69 73 5f 64 61 74 65 74 69 6d 65 3b int is_datetime;
14d40 0a 09 20 20 69 6e 74 20 69 73 5f 74 69 6d 65 3b .. int is_time;
14d50 0a 09 20 20 69 6e 74 20 72 65 74 3b 0a 0a 09 20 .. int ret;...
14d60 20 69 66 20 28 63 68 65 63 6b 5f 61 6c 72 65 61 if (check_alrea
14d70 64 79 5f 64 6f 6e 65 20 28 77 6f 72 6b 62 6f 6f dy_done (workboo
14d80 6b 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 k)).. retur
14d90 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 n FREEXL_OK;...
14da0 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e memcpy (word16.
14db0 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
14dc0 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 20 20 >record, 2);..
14dd0 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 if (swap)..
14de0 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
14df0 29 3b 0a 09 20 20 72 6f 77 20 3d 20 77 6f 72 64 );.. row = word
14e00 31 36 2e 76 61 6c 75 65 3b 0a 09 20 20 6d 65 6d 16.value;.. mem
14e10 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 cpy (word16.byte
14e20 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 s, workbook->rec
14e30 6f 72 64 20 2b 20 32 2c 20 32 29 3b 0a 09 20 20 ord + 2, 2);..
14e40 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 if (swap)..
14e50 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
14e60 29 3b 0a 09 20 20 63 6f 6c 20 3d 20 77 6f 72 64 );.. col = word
14e70 31 36 2e 76 61 6c 75 65 3b 0a 0a 09 20 20 69 66 16.value;... if
14e80 20 28 63 68 65 63 6b 5f 75 6e 64 65 63 6c 61 72 (check_undeclar
14e90 65 64 5f 64 69 6d 65 6e 73 69 6f 6e 20 28 77 6f ed_dimension (wo
14ea0 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c rkbook, row, col
14eb0 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e )).. return
14ec0 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 20 FREEXL_OK;...
14ed0 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 memcpy (word16.b
14ee0 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
14ef0 72 65 63 6f 72 64 20 2b 20 34 2c 20 32 29 3b 0a record + 4, 2);.
14f00 09 20 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 . if (swap)..
14f10 20 20 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 swap16 (&wor
14f20 64 31 36 29 3b 0a 09 20 20 78 66 5f 69 6e 64 65 d16);.. xf_inde
14f30 78 20 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 x = word16.value
14f40 3b 0a 09 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 ;.. memcpy (wor
14f50 64 33 32 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 d32.bytes, workb
14f60 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 36 2c ook->record + 6,
14f70 20 34 29 3b 0a 09 20 20 69 66 20 28 64 65 63 6f 4);.. if (deco
14f80 64 65 5f 72 6b 5f 69 6e 74 65 67 65 72 20 28 77 de_rk_integer (w
14f90 6f 72 64 33 32 2e 62 79 74 65 73 2c 20 26 69 6e ord32.bytes, &in
14fa0 74 5f 76 61 6c 75 65 2c 20 73 77 61 70 29 29 0a t_value, swap)).
14fb0 09 20 20 20 20 7b 0a 09 09 69 66 20 28 21 63 68 . {...if (!ch
14fc0 65 63 6b 5f 78 66 5f 64 61 74 65 74 69 6d 65 5f eck_xf_datetime_
14fd0 35 38 0a 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 58... (workbo
14fe0 6f 6b 2c 20 78 66 5f 69 6e 64 65 78 2c 20 26 69 ok, xf_index, &i
14ff0 73 5f 64 61 74 65 2c 20 26 69 73 5f 64 61 74 65 s_date, &is_date
15000 74 69 6d 65 2c 20 26 69 73 5f 74 69 6d 65 29 29 time, &is_time))
15010 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 69 ... {... i
15020 73 5f 64 61 74 65 20 3d 20 30 3b 0a 09 09 20 20 s_date = 0;...
15030 20 20 20 20 69 73 5f 64 61 74 65 74 69 6d 65 20 is_datetime
15040 3d 20 30 3b 0a 09 09 20 20 20 20 20 20 69 73 5f = 0;... is_
15050 74 69 6d 65 20 3d 20 30 3b 0a 09 09 20 20 7d 0a time = 0;... }.
15060 09 09 69 66 20 28 69 73 5f 64 61 74 65 29 0a 09 ..if (is_date)..
15070 09 20 20 20 20 72 65 74 20 3d 0a 09 09 09 73 65 . ret =....se
15080 74 5f 64 61 74 65 5f 69 6e 74 5f 76 61 6c 75 65 t_date_int_value
15090 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c (workbook, row,
150a0 20 63 6f 6c 2c 0a 09 09 09 09 09 20 20 20 20 77 col,...... w
150b0 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 64 61 orkbook->biff_da
150c0 74 65 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 20 20 te_mode,......
150d0 20 20 69 6e 74 5f 76 61 6c 75 65 29 3b 0a 09 09 int_value);...
150e0 65 6c 73 65 20 69 66 20 28 69 73 5f 64 61 74 65 else if (is_date
150f0 74 69 6d 65 29 0a 09 09 20 20 20 20 72 65 74 20 time)... ret
15100 3d 0a 09 09 09 73 65 74 5f 64 61 74 65 74 69 6d =....set_datetim
15110 65 5f 69 6e 74 5f 76 61 6c 75 65 20 28 77 6f 72 e_int_value (wor
15120 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c kbook, row, col,
15130 0a 09 09 09 09 09 09 77 6f 72 6b 62 6f 6f 6b 2d .......workbook-
15140 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f 64 65 2c >biff_date_mode,
15150 0a 09 09 09 09 09 09 69 6e 74 5f 76 61 6c 75 65 .......int_value
15160 29 3b 0a 09 09 65 6c 73 65 20 69 66 20 28 69 73 );...else if (is
15170 5f 74 69 6d 65 29 0a 09 09 20 20 20 20 72 65 74 _time)... ret
15180 20 3d 20 73 65 74 5f 74 69 6d 65 5f 64 6f 75 62 = set_time_doub
15190 6c 65 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f le_value (workbo
151a0 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 20 30 2e ok, row, col, 0.
151b0 30 29 3b 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 0);...else...
151c0 20 72 65 74 20 3d 20 73 65 74 5f 69 6e 74 5f 76 ret = set_int_v
151d0 61 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 alue (workbook,
151e0 72 6f 77 2c 20 63 6f 6c 2c 20 69 6e 74 5f 76 61 row, col, int_va
151f0 6c 75 65 29 3b 0a 09 09 69 66 20 28 72 65 74 20 lue);...if (ret
15200 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 09 != FREEXL_OK)...
15210 20 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a return ret;.
15220 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 20 69 . }.. else i
15230 66 20 28 64 65 63 6f 64 65 5f 72 6b 5f 66 6c 6f f (decode_rk_flo
15240 61 74 20 28 77 6f 72 64 33 32 2e 62 79 74 65 73 at (word32.bytes
15250 2c 20 26 64 62 6c 5f 76 61 6c 75 65 2c 20 73 77 , &dbl_value, sw
15260 61 70 29 29 0a 09 20 20 20 20 7b 0a 09 09 69 66 ap)).. {...if
15270 20 28 21 63 68 65 63 6b 5f 78 66 5f 64 61 74 65 (!check_xf_date
15280 74 69 6d 65 5f 35 38 0a 09 09 20 20 20 20 28 77 time_58... (w
15290 6f 72 6b 62 6f 6f 6b 2c 20 78 66 5f 69 6e 64 65 orkbook, xf_inde
152a0 78 2c 20 26 69 73 5f 64 61 74 65 2c 20 26 69 73 x, &is_date, &is
152b0 5f 64 61 74 65 74 69 6d 65 2c 20 26 69 73 5f 74 _datetime, &is_t
152c0 69 6d 65 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 ime))... {...
152d0 20 20 20 20 69 73 5f 64 61 74 65 20 3d 20 30 3b is_date = 0;
152e0 0a 09 09 20 20 20 20 20 20 69 73 5f 64 61 74 65 ... is_date
152f0 74 69 6d 65 20 3d 20 30 3b 0a 09 09 20 20 20 20 time = 0;...
15300 20 20 69 73 5f 74 69 6d 65 20 3d 20 30 3b 0a 09 is_time = 0;..
15310 09 20 20 7d 0a 09 09 69 66 20 28 69 73 5f 64 61 . }...if (is_da
15320 74 65 29 0a 09 09 20 20 20 20 72 65 74 20 3d 0a te)... ret =.
15330 09 09 09 73 65 74 5f 64 61 74 65 5f 64 6f 75 62 ...set_date_doub
15340 6c 65 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f le_value (workbo
15350 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 2c 0a 09 09 ok, row, col,...
15360 09 09 09 20 20 20 20 20 20 20 77 6f 72 6b 62 6f ... workbo
15370 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f ok->biff_date_mo
15380 64 65 2c 0a 09 09 09 09 09 20 20 20 20 20 20 20 de,......
15390 64 62 6c 5f 76 61 6c 75 65 29 3b 0a 09 09 65 6c dbl_value);...el
153a0 73 65 20 69 66 20 28 69 73 5f 64 61 74 65 74 69 se if (is_dateti
153b0 6d 65 29 0a 09 09 20 20 20 20 72 65 74 20 3d 0a me)... ret =.
153c0 09 09 09 73 65 74 5f 64 61 74 65 74 69 6d 65 5f ...set_datetime_
153d0 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 77 6f double_value (wo
153e0 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c rkbook, row, col
153f0 2c 0a 09 09 09 09 09 09 20 20 20 77 6f 72 6b 62 ,....... workb
15400 6f 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 5f 6d ook->biff_date_m
15410 6f 64 65 2c 0a 09 09 09 09 09 09 20 20 20 64 62 ode,....... db
15420 6c 5f 76 61 6c 75 65 29 3b 0a 09 09 65 6c 73 65 l_value);...else
15430 20 69 66 20 28 69 73 5f 74 69 6d 65 29 0a 09 09 if (is_time)...
15440 20 20 20 20 72 65 74 20 3d 20 73 65 74 5f 74 69 ret = set_ti
15450 6d 65 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 me_double_value
15460 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 (workbook, row,
15470 63 6f 6c 2c 20 64 62 6c 5f 76 61 6c 75 65 29 3b col, dbl_value);
15480 0a 09 09 65 6c 73 65 0a 09 09 20 20 20 20 72 65 ...else... re
15490 74 20 3d 20 73 65 74 5f 64 6f 75 62 6c 65 5f 76 t = set_double_v
154a0 61 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 alue (workbook,
154b0 72 6f 77 2c 20 63 6f 6c 2c 20 64 62 6c 5f 76 61 row, col, dbl_va
154c0 6c 75 65 29 3b 0a 09 09 69 66 20 28 72 65 74 20 lue);...if (ret
154d0 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 09 != FREEXL_OK)...
154e0 20 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a return ret;.
154f0 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 0a 09 . }.. else..
15500 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 return FRE
15510 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 52 4b 5f 56 EXL_ILLEGAL_RK_V
15520 41 4c 55 45 3b 0a 09 20 20 72 65 74 75 72 6e 20 ALUE;.. return
15530 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 FREEXL_OK;.
15540 20 7d 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 6b }.. if (work
15550 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 book->record_typ
15560 65 20 3d 3d 20 42 49 46 46 5f 4d 55 4c 52 4b 0a e == BIFF_MULRK.
15570 09 26 26 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 .&& (workbook->b
15580 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 iff_version == F
15590 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 35 REEXL_BIFF_VER_5
155a0 0a 09 20 20 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f .. || workboo
155b0 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
155c0 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
155d0 45 52 5f 38 29 29 0a 20 20 20 20 20 20 7b 0a 09 ER_8)). {..
155e0 20 20 2f 2a 20 4d 55 4c 52 4b 20 6d 61 72 6b 65 /* MULRK marke
155f0 72 20 66 6f 75 6e 64 20 2a 2f 0a 09 20 20 62 69 r found */.. bi
15600 66 66 5f 77 6f 72 64 31 36 20 77 6f 72 64 31 36 ff_word16 word16
15610 3b 0a 09 20 20 62 69 66 66 5f 77 6f 72 64 33 32 ;.. biff_word32
15620 20 77 6f 72 64 33 32 3b 0a 09 20 20 75 6e 73 69 word32;.. unsi
15630 67 6e 65 64 20 73 68 6f 72 74 20 72 6f 77 3b 0a gned short row;.
15640 09 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 . unsigned shor
15650 74 20 63 6f 6c 3b 0a 09 20 20 75 6e 73 69 67 6e t col;.. unsign
15660 65 64 20 73 68 6f 72 74 20 78 66 5f 69 6e 64 65 ed short xf_inde
15670 78 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 20 69 x;.. unsigned i
15680 6e 74 20 6f 66 66 20 3d 20 34 3b 0a 09 20 20 69 nt off = 4;.. i
15690 6e 74 20 69 6e 74 5f 76 61 6c 75 65 3b 0a 09 20 nt int_value;..
156a0 20 64 6f 75 62 6c 65 20 64 62 6c 5f 76 61 6c 75 double dbl_valu
156b0 65 3b 0a 09 20 20 69 6e 74 20 69 73 5f 64 61 74 e;.. int is_dat
156c0 65 3b 0a 09 20 20 69 6e 74 20 69 73 5f 64 61 74 e;.. int is_dat
156d0 65 74 69 6d 65 3b 0a 09 20 20 69 6e 74 20 69 73 etime;.. int is
156e0 5f 74 69 6d 65 3b 0a 09 20 20 69 6e 74 20 72 65 _time;.. int re
156f0 74 3b 0a 0a 09 20 20 69 66 20 28 63 68 65 63 6b t;... if (check
15700 5f 61 6c 72 65 61 64 79 5f 64 6f 6e 65 20 28 77 _already_done (w
15710 6f 72 6b 62 6f 6f 6b 29 29 0a 09 20 20 20 20 20 orkbook))..
15720 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f return FREEXL_O
15730 4b 3b 0a 0a 09 20 20 6d 65 6d 63 70 79 20 28 77 K;... memcpy (w
15740 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 6f 72 ord16.bytes, wor
15750 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 32 kbook->record, 2
15760 29 3b 0a 09 20 20 69 66 20 28 73 77 61 70 29 0a );.. if (swap).
15770 09 20 20 20 20 20 20 73 77 61 70 31 36 20 28 26 . swap16 (&
15780 77 6f 72 64 31 36 29 3b 0a 09 20 20 72 6f 77 20 word16);.. row
15790 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
157a0 09 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 . memcpy (word1
157b0 36 2e 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6.bytes, workboo
157c0 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 32 2c 20 32 k->record + 2, 2
157d0 29 3b 0a 09 20 20 69 66 20 28 73 77 61 70 29 0a );.. if (swap).
157e0 09 20 20 20 20 20 20 73 77 61 70 31 36 20 28 26 . swap16 (&
157f0 77 6f 72 64 31 36 29 3b 0a 09 20 20 63 6f 6c 20 word16);.. col
15800 3d 20 77 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a = word16.value;.
15810 0a 09 20 20 69 66 20 28 63 68 65 63 6b 5f 75 6e .. if (check_un
15820 64 65 63 6c 61 72 65 64 5f 64 69 6d 65 6e 73 69 declared_dimensi
15830 6f 6e 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f on (workbook, ro
15840 77 2c 20 63 6f 6c 29 29 0a 09 20 20 20 20 20 20 w, col))..
15850 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b return FREEXL_OK
15860 3b 0a 0a 09 20 20 77 68 69 6c 65 20 28 28 6f 66 ;... while ((of
15870 66 20 2b 20 36 29 20 3c 20 77 6f 72 6b 62 6f 6f f + 6) < workboo
15880 6b 2d 3e 72 65 63 6f 72 64 5f 73 69 7a 65 29 0a k->record_size).
15890 09 20 20 20 20 7b 0a 09 09 2f 2a 20 66 65 74 63 . {.../* fetc
158a0 68 69 6e 67 20 6f 6e 65 20 63 65 6c 6c 20 76 61 hing one cell va
158b0 6c 75 65 20 2a 2f 0a 09 09 6d 65 6d 63 70 79 20 lue */...memcpy
158c0 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c 20 77 (word16.bytes, w
158d0 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 orkbook->record
158e0 2b 20 6f 66 66 2c 20 32 29 3b 0a 09 09 69 66 20 + off, 2);...if
158f0 28 73 77 61 70 29 0a 09 09 20 20 20 20 73 77 61 (swap)... swa
15900 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b 0a 09 p16 (&word16);..
15910 09 78 66 5f 69 6e 64 65 78 20 3d 20 77 6f 72 64 .xf_index = word
15920 31 36 2e 76 61 6c 75 65 3b 0a 09 09 6d 65 6d 63 16.value;...memc
15930 70 79 20 28 77 6f 72 64 33 32 2e 62 79 74 65 73 py (word32.bytes
15940 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f , workbook->reco
15950 72 64 20 2b 20 6f 66 66 20 2b 20 32 2c 20 34 29 rd + off + 2, 4)
15960 3b 0a 09 09 69 66 20 28 64 65 63 6f 64 65 5f 72 ;...if (decode_r
15970 6b 5f 69 6e 74 65 67 65 72 20 28 77 6f 72 64 33 k_integer (word3
15980 32 2e 62 79 74 65 73 2c 20 26 69 6e 74 5f 76 61 2.bytes, &int_va
15990 6c 75 65 2c 20 73 77 61 70 29 29 0a 09 09 20 20 lue, swap))...
159a0 7b 0a 09 09 20 20 20 20 20 20 69 66 20 28 21 63 {... if (!c
159b0 68 65 63 6b 5f 78 66 5f 64 61 74 65 74 69 6d 65 heck_xf_datetime
159c0 5f 35 38 0a 09 09 09 20 20 28 77 6f 72 6b 62 6f _58.... (workbo
159d0 6f 6b 2c 20 78 66 5f 69 6e 64 65 78 2c 20 26 69 ok, xf_index, &i
159e0 73 5f 64 61 74 65 2c 20 26 69 73 5f 64 61 74 65 s_date, &is_date
159f0 74 69 6d 65 2c 0a 09 09 09 20 20 20 26 69 73 5f time,.... &is_
15a00 74 69 6d 65 29 29 0a 09 09 09 7b 0a 09 09 09 20 time))....{....
15a10 20 20 20 69 73 5f 64 61 74 65 20 3d 20 30 3b 0a is_date = 0;.
15a20 09 09 09 20 20 20 20 69 73 5f 64 61 74 65 74 69 ... is_dateti
15a30 6d 65 20 3d 20 30 3b 0a 09 09 09 20 20 20 20 69 me = 0;.... i
15a40 73 5f 74 69 6d 65 20 3d 20 30 3b 0a 09 09 09 7d s_time = 0;....}
15a50 0a 09 09 20 20 20 20 20 20 69 66 20 28 69 73 5f ... if (is_
15a60 64 61 74 65 29 0a 09 09 09 20 20 72 65 74 20 3d date).... ret =
15a70 0a 09 09 09 20 20 20 20 20 20 73 65 74 5f 64 61 .... set_da
15a80 74 65 5f 69 6e 74 5f 76 61 6c 75 65 20 28 77 6f te_int_value (wo
15a90 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c rkbook, row, col
15aa0 2c 0a 09 09 09 09 09 09 20 20 77 6f 72 6b 62 6f ,....... workbo
15ab0 6f 6b 2d 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f ok->biff_date_mo
15ac0 64 65 2c 0a 09 09 09 09 09 09 20 20 69 6e 74 5f de,....... int_
15ad0 76 61 6c 75 65 29 3b 0a 09 09 20 20 20 20 20 20 value);...
15ae0 65 6c 73 65 20 69 66 20 28 69 73 5f 64 61 74 65 else if (is_date
15af0 74 69 6d 65 29 0a 09 09 09 20 20 72 65 74 20 3d time).... ret =
15b00 0a 09 09 09 20 20 20 20 20 20 73 65 74 5f 64 61 .... set_da
15b10 74 65 74 69 6d 65 5f 69 6e 74 5f 76 61 6c 75 65 tetime_int_value
15b20 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c (workbook, row,
15b30 20 63 6f 6c 2c 0a 09 09 09 09 09 09 20 20 20 20 col,.......
15b40 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 workbook->biff
15b50 5f 64 61 74 65 5f 6d 6f 64 65 2c 0a 09 09 09 09 _date_mode,.....
15b60 09 09 20 20 20 20 20 20 69 6e 74 5f 76 61 6c 75 .. int_valu
15b70 65 29 3b 0a 09 09 20 20 20 20 20 20 65 6c 73 65 e);... else
15b80 20 69 66 20 28 69 73 5f 74 69 6d 65 29 0a 09 09 if (is_time)...
15b90 09 20 20 72 65 74 20 3d 20 73 65 74 5f 74 69 6d . ret = set_tim
15ba0 65 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 65 20 28 e_double_value (
15bb0 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 workbook, row, c
15bc0 6f 6c 2c 20 30 2e 30 29 3b 0a 09 09 20 20 20 20 ol, 0.0);...
15bd0 20 20 65 6c 73 65 0a 09 09 09 20 20 72 65 74 20 else.... ret
15be0 3d 20 73 65 74 5f 69 6e 74 5f 76 61 6c 75 65 20 = set_int_value
15bf0 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 (workbook, row,
15c00 63 6f 6c 2c 20 69 6e 74 5f 76 61 6c 75 65 29 3b col, int_value);
15c10 0a 09 09 20 20 20 20 20 20 69 66 20 28 72 65 74 ... if (ret
15c20 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 != FREEXL_OK)..
15c30 09 09 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a .. return ret;.
15c40 09 09 20 20 7d 0a 09 09 65 6c 73 65 20 69 66 20 .. }...else if
15c50 28 64 65 63 6f 64 65 5f 72 6b 5f 66 6c 6f 61 74 (decode_rk_float
15c60 20 28 77 6f 72 64 33 32 2e 62 79 74 65 73 2c 20 (word32.bytes,
15c70 26 64 62 6c 5f 76 61 6c 75 65 2c 20 73 77 61 70 &dbl_value, swap
15c80 29 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 ))... {...
15c90 20 69 66 20 28 21 63 68 65 63 6b 5f 78 66 5f 64 if (!check_xf_d
15ca0 61 74 65 74 69 6d 65 5f 35 38 0a 09 09 09 20 20 atetime_58....
15cb0 28 77 6f 72 6b 62 6f 6f 6b 2c 20 78 66 5f 69 6e (workbook, xf_in
15cc0 64 65 78 2c 20 26 69 73 5f 64 61 74 65 2c 20 26 dex, &is_date, &
15cd0 69 73 5f 64 61 74 65 74 69 6d 65 2c 0a 09 09 09 is_datetime,....
15ce0 20 20 20 26 69 73 5f 74 69 6d 65 29 29 0a 09 09 &is_time))...
15cf0 09 7b 0a 09 09 09 20 20 20 20 69 73 5f 64 61 74 .{.... is_dat
15d00 65 20 3d 20 30 3b 0a 09 09 09 20 20 20 20 69 73 e = 0;.... is
15d10 5f 64 61 74 65 74 69 6d 65 20 3d 20 30 3b 0a 09 _datetime = 0;..
15d20 09 09 20 20 20 20 69 73 5f 74 69 6d 65 20 3d 20 .. is_time =
15d30 30 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20 20 20 0;....}...
15d40 69 66 20 28 69 73 5f 64 61 74 65 29 0a 09 09 09 if (is_date)....
15d50 20 20 72 65 74 20 3d 0a 09 09 09 20 20 20 20 20 ret =....
15d60 20 73 65 74 5f 64 61 74 65 5f 64 6f 75 62 6c 65 set_date_double
15d70 5f 76 61 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b _value (workbook
15d80 2c 20 72 6f 77 2c 20 63 6f 6c 2c 0a 09 09 09 09 , row, col,.....
15d90 09 09 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d .. workbook-
15da0 3e 62 69 66 66 5f 64 61 74 65 5f 6d 6f 64 65 2c >biff_date_mode,
15db0 0a 09 09 09 09 09 09 20 20 20 20 20 64 62 6c 5f ....... dbl_
15dc0 76 61 6c 75 65 29 3b 0a 09 09 20 20 20 20 20 20 value);...
15dd0 65 6c 73 65 20 69 66 20 28 69 73 5f 64 61 74 65 else if (is_date
15de0 74 69 6d 65 29 0a 09 09 09 20 20 72 65 74 20 3d time).... ret =
15df0 0a 09 09 09 20 20 20 20 20 20 73 65 74 5f 64 61 .... set_da
15e00 74 65 74 69 6d 65 5f 64 6f 75 62 6c 65 5f 76 61 tetime_double_va
15e10 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 lue (workbook, r
15e20 6f 77 2c 20 63 6f 6c 2c 0a 09 09 09 09 09 09 09 ow, col,........
15e30 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f workbook->biff_
15e40 64 61 74 65 5f 6d 6f 64 65 2c 0a 09 09 09 09 09 date_mode,......
15e50 09 09 20 64 62 6c 5f 76 61 6c 75 65 29 3b 0a 09 .. dbl_value);..
15e60 09 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 . else if (
15e70 69 73 5f 74 69 6d 65 29 0a 09 09 09 20 20 72 65 is_time).... re
15e80 74 20 3d 0a 09 09 09 20 20 20 20 20 20 73 65 74 t =.... set
15e90 5f 74 69 6d 65 5f 64 6f 75 62 6c 65 5f 76 61 6c _time_double_val
15ea0 75 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f ue (workbook, ro
15eb0 77 2c 20 63 6f 6c 2c 0a 09 09 09 09 09 09 20 20 w, col,.......
15ec0 20 20 20 64 62 6c 5f 76 61 6c 75 65 29 3b 0a 09 dbl_value);..
15ed0 09 20 20 20 20 20 20 65 6c 73 65 0a 09 09 09 20 . else....
15ee0 20 72 65 74 20 3d 0a 09 09 09 20 20 20 20 20 20 ret =....
15ef0 73 65 74 5f 64 6f 75 62 6c 65 5f 76 61 6c 75 65 set_double_value
15f00 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c (workbook, row,
15f10 20 63 6f 6c 2c 20 64 62 6c 5f 76 61 6c 75 65 29 col, dbl_value)
15f20 3b 0a 09 09 20 20 20 20 20 20 69 66 20 28 72 65 ;... if (re
15f30 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a t != FREEXL_OK).
15f40 09 09 09 20 20 72 65 74 75 72 6e 20 72 65 74 3b ... return ret;
15f50 0a 09 09 20 20 7d 0a 09 09 65 6c 73 65 0a 09 09 ... }...else...
15f60 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 return FREEX
15f70 4c 5f 49 4c 4c 45 47 41 4c 5f 4d 55 4c 52 4b 5f L_ILLEGAL_MULRK_
15f80 56 41 4c 55 45 3b 0a 09 09 6f 66 66 20 2b 3d 20 VALUE;...off +=
15f90 36 3b 0a 09 09 63 6f 6c 2b 2b 3b 0a 09 20 20 20 6;...col++;..
15fa0 20 7d 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 }.. return FRE
15fb0 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a EXL_OK;. }.
15fc0 0a 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f . if (workboo
15fd0 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 3d k->record_type =
15fe0 3d 20 42 49 46 46 5f 4c 41 42 45 4c 0a 09 26 26 = BIFF_LABEL..&&
15ff0 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 (workbook->biff
16000 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 52 45 45 _version == FREE
16010 58 4c 5f 42 49 46 46 5f 56 45 52 5f 35 0a 09 20 XL_BIFF_VER_5..
16020 20 20 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e || workbook->
16030 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 biff_version ==
16040 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
16050 38 29 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 8)). {.. /
16060 2a 20 4c 41 42 45 4c 20 6d 61 72 6b 65 72 20 66 * LABEL marker f
16070 6f 75 6e 64 20 2a 2f 0a 09 20 20 62 69 66 66 5f ound */.. biff_
16080 77 6f 72 64 31 36 20 77 6f 72 64 31 36 3b 0a 09 word16 word16;..
16090 20 20 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 0a char *string;.
160a0 09 20 20 63 68 61 72 20 2a 75 74 66 38 5f 73 74 . char *utf8_st
160b0 72 69 6e 67 3b 0a 09 20 20 75 6e 73 69 67 6e 65 ring;.. unsigne
160c0 64 20 69 6e 74 20 6c 65 6e 3b 0a 09 20 20 69 6e d int len;.. in
160d0 74 20 65 72 72 3b 0a 09 20 20 75 6e 73 69 67 6e t err;.. unsign
160e0 65 64 20 73 68 6f 72 74 20 72 6f 77 3b 0a 09 20 ed short row;..
160f0 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 unsigned short
16100 63 6f 6c 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 col;.. unsigned
16110 20 63 68 61 72 20 2a 70 5f 73 74 72 69 6e 67 3b char *p_string;
16120 0a 09 20 20 69 6e 74 20 72 65 74 3b 0a 0a 09 20 .. int ret;...
16130 20 69 66 20 28 63 68 65 63 6b 5f 61 6c 72 65 61 if (check_alrea
16140 64 79 5f 64 6f 6e 65 20 28 77 6f 72 6b 62 6f 6f dy_done (workboo
16150 6b 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 k)).. retur
16160 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 n FREEXL_OK;...
16170 20 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e memcpy (word16.
16180 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
16190 3e 72 65 63 6f 72 64 2c 20 32 29 3b 0a 09 20 20 >record, 2);..
161a0 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 if (swap)..
161b0 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
161c0 29 3b 0a 09 20 20 72 6f 77 20 3d 20 77 6f 72 64 );.. row = word
161d0 31 36 2e 76 61 6c 75 65 3b 0a 09 20 20 6d 65 6d 16.value;.. mem
161e0 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 cpy (word16.byte
161f0 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 s, workbook->rec
16200 6f 72 64 20 2b 20 32 2c 20 32 29 3b 0a 09 20 20 ord + 2, 2);..
16210 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 if (swap)..
16220 20 73 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 swap16 (&word16
16230 29 3b 0a 09 20 20 63 6f 6c 20 3d 20 77 6f 72 64 );.. col = word
16240 31 36 2e 76 61 6c 75 65 3b 0a 0a 09 20 20 69 66 16.value;... if
16250 20 28 63 68 65 63 6b 5f 75 6e 64 65 63 6c 61 72 (check_undeclar
16260 65 64 5f 64 69 6d 65 6e 73 69 6f 6e 20 28 77 6f ed_dimension (wo
16270 72 6b 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c rkbook, row, col
16280 29 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e )).. return
16290 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 20 FREEXL_OK;...
162a0 6d 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 memcpy (word16.b
162b0 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ytes, workbook->
162c0 72 65 63 6f 72 64 20 2b 20 36 2c 20 32 29 3b 0a record + 6, 2);.
162d0 09 20 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 . if (swap)..
162e0 20 20 20 20 73 77 61 70 31 36 20 28 26 77 6f 72 swap16 (&wor
162f0 64 31 36 29 3b 0a 09 20 20 6c 65 6e 20 3d 20 77 d16);.. len = w
16300 6f 72 64 31 36 2e 76 61 6c 75 65 3b 0a 09 20 20 ord16.value;..
16310 70 5f 73 74 72 69 6e 67 20 3d 20 77 6f 72 6b 62 p_string = workb
16320 6f 6f 6b 2d 3e 72 65 63 6f 72 64 20 2b 20 38 3b ook->record + 8;
16330 0a 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f ... if (workboo
16340 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 k->biff_version
16350 3d 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 == FREEXL_BIFF_V
16360 45 52 5f 35 29 0a 09 20 20 20 20 7b 0a 09 09 2f ER_5).. {.../
16370 2a 20 43 4f 44 45 50 41 47 45 20 73 74 72 69 6e * CODEPAGE strin
16380 67 20 2a 2f 0a 09 09 73 74 72 69 6e 67 20 3d 20 g */...string =
16390 6d 61 6c 6c 6f 63 20 28 6c 65 6e 29 3b 0a 09 09 malloc (len);...
163a0 6d 65 6d 63 70 79 20 28 73 74 72 69 6e 67 2c 20 memcpy (string,
163b0 70 5f 73 74 72 69 6e 67 2c 20 6c 65 6e 29 3b 0a p_string, len);.
163c0 0a 09 09 2f 2a 20 63 6f 6e 76 65 72 74 69 6e 67 .../* converting
163d0 20 74 65 78 74 20 74 6f 20 55 54 46 2d 38 20 2a text to UTF-8 *
163e0 2f 0a 09 09 75 74 66 38 5f 73 74 72 69 6e 67 20 /...utf8_string
163f0 3d 0a 09 09 20 20 20 20 63 6f 6e 76 65 72 74 5f =... convert_
16400 74 6f 5f 75 74 66 38 20 28 77 6f 72 6b 62 6f 6f to_utf8 (workboo
16410 6b 2d 3e 75 74 66 38 5f 63 6f 6e 76 65 72 74 65 k->utf8_converte
16420 72 2c 20 73 74 72 69 6e 67 2c 20 6c 65 6e 2c 0a r, string, len,.
16430 09 09 09 09 20 20 20 20 20 26 65 72 72 29 3b 0a .... &err);.
16440 09 09 66 72 65 65 20 28 73 74 72 69 6e 67 29 3b ..free (string);
16450 0a 09 09 69 66 20 28 65 72 72 29 0a 09 09 20 20 ...if (err)...
16460 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f return FREEXL_
16470 49 4e 56 41 4c 49 44 5f 43 48 41 52 41 43 54 45 INVALID_CHARACTE
16480 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 R;.. }.. els
16490 65 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 70 6c e.. {.../* pl
164a0 65 61 73 65 20 6e 6f 74 65 3a 20 74 68 69 73 20 ease note: this
164b0 61 6c 77 61 79 73 20 69 73 20 55 54 46 2d 31 36 always is UTF-16
164c0 20 5b 42 49 46 46 38 5d 20 2a 2f 0a 09 09 69 6e [BIFF8] */...in
164d0 74 20 75 74 66 31 36 20 3d 20 30 3b 0a 09 09 75 t utf16 = 0;...u
164e0 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 74 61 72 nsigned int star
164f0 74 5f 6f 66 66 73 65 74 3b 0a 09 09 75 6e 73 69 t_offset;...unsi
16500 67 6e 65 64 20 69 6e 74 20 65 78 74 72 61 5f 73 gned int extra_s
16510 6b 69 70 3b 0a 09 09 67 65 74 5f 75 6e 69 63 6f kip;...get_unico
16520 64 65 5f 70 61 72 61 6d 73 20 28 70 5f 73 74 72 de_params (p_str
16530 69 6e 67 2c 20 73 77 61 70 2c 20 26 73 74 61 72 ing, swap, &star
16540 74 5f 6f 66 66 73 65 74 2c 20 26 75 74 66 31 36 t_offset, &utf16
16550 2c 0a 09 09 09 09 20 20 20 20 26 65 78 74 72 61 ,..... &extra
16560 5f 73 6b 69 70 29 3b 0a 09 09 70 5f 73 74 72 69 _skip);...p_stri
16570 6e 67 20 2b 3d 20 73 74 61 72 74 5f 6f 66 66 73 ng += start_offs
16580 65 74 3b 0a 09 09 69 66 20 28 21 70 61 72 73 65 et;...if (!parse
16590 5f 75 6e 69 63 6f 64 65 5f 73 74 72 69 6e 67 0a _unicode_string.
165a0 09 09 20 20 20 20 28 77 6f 72 6b 62 6f 6f 6b 2d .. (workbook-
165b0 3e 75 74 66 31 36 5f 63 6f 6e 76 65 72 74 65 72 >utf16_converter
165c0 2c 20 6c 65 6e 2c 20 75 74 66 31 36 2c 20 70 5f , len, utf16, p_
165d0 73 74 72 69 6e 67 2c 0a 09 09 20 20 20 20 20 26 string,... &
165e0 75 74 66 38 5f 73 74 72 69 6e 67 29 29 0a 09 09 utf8_string))...
165f0 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 return FREEX
16600 4c 5f 49 4e 56 41 4c 49 44 5f 43 48 41 52 41 43 L_INVALID_CHARAC
16610 54 45 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 72 TER;.. }.. r
16620 65 74 20 3d 20 73 65 74 5f 74 65 78 74 5f 76 61 et = set_text_va
16630 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 lue (workbook, r
16640 6f 77 2c 20 63 6f 6c 2c 20 75 74 66 38 5f 73 74 ow, col, utf8_st
16650 72 69 6e 67 29 3b 0a 09 20 20 69 66 20 28 72 65 ring);.. if (re
16660 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a t != FREEXL_OK).
16670 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 . return re
16680 74 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 t;.. return FRE
16690 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a EXL_OK;. }.
166a0 0a 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f . if (workboo
166b0 6b 2d 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 3d k->record_type =
166c0 3d 20 42 49 46 46 5f 4c 41 42 45 4c 5f 53 53 54 = BIFF_LABEL_SST
166d0 0a 09 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 ..&& workbook->b
166e0 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 46 iff_version == F
166f0 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 38 REEXL_BIFF_VER_8
16700 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 ). {.. /*
16710 4c 41 42 45 4c 53 53 54 20 6d 61 72 6b 65 72 20 LABELSST marker
16720 66 6f 75 6e 64 20 2a 2f 0a 09 20 20 62 69 66 66 found */.. biff
16730 5f 77 6f 72 64 31 36 20 77 6f 72 64 31 36 3b 0a _word16 word16;.
16740 09 20 20 62 69 66 66 5f 77 6f 72 64 33 32 20 77 . biff_word32 w
16750 6f 72 64 33 32 3b 0a 09 20 20 75 6e 73 69 67 6e ord32;.. unsign
16760 65 64 20 73 68 6f 72 74 20 72 6f 77 3b 0a 09 20 ed short row;..
16770 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 unsigned short
16780 63 6f 6c 3b 0a 09 20 20 75 6e 73 69 67 6e 65 64 col;.. unsigned
16790 20 69 6e 74 20 73 74 72 69 6e 67 5f 69 6e 64 65 int string_inde
167a0 78 3b 0a 09 20 20 63 6f 6e 73 74 20 63 68 61 72 x;.. const char
167b0 20 2a 75 74 66 38 5f 73 74 72 69 6e 67 3b 0a 09 *utf8_string;..
167c0 20 20 69 6e 74 20 72 65 74 3b 0a 0a 09 20 20 69 int ret;... i
167d0 66 20 28 63 68 65 63 6b 5f 61 6c 72 65 61 64 79 f (check_already
167e0 5f 64 6f 6e 65 20 28 77 6f 72 6b 62 6f 6f 6b 29 _done (workbook)
167f0 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 ).. return
16800 46 52 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 20 6d FREEXL_OK;... m
16810 65 6d 63 70 79 20 28 77 6f 72 64 31 36 2e 62 79 emcpy (word16.by
16820 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 tes, workbook->r
16830 65 63 6f 72 64 2c 20 32 29 3b 0a 09 20 20 69 66 ecord, 2);.. if
16840 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 20 73 (swap).. s
16850 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b wap16 (&word16);
16860 0a 09 20 20 72 6f 77 20 3d 20 77 6f 72 64 31 36 .. row = word16
16870 2e 76 61 6c 75 65 3b 0a 09 20 20 6d 65 6d 63 70 .value;.. memcp
16880 79 20 28 77 6f 72 64 31 36 2e 62 79 74 65 73 2c y (word16.bytes,
16890 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 workbook->recor
168a0 64 20 2b 20 32 2c 20 32 29 3b 0a 09 20 20 69 66 d + 2, 2);.. if
168b0 20 28 73 77 61 70 29 0a 09 20 20 20 20 20 20 73 (swap).. s
168c0 77 61 70 31 36 20 28 26 77 6f 72 64 31 36 29 3b wap16 (&word16);
168d0 0a 09 20 20 63 6f 6c 20 3d 20 77 6f 72 64 31 36 .. col = word16
168e0 2e 76 61 6c 75 65 3b 0a 0a 09 20 20 69 66 20 28 .value;... if (
168f0 63 68 65 63 6b 5f 75 6e 64 65 63 6c 61 72 65 64 check_undeclared
16900 5f 64 69 6d 65 6e 73 69 6f 6e 20 28 77 6f 72 6b _dimension (work
16910 62 6f 6f 6b 2c 20 72 6f 77 2c 20 63 6f 6c 29 29 book, row, col))
16920 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 .. return F
16930 52 45 45 58 4c 5f 4f 4b 3b 0a 0a 09 20 20 6d 65 REEXL_OK;... me
16940 6d 63 70 79 20 28 77 6f 72 64 33 32 2e 62 79 74 mcpy (word32.byt
16950 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 es, workbook->re
16960 63 6f 72 64 20 2b 20 36 2c 20 34 29 3b 0a 09 20 cord + 6, 4);..
16970 20 69 66 20 28 73 77 61 70 29 0a 09 20 20 20 20 if (swap)..
16980 20 20 73 77 61 70 33 32 20 28 26 77 6f 72 64 33 swap32 (&word3
16990 32 29 3b 0a 09 20 20 73 74 72 69 6e 67 5f 69 6e 2);.. string_in
169a0 64 65 78 20 3d 20 77 6f 72 64 33 32 2e 76 61 6c dex = word32.val
169b0 75 65 3b 0a 09 20 20 75 74 66 38 5f 73 74 72 69 ue;.. utf8_stri
169c0 6e 67 20 3d 20 66 69 6e 64 5f 69 6e 5f 53 53 54 ng = find_in_SST
169d0 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 73 74 72 69 (workbook, stri
169e0 6e 67 5f 69 6e 64 65 78 29 3b 0a 09 20 20 69 66 ng_index);.. if
169f0 20 28 21 75 74 66 38 5f 73 74 72 69 6e 67 29 0a (!utf8_string).
16a00 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 52 . return FR
16a10 45 45 58 4c 5f 42 49 46 46 5f 49 4c 4c 45 47 41 EEXL_BIFF_ILLEGA
16a20 4c 5f 53 53 54 5f 49 4e 44 45 58 3b 0a 09 20 20 L_SST_INDEX;..
16a30 72 65 74 20 3d 20 73 65 74 5f 73 73 74 5f 76 61 ret = set_sst_va
16a40 6c 75 65 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 72 lue (workbook, r
16a50 6f 77 2c 20 63 6f 6c 2c 20 75 74 66 38 5f 73 74 ow, col, utf8_st
16a60 72 69 6e 67 29 3b 0a 09 20 20 69 66 20 28 72 65 ring);.. if (re
16a70 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a t != FREEXL_OK).
16a80 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 . return re
16a90 74 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 t;.. return FRE
16aa0 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a EXL_OK;. }.
16ab0 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 . return FREE
16ac0 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 XL_OK;.}..static
16ad0 20 69 6e 74 0a 72 65 61 64 5f 63 66 62 66 5f 73 int.read_cfbf_s
16ae0 65 63 74 6f 72 20 28 62 69 66 66 5f 77 6f 72 6b ector (biff_work
16af0 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c book * workbook,
16b00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
16b10 62 75 66 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 buf).{./* attemp
16b20 74 69 6e 67 20 74 6f 20 72 65 61 64 20 61 20 70 ting to read a p
16b30 68 79 73 69 63 61 6c 20 73 65 63 74 6f 72 20 66 hysical sector f
16b40 72 6f 6d 20 74 68 65 20 43 46 42 46 20 73 74 72 rom the CFBF str
16b50 65 61 6d 20 2a 2f 0a 20 20 20 20 6c 6f 6e 67 20 eam */. long
16b60 77 68 65 72 65 20 3d 20 28 77 6f 72 6b 62 6f 6f where = (workboo
16b70 6b 2d 3e 63 75 72 72 65 6e 74 5f 73 65 63 74 6f k->current_secto
16b80 72 20 2b 20 31 29 20 2a 20 77 6f 72 6b 62 6f 6f r + 1) * workboo
16b90 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 k->fat->sector_s
16ba0 69 7a 65 3b 0a 20 20 20 20 69 66 20 28 66 73 65 ize;. if (fse
16bb0 65 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c ek (workbook->xl
16bc0 73 2c 20 77 68 65 72 65 2c 20 53 45 45 4b 5f 53 s, where, SEEK_S
16bd0 45 54 29 20 21 3d 20 30 29 0a 09 72 65 74 75 72 ET) != 0)..retur
16be0 6e 20 46 52 45 45 58 4c 5f 43 46 42 46 5f 53 45 n FREEXL_CFBF_SE
16bf0 45 4b 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 EK_ERROR;. if
16c00 20 28 66 72 65 61 64 20 28 62 75 66 2c 20 31 2c (fread (buf, 1,
16c10 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e workbook->fat->
16c20 73 65 63 74 6f 72 5f 73 69 7a 65 2c 20 77 6f 72 sector_size, wor
16c30 6b 62 6f 6f 6b 2d 3e 78 6c 73 29 20 21 3d 0a 09 kbook->xls) !=..
16c40 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 workbook->fat->s
16c50 65 63 74 6f 72 5f 73 69 7a 65 29 0a 09 72 65 74 ector_size)..ret
16c60 75 72 6e 20 46 52 45 45 58 4c 5f 43 46 42 46 5f urn FREEXL_CFBF_
16c70 52 45 41 44 5f 45 52 52 4f 52 3b 0a 20 20 20 20 READ_ERROR;.
16c80 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b return FREEXL_OK
16c90 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a ;.}..static int.
16ca0 72 65 61 64 5f 63 66 62 66 5f 6e 65 78 74 5f 73 read_cfbf_next_s
16cb0 65 63 74 6f 72 20 28 62 69 66 66 5f 77 6f 72 6b ector (biff_work
16cc0 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2c book * workbook,
16cd0 20 69 6e 74 20 2a 65 72 72 63 6f 64 65 29 0a 7b int *errcode).{
16ce0 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 ./* attempting t
16cf0 6f 20 72 65 61 64 20 74 68 65 20 6e 65 78 74 20 o read the next
16d00 73 65 63 74 6f 72 20 66 72 6f 6d 20 74 68 65 20 sector from the
16d10 43 46 42 46 20 73 74 72 65 61 6d 20 2a 2f 0a 20 CFBF stream */.
16d20 20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 20 20 int ret;.
16d30 66 61 74 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 fat_entry *entry
16d40 20 3d 20 67 65 74 5f 66 61 74 5f 65 6e 74 72 79 = get_fat_entry
16d50 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2c (workbook->fat,
16d60 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 63 75 72 72 65 workbook->curre
16d70 6e 74 5f 73 65 63 74 6f 72 29 3b 0a 20 20 20 20 nt_sector);.
16d80 69 66 20 28 65 6e 74 72 79 20 3d 3d 20 4e 55 4c if (entry == NUL
16d90 4c 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 L). {.. *e
16da0 72 72 63 6f 64 65 20 3d 20 46 52 45 45 58 4c 5f rrcode = FREEXL_
16db0 43 46 42 46 5f 49 4c 4c 45 47 41 4c 5f 46 41 54 CFBF_ILLEGAL_FAT
16dc0 5f 45 4e 54 52 59 3b 0a 09 20 20 72 65 74 75 72 _ENTRY;.. retur
16dd0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 n 0;. }.
16de0 20 69 66 20 28 65 6e 74 72 79 2d 3e 6e 65 78 74 if (entry->next
16df0 5f 73 65 63 74 6f 72 20 3d 3d 20 30 78 66 66 66 _sector == 0xfff
16e00 66 66 66 66 65 29 0a 20 20 20 20 20 20 7b 0a 09 ffffe). {..
16e10 20 20 2f 2a 20 45 4f 46 3a 20 65 6e 64 2d 6f 66 /* EOF: end-of
16e20 2d 63 68 61 69 6e 20 6d 61 72 6b 65 72 20 66 6f -chain marker fo
16e30 75 6e 64 20 2a 2f 0a 09 20 20 2a 65 72 72 63 6f und */.. *errco
16e40 64 65 20 3d 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a de = FREEXL_OK;.
16e50 09 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 . return -1;.
16e60 20 20 20 20 7d 0a 20 20 20 20 77 6f 72 6b 62 6f }. workbo
16e70 6f 6b 2d 3e 63 75 72 72 65 6e 74 5f 73 65 63 74 ok->current_sect
16e80 6f 72 20 3d 20 65 6e 74 72 79 2d 3e 6e 65 78 74 or = entry->next
16e90 5f 73 65 63 74 6f 72 3b 0a 20 20 20 20 69 66 20 _sector;. if
16ea0 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f (workbook->secto
16eb0 72 5f 65 6e 64 20 3e 20 77 6f 72 6b 62 6f 6f 6b r_end > workbook
16ec0 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 ->fat->sector_si
16ed0 7a 65 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f ze). {.. /
16ee0 2a 20 73 68 69 66 74 69 6e 67 20 62 61 63 6b 20 * shifting back
16ef0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 63 74 the current sect
16f00 6f 72 20 62 75 66 66 65 72 20 2a 2f 0a 09 20 20 or buffer */..
16f10 6d 65 6d 63 70 79 20 28 77 6f 72 6b 62 6f 6f 6b memcpy (workbook
16f20 2d 3e 73 65 63 74 6f 72 5f 62 75 66 2c 0a 09 09 ->sector_buf,...
16f30 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 workbook->sect
16f40 6f 72 5f 62 75 66 20 2b 20 77 6f 72 6b 62 6f 6f or_buf + workboo
16f50 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 k->fat->sector_s
16f60 69 7a 65 2c 0a 09 09 20 20 77 6f 72 6b 62 6f 6f ize,... workboo
16f70 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 k->fat->sector_s
16f80 69 7a 65 29 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f ize);.. workboo
16f90 6b 2d 3e 70 5f 69 6e 20 2d 3d 20 77 6f 72 6b 62 k->p_in -= workb
16fa0 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 ook->fat->sector
16fb0 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 7d 0a 2f _size;. }./
16fc0 2a 20 72 65 61 64 69 6e 67 20 69 6e 74 6f 20 74 * reading into t
16fd0 68 65 20 73 65 63 6f 6e 64 20 68 61 6c 66 20 6f he second half o
16fe0 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 75 66 f the sector buf
16ff0 66 65 72 20 2a 2f 0a 20 20 20 20 72 65 74 20 3d fer */. ret =
17000 0a 09 72 65 61 64 5f 63 66 62 66 5f 73 65 63 74 ..read_cfbf_sect
17010 6f 72 20 28 77 6f 72 6b 62 6f 6f 6b 2c 0a 09 09 or (workbook,...
17020 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 . workbook->sec
17030 74 6f 72 5f 62 75 66 20 2b 20 77 6f 72 6b 62 6f tor_buf + workbo
17040 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f ok->fat->sector_
17050 73 69 7a 65 29 3b 0a 20 20 20 20 69 66 20 28 72 size);. if (r
17060 65 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 et != FREEXL_OK)
17070 0a 20 20 20 20 20 20 7b 0a 09 20 20 2a 65 72 72 . {.. *err
17080 63 6f 64 65 20 3d 20 72 65 74 3b 0a 09 20 20 72 code = ret;.. r
17090 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d eturn 0;. }
170a0 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 . workbook->b
170b0 79 74 65 73 5f 72 65 61 64 20 2b 3d 20 77 6f 72 ytes_read += wor
170c0 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 kbook->fat->sect
170d0 6f 72 5f 73 69 7a 65 3b 0a 20 20 20 20 69 66 20 or_size;. if
170e0 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 79 74 65 73 (workbook->bytes
170f0 5f 72 65 61 64 20 3e 20 77 6f 72 6b 62 6f 6f 6b _read > workbook
17100 2d 3e 73 69 7a 65 29 0a 20 20 20 20 20 20 7b 0a ->size). {.
17110 09 20 20 2f 2a 20 69 6e 63 6f 6d 70 6c 65 74 65 . /* incomplete
17120 20 6c 61 73 74 20 73 65 63 74 6f 72 20 2a 2f 0a last sector */.
17130 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 . workbook->sec
17140 74 6f 72 5f 65 6e 64 20 3d 0a 09 20 20 20 20 20 tor_end =..
17150 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d (workbook->fat-
17160 3e 73 65 63 74 6f 72 5f 73 69 7a 65 20 2a 20 32 >sector_size * 2
17170 29 20 2d 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 ) - (workbook->b
17180 79 74 65 73 5f 72 65 61 64 20 2d 0a 09 09 09 09 ytes_read -.....
17190 09 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 69 .. workbook->si
171a0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ze);. }.
171b0 20 65 6c 73 65 0a 09 77 6f 72 6b 62 6f 6f 6b 2d else..workbook-
171c0 3e 73 65 63 74 6f 72 5f 65 6e 64 20 3d 20 28 77 >sector_end = (w
171d0 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 orkbook->fat->se
171e0 63 74 6f 72 5f 73 69 7a 65 20 2a 20 32 29 3b 0a ctor_size * 2);.
171f0 20 20 20 20 2a 65 72 72 63 6f 64 65 20 3d 20 46 *errcode = F
17200 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 72 65 REEXL_OK;. re
17210 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 turn 1;.}..stati
17220 63 20 69 6e 74 0a 72 65 61 64 5f 62 69 66 66 5f c int.read_biff_
17230 6e 65 78 74 5f 72 65 63 6f 72 64 20 28 62 69 66 next_record (bif
17240 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 f_workbook * wor
17250 6b 62 6f 6f 6b 2c 20 69 6e 74 20 73 77 61 70 2c kbook, int swap,
17260 20 69 6e 74 20 2a 65 72 72 63 6f 64 65 29 0a 7b int *errcode).{
17270 0a 2f 2a 20 0a 20 2a 20 61 74 74 65 6d 70 74 69 ./* . * attempti
17280 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 6e ng to read the n
17290 65 78 74 20 42 49 46 46 20 72 65 63 6f 72 64 0a ext BIFF record.
172a0 20 2a 20 66 72 6f 6d 20 74 68 65 20 57 6f 72 6b * from the Work
172b0 62 6f 6f 6b 20 73 74 72 65 61 6d 0a 20 2a 2f 0a book stream. */.
172c0 20 20 20 20 62 69 66 66 5f 77 6f 72 64 31 36 20 biff_word16
172d0 72 65 63 6f 72 64 5f 74 79 70 65 3b 0a 20 20 20 record_type;.
172e0 20 62 69 66 66 5f 77 6f 72 64 31 36 20 72 65 63 biff_word16 rec
172f0 6f 72 64 5f 73 69 7a 65 3b 0a 20 20 20 20 69 6e ord_size;. in
17300 74 20 72 65 74 3b 0a 0a 20 20 20 20 69 66 20 28 t ret;.. if (
17310 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f 72 workbook->sector
17320 5f 72 65 61 64 79 20 3d 3d 20 30 29 0a 20 20 20 _ready == 0).
17330 20 20 20 7b 0a 09 20 20 2f 2a 20 66 69 72 73 74 {.. /* first
17340 20 61 63 63 65 73 73 3a 20 6c 6f 61 64 69 6e 67 access: loading
17350 20 74 68 65 20 66 69 72 73 74 20 73 74 72 65 61 the first strea
17360 6d 20 73 65 63 74 6f 72 20 2a 2f 0a 09 20 20 72 m sector */.. r
17370 65 74 20 3d 20 72 65 61 64 5f 63 66 62 66 5f 73 et = read_cfbf_s
17380 65 63 74 6f 72 20 28 77 6f 72 6b 62 6f 6f 6b 2c ector (workbook,
17390 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f workbook->secto
173a0 72 5f 62 75 66 29 3b 0a 09 20 20 69 66 20 28 72 r_buf);.. if (r
173b0 65 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 et != FREEXL_OK)
173c0 0a 09 20 20 20 20 7b 0a 09 09 2a 65 72 72 63 6f .. {...*errco
173d0 64 65 20 3d 20 72 65 74 3b 0a 09 09 72 65 74 75 de = ret;...retu
173e0 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 rn 0;.. }..
173f0 77 6f 72 6b 62 6f 6f 6b 2d 3e 63 75 72 72 65 6e workbook->curren
17400 74 5f 73 65 63 74 6f 72 20 3d 20 77 6f 72 6b 62 t_sector = workb
17410 6f 6f 6b 2d 3e 73 74 61 72 74 5f 73 65 63 74 6f ook->start_secto
17420 72 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e r;.. workbook->
17430 62 79 74 65 73 5f 72 65 61 64 20 2b 3d 20 77 6f bytes_read += wo
17440 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 rkbook->fat->sec
17450 74 6f 72 5f 73 69 7a 65 3b 0a 09 20 20 69 66 20 tor_size;.. if
17460 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 79 74 65 73 (workbook->bytes
17470 5f 72 65 61 64 20 3e 20 77 6f 72 6b 62 6f 6f 6b _read > workbook
17480 2d 3e 73 69 7a 65 29 0a 09 20 20 20 20 7b 0a 09 ->size).. {..
17490 09 2f 2a 20 69 6e 63 6f 6d 70 6c 65 74 65 20 6c ./* incomplete l
174a0 61 73 74 20 73 65 63 74 6f 72 20 2a 2f 0a 09 09 ast sector */...
174b0 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f 72 workbook->sector
174c0 5f 65 6e 64 20 3d 0a 09 09 20 20 20 20 77 6f 72 _end =... wor
174d0 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 kbook->fat->sect
174e0 6f 72 5f 73 69 7a 65 20 2d 20 28 77 6f 72 6b 62 or_size - (workb
174f0 6f 6f 6b 2d 3e 62 79 74 65 73 5f 72 65 61 64 20 ook->bytes_read
17500 2d 0a 09 09 09 09 09 09 20 20 77 6f 72 6b 62 6f -....... workbo
17510 6f 6b 2d 3e 73 69 7a 65 29 3b 0a 09 20 20 20 20 ok->size);..
17520 7d 0a 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 }.. else..
17530 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f workbook->secto
17540 72 5f 65 6e 64 20 3d 20 77 6f 72 6b 62 6f 6f 6b r_end = workbook
17550 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 ->fat->sector_si
17560 7a 65 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d ze;.. workbook-
17570 3e 70 5f 69 6e 20 3d 20 77 6f 72 6b 62 6f 6f 6b >p_in = workbook
17580 2d 3e 73 65 63 74 6f 72 5f 62 75 66 3b 0a 09 20 ->sector_buf;..
17590 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f workbook->secto
175a0 72 5f 72 65 61 64 79 20 3d 20 31 3b 0a 20 20 20 r_ready = 1;.
175b0 20 20 20 7d 0a 0a 2f 2a 20 0a 20 2a 20 66 6f 75 }../* . * fou
175c0 72 20 62 79 74 65 73 20 61 72 65 20 6e 6f 77 20 r bytes are now
175d0 65 78 70 65 63 74 65 64 3a 0a 20 2a 20 55 53 48 expected:. * USH
175e0 4f 52 54 20 72 65 63 6f 72 64 2d 74 79 70 65 0a ORT record-type.
175f0 20 2a 20 55 53 48 4f 52 54 20 72 65 63 6f 72 64 * USHORT record
17600 2d 73 69 7a 65 0a 20 2a 2f 0a 20 20 20 20 69 66 -size. */. if
17610 20 28 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 ((workbook->p_i
17620 6e 20 2d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 n - workbook->se
17630 63 74 6f 72 5f 62 75 66 29 20 2b 20 34 20 3e 20 ctor_buf) + 4 >
17640 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f 72 workbook->sector
17650 5f 65 6e 64 29 0a 20 20 20 20 20 20 7b 0a 09 20 _end). {..
17660 20 2f 2a 20 72 65 61 64 69 6e 67 20 6e 65 78 74 /* reading next
17670 20 73 65 63 74 6f 72 20 2a 2f 0a 09 20 20 72 65 sector */.. re
17680 74 20 3d 20 72 65 61 64 5f 63 66 62 66 5f 6e 65 t = read_cfbf_ne
17690 78 74 5f 73 65 63 74 6f 72 20 28 77 6f 72 6b 62 xt_sector (workb
176a0 6f 6f 6b 2c 20 65 72 72 63 6f 64 65 29 3b 0a 09 ook, errcode);..
176b0 20 20 69 66 20 28 72 65 74 20 3d 3d 20 2d 31 29 if (ret == -1)
176c0 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d .. return -
176d0 31 3b 09 2f 2a 20 45 4f 46 20 66 6f 75 6e 64 20 1;./* EOF found
176e0 2a 2f 0a 09 20 20 69 66 20 28 72 65 74 20 3d 3d */.. if (ret ==
176f0 20 30 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 0).. retur
17700 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 n 0;. }./*
17710 66 65 74 63 68 69 6e 67 20 72 65 63 6f 72 64 2d fetching record-
17720 74 79 70 65 20 61 6e 64 20 72 65 63 6f 72 64 2d type and record-
17730 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 size */. memc
17740 70 79 20 28 72 65 63 6f 72 64 5f 74 79 70 65 2e py (record_type.
17750 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
17760 3e 70 5f 69 6e 2c 20 32 29 3b 0a 20 20 20 20 77 >p_in, 2);. w
17770 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 20 2b 3d orkbook->p_in +=
17780 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 20 28 2;. memcpy (
17790 72 65 63 6f 72 64 5f 73 69 7a 65 2e 62 79 74 65 record_size.byte
177a0 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 s, workbook->p_i
177b0 6e 2c 20 32 29 3b 0a 20 20 20 20 77 6f 72 6b 62 n, 2);. workb
177c0 6f 6f 6b 2d 3e 70 5f 69 6e 20 2b 3d 20 32 3b 0a ook->p_in += 2;.
177d0 20 20 20 20 69 66 20 28 73 77 61 70 29 0a 20 20 if (swap).
177e0 20 20 20 20 7b 0a 09 20 20 2f 2a 20 42 49 47 20 {.. /* BIG
177f0 65 6e 64 69 61 6e 20 61 72 63 68 3a 20 73 77 61 endian arch: swa
17800 70 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 20 p required */..
17810 20 73 77 61 70 31 36 20 28 26 72 65 63 6f 72 64 swap16 (&record
17820 5f 74 79 70 65 29 3b 0a 09 20 20 73 77 61 70 31 _type);.. swap1
17830 36 20 28 26 72 65 63 6f 72 64 5f 73 69 7a 65 29 6 (&record_size)
17840 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 0a 2f 20 ;. }./* ./
17850 53 61 6e 64 72 6f 20 32 30 31 31 2d 30 39 2d 30 Sandro 2011-09-0
17860 34 0a 2f 20 61 70 70 61 72 65 6e 74 6c 79 20 61 4./ apparently a
17870 20 72 65 63 6f 72 64 2d 74 79 70 65 20 30 78 30 record-type 0x0
17880 30 30 30 20 61 6e 64 20 61 20 72 65 63 6f 72 64 000 and a record
17890 2d 73 69 7a 65 20 30 0a 2f 20 73 65 65 6d 73 20 -size 0./ seems
178a0 74 6f 20 62 65 20 61 6e 20 61 6c 74 65 72 6e 61 to be an alterna
178b0 74 69 76 65 20 77 61 79 20 74 6f 20 6d 61 72 6b tive way to mark
178c0 20 45 4f 46 0a 2a 2f 0a 20 20 20 20 69 66 20 28 EOF.*/. if (
178d0 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 record_type.valu
178e0 65 20 3d 3d 20 30 78 30 30 30 30 20 26 26 20 72 e == 0x0000 && r
178f0 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 ecord_size.value
17900 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 20 2d == 0)..return -
17910 31 3b 0a 0a 2f 2a 20 73 61 76 69 6e 67 20 74 68 1;../* saving th
17920 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 e current record
17930 20 2a 2f 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b */. workbook
17940 2d 3e 72 65 63 6f 72 64 5f 74 79 70 65 20 3d 20 ->record_type =
17950 72 65 63 6f 72 64 5f 74 79 70 65 2e 76 61 6c 75 record_type.valu
17960 65 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d e;. workbook-
17970 3e 72 65 63 6f 72 64 5f 73 69 7a 65 20 3d 20 72 >record_size = r
17980 65 63 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 ecord_size.value
17990 3b 0a 0a 20 20 20 20 69 66 20 28 28 28 77 6f 72 ;.. if (((wor
179a0 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 20 2b 20 77 6f kbook->p_in + wo
179b0 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 73 rkbook->record_s
179c0 69 7a 65 29 20 2d 20 77 6f 72 6b 62 6f 6f 6b 2d ize) - workbook-
179d0 3e 73 65 63 74 6f 72 5f 62 75 66 29 20 3e 0a 09 >sector_buf) >..
179e0 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f 72 workbook->sector
179f0 5f 65 6e 64 29 0a 20 20 20 20 20 20 7b 0a 09 20 _end). {..
17a00 20 2f 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 /* the current
17a10 72 65 63 6f 72 64 20 73 70 61 6e 73 20 6f 6e 20 record spans on
17a20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 the following se
17a30 63 74 6f 72 28 73 29 20 2a 2f 0a 09 20 20 75 6e ctor(s) */.. un
17a40 73 69 67 6e 65 64 20 69 6e 74 20 61 6c 72 65 61 signed int alrea
17a50 64 79 5f 64 6f 6e 65 3b 0a 09 20 20 75 6e 73 69 dy_done;.. unsi
17a60 67 6e 65 64 20 69 6e 74 20 63 68 75 6e 6b 20 3d gned int chunk =
17a70 0a 09 20 20 20 20 20 20 77 6f 72 6b 62 6f 6f 6b .. workbook
17a80 2d 3e 73 65 63 74 6f 72 5f 65 6e 64 20 2d 20 28 ->sector_end - (
17a90 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 20 2d workbook->p_in -
17aa0 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f workbook->secto
17ab0 72 5f 62 75 66 29 3b 0a 09 20 20 69 66 20 28 77 r_buf);.. if (w
17ac0 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f 72 5f orkbook->sector_
17ad0 65 6e 64 20 3c 3d 20 28 77 6f 72 6b 62 6f 6f 6b end <= (workbook
17ae0 2d 3e 70 5f 69 6e 20 2d 20 77 6f 72 6b 62 6f 6f ->p_in - workboo
17af0 6b 2d 3e 73 65 63 74 6f 72 5f 62 75 66 29 29 0a k->sector_buf)).
17b00 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 . return -1
17b10 3b 0a 09 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 ;.. memcpy (wor
17b20 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 77 kbook->record, w
17b30 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 2c 20 63 orkbook->p_in, c
17b40 68 75 6e 6b 29 3b 0a 09 20 20 77 6f 72 6b 62 6f hunk);.. workbo
17b50 6f 6b 2d 3e 70 5f 69 6e 20 2b 3d 20 63 68 75 6e ok->p_in += chun
17b60 6b 3b 0a 09 20 20 61 6c 72 65 61 64 79 5f 64 6f k;.. already_do
17b70 6e 65 20 3d 20 63 68 75 6e 6b 3b 0a 0a 09 20 20 ne = chunk;...
17b80 77 68 69 6c 65 20 28 61 6c 72 65 61 64 79 5f 64 while (already_d
17b90 6f 6e 65 20 3c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e one < workbook->
17ba0 72 65 63 6f 72 64 5f 73 69 7a 65 29 0a 09 20 20 record_size)..
17bb0 20 20 7b 0a 09 09 2f 2a 20 72 65 61 64 69 6e 67 {.../* reading
17bc0 20 61 20 66 75 72 74 68 65 72 20 73 65 63 74 6f a further secto
17bd0 72 20 2a 2f 0a 09 09 72 65 74 20 3d 20 72 65 61 r */...ret = rea
17be0 64 5f 63 66 62 66 5f 6e 65 78 74 5f 73 65 63 74 d_cfbf_next_sect
17bf0 6f 72 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 65 72 or (workbook, er
17c00 72 63 6f 64 65 29 3b 0a 09 09 69 66 20 28 72 65 rcode);...if (re
17c10 74 20 3d 3d 20 2d 31 29 0a 09 09 20 20 20 20 72 t == -1)... r
17c20 65 74 75 72 6e 20 2d 31 3b 09 2f 2a 20 45 4f 46 eturn -1;./* EOF
17c30 20 66 6f 75 6e 64 20 2a 2f 0a 09 09 69 66 20 28 found */...if (
17c40 72 65 74 20 3d 3d 20 30 29 0a 09 09 20 20 20 20 ret == 0)...
17c50 72 65 74 75 72 6e 20 30 3b 0a 09 09 63 68 75 6e return 0;...chun
17c60 6b 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 k = workbook->re
17c70 63 6f 72 64 5f 73 69 7a 65 20 2d 20 61 6c 72 65 cord_size - alre
17c80 61 64 79 5f 64 6f 6e 65 3b 0a 09 09 69 66 20 28 ady_done;...if (
17c90 63 68 75 6e 6b 20 3c 3d 20 77 6f 72 6b 62 6f 6f chunk <= workboo
17ca0 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 k->fat->sector_s
17cb0 69 7a 65 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 ize)... {...
17cc0 20 20 20 2f 2a 20 6f 6b 2c 20 66 69 6e 69 73 68 /* ok, finish
17cd0 65 64 3a 20 77 68 6f 6c 65 20 72 65 63 6f 72 64 ed: whole record
17ce0 20 72 65 61 73 73 65 6d 62 6c 65 64 20 2a 2f 0a reassembled */.
17cf0 09 09 20 20 20 20 20 20 6d 65 6d 63 70 79 20 28 .. memcpy (
17d00 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
17d10 20 2b 20 61 6c 72 65 61 64 79 5f 64 6f 6e 65 2c + already_done,
17d20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 2c workbook->p_in,
17d30 0a 09 09 09 20 20 20 20 20 20 63 68 75 6e 6b 29 .... chunk)
17d40 3b 0a 09 09 20 20 20 20 20 20 77 6f 72 6b 62 6f ;... workbo
17d50 6f 6b 2d 3e 70 5f 69 6e 20 2b 3d 20 63 68 75 6e ok->p_in += chun
17d60 6b 3b 0a 09 09 20 20 20 20 20 20 67 6f 74 6f 20 k;... goto
17d70 72 65 63 6f 72 64 5f 64 6f 6e 65 3b 0a 09 09 20 record_done;...
17d80 20 7d 0a 09 09 2f 2a 20 72 65 63 6f 72 64 20 73 }.../* record s
17d90 74 69 6c 6c 20 73 70 61 6e 6e 69 6e 67 20 6f 6e till spanning on
17da0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 the following s
17db0 65 63 74 6f 72 20 2a 2f 0a 09 09 6d 65 6d 63 70 ector */...memcp
17dc0 79 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 y (workbook->rec
17dd0 6f 72 64 20 2b 20 61 6c 72 65 61 64 79 5f 64 6f ord + already_do
17de0 6e 65 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f ne, workbook->p_
17df0 69 6e 2c 0a 09 09 09 77 6f 72 6b 62 6f 6f 6b 2d in,....workbook-
17e00 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 7a >fat->sector_siz
17e10 65 29 3b 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d 3e e);...workbook->
17e20 70 5f 69 6e 20 2b 3d 20 77 6f 72 6b 62 6f 6f 6b p_in += workbook
17e30 2d 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 ->fat->sector_si
17e40 7a 65 3b 0a 09 09 61 6c 72 65 61 64 79 5f 64 6f ze;...already_do
17e50 6e 65 20 2b 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e ne += workbook->
17e60 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 7a 65 fat->sector_size
17e70 3b 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d ;.. }. }
17e80 0a 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 . else.
17e90 7b 0a 09 20 20 2f 2a 20 74 68 65 20 72 65 63 6f {.. /* the reco
17ea0 72 64 20 69 73 20 66 75 6c 6c 79 20 63 6f 6e 74 rd is fully cont
17eb0 61 69 6e 65 64 20 69 6e 74 6f 20 74 68 65 20 63 ained into the c
17ec0 75 72 72 65 6e 74 20 73 65 63 74 6f 72 20 2a 2f urrent sector */
17ed0 0a 09 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 6b .. memcpy (work
17ee0 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 77 6f book->record, wo
17ef0 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 2c 20 77 6f rkbook->p_in, wo
17f00 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 73 rkbook->record_s
17f10 69 7a 65 29 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f ize);.. workboo
17f20 6b 2d 3e 70 5f 69 6e 20 2b 3d 20 72 65 63 6f 72 k->p_in += recor
17f30 64 5f 73 69 7a 65 2e 76 61 6c 75 65 3b 0a 20 20 d_size.value;.
17f40 20 20 20 20 7d 0a 20 20 72 65 63 6f 72 64 5f 64 }. record_d
17f50 6f 6e 65 3a 0a 20 20 20 20 72 65 74 20 3d 20 70 one:. ret = p
17f60 61 72 73 65 5f 62 69 66 66 5f 72 65 63 6f 72 64 arse_biff_record
17f70 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 (workbook, swap
17f80 29 3b 0a 20 20 20 20 69 66 20 28 72 65 74 20 21 );. if (ret !
17f90 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 72 65 = FREEXL_OK)..re
17fa0 74 75 72 6e 20 30 3b 0a 20 20 20 20 2a 65 72 72 turn 0;. *err
17fb0 63 6f 64 65 20 3d 20 46 52 45 45 58 4c 5f 4f 4b code = FREEXL_OK
17fc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
17fd0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 72 65 }..static int.re
17fe0 61 64 5f 6d 69 6e 69 5f 62 69 66 66 5f 6e 65 78 ad_mini_biff_nex
17ff0 74 5f 72 65 63 6f 72 64 20 28 62 69 66 66 5f 77 t_record (biff_w
18000 6f 72 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f orkbook * workbo
18010 6f 6b 2c 20 69 6e 74 20 73 77 61 70 2c 20 69 6e ok, int swap, in
18020 74 20 2a 65 72 72 63 6f 64 65 29 0a 7b 0a 2f 2a t *errcode).{./*
18030 20 0a 20 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 . * attempting
18040 74 6f 20 72 65 61 64 20 74 68 65 20 6e 65 78 74 to read the next
18050 20 42 49 46 46 20 72 65 63 6f 72 64 0a 20 2a 20 BIFF record. *
18060 66 72 6f 6d 20 74 68 65 20 57 6f 72 6b 62 6f 6f from the Workboo
18070 6b 20 4d 49 4e 49 2d 73 74 72 65 61 6d 0a 20 2a k MINI-stream. *
18080 2f 0a 20 20 20 20 62 69 66 66 5f 77 6f 72 64 31 /. biff_word1
18090 36 20 72 65 63 6f 72 64 5f 74 79 70 65 3b 0a 20 6 record_type;.
180a0 20 20 20 62 69 66 66 5f 77 6f 72 64 31 36 20 72 biff_word16 r
180b0 65 63 6f 72 64 5f 73 69 7a 65 3b 0a 20 20 20 20 ecord_size;.
180c0 69 6e 74 20 72 65 74 3b 0a 0a 2f 2a 20 0a 20 2a int ret;../* . *
180d0 20 66 6f 75 72 20 62 79 74 65 73 20 61 72 65 20 four bytes are
180e0 6e 6f 77 20 65 78 70 65 63 74 65 64 3a 0a 20 2a now expected:. *
180f0 20 55 53 48 4f 52 54 20 72 65 63 6f 72 64 2d 74 USHORT record-t
18100 79 70 65 0a 20 2a 20 55 53 48 4f 52 54 20 72 65 ype. * USHORT re
18110 63 6f 72 64 2d 73 69 7a 65 0a 20 2a 2f 0a 20 20 cord-size. */.
18120 20 20 69 66 20 28 28 77 6f 72 6b 62 6f 6f 6b 2d if ((workbook-
18130 3e 70 5f 69 6e 20 2d 20 77 6f 72 6b 62 6f 6f 6b >p_in - workbook
18140 2d 3e 66 61 74 2d 3e 6d 69 6e 69 53 74 72 65 61 ->fat->miniStrea
18150 6d 29 20 2b 20 34 20 3e 20 28 69 6e 74 29 20 77 m) + 4 > (int) w
18160 6f 72 6b 62 6f 6f 6b 2d 3e 73 69 7a 65 29 0a 09 orkbook->size)..
18170 72 65 74 75 72 6e 20 2d 31 3b 09 09 2f 2a 20 45 return -1;../* E
18180 4f 46 20 66 6f 75 6e 64 20 2a 2f 0a 0a 2f 2a 20 OF found */../*
18190 66 65 74 63 68 69 6e 67 20 72 65 63 6f 72 64 2d fetching record-
181a0 74 79 70 65 20 61 6e 64 20 72 65 63 6f 72 64 2d type and record-
181b0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 size */. memc
181c0 70 79 20 28 72 65 63 6f 72 64 5f 74 79 70 65 2e py (record_type.
181d0 62 79 74 65 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d bytes, workbook-
181e0 3e 70 5f 69 6e 2c 20 32 29 3b 0a 20 20 20 20 77 >p_in, 2);. w
181f0 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 20 2b 3d orkbook->p_in +=
18200 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 20 28 2;. memcpy (
18210 72 65 63 6f 72 64 5f 73 69 7a 65 2e 62 79 74 65 record_size.byte
18220 73 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 s, workbook->p_i
18230 6e 2c 20 32 29 3b 0a 20 20 20 20 77 6f 72 6b 62 n, 2);. workb
18240 6f 6f 6b 2d 3e 70 5f 69 6e 20 2b 3d 20 32 3b 0a ook->p_in += 2;.
18250 20 20 20 20 69 66 20 28 73 77 61 70 29 0a 20 20 if (swap).
18260 20 20 20 20 7b 0a 09 20 20 2f 2a 20 42 49 47 20 {.. /* BIG
18270 65 6e 64 69 61 6e 20 61 72 63 68 3a 20 73 77 61 endian arch: swa
18280 70 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 20 p required */..
18290 20 73 77 61 70 31 36 20 28 26 72 65 63 6f 72 64 swap16 (&record
182a0 5f 74 79 70 65 29 3b 0a 09 20 20 73 77 61 70 31 _type);.. swap1
182b0 36 20 28 26 72 65 63 6f 72 64 5f 73 69 7a 65 29 6 (&record_size)
182c0 3b 0a 20 20 20 20 20 20 7d 0a 2f 2a 20 73 61 76 ;. }./* sav
182d0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 ing the current
182e0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 20 20 77 6f record */. wo
182f0 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 74 rkbook->record_t
18300 79 70 65 20 3d 20 72 65 63 6f 72 64 5f 74 79 70 ype = record_typ
18310 65 2e 76 61 6c 75 65 3b 0a 20 20 20 20 77 6f 72 e.value;. wor
18320 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f 73 69 kbook->record_si
18330 7a 65 20 3d 20 72 65 63 6f 72 64 5f 73 69 7a 65 ze = record_size
18340 2e 76 61 6c 75 65 3b 0a 0a 20 20 20 20 69 66 20 .value;.. if
18350 28 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e ((workbook->p_in
18360 20 2d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 - workbook->fat
18370 2d 3e 6d 69 6e 69 53 74 72 65 61 6d 29 20 2b 20 ->miniStream) +
18380 77 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 workbook->record
18390 5f 73 69 7a 65 20 3e 0a 09 28 69 6e 74 29 20 77 _size >..(int) w
183a0 6f 72 6b 62 6f 6f 6b 2d 3e 73 69 7a 65 29 0a 09 orkbook->size)..
183b0 72 65 74 75 72 6e 20 30 3b 09 09 2f 2a 20 75 6e return 0;../* un
183c0 65 78 70 65 63 74 65 64 20 45 4f 46 20 2a 2f 0a expected EOF */.
183d0 0a 20 20 20 20 6d 65 6d 63 70 79 20 28 77 6f 72 . memcpy (wor
183e0 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 2c 20 77 kbook->record, w
183f0 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 2c 20 77 orkbook->p_in, w
18400 6f 72 6b 62 6f 6f 6b 2d 3e 72 65 63 6f 72 64 5f orkbook->record_
18410 73 69 7a 65 29 3b 0a 20 20 20 20 77 6f 72 6b 62 size);. workb
18420 6f 6f 6b 2d 3e 70 5f 69 6e 20 2b 3d 20 72 65 63 ook->p_in += rec
18430 6f 72 64 5f 73 69 7a 65 2e 76 61 6c 75 65 3b 0a ord_size.value;.
18440 0a 20 20 20 20 72 65 74 20 3d 20 70 61 72 73 65 . ret = parse
18450 5f 62 69 66 66 5f 72 65 63 6f 72 64 20 28 77 6f _biff_record (wo
18460 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 29 3b 0a 20 rkbook, swap);.
18470 20 20 20 69 66 20 28 72 65 74 20 21 3d 20 46 52 if (ret != FR
18480 45 45 58 4c 5f 4f 4b 29 0a 09 72 65 74 75 72 6e EEXL_OK)..return
18490 20 30 3b 0a 20 20 20 20 2a 65 72 72 63 6f 64 65 0;. *errcode
184a0 20 3d 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 = FREEXL_OK;.
184b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 return 1;.}..s
184c0 74 61 74 69 63 20 69 6e 74 0a 70 61 72 73 65 5f tatic int.parse_
184d0 64 69 72 5f 65 6e 74 72 79 20 28 76 6f 69 64 20 dir_entry (void
184e0 2a 62 6c 6f 63 6b 2c 20 69 6e 74 20 73 77 61 70 *block, int swap
184f0 2c 20 69 63 6f 6e 76 5f 74 20 75 74 66 31 36 5f , iconv_t utf16_
18500 75 74 66 38 5f 63 6f 6e 76 65 72 74 65 72 2c 0a utf8_converter,.
18510 09 09 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 .. unsigned int
18520 2a 77 6f 72 6b 62 6f 6f 6b 2c 20 75 6e 73 69 67 *workbook, unsig
18530 6e 65 64 20 69 6e 74 20 2a 77 6f 72 6b 62 6f 6f ned int *workboo
18540 6b 5f 6c 65 6e 2c 0a 09 09 20 75 6e 73 69 67 6e k_len,... unsign
18550 65 64 20 69 6e 74 20 2a 6d 69 6e 69 46 41 54 5f ed int *miniFAT_
18560 73 74 61 72 74 2c 20 75 6e 73 69 67 6e 65 64 20 start, unsigned
18570 69 6e 74 20 2a 6d 69 6e 69 46 41 54 5f 6c 65 6e int *miniFAT_len
18580 2c 0a 09 09 20 69 6e 74 20 2a 72 6f 6f 74 45 6e ,... int *rootEn
18590 74 72 79 29 0a 7b 0a 2f 2a 20 70 61 72 73 69 6e try).{./* parsin
185a0 67 20 61 20 44 69 72 65 63 74 6f 72 79 20 65 6e g a Directory en
185b0 74 72 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 try */. char
185c0 2a 6e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 65 *name;. int e
185d0 72 72 3b 0a 20 20 20 20 63 66 62 66 5f 64 69 72 rr;. cfbf_dir
185e0 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 20 3d 20 _entry *entry =
185f0 28 63 66 62 66 5f 64 69 72 5f 65 6e 74 72 79 20 (cfbf_dir_entry
18600 2a 29 20 62 6c 6f 63 6b 3b 0a 20 20 20 20 69 66 *) block;. if
18610 20 28 73 77 61 70 29 0a 20 20 20 20 20 20 7b 0a (swap). {.
18620 09 20 20 2f 2a 20 42 49 47 20 65 6e 64 69 61 6e . /* BIG endian
18630 20 61 72 63 68 3a 20 73 77 61 70 20 72 65 71 75 arch: swap requ
18640 69 72 65 64 20 2a 2f 0a 09 20 20 73 77 61 70 31 ired */.. swap1
18650 36 20 28 26 28 65 6e 74 72 79 2d 3e 6e 61 6d 65 6 (&(entry->name
18660 5f 73 69 7a 65 29 29 3b 0a 09 20 20 73 77 61 70 _size));.. swap
18670 33 32 20 28 26 28 65 6e 74 72 79 2d 3e 70 72 65 32 (&(entry->pre
18680 76 69 6f 75 73 29 29 3b 0a 09 20 20 73 77 61 70 vious));.. swap
18690 33 32 20 28 26 28 65 6e 74 72 79 2d 3e 6e 65 78 32 (&(entry->nex
186a0 74 29 29 3b 0a 09 20 20 73 77 61 70 33 32 20 28 t));.. swap32 (
186b0 26 28 65 6e 74 72 79 2d 3e 63 68 69 6c 64 29 29 &(entry->child))
186c0 3b 0a 09 20 20 73 77 61 70 33 32 20 28 26 28 65 ;.. swap32 (&(e
186d0 6e 74 72 79 2d 3e 74 69 6d 65 73 74 61 6d 70 5f ntry->timestamp_
186e0 31 29 29 3b 0a 09 20 20 73 77 61 70 33 32 20 28 1));.. swap32 (
186f0 26 28 65 6e 74 72 79 2d 3e 74 69 6d 65 73 74 61 &(entry->timesta
18700 6d 70 5f 32 29 29 3b 0a 09 20 20 73 77 61 70 33 mp_2));.. swap3
18710 32 20 28 26 28 65 6e 74 72 79 2d 3e 74 69 6d 65 2 (&(entry->time
18720 73 74 61 6d 70 5f 33 29 29 3b 0a 09 20 20 73 77 stamp_3));.. sw
18730 61 70 33 32 20 28 26 28 65 6e 74 72 79 2d 3e 74 ap32 (&(entry->t
18740 69 6d 65 73 74 61 6d 70 5f 34 29 29 3b 0a 09 20 imestamp_4));..
18750 20 73 77 61 70 33 32 20 28 26 28 65 6e 74 72 79 swap32 (&(entry
18760 2d 3e 73 74 61 72 74 5f 73 65 63 74 6f 72 29 29 ->start_sector))
18770 3b 0a 09 20 20 73 77 61 70 33 32 20 28 26 28 65 ;.. swap32 (&(e
18780 6e 74 72 79 2d 3e 65 78 74 72 61 5f 73 69 7a 65 ntry->extra_size
18790 29 29 3b 0a 09 20 20 73 77 61 70 33 32 20 28 26 ));.. swap32 (&
187a0 28 65 6e 74 72 79 2d 3e 73 69 7a 65 29 29 3b 0a (entry->size));.
187b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 6e 61 6d }.. nam
187c0 65 20 3d 0a 09 63 6f 6e 76 65 72 74 5f 74 6f 5f e =..convert_to_
187d0 75 74 66 38 20 28 75 74 66 31 36 5f 75 74 66 38 utf8 (utf16_utf8
187e0 5f 63 6f 6e 76 65 72 74 65 72 2c 20 65 6e 74 72 _converter, entr
187f0 79 2d 3e 6e 61 6d 65 2c 0a 09 09 09 20 65 6e 74 y->name,.... ent
18800 72 79 2d 3e 6e 61 6d 65 5f 73 69 7a 65 2e 76 61 ry->name_size.va
18810 6c 75 65 2c 20 26 65 72 72 29 3b 0a 20 20 20 20 lue, &err);.
18820 69 66 20 28 65 72 72 29 0a 09 72 65 74 75 72 6e if (err)..return
18830 20 46 52 45 45 58 4c 5f 49 4e 56 41 4c 49 44 5f FREEXL_INVALID_
18840 43 48 41 52 41 43 54 45 52 3b 0a 0a 20 20 20 20 CHARACTER;..
18850 69 66 20 28 73 74 72 63 6d 70 20 28 6e 61 6d 65 if (strcmp (name
18860 2c 20 22 52 6f 6f 74 20 45 6e 74 72 79 22 29 20 , "Root Entry")
18870 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 09 20 == 0). {..
18880 20 2a 6d 69 6e 69 46 41 54 5f 73 74 61 72 74 20 *miniFAT_start
18890 3d 20 65 6e 74 72 79 2d 3e 73 74 61 72 74 5f 73 = entry->start_s
188a0 65 63 74 6f 72 2e 76 61 6c 75 65 3b 0a 09 20 20 ector.value;..
188b0 2a 6d 69 6e 69 46 41 54 5f 6c 65 6e 20 3d 20 65 *miniFAT_len = e
188c0 6e 74 72 79 2d 3e 73 69 7a 65 2e 76 61 6c 75 65 ntry->size.value
188d0 3b 0a 09 20 20 2a 72 6f 6f 74 45 6e 74 72 79 20 ;.. *rootEntry
188e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 1;. }.
188f0 20 65 6c 73 65 0a 09 2a 72 6f 6f 74 45 6e 74 72 else..*rootEntr
18900 79 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 y = 0;.. if (
18910 73 74 72 63 6d 70 20 28 6e 61 6d 65 2c 20 22 57 strcmp (name, "W
18920 6f 72 6b 62 6f 6f 6b 22 29 20 3d 3d 20 30 20 7c orkbook") == 0 |
18930 7c 20 73 74 72 63 6d 70 20 28 6e 61 6d 65 2c 20 | strcmp (name,
18940 22 42 6f 6f 6b 22 29 20 3d 3d 20 30 29 0a 20 20 "Book") == 0).
18950 20 20 20 20 7b 0a 09 20 20 2a 77 6f 72 6b 62 6f {.. *workbo
18960 6f 6b 20 3d 20 65 6e 74 72 79 2d 3e 73 74 61 72 ok = entry->star
18970 74 5f 73 65 63 74 6f 72 2e 76 61 6c 75 65 3b 0a t_sector.value;.
18980 09 20 20 2a 77 6f 72 6b 62 6f 6f 6b 5f 6c 65 6e . *workbook_len
18990 20 3d 20 65 6e 74 72 79 2d 3e 73 69 7a 65 2e 76 = entry->size.v
189a0 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 alue;. }.
189b0 20 20 66 72 65 65 20 28 6e 61 6d 65 29 3b 0a 20 free (name);.
189c0 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c return FREEXL
189d0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 _OK;.}..static i
189e0 6e 74 0a 67 65 74 5f 77 6f 72 6b 62 6f 6f 6b 5f nt.get_workbook_
189f0 73 74 72 65 61 6d 20 28 62 69 66 66 5f 77 6f 72 stream (biff_wor
18a00 6b 62 6f 6f 6b 20 2a 20 77 6f 72 6b 62 6f 6f 6b kbook * workbook
18a10 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e ).{./* attemptin
18a20 67 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 g to locate the
18a30 57 6f 72 6b 62 6f 6f 6b 20 69 6e 74 6f 20 74 68 Workbook into th
18a40 65 20 6d 61 69 6e 20 46 41 54 20 64 69 72 65 63 e main FAT direc
18a50 74 6f 72 79 20 2a 2f 0a 20 20 20 20 6c 6f 6e 67 tory */. long
18a60 20 77 68 65 72 65 3b 0a 20 20 20 20 75 6e 73 69 where;. unsi
18a70 67 6e 65 64 20 69 6e 74 20 73 65 63 74 6f 72 20 gned int sector
18a80 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d = workbook->fat-
18a90 3e 64 69 72 65 63 74 6f 72 79 5f 73 74 61 72 74 >directory_start
18aa0 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 ;. unsigned c
18ab0 68 61 72 20 64 69 72 5f 62 6c 6f 63 6b 5b 34 30 har dir_block[40
18ac0 39 36 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 61 78 96];. int max
18ad0 5f 65 6e 74 72 69 65 73 3b 0a 20 20 20 20 69 6e _entries;. in
18ae0 74 20 69 5f 65 6e 74 72 79 3b 0a 20 20 20 20 75 t i_entry;. u
18af0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 5f nsigned char *p_
18b00 65 6e 74 72 79 3b 0a 20 20 20 20 75 6e 73 69 67 entry;. unsig
18b10 6e 65 64 20 69 6e 74 20 77 6f 72 6b 62 6f 6f 6b ned int workbook
18b20 5f 73 74 61 72 74 3b 0a 20 20 20 20 75 6e 73 69 _start;. unsi
18b30 67 6e 65 64 20 69 6e 74 20 77 6f 72 6b 62 6f 6f gned int workboo
18b40 6b 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67 k_len;. unsig
18b50 6e 65 64 20 69 6e 74 20 6d 69 6e 69 46 41 54 5f ned int miniFAT_
18b60 73 74 61 72 74 3b 0a 20 20 20 20 75 6e 73 69 67 start;. unsig
18b70 6e 65 64 20 69 6e 74 20 6d 69 6e 69 46 41 54 5f ned int miniFAT_
18b80 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72 6f 6f len;. int roo
18b90 74 45 6e 74 72 79 3b 0a 20 20 20 20 69 6e 74 20 tEntry;. int
18ba0 72 65 74 3b 0a 0a 20 20 20 20 69 66 20 28 77 6f ret;.. if (wo
18bb0 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 rkbook->fat->sec
18bc0 74 6f 72 5f 73 69 7a 65 20 3d 3d 20 34 30 39 36 tor_size == 4096
18bd0 29 0a 09 6d 61 78 5f 65 6e 74 72 69 65 73 20 3d )..max_entries =
18be0 20 33 32 3b 0a 20 20 20 20 65 6c 73 65 0a 09 6d 32;. else..m
18bf0 61 78 5f 65 6e 74 72 69 65 73 20 3d 20 34 3b 0a ax_entries = 4;.
18c00 0a 20 20 20 20 77 68 65 72 65 20 3d 20 28 73 65 . where = (se
18c10 63 74 6f 72 20 2b 20 31 29 20 2a 20 77 6f 72 6b ctor + 1) * work
18c20 62 6f 6f 6b 2d 3e 66 61 74 2d 3e 73 65 63 74 6f book->fat->secto
18c30 72 5f 73 69 7a 65 3b 0a 20 20 20 20 69 66 20 28 r_size;. if (
18c40 66 73 65 65 6b 20 28 77 6f 72 6b 62 6f 6f 6b 2d fseek (workbook-
18c50 3e 78 6c 73 2c 20 77 68 65 72 65 2c 20 53 45 45 >xls, where, SEE
18c60 4b 5f 53 45 54 29 20 21 3d 20 30 29 0a 09 72 65 K_SET) != 0)..re
18c70 74 75 72 6e 20 46 52 45 45 58 4c 5f 43 46 42 46 turn FREEXL_CFBF
18c80 5f 53 45 45 4b 5f 45 52 52 4f 52 3b 0a 2f 2a 20 _SEEK_ERROR;./*
18c90 72 65 61 64 69 6e 67 20 61 20 46 41 54 20 44 69 reading a FAT Di
18ca0 72 65 63 74 6f 72 79 20 62 6c 6f 63 6b 20 5b 73 rectory block [s
18cb0 65 63 74 6f 72 5d 20 2a 2f 0a 20 20 20 20 69 66 ector] */. if
18cc0 20 28 66 72 65 61 64 20 28 64 69 72 5f 62 6c 6f (fread (dir_blo
18cd0 63 6b 2c 20 31 2c 20 77 6f 72 6b 62 6f 6f 6b 2d ck, 1, workbook-
18ce0 3e 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 7a >fat->sector_siz
18cf0 65 2c 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 78 6c 73 e, workbook->xls
18d00 29 20 21 3d 0a 09 77 6f 72 6b 62 6f 6f 6b 2d 3e ) !=..workbook->
18d10 66 61 74 2d 3e 73 65 63 74 6f 72 5f 73 69 7a 65 fat->sector_size
18d20 29 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c )..return FREEXL
18d30 5f 43 46 42 46 5f 52 45 41 44 5f 45 52 52 4f 52 _CFBF_READ_ERROR
18d40 3b 0a 20 20 20 20 77 6f 72 6b 62 6f 6f 6b 5f 73 ;. workbook_s
18d50 74 61 72 74 20 3d 20 30 78 46 46 46 46 46 46 46 tart = 0xFFFFFFF
18d60 46 3b 0a 20 20 20 20 66 6f 72 20 28 69 5f 65 6e F;. for (i_en
18d70 74 72 79 20 3d 20 30 3b 20 69 5f 65 6e 74 72 79 try = 0; i_entry
18d80 20 3c 20 6d 61 78 5f 65 6e 74 72 69 65 73 3b 20 < max_entries;
18d90 69 5f 65 6e 74 72 79 2b 2b 29 0a 20 20 20 20 20 i_entry++).
18da0 20 7b 0a 09 20 20 2f 2a 20 73 63 61 6e 6e 69 6e {.. /* scannin
18db0 67 20 64 69 72 20 65 6e 74 72 69 65 73 20 75 6e g dir entries un
18dc0 74 69 6c 20 57 6f 72 6b 62 6f 6f 6b 20 66 6f 75 til Workbook fou
18dd0 6e 64 20 2a 2f 0a 09 20 20 70 5f 65 6e 74 72 79 nd */.. p_entry
18de0 20 3d 20 64 69 72 5f 62 6c 6f 63 6b 20 2b 20 28 = dir_block + (
18df0 69 5f 65 6e 74 72 79 20 2a 20 31 32 38 29 3b 0a i_entry * 128);.
18e00 09 20 20 72 65 74 20 3d 0a 09 20 20 20 20 20 20 . ret =..
18e10 70 61 72 73 65 5f 64 69 72 5f 65 6e 74 72 79 20 parse_dir_entry
18e20 28 70 5f 65 6e 74 72 79 2c 20 77 6f 72 6b 62 6f (p_entry, workbo
18e30 6f 6b 2d 3e 66 61 74 2d 3e 73 77 61 70 2c 0a 09 ok->fat->swap,..
18e40 09 09 20 20 20 20 20 20 20 77 6f 72 6b 62 6f 6f .. workboo
18e50 6b 2d 3e 75 74 66 31 36 5f 63 6f 6e 76 65 72 74 k->utf16_convert
18e60 65 72 2c 20 26 77 6f 72 6b 62 6f 6f 6b 5f 73 74 er, &workbook_st
18e70 61 72 74 2c 0a 09 09 09 20 20 20 20 20 20 20 26 art,.... &
18e80 77 6f 72 6b 62 6f 6f 6b 5f 6c 65 6e 2c 20 26 6d workbook_len, &m
18e90 69 6e 69 46 41 54 5f 73 74 61 72 74 2c 20 26 6d iniFAT_start, &m
18ea0 69 6e 69 46 41 54 5f 6c 65 6e 2c 0a 09 09 09 20 iniFAT_len,....
18eb0 20 20 20 20 20 20 26 72 6f 6f 74 45 6e 74 72 79 &rootEntry
18ec0 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 21 3d );.. if (ret !=
18ed0 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 20 20 20 FREEXL_OK)..
18ee0 20 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 09 return ret;..
18ef0 20 20 69 66 20 28 72 6f 6f 74 45 6e 74 72 79 29 if (rootEntry)
18f00 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c .. {.../* ok,
18f10 20 52 6f 6f 74 20 45 6e 74 72 79 20 66 6f 75 6e Root Entry foun
18f20 64 20 2a 2f 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d d */...workbook-
18f30 3e 66 61 74 2d 3e 6d 69 6e 69 46 41 54 5f 73 74 >fat->miniFAT_st
18f40 61 72 74 20 3d 20 6d 69 6e 69 46 41 54 5f 73 74 art = miniFAT_st
18f50 61 72 74 3b 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d art;...workbook-
18f60 3e 66 61 74 2d 3e 6d 69 6e 69 46 41 54 5f 6c 65 >fat->miniFAT_le
18f70 6e 20 3d 20 6d 69 6e 69 46 41 54 5f 6c 65 6e 3b n = miniFAT_len;
18f80 0a 09 20 20 20 20 7d 0a 09 20 20 69 66 20 28 77 .. }.. if (w
18f90 6f 72 6b 62 6f 6f 6b 5f 73 74 61 72 74 20 21 3d orkbook_start !=
18fa0 20 30 78 46 46 46 46 46 46 46 46 29 0a 09 20 20 0xFFFFFFFF)..
18fb0 20 20 7b 0a 09 09 2f 2a 20 6f 6b 2c 20 57 6f 72 {.../* ok, Wor
18fc0 6b 62 6f 6f 6b 20 66 6f 75 6e 64 20 2a 2f 0a 09 kbook found */..
18fd0 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 74 61 72 74 .workbook->start
18fe0 5f 73 65 63 74 6f 72 20 3d 20 77 6f 72 6b 62 6f _sector = workbo
18ff0 6f 6b 5f 73 74 61 72 74 3b 0a 09 09 77 6f 72 6b ok_start;...work
19000 62 6f 6f 6b 2d 3e 73 69 7a 65 20 3d 20 77 6f 72 book->size = wor
19010 6b 62 6f 6f 6b 5f 6c 65 6e 3b 0a 09 09 77 6f 72 kbook_len;...wor
19020 6b 62 6f 6f 6b 2d 3e 63 75 72 72 65 6e 74 5f 73 kbook->current_s
19030 65 63 74 6f 72 20 3d 20 77 6f 72 6b 62 6f 6f 6b ector = workbook
19040 5f 73 74 61 72 74 3b 0a 09 09 72 65 74 75 72 6e _start;...return
19050 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 09 20 20 20 FREEXL_OK;..
19060 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 }. }. r
19070 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 42 49 46 eturn FREEXL_BIF
19080 46 5f 57 4f 52 4b 42 4f 4f 4b 5f 4e 4f 54 5f 46 F_WORKBOOK_NOT_F
19090 4f 55 4e 44 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 OUND;.}..static
190a0 76 6f 69 64 20 2a 0a 63 72 65 61 74 65 5f 75 74 void *.create_ut
190b0 66 31 36 5f 75 74 66 38 5f 63 6f 6e 76 65 72 74 f16_utf8_convert
190c0 65 72 20 28 76 6f 69 64 29 0a 7b 0a 2f 2a 20 63 er (void).{./* c
190d0 72 65 61 74 69 6e 67 20 74 68 65 20 55 54 46 31 reating the UTF1
190e0 36 2f 55 54 46 38 20 63 6f 6e 76 65 72 74 65 72 6/UTF8 converter
190f0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 6f and returning o
19100 6e 20 6f 70 61 71 75 65 20 72 65 66 65 72 65 6e n opaque referen
19110 63 65 20 74 6f 20 69 74 20 2a 2f 0a 20 20 20 20 ce to it */.
19120 69 63 6f 6e 76 5f 74 20 63 76 74 20 3d 20 69 63 iconv_t cvt = ic
19130 6f 6e 76 5f 6f 70 65 6e 20 28 22 55 54 46 2d 38 onv_open ("UTF-8
19140 22 2c 20 22 55 54 46 2d 31 36 4c 45 22 29 3b 0a ", "UTF-16LE");.
19150 20 20 20 20 69 66 20 28 63 76 74 20 3d 3d 20 28 if (cvt == (
19160 69 63 6f 6e 76 5f 74 29 20 28 2d 31 29 29 0a 09 iconv_t) (-1))..
19170 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
19180 20 72 65 74 75 72 6e 20 63 76 74 3b 0a 7d 0a 0a return cvt;.}..
19190 73 74 61 74 69 63 20 69 6e 74 0a 63 68 65 63 6b static int.check
191a0 5f 6c 69 74 74 6c 65 5f 65 6e 64 69 61 6e 5f 61 _little_endian_a
191b0 72 63 68 20 28 29 0a 7b 0a 2f 2a 20 63 68 65 63 rch ().{./* chec
191c0 6b 69 6e 67 20 69 66 20 74 61 72 67 65 74 20 43 king if target C
191d0 50 55 20 69 73 20 61 20 6c 69 74 74 6c 65 2d 65 PU is a little-e
191e0 6e 64 69 61 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 ndian one */.
191f0 20 62 69 66 66 5f 77 6f 72 64 33 32 20 77 6f 72 biff_word32 wor
19200 64 33 32 3b 0a 20 20 20 20 77 6f 72 64 33 32 2e d32;. word32.
19210 76 61 6c 75 65 20 3d 20 31 3b 0a 20 20 20 20 69 value = 1;. i
19220 66 20 28 77 6f 72 64 33 32 2e 62 79 74 65 73 5b f (word32.bytes[
19230 30 5d 20 3d 3d 20 30 29 0a 09 72 65 74 75 72 6e 0] == 0)..return
19240 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 1;. return 0
19250 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a ;.}..static int.
19260 63 6f 6d 6d 6f 6e 5f 6f 70 65 6e 20 28 63 6f 6e common_open (con
19270 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 63 st char *path, c
19280 6f 6e 73 74 20 76 6f 69 64 20 2a 2a 78 6c 73 5f onst void **xls_
19290 68 61 6e 64 6c 65 2c 20 69 6e 74 20 6d 61 67 69 handle, int magi
192a0 63 29 0a 7b 0a 2f 2a 20 6f 70 65 6e 69 6e 67 20 c).{./* opening
192b0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 and initializing
192c0 20 74 68 65 20 57 6f 72 6b 62 6f 6f 6b 20 2a 2f the Workbook */
192d0 0a 20 20 20 20 62 69 66 66 5f 77 6f 72 6b 62 6f . biff_workbo
192e0 6f 6b 20 2a 77 6f 72 6b 62 6f 6f 6b 3b 0a 20 20 ok *workbook;.
192f0 20 20 62 69 66 66 5f 73 68 65 65 74 20 2a 70 5f biff_sheet *p_
19300 73 68 65 65 74 3b 0a 20 20 20 20 66 61 74 5f 63 sheet;. fat_c
19310 68 61 69 6e 20 2a 63 68 61 69 6e 20 3d 20 4e 55 hain *chain = NU
19320 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 63 LL;. int errc
19330 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 ode;. int ret
19340 3b 0a 20 20 20 20 69 6e 74 20 73 77 61 70 20 3d ;. int swap =
19350 20 63 68 65 63 6b 5f 6c 69 74 74 6c 65 5f 65 6e check_little_en
19360 64 69 61 6e 5f 61 72 63 68 20 28 29 3b 0a 0a 20 dian_arch ();..
19370 20 20 20 2a 78 6c 73 5f 68 61 6e 64 6c 65 20 3d *xls_handle =
19380 20 4e 55 4c 4c 3b 0a 2f 2a 20 61 6c 6c 6f 63 61 NULL;./* alloca
19390 74 69 6e 67 20 74 68 65 20 57 6f 72 6b 62 6f 6f ting the Workboo
193a0 6b 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 k struct */.
193b0 77 6f 72 6b 62 6f 6f 6b 20 3d 20 61 6c 6c 6f 63 workbook = alloc
193c0 5f 77 6f 72 6b 62 6f 6f 6b 20 28 6d 61 67 69 63 _workbook (magic
193d0 29 3b 0a 20 20 20 20 69 66 20 28 21 77 6f 72 6b );. if (!work
193e0 62 6f 6f 6b 29 0a 09 72 65 74 75 72 6e 20 46 52 book)..return FR
193f0 45 45 58 4c 5f 49 4e 53 55 46 46 49 43 49 45 4e EEXL_INSUFFICIEN
19400 54 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 2a 78 T_MEMORY;. *x
19410 6c 73 5f 68 61 6e 64 6c 65 20 3d 20 77 6f 72 6b ls_handle = work
19420 62 6f 6f 6b 3b 0a 0a 20 20 20 20 77 6f 72 6b 62 book;.. workb
19430 6f 6f 6b 2d 3e 78 6c 73 20 3d 20 66 6f 70 65 6e ook->xls = fopen
19440 20 28 70 61 74 68 2c 20 22 72 62 22 29 3b 0a 20 (path, "rb");.
19450 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d if (workbook-
19460 3e 78 6c 73 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 >xls == NULL)..r
19470 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 46 49 4c eturn FREEXL_FIL
19480 45 5f 4e 4f 54 5f 46 4f 55 4e 44 3b 0a 0a 2f 2a E_NOT_FOUND;../*
19490 0a 20 2a 20 74 68 65 20 58 4c 53 20 66 69 6c 65 . * the XLS file
194a0 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 73 is internally s
194b0 74 72 75 63 74 75 72 65 64 20 61 73 20 61 20 46 tructured as a F
194c0 41 54 2d 6c 69 6b 65 0a 20 2a 20 66 69 6c 65 2d AT-like. * file-
194d0 73 79 73 74 65 6d 20 28 43 6f 6d 70 6f 75 6e 64 system (Compound
194e0 20 46 69 6c 65 20 42 69 6e 61 72 79 20 46 6f 72 File Binary For
194f0 6d 61 74 2c 20 43 46 42 46 29 20 0a 20 2a 20 73 mat, CFBF) . * s
19500 6f 20 77 65 27 6c 6c 20 73 74 61 72 74 20 62 79 o we'll start by
19510 20 70 61 72 73 69 6e 67 20 74 68 65 20 46 41 54 parsing the FAT
19520 0a 20 2a 2f 0a 20 20 20 20 63 68 61 69 6e 20 3d . */. chain =
19530 20 72 65 61 64 5f 63 66 62 66 5f 68 65 61 64 65 read_cfbf_heade
19540 72 20 28 77 6f 72 6b 62 6f 6f 6b 2c 20 73 77 61 r (workbook, swa
19550 70 2c 20 26 65 72 72 63 6f 64 65 29 3b 0a 20 20 p, &errcode);.
19560 20 20 69 66 20 28 21 63 68 61 69 6e 29 0a 20 20 if (!chain).
19570 20 20 20 20 7b 0a 09 20 20 2f 2a 20 69 74 27 73 {.. /* it's
19580 20 6e 6f 74 20 61 20 43 46 42 46 20 66 69 6c 65 not a CFBF file
19590 3a 20 74 65 73 74 69 6e 67 20 6f 6c 64 65 72 20 : testing older
195a0 42 49 46 46 2d 28 32 2c 33 2c 34 29 20 66 6f 72 BIFF-(2,3,4) for
195b0 6d 61 74 73 20 2a 2f 0a 09 20 20 69 66 20 28 72 mats */.. if (r
195c0 65 61 64 5f 6c 65 67 61 63 79 5f 62 69 66 66 20 ead_legacy_biff
195d0 28 77 6f 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 29 (workbook, swap)
195e0 29 0a 09 20 20 20 20 20 20 72 65 74 75 72 6e 20 ).. return
195f0 46 52 45 45 58 4c 5f 4f 4b 3b 0a 09 20 20 67 6f FREEXL_OK;.. go
19600 74 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d to stop;. }
19610 0a 0a 2f 2a 20 74 72 61 6e 73 66 65 72 72 69 6e ../* transferrin
19620 67 20 46 41 54 20 63 68 61 69 6e 20 6f 77 6e 65 g FAT chain owne
19630 72 73 68 69 70 20 2a 2f 0a 20 20 20 20 77 6f 72 rship */. wor
19640 6b 62 6f 6f 6b 2d 3e 66 61 74 20 3d 20 63 68 61 kbook->fat = cha
19650 69 6e 3b 0a 20 20 20 20 63 68 61 69 6e 20 3d 20 in;. chain =
19660 4e 55 4c 4c 3b 0a 0a 2f 2a 20 63 72 65 61 74 69 NULL;../* creati
19670 6e 67 20 74 68 65 20 55 54 46 31 36 2f 55 54 46 ng the UTF16/UTF
19680 38 20 63 6f 6e 76 65 72 74 65 72 20 2a 2f 0a 20 8 converter */.
19690 20 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 75 74 66 workbook->utf
196a0 31 36 5f 63 6f 6e 76 65 72 74 65 72 20 3d 20 63 16_converter = c
196b0 72 65 61 74 65 5f 75 74 66 31 36 5f 75 74 66 38 reate_utf16_utf8
196c0 5f 63 6f 6e 76 65 72 74 65 72 20 28 29 3b 0a 20 _converter ();.
196d0 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d if (workbook-
196e0 3e 75 74 66 31 36 5f 63 6f 6e 76 65 72 74 65 72 >utf16_converter
196f0 20 3d 3d 20 4e 55 4c 4c 29 0a 20 20 20 20 20 20 == NULL).
19700 7b 0a 09 20 20 65 72 72 63 6f 64 65 20 3d 20 46 {.. errcode = F
19710 52 45 45 58 4c 5f 55 4e 53 55 50 50 4f 52 54 45 REEXL_UNSUPPORTE
19720 44 5f 43 48 41 52 53 45 54 3b 0a 09 20 20 67 6f D_CHARSET;.. go
19730 74 6f 20 73 74 6f 70 3b 0a 20 20 20 20 20 20 7d to stop;. }
19740 0a 0a 2f 2a 20 77 65 27 6c 6c 20 6e 6f 77 20 72 ../* we'll now r
19750 65 74 72 69 65 76 65 20 74 68 65 20 46 41 54 20 etrieve the FAT
19760 6d 61 69 6e 20 44 69 72 65 63 74 6f 72 79 20 2a main Directory *
19770 2f 0a 20 20 20 20 72 65 74 20 3d 20 67 65 74 5f /. ret = get_
19780 77 6f 72 6b 62 6f 6f 6b 5f 73 74 72 65 61 6d 20 workbook_stream
19790 28 77 6f 72 6b 62 6f 6f 6b 29 3b 0a 20 20 20 20 (workbook);.
197a0 69 66 20 28 72 65 74 20 21 3d 20 46 52 45 45 58 if (ret != FREEX
197b0 4c 5f 4f 4b 29 0a 20 20 20 20 20 20 7b 0a 09 20 L_OK). {..
197c0 20 65 72 72 63 6f 64 65 20 3d 20 72 65 74 3b 0a errcode = ret;.
197d0 09 20 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 20 20 . goto stop;.
197e0 20 20 20 20 7d 0a 0a 2f 2a 20 77 65 27 6c 6c 20 }../* we'll
197f0 6e 6f 77 20 70 61 72 73 65 20 74 68 65 20 57 6f now parse the Wo
19800 72 6b 62 6f 6f 6b 20 2a 2f 0a 20 20 20 20 69 66 rkbook */. if
19810 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 69 7a 65 (workbook->size
19820 20 3c 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 <= workbook->fa
19830 74 2d 3e 6d 69 6e 69 43 75 74 4f 66 66 29 0a 20 t->miniCutOff).
19840 20 20 20 20 20 7b 0a 09 20 20 2f 2a 20 6d 69 6e {.. /* min
19850 69 2d 73 74 72 65 61 6d 20 73 74 6f 72 65 64 20 i-stream stored
19860 69 6e 20 6d 69 6e 69 46 41 54 20 2a 2f 0a 09 20 in miniFAT */..
19870 20 69 6e 74 20 72 65 74 20 3d 20 72 65 61 64 5f int ret = read_
19880 6d 69 6e 69 5f 73 74 72 65 61 6d 20 28 77 6f 72 mini_stream (wor
19890 6b 62 6f 6f 6b 2c 20 26 65 72 72 63 6f 64 65 29 kbook, &errcode)
198a0 3b 0a 09 20 20 69 66 20 28 21 72 65 74 29 0a 09 ;.. if (!ret)..
198b0 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6f 70 3b goto stop;
198c0 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f .. workbook->p_
198d0 69 6e 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 in = workbook->f
198e0 61 74 2d 3e 6d 69 6e 69 53 74 72 65 61 6d 3b 0a at->miniStream;.
198f0 09 20 20 77 68 69 6c 65 20 28 31 29 0a 09 20 20 . while (1)..
19900 20 20 7b 0a 09 09 72 65 74 20 3d 20 72 65 61 64 {...ret = read
19910 5f 6d 69 6e 69 5f 62 69 66 66 5f 6e 65 78 74 5f _mini_biff_next_
19920 72 65 63 6f 72 64 20 28 77 6f 72 6b 62 6f 6f 6b record (workbook
19930 2c 20 73 77 61 70 2c 20 26 65 72 72 63 6f 64 65 , swap, &errcode
19940 29 3b 0a 09 09 69 66 20 28 72 65 74 20 3d 3d 20 );...if (ret ==
19950 2d 31 29 0a 09 09 20 20 20 20 62 72 65 61 6b 3b -1)... break;
19960 09 2f 2a 20 45 4f 46 20 2a 2f 0a 09 09 69 66 20 ./* EOF */...if
19970 28 72 65 74 20 3d 3d 20 30 29 0a 09 09 20 20 20 (ret == 0)...
19980 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 20 20 20 goto stop;..
19990 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 65 }. }. e
199a0 6c 73 65 0a 20 20 20 20 20 20 7b 0a 09 20 20 2f lse. {.. /
199b0 2a 20 6e 6f 72 6d 61 6c 20 73 74 72 65 61 6d 20 * normal stream
199c0 2a 2f 0a 09 20 20 77 68 69 6c 65 20 28 31 29 0a */.. while (1).
199d0 09 20 20 20 20 7b 0a 09 09 69 6e 74 20 72 65 74 . {...int ret
199e0 20 3d 20 72 65 61 64 5f 62 69 66 66 5f 6e 65 78 = read_biff_nex
199f0 74 5f 72 65 63 6f 72 64 20 28 77 6f 72 6b 62 6f t_record (workbo
19a00 6f 6b 2c 20 73 77 61 70 2c 20 26 65 72 72 63 6f ok, swap, &errco
19a10 64 65 29 3b 0a 09 09 69 66 20 28 72 65 74 20 3d de);...if (ret =
19a20 3d 20 2d 31 29 0a 09 09 20 20 20 20 62 72 65 61 = -1)... brea
19a30 6b 3b 09 2f 2a 20 45 4f 46 20 2a 2f 0a 09 09 69 k;./* EOF */...i
19a40 66 20 28 72 65 74 20 3d 3d 20 30 29 0a 09 09 20 f (ret == 0)...
19a50 20 20 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 20 goto stop;..
19a60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 }. }..
19a70 20 20 70 5f 73 68 65 65 74 20 3d 20 77 6f 72 6b p_sheet = work
19a80 62 6f 6f 6b 2d 3e 66 69 72 73 74 5f 73 68 65 65 book->first_shee
19a90 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 70 5f t;. while (p_
19aa0 73 68 65 65 74 29 0a 20 20 20 20 20 20 7b 0a 09 sheet). {..
19ab0 20 20 69 66 20 28 70 5f 73 68 65 65 74 2d 3e 76 if (p_sheet->v
19ac0 61 6c 69 64 5f 64 69 6d 65 6e 73 69 6f 6e 20 3d alid_dimension =
19ad0 3d 20 30 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a = 0).. {.../*
19ae0 20 73 65 74 74 69 6e 67 20 53 68 65 65 74 20 64 setting Sheet d
19af0 69 6d 65 6e 73 69 6f 6e 73 20 2a 2f 0a 09 09 69 imensions */...i
19b00 6e 74 20 72 65 74 3b 0a 09 09 70 5f 73 68 65 65 nt ret;...p_shee
19b10 74 2d 3e 72 6f 77 73 20 2b 3d 20 31 3b 0a 09 09 t->rows += 1;...
19b20 70 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 p_sheet->columns
19b30 20 2b 3d 20 31 3b 0a 09 09 72 65 74 20 3d 20 61 += 1;...ret = a
19b40 6c 6c 6f 63 61 74 65 5f 63 65 6c 6c 73 20 28 77 llocate_cells (w
19b50 6f 72 6b 62 6f 6f 6b 29 3b 0a 09 09 69 66 20 28 orkbook);...if (
19b60 72 65 74 20 21 3d 20 46 52 45 45 58 4c 5f 4f 4b ret != FREEXL_OK
19b70 29 0a 09 09 20 20 7b 0a 09 09 20 20 20 20 20 20 )... {...
19b80 65 72 72 63 6f 64 65 20 3d 20 72 65 74 3b 0a 09 errcode = ret;..
19b90 09 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6f 70 . goto stop
19ba0 3b 0a 09 09 20 20 7d 0a 09 09 70 5f 73 68 65 65 ;... }...p_shee
19bb0 74 2d 3e 76 61 6c 69 64 5f 64 69 6d 65 6e 73 69 t->valid_dimensi
19bc0 6f 6e 20 3d 20 31 3b 0a 09 09 77 6f 72 6b 62 6f on = 1;...workbo
19bd0 6f 6b 2d 3e 73 65 63 6f 6e 64 5f 70 61 73 73 20 ok->second_pass
19be0 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 65 = 1;.. }.. e
19bf0 6c 73 65 0a 09 20 20 20 20 20 20 70 5f 73 68 65 lse.. p_she
19c00 65 74 2d 3e 61 6c 72 65 61 64 79 5f 64 6f 6e 65 et->already_done
19c10 20 3d 20 31 3b 0a 09 20 20 70 5f 73 68 65 65 74 = 1;.. p_sheet
19c20 20 3d 20 70 5f 73 68 65 65 74 2d 3e 6e 65 78 74 = p_sheet->next
19c30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 69 ;. }.. i
19c40 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 f (workbook->sec
19c50 6f 6e 64 5f 70 61 73 73 29 0a 20 20 20 20 20 20 ond_pass).
19c60 7b 0a 09 20 20 2f 2a 20 61 74 74 65 6d 70 74 69 {.. /* attempti
19c70 6e 67 20 74 6f 20 66 65 74 63 68 20 63 65 6c 6c ng to fetch cell
19c80 20 76 61 6c 75 65 73 20 70 65 72 66 6f 72 6d 69 values performi
19c90 6e 67 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 ng a second pass
19ca0 20 2a 2f 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d */.. workbook-
19cb0 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d 20 >active_sheet =
19cc0 4e 55 4c 4c 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f NULL;.. workboo
19cd0 6b 2d 3e 73 74 61 72 74 5f 73 65 63 74 6f 72 20 k->start_sector
19ce0 3d 20 30 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b = 0;.. workbook
19cf0 2d 3e 73 69 7a 65 20 3d 20 30 3b 0a 09 20 20 77 ->size = 0;.. w
19d00 6f 72 6b 62 6f 6f 6b 2d 3e 63 75 72 72 65 6e 74 orkbook->current
19d10 5f 73 65 63 74 6f 72 20 3d 20 30 3b 0a 09 20 20 _sector = 0;..
19d20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 79 74 65 73 5f workbook->bytes_
19d30 72 65 61 64 20 3d 20 30 3b 0a 09 20 20 77 6f 72 read = 0;.. wor
19d40 6b 62 6f 6f 6b 2d 3e 63 75 72 72 65 6e 74 5f 6f kbook->current_o
19d50 66 66 73 65 74 20 3d 20 30 3b 0a 09 20 20 77 6f ffset = 0;.. wo
19d60 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 20 3d 20 77 rkbook->p_in = w
19d70 6f 72 6b 62 6f 6f 6b 2d 3e 73 65 63 74 6f 72 5f orkbook->sector_
19d80 62 75 66 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b buf;.. workbook
19d90 2d 3e 73 65 63 74 6f 72 5f 65 6e 64 20 3d 20 30 ->sector_end = 0
19da0 3b 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 ;.. workbook->s
19db0 65 63 74 6f 72 5f 72 65 61 64 79 20 3d 20 30 3b ector_ready = 0;
19dc0 0a 09 20 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6f 6b .. workbook->ok
19dd0 5f 62 6f 66 20 3d 20 2d 31 3b 0a 0a 09 20 20 72 _bof = -1;... r
19de0 65 74 20 3d 20 67 65 74 5f 77 6f 72 6b 62 6f 6f et = get_workboo
19df0 6b 5f 73 74 72 65 61 6d 20 28 77 6f 72 6b 62 6f k_stream (workbo
19e00 6f 6b 29 3b 0a 09 20 20 69 66 20 28 72 65 74 20 ok);.. if (ret
19e10 21 3d 20 46 52 45 45 58 4c 5f 4f 4b 29 0a 09 20 != FREEXL_OK)..
19e20 20 20 20 7b 0a 09 09 65 72 72 63 6f 64 65 20 3d {...errcode =
19e30 20 72 65 74 3b 0a 09 09 67 6f 74 6f 20 73 74 6f ret;...goto sto
19e40 70 3b 0a 09 20 20 20 20 7d 0a 0a 2f 2a 20 77 65 p;.. }../* we
19e50 27 6c 6c 20 6e 6f 77 20 70 61 72 73 65 20 74 68 'll now parse th
19e60 65 20 57 6f 72 6b 62 6f 6f 6b 20 2a 2f 0a 09 20 e Workbook */..
19e70 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 73 if (workbook->s
19e80 69 7a 65 20 3c 3d 20 77 6f 72 6b 62 6f 6f 6b 2d ize <= workbook-
19e90 3e 66 61 74 2d 3e 6d 69 6e 69 43 75 74 4f 66 66 >fat->miniCutOff
19ea0 29 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6d 69 ).. {.../* mi
19eb0 6e 69 2d 73 74 72 65 61 6d 20 73 74 6f 72 65 64 ni-stream stored
19ec0 20 69 6e 20 6d 69 6e 69 46 41 54 20 2a 2f 0a 09 in miniFAT */..
19ed0 09 69 6e 74 20 72 65 74 20 3d 20 72 65 61 64 5f .int ret = read_
19ee0 6d 69 6e 69 5f 73 74 72 65 61 6d 20 28 77 6f 72 mini_stream (wor
19ef0 6b 62 6f 6f 6b 2c 20 26 65 72 72 63 6f 64 65 29 kbook, &errcode)
19f00 3b 0a 09 09 69 66 20 28 21 72 65 74 29 0a 09 09 ;...if (!ret)...
19f10 20 20 20 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 goto stop;..
19f20 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 70 5f 69 6e 20 .workbook->p_in
19f30 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 2d = workbook->fat-
19f40 3e 6d 69 6e 69 53 74 72 65 61 6d 3b 0a 09 09 77 >miniStream;...w
19f50 68 69 6c 65 20 28 31 29 0a 09 09 20 20 7b 0a 09 hile (1)... {..
19f60 09 20 20 20 20 20 20 72 65 74 20 3d 0a 09 09 09 . ret =....
19f70 20 20 72 65 61 64 5f 6d 69 6e 69 5f 62 69 66 66 read_mini_biff
19f80 5f 6e 65 78 74 5f 72 65 63 6f 72 64 20 28 77 6f _next_record (wo
19f90 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 2c 20 26 65 rkbook, swap, &e
19fa0 72 72 63 6f 64 65 29 3b 0a 09 09 20 20 20 20 20 rrcode);...
19fb0 20 69 66 20 28 72 65 74 20 3d 3d 20 2d 31 29 0a if (ret == -1).
19fc0 09 09 09 20 20 62 72 65 61 6b 3b 09 2f 2a 20 45 ... break;./* E
19fd0 4f 46 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 66 OF */... if
19fe0 20 28 72 65 74 20 3d 3d 20 30 29 0a 09 09 09 20 (ret == 0)....
19ff0 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 09 20 20 goto stop;...
1a000 7d 0a 09 20 20 20 20 7d 0a 09 20 20 65 6c 73 65 }.. }.. else
1a010 0a 09 20 20 20 20 7b 0a 09 09 2f 2a 20 6e 6f 72 .. {.../* nor
1a020 6d 61 6c 20 73 74 72 65 61 6d 20 2a 2f 0a 09 09 mal stream */...
1a030 77 68 69 6c 65 20 28 31 29 0a 09 09 20 20 7b 0a while (1)... {.
1a040 09 09 20 20 20 20 20 20 69 6e 74 20 72 65 74 20 .. int ret
1a050 3d 0a 09 09 09 20 20 72 65 61 64 5f 62 69 66 66 =.... read_biff
1a060 5f 6e 65 78 74 5f 72 65 63 6f 72 64 20 28 77 6f _next_record (wo
1a070 72 6b 62 6f 6f 6b 2c 20 73 77 61 70 2c 20 26 65 rkbook, swap, &e
1a080 72 72 63 6f 64 65 29 3b 0a 09 09 20 20 20 20 20 rrcode);...
1a090 20 69 66 20 28 72 65 74 20 3d 3d 20 2d 31 29 0a if (ret == -1).
1a0a0 09 09 09 20 20 62 72 65 61 6b 3b 09 2f 2a 20 45 ... break;./* E
1a0b0 4f 46 20 2a 2f 0a 09 09 20 20 20 20 20 20 69 66 OF */... if
1a0c0 20 28 72 65 74 20 3d 3d 20 30 29 0a 09 09 09 20 (ret == 0)....
1a0d0 20 67 6f 74 6f 20 73 74 6f 70 3b 0a 09 09 20 20 goto stop;...
1a0e0 7d 0a 09 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }.. }. }
1a0f0 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 .. return FRE
1a100 45 58 4c 5f 4f 4b 3b 0a 0a 20 20 73 74 6f 70 3a EXL_OK;.. stop:
1a110 0a 20 20 20 20 69 66 20 28 63 68 61 69 6e 29 0a . if (chain).
1a120 09 64 65 73 74 72 6f 79 5f 66 61 74 5f 63 68 61 .destroy_fat_cha
1a130 69 6e 20 28 63 68 61 69 6e 29 3b 0a 20 20 20 20 in (chain);.
1a140 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 29 0a 09 64 if (workbook)..d
1a150 65 73 74 72 6f 79 5f 77 6f 72 6b 62 6f 6f 6b 20 estroy_workbook
1a160 28 77 6f 72 6b 62 6f 6f 6b 29 3b 0a 20 20 20 20 (workbook);.
1a170 2a 78 6c 73 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 *xls_handle = NU
1a180 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 65 LL;. return e
1a190 72 72 63 6f 64 65 3b 0a 7d 0a 0a 46 52 45 45 58 rrcode;.}..FREEX
1a1a0 4c 5f 44 45 43 4c 41 52 45 20 69 6e 74 0a 66 72 L_DECLARE int.fr
1a1b0 65 65 78 6c 5f 6f 70 65 6e 20 28 63 6f 6e 73 74 eexl_open (const
1a1c0 20 63 68 61 72 20 2a 70 61 74 68 2c 20 63 6f 6e char *path, con
1a1d0 73 74 20 76 6f 69 64 20 2a 2a 78 6c 73 5f 68 61 st void **xls_ha
1a1e0 6e 64 6c 65 29 0a 7b 0a 2f 2a 20 6f 70 65 6e 69 ndle).{./* openi
1a1f0 6e 67 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a ng and initializ
1a200 69 6e 67 20 74 68 65 20 57 6f 72 6b 62 6f 6f 6b ing the Workbook
1a210 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 63 */. return c
1a220 6f 6d 6d 6f 6e 5f 6f 70 65 6e 20 28 70 61 74 68 ommon_open (path
1a230 2c 20 78 6c 73 5f 68 61 6e 64 6c 65 2c 20 46 52 , xls_handle, FR
1a240 45 45 58 4c 5f 4d 41 47 49 43 5f 53 54 41 52 54 EEXL_MAGIC_START
1a250 29 3b 0a 7d 0a 0a 46 52 45 45 58 4c 5f 44 45 43 );.}..FREEXL_DEC
1a260 4c 41 52 45 20 69 6e 74 0a 66 72 65 65 78 6c 5f LARE int.freexl_
1a270 6f 70 65 6e 5f 69 6e 66 6f 20 28 63 6f 6e 73 74 open_info (const
1a280 20 63 68 61 72 20 2a 70 61 74 68 2c 20 63 6f 6e char *path, con
1a290 73 74 20 76 6f 69 64 20 2a 2a 78 6c 73 5f 68 61 st void **xls_ha
1a2a0 6e 64 6c 65 29 0a 7b 0a 2f 2a 20 6f 70 65 6e 69 ndle).{./* openi
1a2b0 6e 67 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a ng and initializ
1a2c0 69 6e 67 20 74 68 65 20 57 6f 72 6b 62 6f 6f 6b ing the Workbook
1a2d0 20 28 6f 6e 6c 79 20 66 6f 72 20 49 6e 66 6f 29 (only for Info)
1a2e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 63 */. return c
1a2f0 6f 6d 6d 6f 6e 5f 6f 70 65 6e 20 28 70 61 74 68 ommon_open (path
1a300 2c 20 78 6c 73 5f 68 61 6e 64 6c 65 2c 20 46 52 , xls_handle, FR
1a310 45 45 58 4c 5f 4d 41 47 49 43 5f 49 4e 46 4f 29 EEXL_MAGIC_INFO)
1a320 3b 0a 7d 0a 0a 46 52 45 45 58 4c 5f 44 45 43 4c ;.}..FREEXL_DECL
1a330 41 52 45 20 69 6e 74 0a 66 72 65 65 78 6c 5f 63 ARE int.freexl_c
1a340 6c 6f 73 65 20 28 63 6f 6e 73 74 20 76 6f 69 64 lose (const void
1a350 20 2a 78 6c 73 5f 68 61 6e 64 6c 65 29 0a 7b 0a *xls_handle).{.
1a360 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f /* attempting to
1a370 20 64 65 73 74 72 6f 79 20 74 68 65 20 57 6f 72 destroy the Wor
1a380 6b 62 6f 6f 6b 20 2a 2f 0a 20 20 20 20 62 69 66 kbook */. bif
1a390 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 77 6f 72 6b f_workbook *work
1a3a0 62 6f 6f 6b 20 3d 20 28 62 69 66 66 5f 77 6f 72 book = (biff_wor
1a3b0 6b 62 6f 6f 6b 20 2a 29 20 78 6c 73 5f 68 61 6e kbook *) xls_han
1a3c0 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 21 77 6f dle;. if (!wo
1a3d0 72 6b 62 6f 6f 6b 29 0a 09 72 65 74 75 72 6e 20 rkbook)..return
1a3e0 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 48 41 4e 44 FREEXL_NULL_HAND
1a3f0 4c 45 3b 0a 20 20 20 20 69 66 20 28 28 77 6f 72 LE;. if ((wor
1a400 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 3d 3d kbook->magic1 ==
1a410 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f 49 4e FREEXL_MAGIC_IN
1a420 46 4f 0a 09 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b FO.. || workbook
1a430 2d 3e 6d 61 67 69 63 31 20 3d 3d 20 46 52 45 45 ->magic1 == FREE
1a440 58 4c 5f 4d 41 47 49 43 5f 53 54 41 52 54 29 0a XL_MAGIC_START).
1a450 09 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 .&& workbook->ma
1a460 67 69 63 32 20 3d 3d 20 46 52 45 45 58 4c 5f 4d gic2 == FREEXL_M
1a470 41 47 49 43 5f 45 4e 44 29 0a 09 3b 0a 20 20 20 AGIC_END)..;.
1a480 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 46 52 else..return FR
1a490 45 45 58 4c 5f 49 4e 56 41 4c 49 44 5f 48 41 4e EEXL_INVALID_HAN
1a4a0 44 4c 45 3b 0a 0a 2f 2a 20 64 65 73 74 72 6f 79 DLE;../* destroy
1a4b0 69 6e 67 20 74 68 65 20 77 6f 72 6b 62 6f 6f 6b ing the workbook
1a4c0 20 2a 2f 0a 20 20 20 20 64 65 73 74 72 6f 79 5f */. destroy_
1a4d0 77 6f 72 6b 62 6f 6f 6b 20 28 77 6f 72 6b 62 6f workbook (workbo
1a4e0 6f 6b 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e ok);.. return
1a4f0 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 7d 0a 0a 46 FREEXL_OK;.}..F
1a500 52 45 45 58 4c 5f 44 45 43 4c 41 52 45 20 69 6e REEXL_DECLARE in
1a510 74 0a 66 72 65 65 78 6c 5f 67 65 74 5f 69 6e 66 t.freexl_get_inf
1a520 6f 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 78 o (const void *x
1a530 6c 73 5f 68 61 6e 64 6c 65 2c 20 75 6e 73 69 67 ls_handle, unsig
1a540 6e 65 64 20 73 68 6f 72 74 20 77 68 61 74 2c 0a ned short what,.
1a550 09 09 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 .. unsigned int
1a560 2a 69 6e 66 6f 29 0a 7b 0a 2f 2a 20 61 74 74 65 *info).{./* atte
1a570 6d 70 74 69 6e 67 20 74 6f 20 72 65 74 72 69 65 mpting to retrie
1a580 76 65 20 73 6f 6d 65 20 69 6e 66 6f 20 2a 2f 0a ve some info */.
1a590 20 20 20 20 62 69 66 66 5f 77 6f 72 6b 62 6f 6f biff_workboo
1a5a0 6b 20 2a 77 6f 72 6b 62 6f 6f 6b 20 3d 20 28 62 k *workbook = (b
1a5b0 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 29 20 iff_workbook *)
1a5c0 78 6c 73 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 xls_handle;.
1a5d0 69 66 20 28 21 77 6f 72 6b 62 6f 6f 6b 29 0a 09 if (!workbook)..
1a5e0 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 return FREEXL_NU
1a5f0 4c 4c 5f 48 41 4e 44 4c 45 3b 0a 20 20 20 20 69 LL_HANDLE;. i
1a600 66 20 28 21 69 6e 66 6f 29 0a 09 72 65 74 75 72 f (!info)..retur
1a610 6e 20 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 41 52 n FREEXL_NULL_AR
1a620 47 55 4d 45 4e 54 3b 0a 20 20 20 20 69 66 20 28 GUMENT;. if (
1a630 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 (workbook->magic
1a640 31 20 3d 3d 20 46 52 45 45 58 4c 5f 4d 41 47 49 1 == FREEXL_MAGI
1a650 43 5f 49 4e 46 4f 0a 09 20 7c 7c 20 77 6f 72 6b C_INFO.. || work
1a660 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 3d 3d 20 book->magic1 ==
1a670 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f 53 54 41 FREEXL_MAGIC_STA
1a680 52 54 29 0a 09 26 26 20 77 6f 72 6b 62 6f 6f 6b RT)..&& workbook
1a690 2d 3e 6d 61 67 69 63 32 20 3d 3d 20 46 52 45 45 ->magic2 == FREE
1a6a0 58 4c 5f 4d 41 47 49 43 5f 45 4e 44 29 0a 09 3b XL_MAGIC_END)..;
1a6b0 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 . else..retur
1a6c0 6e 20 46 52 45 45 58 4c 5f 49 4e 56 41 4c 49 44 n FREEXL_INVALID
1a6d0 5f 48 41 4e 44 4c 45 3b 0a 0a 20 20 20 20 73 77 _HANDLE;.. sw
1a6e0 69 74 63 68 20 28 77 68 61 74 29 0a 20 20 20 20 itch (what).
1a6f0 20 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 46 {. case F
1a700 52 45 45 58 4c 5f 43 46 42 46 5f 56 45 52 53 49 REEXL_CFBF_VERSI
1a710 4f 4e 3a 0a 09 20 20 2a 69 6e 66 6f 20 3d 20 46 ON:.. *info = F
1a720 52 45 45 58 4c 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 REEXL_UNKNOWN;..
1a730 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e if (workbook->
1a740 63 66 62 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 cfbf_version ==
1a750 33 29 0a 09 20 20 20 20 20 20 2a 69 6e 66 6f 20 3).. *info
1a760 3d 20 46 52 45 45 58 4c 5f 43 46 42 46 5f 56 45 = FREEXL_CFBF_VE
1a770 52 5f 33 3b 0a 09 20 20 69 66 20 28 77 6f 72 6b R_3;.. if (work
1a780 62 6f 6f 6b 2d 3e 63 66 62 66 5f 76 65 72 73 69 book->cfbf_versi
1a790 6f 6e 20 3d 3d 20 34 29 0a 09 20 20 20 20 20 20 on == 4)..
1a7a0 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c 5f 43 *info = FREEXL_C
1a7b0 46 42 46 5f 56 45 52 5f 34 3b 0a 09 20 20 72 65 FBF_VER_4;.. re
1a7c0 74 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a turn FREEXL_OK;.
1a7d0 20 20 20 20 20 20 63 61 73 65 20 46 52 45 45 58 case FREEX
1a7e0 4c 5f 43 46 42 46 5f 53 45 43 54 4f 52 5f 53 49 L_CFBF_SECTOR_SI
1a7f0 5a 45 3a 0a 09 20 20 2a 69 6e 66 6f 20 3d 20 46 ZE:.. *info = F
1a800 52 45 45 58 4c 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 REEXL_UNKNOWN;..
1a810 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e if (workbook->
1a820 63 66 62 66 5f 73 65 63 74 6f 72 5f 73 69 7a 65 cfbf_sector_size
1a830 20 3d 3d 20 35 31 32 29 0a 09 20 20 20 20 20 20 == 512)..
1a840 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c 5f 43 *info = FREEXL_C
1a850 46 42 46 5f 53 45 43 54 4f 52 5f 35 31 32 3b 0a FBF_SECTOR_512;.
1a860 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d . if (workbook-
1a870 3e 63 66 62 66 5f 73 65 63 74 6f 72 5f 73 69 7a >cfbf_sector_siz
1a880 65 20 3d 3d 20 34 30 39 36 29 0a 09 20 20 20 20 e == 4096)..
1a890 20 20 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c *info = FREEXL
1a8a0 5f 43 46 42 46 5f 53 45 43 54 4f 52 5f 34 30 39 _CFBF_SECTOR_409
1a8b0 36 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 6;.. return FRE
1a8c0 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 61 EXL_OK;. ca
1a8d0 73 65 20 46 52 45 45 58 4c 5f 43 46 42 46 5f 46 se FREEXL_CFBF_F
1a8e0 41 54 5f 43 4f 55 4e 54 3a 0a 09 20 20 69 66 20 AT_COUNT:.. if
1a8f0 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 66 61 74 20 21 (workbook->fat !
1a900 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 20 20 2a = NULL).. *
1a910 69 6e 66 6f 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d info = workbook-
1a920 3e 66 61 74 2d 3e 66 61 74 5f 61 72 72 61 79 5f >fat->fat_array_
1a930 63 6f 75 6e 74 3b 0a 09 20 20 65 6c 73 65 0a 09 count;.. else..
1a940 20 20 20 20 20 20 2a 69 6e 66 6f 20 3d 20 30 3b *info = 0;
1a950 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 .. return FREEX
1a960 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 61 73 65 L_OK;. case
1a970 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 4d 41 58 FREEXL_BIFF_MAX
1a980 5f 52 45 43 53 49 5a 45 3a 0a 09 20 20 2a 69 6e _RECSIZE:.. *in
1a990 66 6f 20 3d 20 46 52 45 45 58 4c 5f 55 4e 4b 4e fo = FREEXL_UNKN
1a9a0 4f 57 4e 3b 0a 09 20 20 69 66 20 28 77 6f 72 6b OWN;.. if (work
1a9b0 62 6f 6f 6b 2d 3e 62 69 66 66 5f 6d 61 78 5f 72 book->biff_max_r
1a9c0 65 63 6f 72 64 5f 73 69 7a 65 20 3d 3d 20 32 30 ecord_size == 20
1a9d0 38 30 29 0a 09 20 20 20 20 20 20 2a 69 6e 66 6f 80).. *info
1a9e0 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 4d = FREEXL_BIFF_M
1a9f0 41 58 5f 52 45 43 53 5a 5f 32 30 38 30 3b 0a 09 AX_RECSZ_2080;..
1aa00 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e if (workbook->
1aa10 62 69 66 66 5f 6d 61 78 5f 72 65 63 6f 72 64 5f biff_max_record_
1aa20 73 69 7a 65 20 3d 3d 20 38 32 32 34 29 0a 09 20 size == 8224)..
1aa30 20 20 20 20 20 2a 69 6e 66 6f 20 3d 20 46 52 45 *info = FRE
1aa40 45 58 4c 5f 42 49 46 46 5f 4d 41 58 5f 52 45 43 EXL_BIFF_MAX_REC
1aa50 53 5a 5f 38 32 32 34 3b 0a 09 20 20 72 65 74 75 SZ_8224;.. retu
1aa60 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 rn FREEXL_OK;.
1aa70 20 20 20 20 63 61 73 65 20 46 52 45 45 58 4c 5f case FREEXL_
1aa80 42 49 46 46 5f 44 41 54 45 4d 4f 44 45 3a 0a 09 BIFF_DATEMODE:..
1aa90 20 20 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c *info = FREEXL
1aaa0 5f 55 4e 4b 4e 4f 57 4e 3b 0a 09 20 20 69 66 20 _UNKNOWN;.. if
1aab0 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f (workbook->biff_
1aac0 64 61 74 65 5f 6d 6f 64 65 20 3d 3d 20 30 29 0a date_mode == 0).
1aad0 09 20 20 20 20 20 20 2a 69 6e 66 6f 20 3d 20 46 . *info = F
1aae0 52 45 45 58 4c 5f 42 49 46 46 5f 44 41 54 45 4d REEXL_BIFF_DATEM
1aaf0 4f 44 45 5f 31 39 30 30 3b 0a 09 20 20 69 66 20 ODE_1900;.. if
1ab00 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f (workbook->biff_
1ab10 64 61 74 65 5f 6d 6f 64 65 20 3d 3d 20 31 29 0a date_mode == 1).
1ab20 09 20 20 20 20 20 20 2a 69 6e 66 6f 20 3d 20 46 . *info = F
1ab30 52 45 45 58 4c 5f 42 49 46 46 5f 44 41 54 45 4d REEXL_BIFF_DATEM
1ab40 4f 44 45 5f 31 39 30 34 3b 0a 09 20 20 72 65 74 ODE_1904;.. ret
1ab50 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 20 urn FREEXL_OK;.
1ab60 20 20 20 20 20 63 61 73 65 20 46 52 45 45 58 4c case FREEXL
1ab70 5f 42 49 46 46 5f 43 4f 44 45 50 41 47 45 3a 0a _BIFF_CODEPAGE:.
1ab80 09 20 20 73 77 69 74 63 68 20 28 77 6f 72 6b 62 . switch (workb
1ab90 6f 6f 6b 2d 3e 62 69 66 66 5f 62 6f 6f 6b 5f 63 ook->biff_book_c
1aba0 6f 64 65 5f 70 61 67 65 29 0a 09 20 20 20 20 7b ode_page).. {
1abb0 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 31 36 .. case 0x016
1abc0 46 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 F:...*info = FRE
1abd0 45 58 4c 5f 42 49 46 46 5f 41 53 43 49 49 3b 0a EXL_BIFF_ASCII;.
1abe0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1abf0 73 65 20 30 78 30 31 42 35 3a 0a 09 09 2a 69 6e se 0x01B5:...*in
1ac00 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1ac10 5f 43 50 34 33 37 3b 0a 09 09 62 72 65 61 6b 3b _CP437;...break;
1ac20 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 32 44 .. case 0x02D
1ac30 30 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 0:...*info = FRE
1ac40 45 58 4c 5f 42 49 46 46 5f 43 50 37 32 30 3b 0a EXL_BIFF_CP720;.
1ac50 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1ac60 73 65 20 30 78 30 32 45 31 3a 0a 09 09 2a 69 6e se 0x02E1:...*in
1ac70 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1ac80 5f 43 50 37 33 37 3b 0a 09 09 62 72 65 61 6b 3b _CP737;...break;
1ac90 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 30 .. case 0x030
1aca0 37 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 7:...*info = FRE
1acb0 45 58 4c 5f 42 49 46 46 5f 43 50 37 37 35 3b 0a EXL_BIFF_CP775;.
1acc0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1acd0 73 65 20 30 78 30 33 35 32 3a 0a 09 09 2a 69 6e se 0x0352:...*in
1ace0 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1acf0 5f 43 50 38 35 30 3b 0a 09 09 62 72 65 61 6b 3b _CP850;...break;
1ad00 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 35 .. case 0x035
1ad10 34 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 4:...*info = FRE
1ad20 45 58 4c 5f 42 49 46 46 5f 43 50 38 35 32 3b 0a EXL_BIFF_CP852;.
1ad30 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1ad40 73 65 20 30 78 30 33 35 37 3a 0a 09 09 2a 69 6e se 0x0357:...*in
1ad50 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1ad60 5f 43 50 38 35 35 3b 0a 09 09 62 72 65 61 6b 3b _CP855;...break;
1ad70 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 35 .. case 0x035
1ad80 39 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 9:...*info = FRE
1ad90 45 58 4c 5f 42 49 46 46 5f 43 50 38 35 37 3b 0a EXL_BIFF_CP857;.
1ada0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1adb0 73 65 20 30 78 30 33 35 41 3a 0a 09 09 2a 69 6e se 0x035A:...*in
1adc0 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1add0 5f 43 50 38 35 38 3b 0a 09 09 62 72 65 61 6b 3b _CP858;...break;
1ade0 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 35 .. case 0x035
1adf0 43 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 C:...*info = FRE
1ae00 45 58 4c 5f 42 49 46 46 5f 43 50 38 36 30 3b 0a EXL_BIFF_CP860;.
1ae10 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1ae20 73 65 20 30 78 30 33 35 44 3a 0a 09 09 2a 69 6e se 0x035D:...*in
1ae30 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1ae40 5f 43 50 38 36 31 3b 0a 09 09 62 72 65 61 6b 3b _CP861;...break;
1ae50 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 35 .. case 0x035
1ae60 45 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 E:...*info = FRE
1ae70 45 58 4c 5f 42 49 46 46 5f 43 50 38 36 32 3b 0a EXL_BIFF_CP862;.
1ae80 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1ae90 73 65 20 30 78 30 33 35 46 3a 0a 09 09 2a 69 6e se 0x035F:...*in
1aea0 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1aeb0 5f 43 50 38 36 33 3b 0a 09 09 62 72 65 61 6b 3b _CP863;...break;
1aec0 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 36 .. case 0x036
1aed0 30 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 0:...*info = FRE
1aee0 45 58 4c 5f 42 49 46 46 5f 43 50 38 36 34 3b 0a EXL_BIFF_CP864;.
1aef0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1af00 73 65 20 30 78 30 33 36 31 3a 0a 09 09 2a 69 6e se 0x0361:...*in
1af10 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1af20 5f 43 50 38 36 35 3b 0a 09 09 62 72 65 61 6b 3b _CP865;...break;
1af30 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 36 .. case 0x036
1af40 32 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 2:...*info = FRE
1af50 45 58 4c 5f 42 49 46 46 5f 43 50 38 36 36 3b 0a EXL_BIFF_CP866;.
1af60 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1af70 73 65 20 30 78 30 33 36 35 3a 0a 09 09 2a 69 6e se 0x0365:...*in
1af80 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1af90 5f 43 50 38 36 39 3b 0a 09 09 62 72 65 61 6b 3b _CP869;...break;
1afa0 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 36 .. case 0x036
1afb0 41 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 A:...*info = FRE
1afc0 45 58 4c 5f 42 49 46 46 5f 43 50 38 37 34 3b 0a EXL_BIFF_CP874;.
1afd0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1afe0 73 65 20 30 78 30 33 41 34 3a 0a 09 09 2a 69 6e se 0x03A4:...*in
1aff0 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1b000 5f 43 50 39 33 32 3b 0a 09 09 62 72 65 61 6b 3b _CP932;...break;
1b010 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 41 .. case 0x03A
1b020 38 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 8:...*info = FRE
1b030 45 58 4c 5f 42 49 46 46 5f 43 50 39 33 36 3b 0a EXL_BIFF_CP936;.
1b040 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1b050 73 65 20 30 78 30 33 42 35 3a 0a 09 09 2a 69 6e se 0x03B5:...*in
1b060 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1b070 5f 43 50 39 34 39 3b 0a 09 09 62 72 65 61 6b 3b _CP949;...break;
1b080 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 33 42 .. case 0x03B
1b090 36 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 6:...*info = FRE
1b0a0 45 58 4c 5f 42 49 46 46 5f 43 50 39 35 30 3b 0a EXL_BIFF_CP950;.
1b0b0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1b0c0 73 65 20 30 78 30 34 42 30 3a 0a 09 09 2a 69 6e se 0x04B0:...*in
1b0d0 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1b0e0 5f 55 54 46 31 36 4c 45 3b 0a 09 09 62 72 65 61 _UTF16LE;...brea
1b0f0 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 k;.. case 0x0
1b100 34 45 32 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 4E2:...*info = F
1b110 52 45 45 58 4c 5f 42 49 46 46 5f 43 50 31 32 35 REEXL_BIFF_CP125
1b120 30 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 0;...break;..
1b130 20 63 61 73 65 20 30 78 30 34 45 33 3a 0a 09 09 case 0x04E3:...
1b140 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 *info = FREEXL_B
1b150 49 46 46 5f 43 50 31 32 35 31 3b 0a 09 09 62 72 IFF_CP1251;...br
1b160 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 30 eak;.. case 0
1b170 78 30 34 45 34 3a 0a 09 20 20 20 20 63 61 73 65 x04E4:.. case
1b180 20 30 78 38 30 30 31 3a 0a 09 09 2a 69 6e 66 6f 0x8001:...*info
1b190 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 43 = FREEXL_BIFF_C
1b1a0 50 31 32 35 32 3b 0a 09 09 62 72 65 61 6b 3b 0a P1252;...break;.
1b1b0 09 20 20 20 20 63 61 73 65 20 30 78 30 34 45 35 . case 0x04E5
1b1c0 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 45 :...*info = FREE
1b1d0 58 4c 5f 42 49 46 46 5f 43 50 31 32 35 33 3b 0a XL_BIFF_CP1253;.
1b1e0 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 ..break;.. ca
1b1f0 73 65 20 30 78 30 34 45 36 3a 0a 09 09 2a 69 6e se 0x04E6:...*in
1b200 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 fo = FREEXL_BIFF
1b210 5f 43 50 31 32 35 34 3b 0a 09 09 62 72 65 61 6b _CP1254;...break
1b220 3b 0a 09 20 20 20 20 63 61 73 65 20 30 78 30 34 ;.. case 0x04
1b230 45 37 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 E7:...*info = FR
1b240 45 45 58 4c 5f 42 49 46 46 5f 43 50 31 32 35 35 EEXL_BIFF_CP1255
1b250 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
1b260 63 61 73 65 20 30 78 30 34 45 38 3a 0a 09 09 2a case 0x04E8:...*
1b270 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 info = FREEXL_BI
1b280 46 46 5f 43 50 31 32 35 36 3b 0a 09 09 62 72 65 FF_CP1256;...bre
1b290 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 30 78 ak;.. case 0x
1b2a0 30 34 45 39 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 04E9:...*info =
1b2b0 46 52 45 45 58 4c 5f 42 49 46 46 5f 43 50 31 32 FREEXL_BIFF_CP12
1b2c0 35 37 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 57;...break;..
1b2d0 20 20 63 61 73 65 20 30 78 30 34 45 41 3a 0a 09 case 0x04EA:..
1b2e0 09 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c 5f .*info = FREEXL_
1b2f0 42 49 46 46 5f 43 50 31 32 35 38 3b 0a 09 09 62 BIFF_CP1258;...b
1b300 72 65 61 6b 3b 0a 09 20 20 20 20 63 61 73 65 20 reak;.. case
1b310 30 78 30 35 35 31 3a 0a 09 09 2a 69 6e 66 6f 20 0x0551:...*info
1b320 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 43 50 = FREEXL_BIFF_CP
1b330 31 33 36 31 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 1361;...break;..
1b340 20 20 20 20 63 61 73 65 20 30 78 32 37 31 30 3a case 0x2710:
1b350 0a 09 20 20 20 20 63 61 73 65 20 30 78 38 30 30 .. case 0x800
1b360 30 3a 0a 09 09 2a 69 6e 66 6f 20 3d 20 46 52 45 0:...*info = FRE
1b370 45 58 4c 5f 42 49 46 46 5f 4d 41 43 52 4f 4d 41 EXL_BIFF_MACROMA
1b380 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 N;...break;..
1b390 20 64 65 66 61 75 6c 74 3a 0a 09 09 2a 69 6e 66 default:...*inf
1b3a0 6f 20 3d 20 46 52 45 45 58 4c 5f 55 4e 4b 4e 4f o = FREEXL_UNKNO
1b3b0 57 4e 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 WN;...break;..
1b3c0 20 20 7d 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 };.. return F
1b3d0 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 REEXL_OK;.
1b3e0 63 61 73 65 20 46 52 45 45 58 4c 5f 42 49 46 46 case FREEXL_BIFF
1b3f0 5f 56 45 52 53 49 4f 4e 3a 0a 09 20 20 2a 69 6e _VERSION:.. *in
1b400 66 6f 20 3d 20 46 52 45 45 58 4c 5f 55 4e 4b 4e fo = FREEXL_UNKN
1b410 4f 57 4e 3b 0a 09 20 20 69 66 20 28 77 6f 72 6b OWN;.. if (work
1b420 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 73 69 book->biff_versi
1b430 6f 6e 20 3d 3d 20 32 29 0a 09 20 20 20 20 20 20 on == 2)..
1b440 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 *info = FREEXL_B
1b450 49 46 46 5f 56 45 52 5f 32 3b 0a 09 20 20 69 66 IFF_VER_2;.. if
1b460 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 (workbook->biff
1b470 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 33 29 0a 09 _version == 3)..
1b480 20 20 20 20 20 20 2a 69 6e 66 6f 20 3d 20 46 52 *info = FR
1b490 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f 33 3b EEXL_BIFF_VER_3;
1b4a0 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b .. if (workbook
1b4b0 2d 3e 62 69 66 66 5f 76 65 72 73 69 6f 6e 20 3d ->biff_version =
1b4c0 3d 20 34 29 0a 09 20 20 20 20 20 20 2a 69 6e 66 = 4).. *inf
1b4d0 6f 20 3d 20 46 52 45 45 58 4c 5f 42 49 46 46 5f o = FREEXL_BIFF_
1b4e0 56 45 52 5f 34 3b 0a 09 20 20 69 66 20 28 77 6f VER_4;.. if (wo
1b4f0 72 6b 62 6f 6f 6b 2d 3e 62 69 66 66 5f 76 65 72 rkbook->biff_ver
1b500 73 69 6f 6e 20 3d 3d 20 35 29 0a 09 20 20 20 20 sion == 5)..
1b510 20 20 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c *info = FREEXL
1b520 5f 42 49 46 46 5f 56 45 52 5f 35 3b 0a 09 20 20 _BIFF_VER_5;..
1b530 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 69 if (workbook->bi
1b540 66 66 5f 76 65 72 73 69 6f 6e 20 3d 3d 20 38 29 ff_version == 8)
1b550 0a 09 20 20 20 20 20 20 2a 69 6e 66 6f 20 3d 20 .. *info =
1b560 46 52 45 45 58 4c 5f 42 49 46 46 5f 56 45 52 5f FREEXL_BIFF_VER_
1b570 38 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 8;.. return FRE
1b580 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 61 EXL_OK;. ca
1b590 73 65 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 53 se FREEXL_BIFF_S
1b5a0 54 52 49 4e 47 5f 43 4f 55 4e 54 3a 0a 09 20 20 TRING_COUNT:..
1b5b0 2a 69 6e 66 6f 20 3d 20 77 6f 72 6b 62 6f 6f 6b *info = workbook
1b5c0 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 ->shared_strings
1b5d0 2e 73 74 72 69 6e 67 5f 63 6f 75 6e 74 3b 0a 09 .string_count;..
1b5e0 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f return FREEXL_
1b5f0 4f 4b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 46 OK;. case F
1b600 52 45 45 58 4c 5f 42 49 46 46 5f 53 48 45 45 54 REEXL_BIFF_SHEET
1b610 5f 43 4f 55 4e 54 3a 0a 09 20 20 2a 69 6e 66 6f _COUNT:.. *info
1b620 20 3d 20 67 65 74 5f 77 6f 72 6b 73 68 65 65 74 = get_worksheet
1b630 5f 63 6f 75 6e 74 20 28 77 6f 72 6b 62 6f 6f 6b _count (workbook
1b640 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 );.. return FRE
1b650 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 61 EXL_OK;. ca
1b660 73 65 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 46 se FREEXL_BIFF_F
1b670 4f 52 4d 41 54 5f 43 4f 55 4e 54 3a 0a 09 20 20 ORMAT_COUNT:..
1b680 2a 69 6e 66 6f 20 3d 20 77 6f 72 6b 62 6f 6f 6b *info = workbook
1b690 2d 3e 6d 61 78 5f 66 6f 72 6d 61 74 5f 69 6e 64 ->max_format_ind
1b6a0 65 78 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 ex;.. return FR
1b6b0 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 EEXL_OK;. c
1b6c0 61 73 65 20 46 52 45 45 58 4c 5f 42 49 46 46 5f ase FREEXL_BIFF_
1b6d0 58 46 5f 43 4f 55 4e 54 3a 0a 09 20 20 2a 69 6e XF_COUNT:.. *in
1b6e0 66 6f 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 62 fo = workbook->b
1b6f0 69 66 66 5f 78 66 5f 6e 65 78 74 5f 69 6e 64 65 iff_xf_next_inde
1b700 78 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 45 x;.. return FRE
1b710 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 61 EXL_OK;. ca
1b720 73 65 20 46 52 45 45 58 4c 5f 42 49 46 46 5f 50 se FREEXL_BIFF_P
1b730 41 53 53 57 4f 52 44 3a 0a 09 20 20 2a 69 6e 66 ASSWORD:.. *inf
1b740 6f 20 3d 20 46 52 45 45 58 4c 5f 55 4e 4b 4e 4f o = FREEXL_UNKNO
1b750 57 4e 3b 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 WN;.. if (workb
1b760 6f 6f 6b 2d 3e 62 69 66 66 5f 6f 62 66 75 73 63 ook->biff_obfusc
1b770 61 74 65 64 20 3d 3d 20 30 29 0a 09 20 20 20 20 ated == 0)..
1b780 20 20 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c *info = FREEXL
1b790 5f 42 49 46 46 5f 50 4c 41 49 4e 3b 0a 09 20 20 _BIFF_PLAIN;..
1b7a0 65 6c 73 65 20 69 66 20 28 77 6f 72 6b 62 6f 6f else if (workboo
1b7b0 6b 2d 3e 62 69 66 66 5f 6f 62 66 75 73 63 61 74 k->biff_obfuscat
1b7c0 65 64 20 3d 3d 20 30 29 0a 09 20 20 20 20 20 20 ed == 0)..
1b7d0 2a 69 6e 66 6f 20 3d 20 46 52 45 45 58 4c 5f 42 *info = FREEXL_B
1b7e0 49 46 46 5f 4f 42 46 55 53 43 41 54 45 44 3b 0a IFF_OBFUSCATED;.
1b7f0 09 20 20 65 6c 73 65 0a 09 20 20 20 20 20 20 2a . else.. *
1b800 69 6e 66 6f 20 3d 20 77 6f 72 6b 62 6f 6f 6b 2d info = workbook-
1b810 3e 62 69 66 66 5f 78 66 5f 6e 65 78 74 5f 69 6e >biff_xf_next_in
1b820 64 65 78 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 dex;.. return F
1b830 52 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 REEXL_OK;.
1b840 7d 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 46 };.. return F
1b850 52 45 45 58 4c 5f 49 4e 56 41 4c 49 44 5f 49 4e REEXL_INVALID_IN
1b860 46 4f 5f 41 52 47 3b 0a 7d 0a 0a 46 52 45 45 58 FO_ARG;.}..FREEX
1b870 4c 5f 44 45 43 4c 41 52 45 20 69 6e 74 0a 66 72 L_DECLARE int.fr
1b880 65 65 78 6c 5f 67 65 74 5f 46 41 54 5f 65 6e 74 eexl_get_FAT_ent
1b890 72 79 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a ry (const void *
1b8a0 78 6c 73 5f 68 61 6e 64 6c 65 2c 20 75 6e 73 69 xls_handle, unsi
1b8b0 67 6e 65 64 20 69 6e 74 20 73 65 63 74 6f 72 5f gned int sector_
1b8c0 69 6e 64 65 78 2c 0a 09 09 20 20 20 20 20 20 75 index,... u
1b8d0 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6e 65 78 nsigned int *nex
1b8e0 74 5f 73 65 63 74 6f 72 5f 69 6e 64 65 78 29 0a t_sector_index).
1b8f0 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 {./* attempting
1b900 74 6f 20 72 65 74 72 69 65 76 65 20 73 6f 6d 65 to retrieve some
1b910 20 46 41 54 20 65 6e 74 72 79 20 5b 62 79 20 69 FAT entry [by i
1b920 6e 64 65 78 5d 20 2a 2f 0a 20 20 20 20 66 61 74 ndex] */. fat
1b930 5f 65 6e 74 72 79 20 2a 65 6e 74 72 79 3b 0a 20 _entry *entry;.
1b940 20 20 20 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b biff_workbook
1b950 20 2a 77 6f 72 6b 62 6f 6f 6b 20 3d 20 28 62 69 *workbook = (bi
1b960 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 29 20 78 ff_workbook *) x
1b970 6c 73 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 ls_handle;. i
1b980 66 20 28 21 77 6f 72 6b 62 6f 6f 6b 29 0a 09 72 f (!workbook)..r
1b990 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 4c eturn FREEXL_NUL
1b9a0 4c 5f 48 41 4e 44 4c 45 3b 0a 20 20 20 20 69 66 L_HANDLE;. if
1b9b0 20 28 21 6e 65 78 74 5f 73 65 63 74 6f 72 5f 69 (!next_sector_i
1b9c0 6e 64 65 78 29 0a 09 72 65 74 75 72 6e 20 46 52 ndex)..return FR
1b9d0 45 45 58 4c 5f 4e 55 4c 4c 5f 41 52 47 55 4d 45 EEXL_NULL_ARGUME
1b9e0 4e 54 3b 0a 20 20 20 20 69 66 20 28 28 77 6f 72 NT;. if ((wor
1b9f0 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 3d 3d kbook->magic1 ==
1ba00 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f 49 4e FREEXL_MAGIC_IN
1ba10 46 4f 0a 09 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b FO.. || workbook
1ba20 2d 3e 6d 61 67 69 63 31 20 3d 3d 20 46 52 45 45 ->magic1 == FREE
1ba30 58 4c 5f 4d 41 47 49 43 5f 53 54 41 52 54 29 0a XL_MAGIC_START).
1ba40 09 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 .&& workbook->ma
1ba50 67 69 63 32 20 3d 3d 20 46 52 45 45 58 4c 5f 4d gic2 == FREEXL_M
1ba60 41 47 49 43 5f 45 4e 44 29 0a 09 3b 0a 20 20 20 AGIC_END)..;.
1ba70 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 46 52 else..return FR
1ba80 45 45 58 4c 5f 49 4e 56 41 4c 49 44 5f 48 41 4e EEXL_INVALID_HAN
1ba90 44 4c 45 3b 0a 0a 20 20 20 20 69 66 20 28 77 6f DLE;.. if (wo
1baa0 72 6b 62 6f 6f 6b 2d 3e 66 61 74 20 3d 3d 20 4e rkbook->fat == N
1bab0 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 52 45 ULL)..return FRE
1bac0 45 58 4c 5f 43 46 42 46 5f 45 4d 50 54 59 5f 46 EXL_CFBF_EMPTY_F
1bad0 41 54 5f 43 48 41 49 4e 3b 0a 0a 20 20 20 20 65 AT_CHAIN;.. e
1bae0 6e 74 72 79 20 3d 20 67 65 74 5f 66 61 74 5f 65 ntry = get_fat_e
1baf0 6e 74 72 79 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e ntry (workbook->
1bb00 66 61 74 2c 20 73 65 63 74 6f 72 5f 69 6e 64 65 fat, sector_inde
1bb10 78 29 3b 0a 20 20 20 20 69 66 20 28 65 6e 74 72 x);. if (entr
1bb20 79 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 74 75 y == NULL)..retu
1bb30 72 6e 20 46 52 45 45 58 4c 5f 43 46 42 46 5f 49 rn FREEXL_CFBF_I
1bb40 4c 4c 45 47 41 4c 5f 46 41 54 5f 45 4e 54 52 59 LLEGAL_FAT_ENTRY
1bb50 3b 0a 20 20 20 20 2a 6e 65 78 74 5f 73 65 63 74 ;. *next_sect
1bb60 6f 72 5f 69 6e 64 65 78 20 3d 20 65 6e 74 72 79 or_index = entry
1bb70 2d 3e 6e 65 78 74 5f 73 65 63 74 6f 72 3b 0a 0a ->next_sector;..
1bb80 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 return FREEX
1bb90 4c 5f 4f 4b 3b 0a 0a 7d 0a 0a 46 52 45 45 58 4c L_OK;..}..FREEXL
1bba0 5f 44 45 43 4c 41 52 45 20 69 6e 74 0a 66 72 65 _DECLARE int.fre
1bbb0 65 78 6c 5f 67 65 74 5f 77 6f 72 6b 73 68 65 65 exl_get_workshee
1bbc0 74 5f 6e 61 6d 65 20 28 63 6f 6e 73 74 20 76 6f t_name (const vo
1bbd0 69 64 20 2a 78 6c 73 5f 68 61 6e 64 6c 65 2c 0a id *xls_handle,.
1bbe0 09 09 09 20 20 20 75 6e 73 69 67 6e 65 64 20 73 ... unsigned s
1bbf0 68 6f 72 74 20 77 6f 72 6b 73 68 65 65 74 5f 69 hort worksheet_i
1bc00 6e 64 65 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 ndex, const char
1bc10 20 2a 2a 73 74 72 69 6e 67 29 0a 7b 0a 2f 2a 20 **string).{./*
1bc20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 attempting to re
1bc30 74 72 69 65 76 65 20 73 6f 6d 65 20 57 6f 72 6b trieve some Work
1bc40 73 68 65 65 74 20 6e 61 6d 65 20 5b 62 79 20 69 sheet name [by i
1bc50 6e 64 65 78 5d 20 2a 2f 0a 20 20 20 20 75 6e 73 ndex] */. uns
1bc60 69 67 6e 65 64 20 69 6e 74 20 63 6f 75 6e 74 20 igned int count
1bc70 3d 20 30 3b 0a 20 20 20 20 62 69 66 66 5f 73 68 = 0;. biff_sh
1bc80 65 65 74 20 2a 77 6f 72 6b 73 68 65 65 74 3b 0a eet *worksheet;.
1bc90 20 20 20 20 62 69 66 66 5f 77 6f 72 6b 62 6f 6f biff_workboo
1bca0 6b 20 2a 77 6f 72 6b 62 6f 6f 6b 20 3d 20 28 62 k *workbook = (b
1bcb0 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 29 20 iff_workbook *)
1bcc0 78 6c 73 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 xls_handle;.
1bcd0 69 66 20 28 21 77 6f 72 6b 62 6f 6f 6b 29 0a 09 if (!workbook)..
1bce0 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 return FREEXL_NU
1bcf0 4c 4c 5f 48 41 4e 44 4c 45 3b 0a 20 20 20 20 69 LL_HANDLE;. i
1bd00 66 20 28 21 73 74 72 69 6e 67 29 0a 09 72 65 74 f (!string)..ret
1bd10 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f urn FREEXL_NULL_
1bd20 41 52 47 55 4d 45 4e 54 3b 0a 20 20 20 20 69 66 ARGUMENT;. if
1bd30 20 28 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 ((workbook->mag
1bd40 69 63 31 20 3d 3d 20 46 52 45 45 58 4c 5f 4d 41 ic1 == FREEXL_MA
1bd50 47 49 43 5f 49 4e 46 4f 0a 09 20 7c 7c 20 77 6f GIC_INFO.. || wo
1bd60 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 3d rkbook->magic1 =
1bd70 3d 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f 53 = FREEXL_MAGIC_S
1bd80 54 41 52 54 29 0a 09 26 26 20 77 6f 72 6b 62 6f TART)..&& workbo
1bd90 6f 6b 2d 3e 6d 61 67 69 63 32 20 3d 3d 20 46 52 ok->magic2 == FR
1bda0 45 45 58 4c 5f 4d 41 47 49 43 5f 45 4e 44 29 0a EEXL_MAGIC_END).
1bdb0 09 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 .;. else..ret
1bdc0 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e 56 41 4c urn FREEXL_INVAL
1bdd0 49 44 5f 48 41 4e 44 4c 45 3b 0a 0a 20 20 20 20 ID_HANDLE;..
1bde0 77 6f 72 6b 73 68 65 65 74 20 3d 20 77 6f 72 6b worksheet = work
1bdf0 62 6f 6f 6b 2d 3e 66 69 72 73 74 5f 73 68 65 65 book->first_shee
1be00 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 77 6f t;. while (wo
1be10 72 6b 73 68 65 65 74 29 0a 20 20 20 20 20 20 7b rksheet). {
1be20 0a 09 20 20 69 66 20 28 63 6f 75 6e 74 20 3d 3d .. if (count ==
1be30 20 77 6f 72 6b 73 68 65 65 74 5f 69 6e 64 65 78 worksheet_index
1be40 29 0a 09 20 20 20 20 7b 0a 09 09 2a 73 74 72 69 ).. {...*stri
1be50 6e 67 20 3d 20 77 6f 72 6b 73 68 65 65 74 2d 3e ng = worksheet->
1be60 75 74 66 38 5f 6e 61 6d 65 3b 0a 09 09 72 65 74 utf8_name;...ret
1be70 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 09 urn FREEXL_OK;..
1be80 20 20 20 20 7d 0a 09 20 20 63 6f 75 6e 74 2b 2b }.. count++
1be90 3b 0a 09 20 20 77 6f 72 6b 73 68 65 65 74 20 3d ;.. worksheet =
1bea0 20 77 6f 72 6b 73 68 65 65 74 2d 3e 6e 65 78 74 worksheet->next
1beb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 ;. }. re
1bec0 74 75 72 6e 20 46 52 45 45 58 4c 5f 42 49 46 46 turn FREEXL_BIFF
1bed0 5f 49 4c 4c 45 47 41 4c 5f 53 48 45 45 54 5f 49 _ILLEGAL_SHEET_I
1bee0 4e 44 45 58 3b 0a 7d 0a 0a 46 52 45 45 58 4c 5f NDEX;.}..FREEXL_
1bef0 44 45 43 4c 41 52 45 20 69 6e 74 0a 66 72 65 65 DECLARE int.free
1bf00 78 6c 5f 73 65 6c 65 63 74 5f 61 63 74 69 76 65 xl_select_active
1bf10 5f 77 6f 72 6b 73 68 65 65 74 20 28 63 6f 6e 73 _worksheet (cons
1bf20 74 20 76 6f 69 64 20 2a 78 6c 73 5f 68 61 6e 64 t void *xls_hand
1bf30 6c 65 2c 0a 09 09 09 09 75 6e 73 69 67 6e 65 64 le,.....unsigned
1bf40 20 73 68 6f 72 74 20 77 6f 72 6b 73 68 65 65 74 short worksheet
1bf50 5f 69 6e 64 65 78 29 0a 7b 0a 2f 2a 20 73 65 6c _index).{./* sel
1bf60 65 63 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 ecting the curre
1bf70 6e 74 6c 79 20 61 63 74 69 76 65 20 77 6f 72 6b ntly active work
1bf80 73 68 65 65 74 20 5b 62 79 20 69 6e 64 65 78 5d sheet [by index]
1bf90 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 */. unsigned
1bfa0 20 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a int count = 0;.
1bfb0 20 20 20 20 62 69 66 66 5f 73 68 65 65 74 20 2a biff_sheet *
1bfc0 77 6f 72 6b 73 68 65 65 74 3b 0a 20 20 20 20 62 worksheet;. b
1bfd0 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 77 6f iff_workbook *wo
1bfe0 72 6b 62 6f 6f 6b 20 3d 20 28 62 69 66 66 5f 77 rkbook = (biff_w
1bff0 6f 72 6b 62 6f 6f 6b 20 2a 29 20 78 6c 73 5f 68 orkbook *) xls_h
1c000 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 21 andle;. if (!
1c010 77 6f 72 6b 62 6f 6f 6b 29 0a 09 72 65 74 75 72 workbook)..retur
1c020 6e 20 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 48 41 n FREEXL_NULL_HA
1c030 4e 44 4c 45 3b 0a 20 20 20 20 69 66 20 28 28 77 NDLE;. if ((w
1c040 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 orkbook->magic1
1c050 3d 3d 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f == FREEXL_MAGIC_
1c060 49 4e 46 4f 0a 09 20 7c 7c 20 77 6f 72 6b 62 6f INFO.. || workbo
1c070 6f 6b 2d 3e 6d 61 67 69 63 31 20 3d 3d 20 46 52 ok->magic1 == FR
1c080 45 45 58 4c 5f 4d 41 47 49 43 5f 53 54 41 52 54 EEXL_MAGIC_START
1c090 29 0a 09 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e )..&& workbook->
1c0a0 6d 61 67 69 63 32 20 3d 3d 20 46 52 45 45 58 4c magic2 == FREEXL
1c0b0 5f 4d 41 47 49 43 5f 45 4e 44 29 0a 09 3b 0a 20 _MAGIC_END)..;.
1c0c0 20 20 20 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 else..return
1c0d0 46 52 45 45 58 4c 5f 49 4e 56 41 4c 49 44 5f 48 FREEXL_INVALID_H
1c0e0 41 4e 44 4c 45 3b 0a 0a 20 20 20 20 77 6f 72 6b ANDLE;.. work
1c0f0 73 68 65 65 74 20 3d 20 77 6f 72 6b 62 6f 6f 6b sheet = workbook
1c100 2d 3e 66 69 72 73 74 5f 73 68 65 65 74 3b 0a 20 ->first_sheet;.
1c110 20 20 20 77 68 69 6c 65 20 28 77 6f 72 6b 73 68 while (worksh
1c120 65 65 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 20 eet). {..
1c130 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 77 6f 72 if (count == wor
1c140 6b 73 68 65 65 74 5f 69 6e 64 65 78 29 0a 09 20 ksheet_index)..
1c150 20 20 20 7b 0a 09 09 77 6f 72 6b 62 6f 6f 6b 2d {...workbook-
1c160 3e 61 63 74 69 76 65 5f 73 68 65 65 74 20 3d 20 >active_sheet =
1c170 77 6f 72 6b 73 68 65 65 74 3b 0a 09 09 72 65 74 worksheet;...ret
1c180 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 09 urn FREEXL_OK;..
1c190 20 20 20 20 7d 0a 09 20 20 63 6f 75 6e 74 2b 2b }.. count++
1c1a0 3b 0a 09 20 20 77 6f 72 6b 73 68 65 65 74 20 3d ;.. worksheet =
1c1b0 20 77 6f 72 6b 73 68 65 65 74 2d 3e 6e 65 78 74 worksheet->next
1c1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 72 65 ;. }. re
1c1d0 74 75 72 6e 20 46 52 45 45 58 4c 5f 42 49 46 46 turn FREEXL_BIFF
1c1e0 5f 49 4c 4c 45 47 41 4c 5f 53 48 45 45 54 5f 49 _ILLEGAL_SHEET_I
1c1f0 4e 44 45 58 3b 0a 7d 0a 0a 46 52 45 45 58 4c 5f NDEX;.}..FREEXL_
1c200 44 45 43 4c 41 52 45 20 69 6e 74 0a 66 72 65 65 DECLARE int.free
1c210 78 6c 5f 67 65 74 5f 61 63 74 69 76 65 5f 77 6f xl_get_active_wo
1c220 72 6b 73 68 65 65 74 20 28 63 6f 6e 73 74 20 76 rksheet (const v
1c230 6f 69 64 20 2a 78 6c 73 5f 68 61 6e 64 6c 65 2c oid *xls_handle,
1c240 0a 09 09 09 20 20 20 20 20 75 6e 73 69 67 6e 65 .... unsigne
1c250 64 20 73 68 6f 72 74 20 2a 77 6f 72 6b 73 68 65 d short *workshe
1c260 65 74 5f 69 6e 64 65 78 29 0a 7b 0a 2f 2a 20 72 et_index).{./* r
1c270 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 63 75 etrieving the cu
1c280 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 77 rrently active w
1c290 6f 72 6b 73 68 65 65 74 20 69 6e 64 65 78 20 2a orksheet index *
1c2a0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 /. unsigned i
1c2b0 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 nt count = 0;.
1c2c0 20 20 62 69 66 66 5f 73 68 65 65 74 20 2a 77 6f biff_sheet *wo
1c2d0 72 6b 73 68 65 65 74 3b 0a 20 20 20 20 62 69 66 rksheet;. bif
1c2e0 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 77 6f 72 6b f_workbook *work
1c2f0 62 6f 6f 6b 20 3d 20 28 62 69 66 66 5f 77 6f 72 book = (biff_wor
1c300 6b 62 6f 6f 6b 20 2a 29 20 78 6c 73 5f 68 61 6e kbook *) xls_han
1c310 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 21 77 6f dle;. if (!wo
1c320 72 6b 62 6f 6f 6b 29 0a 09 72 65 74 75 72 6e 20 rkbook)..return
1c330 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 48 41 4e 44 FREEXL_NULL_HAND
1c340 4c 45 3b 0a 20 20 20 20 69 66 20 28 21 77 6f 72 LE;. if (!wor
1c350 6b 73 68 65 65 74 5f 69 6e 64 65 78 29 0a 09 72 ksheet_index)..r
1c360 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 4c eturn FREEXL_NUL
1c370 4c 5f 41 52 47 55 4d 45 4e 54 3b 0a 20 20 20 20 L_ARGUMENT;.
1c380 69 66 20 28 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d if ((workbook->m
1c390 61 67 69 63 31 20 3d 3d 20 46 52 45 45 58 4c 5f agic1 == FREEXL_
1c3a0 4d 41 47 49 43 5f 49 4e 46 4f 0a 09 20 7c 7c 20 MAGIC_INFO.. ||
1c3b0 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 workbook->magic1
1c3c0 20 3d 3d 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 == FREEXL_MAGIC
1c3d0 5f 53 54 41 52 54 29 0a 09 26 26 20 77 6f 72 6b _START)..&& work
1c3e0 62 6f 6f 6b 2d 3e 6d 61 67 69 63 32 20 3d 3d 20 book->magic2 ==
1c3f0 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f 45 4e 44 FREEXL_MAGIC_END
1c400 29 0a 09 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 )..;. else..r
1c410 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e 56 eturn FREEXL_INV
1c420 41 4c 49 44 5f 48 41 4e 44 4c 45 3b 0a 0a 20 20 ALID_HANDLE;..
1c430 20 20 77 6f 72 6b 73 68 65 65 74 20 3d 20 77 6f worksheet = wo
1c440 72 6b 62 6f 6f 6b 2d 3e 66 69 72 73 74 5f 73 68 rkbook->first_sh
1c450 65 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 eet;. while (
1c460 77 6f 72 6b 73 68 65 65 74 29 0a 20 20 20 20 20 worksheet).
1c470 20 7b 0a 09 20 20 69 66 20 28 77 6f 72 6b 62 6f {.. if (workbo
1c480 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 74 ok->active_sheet
1c490 20 3d 3d 20 77 6f 72 6b 73 68 65 65 74 29 0a 09 == worksheet)..
1c4a0 20 20 20 20 7b 0a 09 09 2a 77 6f 72 6b 73 68 65 {...*workshe
1c4b0 65 74 5f 69 6e 64 65 78 20 3d 20 63 6f 75 6e 74 et_index = count
1c4c0 3b 0a 09 09 72 65 74 75 72 6e 20 46 52 45 45 58 ;...return FREEX
1c4d0 4c 5f 4f 4b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 L_OK;.. }..
1c4e0 63 6f 75 6e 74 2b 2b 3b 0a 09 20 20 77 6f 72 6b count++;.. work
1c4f0 73 68 65 65 74 20 3d 20 77 6f 72 6b 73 68 65 65 sheet = workshee
1c500 74 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 20 20 7d t->next;. }
1c510 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 . return FREE
1c520 58 4c 5f 42 49 46 46 5f 55 4e 53 45 4c 45 43 54 XL_BIFF_UNSELECT
1c530 45 44 5f 53 48 45 45 54 3b 0a 7d 0a 0a 46 52 45 ED_SHEET;.}..FRE
1c540 45 58 4c 5f 44 45 43 4c 41 52 45 20 69 6e 74 0a EXL_DECLARE int.
1c550 66 72 65 65 78 6c 5f 77 6f 72 6b 73 68 65 65 74 freexl_worksheet
1c560 5f 64 69 6d 65 6e 73 69 6f 6e 73 20 28 63 6f 6e _dimensions (con
1c570 73 74 20 76 6f 69 64 20 2a 78 6c 73 5f 68 61 6e st void *xls_han
1c580 64 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e dle, unsigned in
1c590 74 20 2a 72 6f 77 73 2c 0a 09 09 09 20 20 20 20 t *rows,....
1c5a0 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 unsigned short
1c5b0 2a 63 6f 6c 75 6d 6e 73 29 0a 7b 0a 2f 2a 20 64 *columns).{./* d
1c5c0 69 6d 65 6e 73 69 6f 6e 73 3a 20 63 75 72 72 65 imensions: curre
1c5d0 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 20 57 6f ntly selected Wo
1c5e0 72 6b 73 68 65 65 74 20 2a 2f 0a 20 20 20 20 62 rksheet */. b
1c5f0 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 77 6f iff_workbook *wo
1c600 72 6b 62 6f 6f 6b 20 3d 20 28 62 69 66 66 5f 77 rkbook = (biff_w
1c610 6f 72 6b 62 6f 6f 6b 20 2a 29 20 78 6c 73 5f 68 orkbook *) xls_h
1c620 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 28 21 andle;. if (!
1c630 77 6f 72 6b 62 6f 6f 6b 29 0a 09 72 65 74 75 72 workbook)..retur
1c640 6e 20 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 48 41 n FREEXL_NULL_HA
1c650 4e 44 4c 45 3b 0a 20 20 20 20 69 66 20 28 21 72 NDLE;. if (!r
1c660 6f 77 73 29 0a 09 72 65 74 75 72 6e 20 46 52 45 ows)..return FRE
1c670 45 58 4c 5f 4e 55 4c 4c 5f 41 52 47 55 4d 45 4e EXL_NULL_ARGUMEN
1c680 54 3b 0a 20 20 20 20 69 66 20 28 21 63 6f 6c 75 T;. if (!colu
1c690 6d 6e 73 29 0a 09 72 65 74 75 72 6e 20 46 52 45 mns)..return FRE
1c6a0 45 58 4c 5f 4e 55 4c 4c 5f 41 52 47 55 4d 45 4e EXL_NULL_ARGUMEN
1c6b0 54 3b 0a 20 20 20 20 69 66 20 28 28 77 6f 72 6b T;. if ((work
1c6c0 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 3d 3d 20 book->magic1 ==
1c6d0 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f 49 4e 46 FREEXL_MAGIC_INF
1c6e0 4f 0a 09 20 7c 7c 20 77 6f 72 6b 62 6f 6f 6b 2d O.. || workbook-
1c6f0 3e 6d 61 67 69 63 31 20 3d 3d 20 46 52 45 45 58 >magic1 == FREEX
1c700 4c 5f 4d 41 47 49 43 5f 53 54 41 52 54 29 0a 09 L_MAGIC_START)..
1c710 26 26 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 && workbook->mag
1c720 69 63 32 20 3d 3d 20 46 52 45 45 58 4c 5f 4d 41 ic2 == FREEXL_MA
1c730 47 49 43 5f 45 4e 44 29 0a 09 3b 0a 20 20 20 20 GIC_END)..;.
1c740 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 46 52 45 else..return FRE
1c750 45 58 4c 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 EXL_INVALID_HAND
1c760 4c 45 3b 0a 0a 20 20 20 20 69 66 20 28 77 6f 72 LE;.. if (wor
1c770 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 kbook->active_sh
1c780 65 65 74 20 3d 3d 20 4e 55 4c 4c 29 0a 09 72 65 eet == NULL)..re
1c790 74 75 72 6e 20 46 52 45 45 58 4c 5f 42 49 46 46 turn FREEXL_BIFF
1c7a0 5f 55 4e 53 45 4c 45 43 54 45 44 5f 53 48 45 45 _UNSELECTED_SHEE
1c7b0 54 3b 0a 0a 20 20 20 20 2a 72 6f 77 73 20 3d 20 T;.. *rows =
1c7c0 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 workbook->active
1c7d0 5f 73 68 65 65 74 2d 3e 72 6f 77 73 3b 0a 20 20 _sheet->rows;.
1c7e0 20 20 2a 63 6f 6c 75 6d 6e 73 20 3d 20 77 6f 72 *columns = wor
1c7f0 6b 62 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 kbook->active_sh
1c800 65 65 74 2d 3e 63 6f 6c 75 6d 6e 73 3b 0a 20 20 eet->columns;.
1c810 20 20 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f return FREEXL_
1c820 4f 4b 3b 0a 7d 0a 0a 46 52 45 45 58 4c 5f 44 45 OK;.}..FREEXL_DE
1c830 43 4c 41 52 45 20 69 6e 74 0a 66 72 65 65 78 6c CLARE int.freexl
1c840 5f 67 65 74 5f 53 53 54 5f 73 74 72 69 6e 67 20 _get_SST_string
1c850 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 78 6c 73 (const void *xls
1c860 5f 68 61 6e 64 6c 65 2c 20 75 6e 73 69 67 6e 65 _handle, unsigne
1c870 64 20 73 68 6f 72 74 20 73 74 72 69 6e 67 5f 69 d short string_i
1c880 6e 64 65 78 2c 0a 09 09 20 20 20 20 20 20 20 63 ndex,... c
1c890 6f 6e 73 74 20 63 68 61 72 20 2a 2a 73 74 72 69 onst char **stri
1c8a0 6e 67 29 0a 7b 0a 2f 2a 20 61 74 74 65 6d 70 74 ng).{./* attempt
1c8b0 69 6e 67 20 74 6f 20 72 65 74 72 69 65 76 65 20 ing to retrieve
1c8c0 73 6f 6d 65 20 53 53 54 20 65 6e 74 72 79 20 5b some SST entry [
1c8d0 62 79 20 69 6e 64 65 78 5d 20 2a 2f 0a 20 20 20 by index] */.
1c8e0 20 62 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a biff_workbook *
1c8f0 77 6f 72 6b 62 6f 6f 6b 20 3d 20 28 62 69 66 66 workbook = (biff
1c900 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 29 20 78 6c 73 _workbook *) xls
1c910 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 69 66 20 _handle;. if
1c920 28 21 77 6f 72 6b 62 6f 6f 6b 29 0a 09 72 65 74 (!workbook)..ret
1c930 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f urn FREEXL_NULL_
1c940 48 41 4e 44 4c 45 3b 0a 20 20 20 20 69 66 20 28 HANDLE;. if (
1c950 21 73 74 72 69 6e 67 29 0a 09 72 65 74 75 72 6e !string)..return
1c960 20 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 41 52 47 FREEXL_NULL_ARG
1c970 55 4d 45 4e 54 3b 0a 20 20 20 20 69 66 20 28 77 UMENT;. if (w
1c980 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 orkbook->magic1
1c990 3d 3d 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f == FREEXL_MAGIC_
1c9a0 53 54 41 52 54 0a 09 26 26 20 77 6f 72 6b 62 6f START..&& workbo
1c9b0 6f 6b 2d 3e 6d 61 67 69 63 32 20 3d 3d 20 46 52 ok->magic2 == FR
1c9c0 45 45 58 4c 5f 4d 41 47 49 43 5f 45 4e 44 29 0a EEXL_MAGIC_END).
1c9d0 09 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 .;. else..ret
1c9e0 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e 56 41 4c urn FREEXL_INVAL
1c9f0 49 44 5f 48 41 4e 44 4c 45 3b 0a 0a 20 20 20 20 ID_HANDLE;..
1ca00 2a 73 74 72 69 6e 67 20 3d 20 4e 55 4c 4c 3b 0a *string = NULL;.
1ca10 20 20 20 20 69 66 20 28 77 6f 72 6b 62 6f 6f 6b if (workbook
1ca20 2d 3e 73 68 61 72 65 64 5f 73 74 72 69 6e 67 73 ->shared_strings
1ca30 2e 75 74 66 38 5f 73 74 72 69 6e 67 73 20 3d 3d .utf8_strings ==
1ca40 20 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 20 46 NULL)..return F
1ca50 52 45 45 58 4c 5f 42 49 46 46 5f 49 4e 56 41 4c REEXL_BIFF_INVAL
1ca60 49 44 5f 53 53 54 3b 0a 20 20 20 20 69 66 20 28 ID_SST;. if (
1ca70 73 74 72 69 6e 67 5f 69 6e 64 65 78 20 3c 20 77 string_index < w
1ca80 6f 72 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f orkbook->shared_
1ca90 73 74 72 69 6e 67 73 2e 73 74 72 69 6e 67 5f 63 strings.string_c
1caa0 6f 75 6e 74 29 0a 20 20 20 20 20 20 7b 0a 09 20 ount). {..
1cab0 20 2a 73 74 72 69 6e 67 20 3d 20 2a 28 77 6f 72 *string = *(wor
1cac0 6b 62 6f 6f 6b 2d 3e 73 68 61 72 65 64 5f 73 74 kbook->shared_st
1cad0 72 69 6e 67 73 2e 75 74 66 38 5f 73 74 72 69 6e rings.utf8_strin
1cae0 67 73 20 2b 20 73 74 72 69 6e 67 5f 69 6e 64 65 gs + string_inde
1caf0 78 29 3b 0a 09 20 20 72 65 74 75 72 6e 20 46 52 x);.. return FR
1cb00 45 45 58 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d EEXL_OK;. }
1cb10 0a 20 20 20 20 72 65 74 75 72 6e 20 46 52 45 45 . return FREE
1cb20 58 4c 5f 42 49 46 46 5f 49 4c 4c 45 47 41 4c 5f XL_BIFF_ILLEGAL_
1cb30 53 53 54 5f 49 4e 44 45 58 3b 0a 7d 0a 0a 46 52 SST_INDEX;.}..FR
1cb40 45 45 58 4c 5f 44 45 43 4c 41 52 45 20 69 6e 74 EEXL_DECLARE int
1cb50 0a 66 72 65 65 78 6c 5f 67 65 74 5f 63 65 6c 6c .freexl_get_cell
1cb60 5f 76 61 6c 75 65 20 28 63 6f 6e 73 74 20 76 6f _value (const vo
1cb70 69 64 20 2a 78 6c 73 5f 68 61 6e 64 6c 65 2c 20 id *xls_handle,
1cb80 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 6f 77 unsigned int row
1cb90 2c 0a 09 09 20 20 20 20 20 20 20 75 6e 73 69 67 ,... unsig
1cba0 6e 65 64 20 73 68 6f 72 74 20 63 6f 6c 75 6d 6e ned short column
1cbb0 2c 20 46 72 65 65 58 4c 5f 43 65 6c 6c 56 61 6c , FreeXL_CellVal
1cbc0 75 65 20 2a 20 76 61 6c 29 0a 7b 0a 2f 2a 20 61 ue * val).{./* a
1cbd0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66 65 74 ttempting to fet
1cbe0 63 68 20 61 20 63 65 6c 6c 20 76 61 6c 75 65 20 ch a cell value
1cbf0 2a 2f 0a 20 20 20 20 62 69 66 66 5f 63 65 6c 6c */. biff_cell
1cc00 5f 76 61 6c 75 65 20 2a 70 5f 63 65 6c 6c 3b 0a _value *p_cell;.
1cc10 20 20 20 20 62 69 66 66 5f 77 6f 72 6b 62 6f 6f biff_workboo
1cc20 6b 20 2a 77 6f 72 6b 62 6f 6f 6b 20 3d 20 28 62 k *workbook = (b
1cc30 69 66 66 5f 77 6f 72 6b 62 6f 6f 6b 20 2a 29 20 iff_workbook *)
1cc40 78 6c 73 5f 68 61 6e 64 6c 65 3b 0a 20 20 20 20 xls_handle;.
1cc50 69 66 20 28 21 77 6f 72 6b 62 6f 6f 6b 29 0a 09 if (!workbook)..
1cc60 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f 4e 55 return FREEXL_NU
1cc70 4c 4c 5f 48 41 4e 44 4c 45 3b 0a 20 20 20 20 69 LL_HANDLE;. i
1cc80 66 20 28 21 76 61 6c 29 0a 09 72 65 74 75 72 6e f (!val)..return
1cc90 20 46 52 45 45 58 4c 5f 4e 55 4c 4c 5f 41 52 47 FREEXL_NULL_ARG
1cca0 55 4d 45 4e 54 3b 0a 20 20 20 20 69 66 20 28 77 UMENT;. if (w
1ccb0 6f 72 6b 62 6f 6f 6b 2d 3e 6d 61 67 69 63 31 20 orkbook->magic1
1ccc0 3d 3d 20 46 52 45 45 58 4c 5f 4d 41 47 49 43 5f == FREEXL_MAGIC_
1ccd0 53 54 41 52 54 0a 09 26 26 20 77 6f 72 6b 62 6f START..&& workbo
1cce0 6f 6b 2d 3e 6d 61 67 69 63 32 20 3d 3d 20 46 52 ok->magic2 == FR
1ccf0 45 45 58 4c 5f 4d 41 47 49 43 5f 45 4e 44 29 0a EEXL_MAGIC_END).
1cd00 09 3b 0a 20 20 20 20 65 6c 73 65 0a 09 72 65 74 .;. else..ret
1cd10 75 72 6e 20 46 52 45 45 58 4c 5f 49 4e 56 41 4c urn FREEXL_INVAL
1cd20 49 44 5f 48 41 4e 44 4c 45 3b 0a 0a 20 20 20 20 ID_HANDLE;..
1cd30 69 66 20 28 72 6f 77 20 3e 3d 20 77 6f 72 6b 62 if (row >= workb
1cd40 6f 6f 6b 2d 3e 61 63 74 69 76 65 5f 73 68 65 65 ook->active_shee
1cd50 74 2d 3e 72 6f 77 73 0a 09 7c 7c 20 63 6f 6c 75 t->rows..|| colu
1cd60 6d 6e 20 3e 3d 20 77 6f 72 6b 62 6f 6f 6b 2d 3e mn >= workbook->
1cd70 61 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 6f active_sheet->co
1cd80 6c 75 6d 6e 73 29 0a 09 72 65 74 75 72 6e 20 46 lumns)..return F
1cd90 52 45 45 58 4c 5f 49 4c 4c 45 47 41 4c 5f 43 45 REEXL_ILLEGAL_CE
1cda0 4c 4c 5f 52 4f 57 5f 43 4f 4c 3b 0a 20 20 20 20 LL_ROW_COL;.
1cdb0 69 66 20 28 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 if (workbook->ac
1cdc0 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c 6c tive_sheet->cell
1cdd0 5f 76 61 6c 75 65 73 20 3d 3d 20 4e 55 4c 4c 29 _values == NULL)
1cde0 0a 09 72 65 74 75 72 6e 20 46 52 45 45 58 4c 5f ..return FREEXL_
1cdf0 49 4c 4c 45 47 41 4c 5f 43 45 4c 4c 5f 52 4f 57 ILLEGAL_CELL_ROW
1ce00 5f 43 4f 4c 3b 0a 0a 20 20 20 20 70 5f 63 65 6c _COL;.. p_cel
1ce10 6c 20 3d 0a 09 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 l =..workbook->a
1ce20 63 74 69 76 65 5f 73 68 65 65 74 2d 3e 63 65 6c ctive_sheet->cel
1ce30 6c 5f 76 61 6c 75 65 73 20 2b 0a 09 28 72 6f 77 l_values +..(row
1ce40 20 2a 20 77 6f 72 6b 62 6f 6f 6b 2d 3e 61 63 74 * workbook->act
1ce50 69 76 65 5f 73 68 65 65 74 2d 3e 63 6f 6c 75 6d ive_sheet->colum
1ce60 6e 73 29 20 2b 20 63 6f 6c 75 6d 6e 3b 0a 2f 2a ns) + column;./*
1ce70 20 0a 2f 20 6b 69 6e 64 6c 79 20 63 6f 6e 74 72 ./ kindly contr
1ce80 69 62 75 74 65 64 20 62 79 20 42 72 61 64 20 48 ibuted by Brad H
1ce90 61 72 64 73 3a 20 32 30 31 31 2d 30 39 2d 30 33 ards: 2011-09-03
1cea0 0a 2f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e ./ this function
1ceb0 20 6e 6f 77 20 72 65 74 75 72 6e 20 74 68 65 20 now return the
1cec0 43 65 6c 6c 20 56 61 6c 75 65 20 75 73 69 6e 67 Cell Value using
1ced0 20 74 68 65 0a 2f 20 46 72 65 65 58 4c 5f 43 65 the./ FreeXL_Ce
1cee0 6c 6c 56 61 6c 75 65 20 6d 75 6c 74 69 2d 74 79 llValue multi-ty
1cef0 70 65 20 63 6f 6e 74 61 69 6e 65 72 20 0a 2a 2f pe container .*/
1cf00 0a 20 20 20 20 76 61 6c 2d 3e 74 79 70 65 20 3d . val->type =
1cf10 20 70 5f 63 65 6c 6c 2d 3e 74 79 70 65 3b 0a 20 p_cell->type;.
1cf20 20 20 20 73 77 69 74 63 68 20 28 70 5f 63 65 6c switch (p_cel
1cf30 6c 2d 3e 74 79 70 65 29 0a 20 20 20 20 20 20 7b l->type). {
1cf40 0a 20 20 20 20 20 20 63 61 73 65 20 46 52 45 45 . case FREE
1cf50 58 4c 5f 43 45 4c 4c 5f 49 4e 54 3a 0a 09 20 20 XL_CELL_INT:..
1cf60 76 61 6c 2d 3e 76 61 6c 75 65 2e 69 6e 74 5f 76 val->value.int_v
1cf70 61 6c 75 65 20 3d 20 70 5f 63 65 6c 6c 2d 3e 76 alue = p_cell->v
1cf80 61 6c 75 65 2e 69 6e 74 5f 76 61 6c 75 65 3b 0a alue.int_value;.
1cf90 09 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 . break;.
1cfa0 63 61 73 65 20 46 52 45 45 58 4c 5f 43 45 4c 4c case FREEXL_CELL
1cfb0 5f 44 4f 55 42 4c 45 3a 0a 09 20 20 76 61 6c 2d _DOUBLE:.. val-
1cfc0 3e 76 61 6c 75 65 2e 64 6f 75 62 6c 65 5f 76 61 >value.double_va
1cfd0 6c 75 65 20 3d 20 70 5f 63 65 6c 6c 2d 3e 76 61 lue = p_cell->va
1cfe0 6c 75 65 2e 64 62 6c 5f 76 61 6c 75 65 3b 0a 09 lue.dbl_value;..
1cff0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 break;. c
1d000 61 73 65 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f ase FREEXL_CELL_
1d010 44 41 54 45 3a 0a 20 20 20 20 20 20 63 61 73 65 DATE:. case
1d020 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 44 41 54 FREEXL_CELL_DAT
1d030 45 54 49 4d 45 3a 0a 20 20 20 20 20 20 63 61 73 ETIME:. cas
1d040 65 20 46 52 45 45 58 4c 5f 43 45 4c 4c 5f 54 49 e FREEXL_CELL_TI
1d050 4d 45 3a 0a 20 20 20 20 20 20 63 61 73 65 20 46 ME:. case F
1d060 52 45 45 58 4c 5f 43 45 4c 4c 5f 54 45 58 54 3a REEXL_CELL_TEXT:
1d070 0a 09 20 20 76 61 6c 2d 3e 76 61 6c 75 65 2e 74 .. val->value.t
1d080 65 78 74 5f 76 61 6c 75 65 20 3d 20 70 5f 63 65 ext_value = p_ce
1d090 6c 6c 2d 3e 76 61 6c 75 65 2e 74 65 78 74 5f 76 ll->value.text_v
1d0a0 61 6c 75 65 3b 0a 09 20 20 62 72 65 61 6b 3b 0a alue;.. break;.
1d0b0 20 20 20 20 20 20 63 61 73 65 20 46 52 45 45 58 case FREEX
1d0c0 4c 5f 43 45 4c 4c 5f 53 53 54 5f 54 45 58 54 3a L_CELL_SST_TEXT:
1d0d0 0a 09 20 20 76 61 6c 2d 3e 76 61 6c 75 65 2e 74 .. val->value.t
1d0e0 65 78 74 5f 76 61 6c 75 65 20 3d 20 70 5f 63 65 ext_value = p_ce
1d0f0 6c 6c 2d 3e 76 61 6c 75 65 2e 73 73 74 5f 76 61 ll->value.sst_va
1d100 6c 75 65 3b 0a 09 20 20 62 72 65 61 6b 3b 0a 20 lue;.. break;.
1d110 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 72 65 74 };.. ret
1d120 75 72 6e 20 46 52 45 45 58 4c 5f 4f 4b 3b 0a 7d urn FREEXL_OK;.}
1d130 0a .