/* * Extract XLM (Excel 4.0) macro source code for component MS Office Documents * * Copyright (C) 2020-2022 Cisco Systems, Inc. and/or its affiliates. All rights reserved. * * Authors: Jonas Zaddach * * This code is partly based on and inspired by plugin_biff from ole_dump (Didier Stevens) * https://github.com/DidierStevens/DidierStevensSuite/blob/master/plugin_biff.py * plugin_biff.py is public domain without copyright. * * See https://www.loc.gov/preservation/digital/formats/digformatspecs/Excel97-2007BinaryFileFormat(xls)Specification.pdf . * See https://www.openoffice.org/sc/excelfileformat.pdf * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include #include "fmap.h" #include "entconv.h" #include "xlm_extract.h" #define min(x, y) (((x) < (y)) ? (x) : (y)) typedef enum biff8_opcode { OPC_FORMULA = 0x06, OPC_NAME = 0x18, OPC_BOUNDSHEET = 0x85, OPC_STRING = 0x207, } biff8_opcode; // clang-format off const char *OPCODE_NAMES[] = { NULL, //0 NULL, //1 NULL, //2 NULL, //3 NULL, //4 NULL, //5 "FORMULA : Cell Formula", //6 NULL, //7 NULL, //8 NULL, //9 "EOF : End of File", //10 NULL, //11 "CALCCOUNT : Iteration Count", //12 "CALCMODE : Calculation Mode", //13 "PRECISION : Precision", //14 "REFMODE : Reference Mode", //15 "DELTA : Iteration Increment", //16 "ITERATION : Iteration Mode", //17 "PROTECT : Protection Flag", //18 "PASSWORD : Protection Password", //19 "HEADER : Print Header on Each Page", //20 "FOOTER : Print Footer on Each Page", //21 "EXTERNCOUNT : Number of External References", //22 "EXTERNSHEET : External Reference", //23 "LABEL : Cell Value, String Constant", //24 "WINDOWPROTECT : Windows Are Protected", //25 "VERTICALPAGEBREAKS : Explicit Column Page Breaks", //26 "HORIZONTALPAGEBREAKS : Explicit Row Page Breaks", //27 "NOTE : Comment Associated with a Cell", //28 "SELECTION : Current Selection", //29 NULL, //30 NULL, //31 NULL, //32 NULL, //33 "1904 : 1904 Date System", //34 NULL, //35 NULL, //36 NULL, //37 "LEFTMARGIN : Left Margin Measurement", //38 "RIGHTMARGIN : Right Margin Measurement", //39 "TOPMARGIN : Top Margin Measurement", //40 "BOTTOMMARGIN : Bottom Margin Measurement", //41 "PRINTHEADERS : Print Row/Column Labels", //42 "PRINTGRIDLINES : Print Gridlines Flag", //43 NULL, //44 NULL, //45 NULL, //46 "FILEPASS : File Is Password-Protected", //47 NULL, //48 NULL, //49 NULL, //50 NULL, //51 NULL, //52 NULL, //53 NULL, //54 NULL, //55 NULL, //56 NULL, //57 NULL, //58 NULL, //59 "CONTINUE : Continues Long Records", //60 "WINDOW1 : Window Information", //61 NULL, //62 NULL, //63 "BACKUP : Save Backup Version of the File", //64 "PANE : Number of Panes and Their Position", //65 "CODEPAGE : Default Code Page", //66 NULL, //67 NULL, //68 NULL, //69 NULL, //70 NULL, //71 NULL, //72 NULL, //73 NULL, //74 NULL, //75 NULL, //76 "PLS : Environment-Specific Print Record", //77 NULL, //78 NULL, //79 "DCON : Data Consolidation Information", //80 "DCONREF : Data Consolidation References", //81 "DCONNAME : Data Consolidation Named References", //82 NULL, //83 NULL, //84 "DEFCOLWIDTH : Default Width for Columns", //85 NULL, //86 NULL, //87 NULL, //88 "XCT : CRN Record Count", //89 "CRN : Nonresident Operands", //90 "FILESHARING : File-Sharing Information", //91 "WRITEACCESS : Write Access User Name", //92 "OBJ : Describes a Graphic Object", //93 "UNCALCED : Recalculation Status", //94 "SAVERECALC : Recalculate Before Save", //95 "TEMPLATE : Workbook Is a Template", //96 NULL, //97 NULL, //98 "OBJPROTECT : Objects Are Protected", //99 NULL, //100 NULL, //101 NULL, //102 NULL, //103 NULL, //104 NULL, //105 NULL, //106 NULL, //107 NULL, //108 NULL, //109 NULL, //110 NULL, //111 NULL, //112 NULL, //113 NULL, //114 NULL, //115 NULL, //116 NULL, //117 NULL, //118 NULL, //119 NULL, //120 NULL, //121 NULL, //122 NULL, //123 NULL, //124 "COLINFO : Column Formatting Information", //125 "RK : Cell Value, RK Number", //126 "IMDATA : Image Data", //127 "GUTS : Size of Row and Column Gutters", //128 "WSBOOL : Additional Workspace Information", //129 "GRIDSET : State Change of Gridlines Option", //130 "HCENTER : Center Between Horizontal Margins", //131 "VCENTER : Center Between Vertical Margins", //132 "BOUNDSHEET : Sheet Information", //133 "WRITEPROT : Workbook Is Write-Protected", //134 "ADDIN : Workbook Is an Add-in Macro", //135 "EDG : Edition Globals", //136 "PUB : Publisher", //137 NULL, //138 NULL, //139 "COUNTRY : Default Country and WIN.INI Country", //140 "HIDEOBJ : Object Display Options", //141 NULL, //142 NULL, //143 "SORT : Sorting Options", //144 "SUB : Subscriber", //145 "PALETTE : Color Palette Definition", //146 NULL, //147 "LHRECORD : .WK? File Conversion Information", //148 "LHNGRAPH : Named Graph Information", //149 "SOUND : Sound Note", //150 NULL, //151 "LPR : Sheet Was Printed Using LINE.PRINT(", //152 "STANDARDWIDTH : Standard Column Width", //153 "FNGROUPNAME : Function Group Name", //154 "FILTERMODE : Sheet Contains Filtered List", //155 "FNGROUPCOUNT : Built-in Function Group Count", //156 "AUTOFILTERINFO : Drop-Down Arrow Count", //157 "AUTOFILTER : AutoFilter Data", //158 NULL, //159 "SCL : Window Zoom Magnification", //160 "SETUP : Page Setup", //161 NULL, //162 NULL, //163 NULL, //164 NULL, //165 NULL, //166 NULL, //167 NULL, //168 "COORDLIST : Polygon Object Vertex Coordinates", //169 NULL, //170 "GCW : Global Column-Width Flags", //171 NULL, //172 NULL, //173 "SCENMAN : Scenario Output Data", //174 "SCENARIO : Scenario Data", //175 "SXVIEW : View Definition", //176 "SXVD : View Fields", //177 "SXVI : View Item", //178 NULL, //179 "SXIVD : Row/Column Field IDs", //180 "SXLI : Line Item Array", //181 "SXPI : Page Item", //182 NULL, //183 "DOCROUTE : Routing Slip Information", //184 "RECIPNAME : Recipient Name", //185 NULL, //186 NULL, //187 "SHRFMLA : Shared Formula", //188 "MULRK : Multiple RK Cells", //189 "MULBLANK : Multiple Blank Cells", //190 NULL, //191 NULL, //192 "MMS : ADDMENU / DELMENU Record Group Count", //193 "ADDMENU : Menu Addition", //194 "DELMENU : Menu Deletion", //195 NULL, //196 "SXDI : Data Item", //197 "SXDB : PivotTable Cache Data", //198 NULL, //199 NULL, //200 NULL, //201 NULL, //202 NULL, //203 NULL, //204 "SXSTRING : String", //205 NULL, //206 NULL, //207 "SXTBL : Multiple Consolidation Source Info", //208 "SXTBRGIITM : Page Item Name Count", //209 "SXTBPG : Page Item Indexes", //210 "OBPROJ : Visual Basic Project", //211 NULL, //212 "SXIDSTM : Stream ID", //213 "RSTRING : Cell with Character Formatting", //214 "DBCELL : Stream Offsets", //215 NULL, //216 NULL, //217 "BOOKBOOL : Workbook Option Flag", //218 NULL, //219 "SXEXT : External Source Information", //220 "SCENPROTECT : Scenario Protection", //221 "OLESIZE : Size of OLE Object", //222 "UDDESC : Description String for Chart Autoformat", //223 "XF : Extended Format", //224 "INTERFACEHDR : Beginning of User Interface Records", //225 "INTERFACEEND : End of User Interface Records", //226 "SXVS : View Source", //227 NULL, //228 "MERGECELLS : Merged Cells", //229 NULL, //230 NULL, //231 NULL, //232 NULL, //233 "TABIDCONF : Sheet Tab ID of Conflict History", //234 "MSODRAWINGGROUP : Microsoft Office Drawing Group", //235 "MSODRAWING : Microsoft Office Drawing", //236 "MSODRAWINGSELECTION : Microsoft Office Drawing Selection", //237 NULL, //238 NULL, //239 "SXRULE : PivotTable Rule Data", //240 "SXEX : PivotTable View Extended Information", //241 "SXFILT : PivotTable Rule Filter", //242 NULL, //243 "SXDXF : Pivot Table Formatting", //244 "SXITM : Pivot Table Item Indexes", //245 "SXNAME : PivotTable Name", //246 "SXSELECT : PivotTable Selection Information", //247 "SXPAIR : PivotTable Name Pair", //248 "SXFMLA : Pivot Table Parsed Expression", //249 NULL, //250 "SXFORMAT : PivotTable Format Record", //251 "SST : Shared String Table", //252 "LABELSST : Cell Value, String Constant/ SST", //253 NULL, //254 "EXTSST : Extended Shared String Table", //255 "SXVDEX : Extended PivotTable View Fields", //256 NULL, //257 NULL, //258 "SXFORMULA : PivotTable Formula Record", //259 NULL, //260 NULL, //261 NULL, //262 NULL, //263 NULL, //264 NULL, //265 NULL, //266 NULL, //267 NULL, //268 NULL, //269 NULL, //270 NULL, //271 NULL, //272 NULL, //273 NULL, //274 NULL, //275 NULL, //276 NULL, //277 NULL, //278 NULL, //279 NULL, //280 NULL, //281 NULL, //282 NULL, //283 NULL, //284 NULL, //285 NULL, //286 NULL, //287 NULL, //288 NULL, //289 "SXDBEX : PivotTable Cache Data", //290 NULL, //291 NULL, //292 NULL, //293 NULL, //294 NULL, //295 NULL, //296 NULL, //297 NULL, //298 NULL, //299 NULL, //300 NULL, //301 NULL, //302 NULL, //303 NULL, //304 NULL, //305 NULL, //306 NULL, //307 NULL, //308 NULL, //309 NULL, //310 NULL, //311 NULL, //312 NULL, //313 NULL, //314 NULL, //315 NULL, //316 "TABID : Sheet Tab Index Array", //317 NULL, //318 NULL, //319 NULL, //320 NULL, //321 NULL, //322 NULL, //323 NULL, //324 NULL, //325 NULL, //326 NULL, //327 NULL, //328 NULL, //329 NULL, //330 NULL, //331 NULL, //332 NULL, //333 NULL, //334 NULL, //335 NULL, //336 NULL, //337 NULL, //338 NULL, //339 NULL, //340 NULL, //341 NULL, //342 NULL, //343 NULL, //344 NULL, //345 NULL, //346 NULL, //347 NULL, //348 NULL, //349 NULL, //350 NULL, //351 "USESELFS : Natural Language Formulas Flag", //352 "DSF : Double Stream File", //353 "XL5MODIFY : Flag for DSF", //354 NULL, //355 NULL, //356 NULL, //357 NULL, //358 NULL, //359 NULL, //360 NULL, //361 NULL, //362 NULL, //363 NULL, //364 NULL, //365 NULL, //366 NULL, //367 NULL, //368 NULL, //369 NULL, //370 NULL, //371 NULL, //372 NULL, //373 NULL, //374 NULL, //375 NULL, //376 NULL, //377 NULL, //378 NULL, //379 NULL, //380 NULL, //381 NULL, //382 NULL, //383 NULL, //384 NULL, //385 NULL, //386 NULL, //387 NULL, //388 NULL, //389 NULL, //390 NULL, //391 NULL, //392 NULL, //393 NULL, //394 NULL, //395 NULL, //396 NULL, //397 NULL, //398 NULL, //399 NULL, //400 NULL, //401 NULL, //402 NULL, //403 NULL, //404 NULL, //405 NULL, //406 NULL, //407 NULL, //408 NULL, //409 NULL, //410 NULL, //411 NULL, //412 NULL, //413 NULL, //414 NULL, //415 NULL, //416 NULL, //417 NULL, //418 NULL, //419 NULL, //420 "FILESHARING2 : File-Sharing Information for Shared Lists", //421 NULL, //422 NULL, //423 NULL, //424 "USERBVIEW : Workbook Custom View Settings", //425 "USERSVIEWBEGIN : Custom View Settings", //426 "USERSVIEWEND : End of Custom View Records", //427 NULL, //428 "QSI : External Data Range", //429 "SUPBOOK : Supporting Workbook", //430 "PROT4REV : Shared Workbook Protection Flag", //431 "CONDFMT : Conditional Formatting Range Information", //432 "CF : Conditional Formatting Conditions", //433 "DVAL : Data Validation Information", //434 NULL, //435 NULL, //436 "DCONBIN : Data Consolidation Information", //437 "TXO : Text Object", //438 "REFRESHALL : Refresh Flag", //439 "HLINK : Hyperlink", //440 NULL, //441 NULL, //442 "SXFDBTYPE : SQL Datatype Identifier", //443 "PROT4REVPASS : Shared Workbook Protection Password", //444 NULL, //445 "DV : Data Validation Criteria", //446 NULL, //447 "EXCEL9FILE : Excel 9 File", //448 "RECALCID : Recalc Information", //449 NULL, //450 NULL, //451 NULL, //452 NULL, //453 NULL, //454 NULL, //455 NULL, //456 NULL, //457 NULL, //458 NULL, //459 NULL, //460 NULL, //461 NULL, //462 NULL, //463 NULL, //464 NULL, //465 NULL, //466 NULL, //467 NULL, //468 NULL, //469 NULL, //470 NULL, //471 NULL, //472 NULL, //473 NULL, //474 NULL, //475 NULL, //476 NULL, //477 NULL, //478 NULL, //479 NULL, //480 NULL, //481 NULL, //482 NULL, //483 NULL, //484 NULL, //485 NULL, //486 NULL, //487 NULL, //488 NULL, //489 NULL, //490 NULL, //491 NULL, //492 NULL, //493 NULL, //494 NULL, //495 NULL, //496 NULL, //497 NULL, //498 NULL, //499 NULL, //500 NULL, //501 NULL, //502 NULL, //503 NULL, //504 NULL, //505 NULL, //506 NULL, //507 NULL, //508 NULL, //509 NULL, //510 NULL, //511 "DIMENSIONS : Cell Table Size", //512 "BLANK : Cell Value, Blank Cell", //513 NULL, //514 "NUMBER : Cell Value, Floating-Point Number", //515 "LABEL : Cell Value, String Constant", //516 "BOOLERR : Cell Value, Boolean or Error", //517 NULL, //518 "STRING : String Value of a Formula", //519 "ROW : Describes a Row", //520 NULL, //521 NULL, //522 "INDEX : Index Record", //523 NULL, //524 NULL, //525 NULL, //526 NULL, //527 NULL, //528 NULL, //529 NULL, //530 NULL, //531 NULL, //532 NULL, //533 NULL, //534 NULL, //535 "NAME : Defined Name", //536 NULL, //537 NULL, //538 NULL, //539 NULL, //540 NULL, //541 NULL, //542 NULL, //543 NULL, //544 "ARRAY : Array-Entered Formula", //545 NULL, //546 "EXTERNNAME : Externally Referenced Name", //547 NULL, //548 "DEFAULTROWHEIGHT : Default Row Height", //549 NULL, //550 NULL, //551 NULL, //552 NULL, //553 NULL, //554 NULL, //555 NULL, //556 NULL, //557 NULL, //558 NULL, //559 NULL, //560 "FONT : Font Description", //561 NULL, //562 NULL, //563 NULL, //564 NULL, //565 "TABLE : Data Table", //566 NULL, //567 NULL, //568 NULL, //569 NULL, //570 NULL, //571 NULL, //572 NULL, //573 "WINDOW2 : Sheet Window Information", //574 NULL, //575 NULL, //576 NULL, //577 NULL, //578 NULL, //579 NULL, //580 NULL, //581 NULL, //582 NULL, //583 NULL, //584 NULL, //585 NULL, //586 NULL, //587 NULL, //588 NULL, //589 NULL, //590 NULL, //591 NULL, //592 NULL, //593 NULL, //594 NULL, //595 NULL, //596 NULL, //597 NULL, //598 NULL, //599 NULL, //600 NULL, //601 NULL, //602 NULL, //603 NULL, //604 NULL, //605 NULL, //606 NULL, //607 NULL, //608 NULL, //609 NULL, //610 NULL, //611 NULL, //612 NULL, //613 NULL, //614 NULL, //615 NULL, //616 NULL, //617 NULL, //618 NULL, //619 NULL, //620 NULL, //621 NULL, //622 NULL, //623 NULL, //624 NULL, //625 NULL, //626 NULL, //627 NULL, //628 NULL, //629 NULL, //630 NULL, //631 NULL, //632 NULL, //633 NULL, //634 NULL, //635 NULL, //636 NULL, //637 NULL, //638 NULL, //639 NULL, //640 NULL, //641 NULL, //642 NULL, //643 NULL, //644 NULL, //645 NULL, //646 NULL, //647 NULL, //648 NULL, //649 NULL, //650 NULL, //651 NULL, //652 NULL, //653 NULL, //654 NULL, //655 NULL, //656 NULL, //657 NULL, //658 "STYLE : Style Information", //659 NULL, //660 NULL, //661 NULL, //662 NULL, //663 NULL, //664 NULL, //665 NULL, //666 NULL, //667 NULL, //668 NULL, //669 NULL, //670 NULL, //671 NULL, //672 NULL, //673 NULL, //674 NULL, //675 NULL, //676 NULL, //677 NULL, //678 NULL, //679 NULL, //680 NULL, //681 NULL, //682 NULL, //683 NULL, //684 NULL, //685 NULL, //686 NULL, //687 NULL, //688 NULL, //689 NULL, //690 NULL, //691 NULL, //692 NULL, //693 NULL, //694 NULL, //695 NULL, //696 NULL, //697 NULL, //698 NULL, //699 NULL, //700 NULL, //701 NULL, //702 NULL, //703 NULL, //704 NULL, //705 NULL, //706 NULL, //707 NULL, //708 NULL, //709 NULL, //710 NULL, //711 NULL, //712 NULL, //713 NULL, //714 NULL, //715 NULL, //716 NULL, //717 NULL, //718 NULL, //719 NULL, //720 NULL, //721 NULL, //722 NULL, //723 NULL, //724 NULL, //725 NULL, //726 NULL, //727 NULL, //728 NULL, //729 NULL, //730 NULL, //731 NULL, //732 NULL, //733 NULL, //734 NULL, //735 NULL, //736 NULL, //737 NULL, //738 NULL, //739 NULL, //740 NULL, //741 NULL, //742 NULL, //743 NULL, //744 NULL, //745 NULL, //746 NULL, //747 NULL, //748 NULL, //749 NULL, //750 NULL, //751 NULL, //752 NULL, //753 NULL, //754 NULL, //755 NULL, //756 NULL, //757 NULL, //758 NULL, //759 NULL, //760 NULL, //761 NULL, //762 NULL, //763 NULL, //764 NULL, //765 NULL, //766 NULL, //767 NULL, //768 NULL, //769 NULL, //770 NULL, //771 NULL, //772 NULL, //773 NULL, //774 NULL, //775 NULL, //776 NULL, //777 NULL, //778 NULL, //779 NULL, //780 NULL, //781 NULL, //782 NULL, //783 NULL, //784 NULL, //785 NULL, //786 NULL, //787 NULL, //788 NULL, //789 NULL, //790 NULL, //791 NULL, //792 NULL, //793 NULL, //794 NULL, //795 NULL, //796 NULL, //797 NULL, //798 NULL, //799 NULL, //800 NULL, //801 NULL, //802 NULL, //803 NULL, //804 NULL, //805 NULL, //806 NULL, //807 NULL, //808 NULL, //809 NULL, //810 NULL, //811 NULL, //812 NULL, //813 NULL, //814 NULL, //815 NULL, //816 NULL, //817 NULL, //818 NULL, //819 NULL, //820 NULL, //821 NULL, //822 NULL, //823 NULL, //824 NULL, //825 NULL, //826 NULL, //827 NULL, //828 NULL, //829 NULL, //830 NULL, //831 NULL, //832 NULL, //833 NULL, //834 NULL, //835 NULL, //836 NULL, //837 NULL, //838 NULL, //839 NULL, //840 NULL, //841 NULL, //842 NULL, //843 NULL, //844 NULL, //845 NULL, //846 NULL, //847 NULL, //848 NULL, //849 NULL, //850 NULL, //851 NULL, //852 NULL, //853 NULL, //854 NULL, //855 NULL, //856 NULL, //857 NULL, //858 NULL, //859 NULL, //860 NULL, //861 NULL, //862 NULL, //863 NULL, //864 NULL, //865 NULL, //866 NULL, //867 NULL, //868 NULL, //869 NULL, //870 NULL, //871 NULL, //872 NULL, //873 NULL, //874 NULL, //875 NULL, //876 NULL, //877 NULL, //878 NULL, //879 NULL, //880 NULL, //881 NULL, //882 NULL, //883 NULL, //884 NULL, //885 NULL, //886 NULL, //887 NULL, //888 NULL, //889 NULL, //890 NULL, //891 NULL, //892 NULL, //893 NULL, //894 NULL, //895 NULL, //896 NULL, //897 NULL, //898 NULL, //899 NULL, //900 NULL, //901 NULL, //902 NULL, //903 NULL, //904 NULL, //905 NULL, //906 NULL, //907 NULL, //908 NULL, //909 NULL, //910 NULL, //911 NULL, //912 NULL, //913 NULL, //914 NULL, //915 NULL, //916 NULL, //917 NULL, //918 NULL, //919 NULL, //920 NULL, //921 NULL, //922 NULL, //923 NULL, //924 NULL, //925 NULL, //926 NULL, //927 NULL, //928 NULL, //929 NULL, //930 NULL, //931 NULL, //932 NULL, //933 NULL, //934 NULL, //935 NULL, //936 NULL, //937 NULL, //938 NULL, //939 NULL, //940 NULL, //941 NULL, //942 NULL, //943 NULL, //944 NULL, //945 NULL, //946 NULL, //947 NULL, //948 NULL, //949 NULL, //950 NULL, //951 NULL, //952 NULL, //953 NULL, //954 NULL, //955 NULL, //956 NULL, //957 NULL, //958 NULL, //959 NULL, //960 NULL, //961 NULL, //962 NULL, //963 NULL, //964 NULL, //965 NULL, //966 NULL, //967 NULL, //968 NULL, //969 NULL, //970 NULL, //971 NULL, //972 NULL, //973 NULL, //974 NULL, //975 NULL, //976 NULL, //977 NULL, //978 NULL, //979 NULL, //980 NULL, //981 NULL, //982 NULL, //983 NULL, //984 NULL, //985 NULL, //986 NULL, //987 NULL, //988 NULL, //989 NULL, //990 NULL, //991 NULL, //992 NULL, //993 NULL, //994 NULL, //995 NULL, //996 NULL, //997 NULL, //998 NULL, //999 NULL, //1000 NULL, //1001 NULL, //1002 NULL, //1003 NULL, //1004 NULL, //1005 NULL, //1006 NULL, //1007 NULL, //1008 NULL, //1009 NULL, //1010 NULL, //1011 NULL, //1012 NULL, //1013 NULL, //1014 NULL, //1015 NULL, //1016 NULL, //1017 NULL, //1018 NULL, //1019 NULL, //1020 NULL, //1021 NULL, //1022 NULL, //1023 NULL, //1024 NULL, //1025 NULL, //1026 NULL, //1027 NULL, //1028 NULL, //1029 "FORMULA : Cell Formula", //1030 NULL, //1031 NULL, //1032 NULL, //1033 NULL, //1034 NULL, //1035 NULL, //1036 NULL, //1037 NULL, //1038 NULL, //1039 NULL, //1040 NULL, //1041 NULL, //1042 NULL, //1043 NULL, //1044 NULL, //1045 NULL, //1046 NULL, //1047 NULL, //1048 NULL, //1049 NULL, //1050 NULL, //1051 NULL, //1052 NULL, //1053 "FORMAT : Number Format", //1054 NULL, //1055 NULL, //1056 NULL, //1057 NULL, //1058 NULL, //1059 NULL, //1060 NULL, //1061 NULL, //1062 NULL, //1063 NULL, //1064 NULL, //1065 NULL, //1066 NULL, //1067 NULL, //1068 NULL, //1069 NULL, //1070 NULL, //1071 NULL, //1072 NULL, //1073 NULL, //1074 NULL, //1075 NULL, //1076 NULL, //1077 NULL, //1078 NULL, //1079 NULL, //1080 NULL, //1081 NULL, //1082 NULL, //1083 NULL, //1084 NULL, //1085 NULL, //1086 NULL, //1087 NULL, //1088 NULL, //1089 NULL, //1090 NULL, //1091 NULL, //1092 NULL, //1093 NULL, //1094 NULL, //1095 NULL, //1096 NULL, //1097 NULL, //1098 NULL, //1099 NULL, //1100 NULL, //1101 NULL, //1102 NULL, //1103 NULL, //1104 NULL, //1105 NULL, //1106 NULL, //1107 NULL, //1108 NULL, //1109 NULL, //1110 NULL, //1111 NULL, //1112 NULL, //1113 NULL, //1114 NULL, //1115 NULL, //1116 NULL, //1117 NULL, //1118 NULL, //1119 NULL, //1120 NULL, //1121 NULL, //1122 NULL, //1123 NULL, //1124 NULL, //1125 NULL, //1126 NULL, //1127 NULL, //1128 NULL, //1129 NULL, //1130 NULL, //1131 NULL, //1132 NULL, //1133 NULL, //1134 NULL, //1135 NULL, //1136 NULL, //1137 NULL, //1138 NULL, //1139 NULL, //1140 NULL, //1141 NULL, //1142 NULL, //1143 NULL, //1144 NULL, //1145 NULL, //1146 NULL, //1147 NULL, //1148 NULL, //1149 NULL, //1150 NULL, //1151 NULL, //1152 NULL, //1153 NULL, //1154 NULL, //1155 NULL, //1156 NULL, //1157 NULL, //1158 NULL, //1159 NULL, //1160 NULL, //1161 NULL, //1162 NULL, //1163 NULL, //1164 NULL, //1165 NULL, //1166 NULL, //1167 NULL, //1168 NULL, //1169 NULL, //1170 NULL, //1171 NULL, //1172 NULL, //1173 NULL, //1174 NULL, //1175 NULL, //1176 NULL, //1177 NULL, //1178 NULL, //1179 NULL, //1180 NULL, //1181 NULL, //1182 NULL, //1183 NULL, //1184 NULL, //1185 NULL, //1186 NULL, //1187 NULL, //1188 NULL, //1189 NULL, //1190 NULL, //1191 NULL, //1192 NULL, //1193 NULL, //1194 NULL, //1195 NULL, //1196 NULL, //1197 NULL, //1198 NULL, //1199 NULL, //1200 NULL, //1201 NULL, //1202 NULL, //1203 NULL, //1204 NULL, //1205 NULL, //1206 NULL, //1207 NULL, //1208 NULL, //1209 NULL, //1210 NULL, //1211 NULL, //1212 NULL, //1213 NULL, //1214 NULL, //1215 NULL, //1216 NULL, //1217 NULL, //1218 NULL, //1219 NULL, //1220 NULL, //1221 NULL, //1222 NULL, //1223 NULL, //1224 NULL, //1225 NULL, //1226 NULL, //1227 NULL, //1228 NULL, //1229 NULL, //1230 NULL, //1231 NULL, //1232 NULL, //1233 NULL, //1234 NULL, //1235 NULL, //1236 NULL, //1237 NULL, //1238 NULL, //1239 NULL, //1240 NULL, //1241 NULL, //1242 NULL, //1243 NULL, //1244 NULL, //1245 NULL, //1246 NULL, //1247 NULL, //1248 NULL, //1249 NULL, //1250 NULL, //1251 NULL, //1252 NULL, //1253 NULL, //1254 NULL, //1255 NULL, //1256 NULL, //1257 NULL, //1258 NULL, //1259 NULL, //1260 NULL, //1261 NULL, //1262 NULL, //1263 NULL, //1264 NULL, //1265 NULL, //1266 NULL, //1267 NULL, //1268 NULL, //1269 NULL, //1270 NULL, //1271 NULL, //1272 NULL, //1273 NULL, //1274 NULL, //1275 NULL, //1276 NULL, //1277 NULL, //1278 NULL, //1279 NULL, //1280 NULL, //1281 NULL, //1282 NULL, //1283 NULL, //1284 NULL, //1285 NULL, //1286 NULL, //1287 NULL, //1288 NULL, //1289 NULL, //1290 NULL, //1291 NULL, //1292 NULL, //1293 NULL, //1294 NULL, //1295 NULL, //1296 NULL, //1297 NULL, //1298 NULL, //1299 NULL, //1300 NULL, //1301 NULL, //1302 NULL, //1303 NULL, //1304 NULL, //1305 NULL, //1306 NULL, //1307 NULL, //1308 NULL, //1309 NULL, //1310 NULL, //1311 NULL, //1312 NULL, //1313 NULL, //1314 NULL, //1315 NULL, //1316 NULL, //1317 NULL, //1318 NULL, //1319 NULL, //1320 NULL, //1321 NULL, //1322 NULL, //1323 NULL, //1324 NULL, //1325 NULL, //1326 NULL, //1327 NULL, //1328 NULL, //1329 NULL, //1330 NULL, //1331 NULL, //1332 NULL, //1333 NULL, //1334 NULL, //1335 NULL, //1336 NULL, //1337 NULL, //1338 NULL, //1339 NULL, //1340 NULL, //1341 NULL, //1342 NULL, //1343 NULL, //1344 NULL, //1345 NULL, //1346 NULL, //1347 NULL, //1348 NULL, //1349 NULL, //1350 NULL, //1351 NULL, //1352 NULL, //1353 NULL, //1354 NULL, //1355 NULL, //1356 NULL, //1357 NULL, //1358 NULL, //1359 NULL, //1360 NULL, //1361 NULL, //1362 NULL, //1363 NULL, //1364 NULL, //1365 NULL, //1366 NULL, //1367 NULL, //1368 NULL, //1369 NULL, //1370 NULL, //1371 NULL, //1372 NULL, //1373 NULL, //1374 NULL, //1375 NULL, //1376 NULL, //1377 NULL, //1378 NULL, //1379 NULL, //1380 NULL, //1381 NULL, //1382 NULL, //1383 NULL, //1384 NULL, //1385 NULL, //1386 NULL, //1387 NULL, //1388 NULL, //1389 NULL, //1390 NULL, //1391 NULL, //1392 NULL, //1393 NULL, //1394 NULL, //1395 NULL, //1396 NULL, //1397 NULL, //1398 NULL, //1399 NULL, //1400 NULL, //1401 NULL, //1402 NULL, //1403 NULL, //1404 NULL, //1405 NULL, //1406 NULL, //1407 NULL, //1408 NULL, //1409 NULL, //1410 NULL, //1411 NULL, //1412 NULL, //1413 NULL, //1414 NULL, //1415 NULL, //1416 NULL, //1417 NULL, //1418 NULL, //1419 NULL, //1420 NULL, //1421 NULL, //1422 NULL, //1423 NULL, //1424 NULL, //1425 NULL, //1426 NULL, //1427 NULL, //1428 NULL, //1429 NULL, //1430 NULL, //1431 NULL, //1432 NULL, //1433 NULL, //1434 NULL, //1435 NULL, //1436 NULL, //1437 NULL, //1438 NULL, //1439 NULL, //1440 NULL, //1441 NULL, //1442 NULL, //1443 NULL, //1444 NULL, //1445 NULL, //1446 NULL, //1447 NULL, //1448 NULL, //1449 NULL, //1450 NULL, //1451 NULL, //1452 NULL, //1453 NULL, //1454 NULL, //1455 NULL, //1456 NULL, //1457 NULL, //1458 NULL, //1459 NULL, //1460 NULL, //1461 NULL, //1462 NULL, //1463 NULL, //1464 NULL, //1465 NULL, //1466 NULL, //1467 NULL, //1468 NULL, //1469 NULL, //1470 NULL, //1471 NULL, //1472 NULL, //1473 NULL, //1474 NULL, //1475 NULL, //1476 NULL, //1477 NULL, //1478 NULL, //1479 NULL, //1480 NULL, //1481 NULL, //1482 NULL, //1483 NULL, //1484 NULL, //1485 NULL, //1486 NULL, //1487 NULL, //1488 NULL, //1489 NULL, //1490 NULL, //1491 NULL, //1492 NULL, //1493 NULL, //1494 NULL, //1495 NULL, //1496 NULL, //1497 NULL, //1498 NULL, //1499 NULL, //1500 NULL, //1501 NULL, //1502 NULL, //1503 NULL, //1504 NULL, //1505 NULL, //1506 NULL, //1507 NULL, //1508 NULL, //1509 NULL, //1510 NULL, //1511 NULL, //1512 NULL, //1513 NULL, //1514 NULL, //1515 NULL, //1516 NULL, //1517 NULL, //1518 NULL, //1519 NULL, //1520 NULL, //1521 NULL, //1522 NULL, //1523 NULL, //1524 NULL, //1525 NULL, //1526 NULL, //1527 NULL, //1528 NULL, //1529 NULL, //1530 NULL, //1531 NULL, //1532 NULL, //1533 NULL, //1534 NULL, //1535 NULL, //1536 NULL, //1537 NULL, //1538 NULL, //1539 NULL, //1540 NULL, //1541 NULL, //1542 NULL, //1543 NULL, //1544 NULL, //1545 NULL, //1546 NULL, //1547 NULL, //1548 NULL, //1549 NULL, //1550 NULL, //1551 NULL, //1552 NULL, //1553 NULL, //1554 NULL, //1555 NULL, //1556 NULL, //1557 NULL, //1558 NULL, //1559 NULL, //1560 NULL, //1561 NULL, //1562 NULL, //1563 NULL, //1564 NULL, //1565 NULL, //1566 NULL, //1567 NULL, //1568 NULL, //1569 NULL, //1570 NULL, //1571 NULL, //1572 NULL, //1573 NULL, //1574 NULL, //1575 NULL, //1576 NULL, //1577 NULL, //1578 NULL, //1579 NULL, //1580 NULL, //1581 NULL, //1582 NULL, //1583 NULL, //1584 NULL, //1585 NULL, //1586 NULL, //1587 NULL, //1588 NULL, //1589 NULL, //1590 NULL, //1591 NULL, //1592 NULL, //1593 NULL, //1594 NULL, //1595 NULL, //1596 NULL, //1597 NULL, //1598 NULL, //1599 NULL, //1600 NULL, //1601 NULL, //1602 NULL, //1603 NULL, //1604 NULL, //1605 NULL, //1606 NULL, //1607 NULL, //1608 NULL, //1609 NULL, //1610 NULL, //1611 NULL, //1612 NULL, //1613 NULL, //1614 NULL, //1615 NULL, //1616 NULL, //1617 NULL, //1618 NULL, //1619 NULL, //1620 NULL, //1621 NULL, //1622 NULL, //1623 NULL, //1624 NULL, //1625 NULL, //1626 NULL, //1627 NULL, //1628 NULL, //1629 NULL, //1630 NULL, //1631 NULL, //1632 NULL, //1633 NULL, //1634 NULL, //1635 NULL, //1636 NULL, //1637 NULL, //1638 NULL, //1639 NULL, //1640 NULL, //1641 NULL, //1642 NULL, //1643 NULL, //1644 NULL, //1645 NULL, //1646 NULL, //1647 NULL, //1648 NULL, //1649 NULL, //1650 NULL, //1651 NULL, //1652 NULL, //1653 NULL, //1654 NULL, //1655 NULL, //1656 NULL, //1657 NULL, //1658 NULL, //1659 NULL, //1660 NULL, //1661 NULL, //1662 NULL, //1663 NULL, //1664 NULL, //1665 NULL, //1666 NULL, //1667 NULL, //1668 NULL, //1669 NULL, //1670 NULL, //1671 NULL, //1672 NULL, //1673 NULL, //1674 NULL, //1675 NULL, //1676 NULL, //1677 NULL, //1678 NULL, //1679 NULL, //1680 NULL, //1681 NULL, //1682 NULL, //1683 NULL, //1684 NULL, //1685 NULL, //1686 NULL, //1687 NULL, //1688 NULL, //1689 NULL, //1690 NULL, //1691 NULL, //1692 NULL, //1693 NULL, //1694 NULL, //1695 NULL, //1696 NULL, //1697 NULL, //1698 NULL, //1699 NULL, //1700 NULL, //1701 NULL, //1702 NULL, //1703 NULL, //1704 NULL, //1705 NULL, //1706 NULL, //1707 NULL, //1708 NULL, //1709 NULL, //1710 NULL, //1711 NULL, //1712 NULL, //1713 NULL, //1714 NULL, //1715 NULL, //1716 NULL, //1717 NULL, //1718 NULL, //1719 NULL, //1720 NULL, //1721 NULL, //1722 NULL, //1723 NULL, //1724 NULL, //1725 NULL, //1726 NULL, //1727 NULL, //1728 NULL, //1729 NULL, //1730 NULL, //1731 NULL, //1732 NULL, //1733 NULL, //1734 NULL, //1735 NULL, //1736 NULL, //1737 NULL, //1738 NULL, //1739 NULL, //1740 NULL, //1741 NULL, //1742 NULL, //1743 NULL, //1744 NULL, //1745 NULL, //1746 NULL, //1747 NULL, //1748 NULL, //1749 NULL, //1750 NULL, //1751 NULL, //1752 NULL, //1753 NULL, //1754 NULL, //1755 NULL, //1756 NULL, //1757 NULL, //1758 NULL, //1759 NULL, //1760 NULL, //1761 NULL, //1762 NULL, //1763 NULL, //1764 NULL, //1765 NULL, //1766 NULL, //1767 NULL, //1768 NULL, //1769 NULL, //1770 NULL, //1771 NULL, //1772 NULL, //1773 NULL, //1774 NULL, //1775 NULL, //1776 NULL, //1777 NULL, //1778 NULL, //1779 NULL, //1780 NULL, //1781 NULL, //1782 NULL, //1783 NULL, //1784 NULL, //1785 NULL, //1786 NULL, //1787 NULL, //1788 NULL, //1789 NULL, //1790 NULL, //1791 NULL, //1792 NULL, //1793 NULL, //1794 NULL, //1795 NULL, //1796 NULL, //1797 NULL, //1798 NULL, //1799 NULL, //1800 NULL, //1801 NULL, //1802 NULL, //1803 NULL, //1804 NULL, //1805 NULL, //1806 NULL, //1807 NULL, //1808 NULL, //1809 NULL, //1810 NULL, //1811 NULL, //1812 NULL, //1813 NULL, //1814 NULL, //1815 NULL, //1816 NULL, //1817 NULL, //1818 NULL, //1819 NULL, //1820 NULL, //1821 NULL, //1822 NULL, //1823 NULL, //1824 NULL, //1825 NULL, //1826 NULL, //1827 NULL, //1828 NULL, //1829 NULL, //1830 NULL, //1831 NULL, //1832 NULL, //1833 NULL, //1834 NULL, //1835 NULL, //1836 NULL, //1837 NULL, //1838 NULL, //1839 NULL, //1840 NULL, //1841 NULL, //1842 NULL, //1843 NULL, //1844 NULL, //1845 NULL, //1846 NULL, //1847 NULL, //1848 NULL, //1849 NULL, //1850 NULL, //1851 NULL, //1852 NULL, //1853 NULL, //1854 NULL, //1855 NULL, //1856 NULL, //1857 NULL, //1858 NULL, //1859 NULL, //1860 NULL, //1861 NULL, //1862 NULL, //1863 NULL, //1864 NULL, //1865 NULL, //1866 NULL, //1867 NULL, //1868 NULL, //1869 NULL, //1870 NULL, //1871 NULL, //1872 NULL, //1873 NULL, //1874 NULL, //1875 NULL, //1876 NULL, //1877 NULL, //1878 NULL, //1879 NULL, //1880 NULL, //1881 NULL, //1882 NULL, //1883 NULL, //1884 NULL, //1885 NULL, //1886 NULL, //1887 NULL, //1888 NULL, //1889 NULL, //1890 NULL, //1891 NULL, //1892 NULL, //1893 NULL, //1894 NULL, //1895 NULL, //1896 NULL, //1897 NULL, //1898 NULL, //1899 NULL, //1900 NULL, //1901 NULL, //1902 NULL, //1903 NULL, //1904 NULL, //1905 NULL, //1906 NULL, //1907 NULL, //1908 NULL, //1909 NULL, //1910 NULL, //1911 NULL, //1912 NULL, //1913 NULL, //1914 NULL, //1915 NULL, //1916 NULL, //1917 NULL, //1918 NULL, //1919 NULL, //1920 NULL, //1921 NULL, //1922 NULL, //1923 NULL, //1924 NULL, //1925 NULL, //1926 NULL, //1927 NULL, //1928 NULL, //1929 NULL, //1930 NULL, //1931 NULL, //1932 NULL, //1933 NULL, //1934 NULL, //1935 NULL, //1936 NULL, //1937 NULL, //1938 NULL, //1939 NULL, //1940 NULL, //1941 NULL, //1942 NULL, //1943 NULL, //1944 NULL, //1945 NULL, //1946 NULL, //1947 NULL, //1948 NULL, //1949 NULL, //1950 NULL, //1951 NULL, //1952 NULL, //1953 NULL, //1954 NULL, //1955 NULL, //1956 NULL, //1957 NULL, //1958 NULL, //1959 NULL, //1960 NULL, //1961 NULL, //1962 NULL, //1963 NULL, //1964 NULL, //1965 NULL, //1966 NULL, //1967 NULL, //1968 NULL, //1969 NULL, //1970 NULL, //1971 NULL, //1972 NULL, //1973 NULL, //1974 NULL, //1975 NULL, //1976 NULL, //1977 NULL, //1978 NULL, //1979 NULL, //1980 NULL, //1981 NULL, //1982 NULL, //1983 NULL, //1984 NULL, //1985 NULL, //1986 NULL, //1987 NULL, //1988 NULL, //1989 NULL, //1990 NULL, //1991 NULL, //1992 NULL, //1993 NULL, //1994 NULL, //1995 NULL, //1996 NULL, //1997 NULL, //1998 NULL, //1999 NULL, //2000 NULL, //2001 NULL, //2002 NULL, //2003 NULL, //2004 NULL, //2005 NULL, //2006 NULL, //2007 NULL, //2008 NULL, //2009 NULL, //2010 NULL, //2011 NULL, //2012 NULL, //2013 NULL, //2014 NULL, //2015 NULL, //2016 NULL, //2017 NULL, //2018 NULL, //2019 NULL, //2020 NULL, //2021 NULL, //2022 NULL, //2023 NULL, //2024 NULL, //2025 NULL, //2026 NULL, //2027 NULL, //2028 NULL, //2029 NULL, //2030 NULL, //2031 NULL, //2032 NULL, //2033 NULL, //2034 NULL, //2035 NULL, //2036 NULL, //2037 NULL, //2038 NULL, //2039 NULL, //2040 NULL, //2041 NULL, //2042 NULL, //2043 NULL, //2044 NULL, //2045 NULL, //2046 NULL, //2047 "HLINKTOOLTIP : Hyperlink Tooltip", //2048 "WEBPUB : Web Publish Item", //2049 "QSISXTAG : PivotTable and Query Table Extensions", //2050 "DBQUERYEXT : Database Query Extensions", //2051 "EXTSTRING : FRT String", //2052 "TXTQUERY : Text Query Information", //2053 "QSIR : Query Table Formatting", //2054 "QSIF : Query Table Field Formatting", //2055 NULL, //2056 "BOF : Beginning of File", //2057 "OLEDBCONN : OLE Database Connection", //2058 "WOPT : Web Options", //2059 "SXVIEWEX : Pivot Table OLAP Extensions", //2060 "SXTH : PivotTable OLAP Hierarchy", //2061 "SXPIEX : OLAP Page Item Extensions", //2062 "SXVDTEX : View Dimension OLAP Extensions", //2063 "SXVIEWEX9 : Pivot Table Extensions", //2064 NULL, //2065 "CONTINUEFRT : Continued FRT", //2066 "REALTIMEDATA : Real-Time Data (RTD)", //2067 NULL, //2068 NULL, //2069 NULL, //2070 NULL, //2071 NULL, //2072 NULL, //2073 NULL, //2074 NULL, //2075 NULL, //2076 NULL, //2077 NULL, //2078 NULL, //2079 NULL, //2080 NULL, //2081 NULL, //2082 NULL, //2083 NULL, //2084 NULL, //2085 NULL, //2086 NULL, //2087 NULL, //2088 NULL, //2089 NULL, //2090 NULL, //2091 NULL, //2092 NULL, //2093 NULL, //2094 NULL, //2095 NULL, //2096 NULL, //2097 NULL, //2098 NULL, //2099 NULL, //2100 NULL, //2101 NULL, //2102 NULL, //2103 NULL, //2104 NULL, //2105 NULL, //2106 NULL, //2107 NULL, //2108 NULL, //2109 NULL, //2110 NULL, //2111 NULL, //2112 NULL, //2113 NULL, //2114 NULL, //2115 NULL, //2116 NULL, //2117 NULL, //2118 NULL, //2119 NULL, //2120 NULL, //2121 NULL, //2122 NULL, //2123 NULL, //2124 NULL, //2125 NULL, //2126 NULL, //2127 NULL, //2128 NULL, //2129 NULL, //2130 NULL, //2131 NULL, //2132 NULL, //2133 NULL, //2134 NULL, //2135 NULL, //2136 NULL, //2137 NULL, //2138 NULL, //2139 NULL, //2140 NULL, //2141 NULL, //2142 NULL, //2143 NULL, //2144 NULL, //2145 "SHEETEXT : Extra Sheet Info", //2146 "BOOKEXT : Extra Book Info", //2147 "SXADDL : Pivot Table Additional Info", //2148 "CRASHRECERR : Crash Recovery Error", //2149 "HFPicture : Header / Footer Picture", //2150 "FEATHEADR : Shared Feature Header", //2151 "FEAT : Shared Feature Record", //2152 NULL, //2153 "DATALABEXT : Chart Data Label Extension", //2154 "DATALABEXTCONTENTS : Chart Data Label Extension Contents", //2155 "CELLWATCH : Cell Watch", //2156 "FEATINFO : Shared Feature Info Record", //2157 NULL, //2158 NULL, //2159 NULL, //2160 "FEATHEADR11 : Shared Feature Header 11", //2161 "FEAT11 : Shared Feature 11 Record", //2162 "FEATINFO11 : Shared Feature Info 11 Record", //2163 "DROPDOWNOBJIDS : Drop Down Object", //2164 "CONTINUEFRT11 : Continue FRT 11", //2165 "DCONN : Data Connection", //2166 "LIST12 : Extra Table Data Introduced in Excel 2007", //2167 "FEAT12 : Shared Feature 12 Record", //2168 "CONDFMT12 : Conditional Formatting Range Information 12", //2169 "CF12 : Conditional Formatting Condition 12", //2170 "CFEX : Conditional Formatting Extension", //2171 "XFCRC : XF Extensions Checksum", //2172 "XFEXT : XF Extension", //2173 "EZFILTER12 : AutoFilter Data Introduced in Excel 2007", //2174 "CONTINUEFRT12 : Continue FRT 12", //2175 NULL, //2176 "SXADDL12 : Additional Workbook Connections Information", //2177 NULL, //2178 NULL, //2179 "MDTINFO : Information about a Metadata Type", //2180 "MDXSTR : MDX Metadata String", //2181 "MDXTUPLE : Tuple MDX Metadata", //2182 "MDXSET : Set MDX Metadata", //2183 "MDXPROP : Member Property MDX Metadata", //2184 "MDXKPI : Key Performance Indicator MDX Metadata", //2185 "MDTB : Block of Metadata Records", //2186 "PLV : Page Layout View Settings in Excel 2007", //2187 "COMPAT12 : Compatibility Checker 12", //2188 "DXF : Differential XF", //2189 "TABLESTYLES : Table Styles", //2190 "TABLESTYLE : Table Style", //2191 "TABLESTYLEELEMENT : Table Style Element", //2192 NULL, //2193 "STYLEEXT : Named Cell Style Extension", //2194 "NAMEPUBLISH : Publish To Excel Server Data for Name", //2195 "NAMECMT : Name Comment", //2196 "SORTDATA12 : Sort Data 12", //2197 "THEME : Theme", //2198 "GUIDTYPELIB : VB Project Typelib GUID", //2199 "FNGRP12 : Function Group", //2200 "NAMEFNGRP12 : Extra Function Group", //2201 "MTRSETTINGS : Multi-Threaded Calculation Settings", //2202 "COMPRESSPICTURES : Automatic Picture Compression Mode", //2203 "HEADERFOOTER : Header Footer", //2204 NULL, //2205 NULL, //2206 NULL, //2207 NULL, //2208 NULL, //2209 NULL, //2210 "FORCEFULLCALCULATION : Force Full Calculation Settings", //2211 NULL, //2212 NULL, //2213 NULL, //2214 NULL, //2215 NULL, //2216 NULL, //2217 NULL, //2218 NULL, //2219 NULL, //2220 NULL, //2221 NULL, //2222 NULL, //2223 NULL, //2224 NULL, //2225 NULL, //2226 NULL, //2227 NULL, //2228 NULL, //2229 NULL, //2230 NULL, //2231 NULL, //2232 NULL, //2233 NULL, //2234 NULL, //2235 NULL, //2236 NULL, //2237 NULL, //2238 NULL, //2239 NULL, //2240 "LISTOBJ : List Object", //2241 "LISTFIELD : List Field", //2242 "LISTDV : List Data Validation", //2243 "LISTCONDFMT : List Conditional Formatting", //2244 "LISTCF : List Cell Formatting", //2245 "FMQRY : Filemaker queries", //2246 "FMSQRY : File maker queries", //2247 "PLV : Page Layout View in Mac Excel 11", //2248 "LNEXT : Extension information for borders in Mac Office 11", //2249 "MKREXT : Extension information for markers in Mac Office 11",//2250 }; char *FUNCTIONS[] = { "COUNT", //0 "IF", //1 "ISNA", //2 "ISERROR", //3 "SUM", //4 "AVERAGE", //5 "MIN", //6 "MAX", //7 "ROW", //8 "COLUMN", //9 "NA", //10 "NPV", //11 "STDEV", //12 "DOLLAR", //13 "FIXED", //14 "SIN", //15 "COS", //16 "TAN", //17 "ATAN", //18 "PI", //19 "SQRT", //20 "EXP", //21 "LN", //22 "LOG10", //23 "ABS", //24 "INT", //25 "SIGN", //26 "ROUND", //27 "LOOKUP", //28 "INDEX", //29 "REPT", //30 "MID", //31 "LEN", //32 "VALUE", //33 "TRUE", //34 "FALSE", //35 "AND", //36 "OR", //37 "NOT", //38 "MOD", //39 "DCOUNT", //40 "DSUM", //41 "DAVERAGE", //42 "DMIN", //43 "DMAX", //44 "DSTDEV", //45 "VAR", //46 "DVAR", //47 "TEXT", //48 "LINEST", //49 "TREND", //50 "LOGEST", //51 "GROWTH", //52 "GOTO", //53 "HALT", //54 "RETURN", //55 "PV", //56 "FV", //57 "NPER", //58 "PMT", //59 "RATE", //60 "MIRR", //61 "IRR", //62 "RAND", //63 "MATCH", //64 "DATE", //65 "TIME", //66 "DAY", //67 "MONTH", //68 "YEAR", //69 "WEEKDAY", //70 "HOUR", //71 "MINUTE", //72 "SECOND", //73 "NOW", //74 "AREAS", //75 "ROWS", //76 "COLUMNS", //77 "OFFSET", //78 "ABSREF", //79 "RELREF", //80 "ARGUMENT", //81 "SEARCH", //82 "TRANSPOSE", //83 "ERROR", //84 "STEP", //85 "TYPE", //86 "ECHO", //87 "SET.NAME", //88 "CALLER", //89 "DEREF", //90 "WINDOWS", //91 "SERIES", //92 "DOCUMENTS", //93 "ACTIVE.CELL", //94 "SELECTION", //95 "RESULT", //96 "ATAN2", //97 "ASIN", //98 "ACOS", //99 "CHOOSE", //100 "HLOOKUP", //101 "VLOOKUP", //102 "LINKS", //103 "INPUT", //104 "ISREF", //105 "GET.FORMULA", //106 "GET.NAME", //107 "SET.VALUE", //108 "LOG", //109 "EXEC", //110 "CHAR", //111 "LOWER", //112 "UPPER", //113 "PROPER", //114 "LEFT", //115 "RIGHT", //116 "EXACT", //117 "TRIM", //118 "REPLACE", //119 "SUBSTITUTE", //120 "CODE", //121 "NAMES", //122 "DIRECTORY", //123 "FIND", //124 "CELL", //125 "ISERR", //126 "ISTEXT", //127 "ISNUMBER", //128 "ISBLANK", //129 "T", //130 "N", //131 "FOPEN", //132 "FCLOSE", //133 "FSIZE", //134 "FREADLN", //135 "FREAD", //136 "FWRITELN", //137 "FWRITE", //138 "FPOS", //139 "DATEVALUE", //140 "TIMEVALUE", //141 "SLN", //142 "SYD", //143 "DDB", //144 "GET.DEF", //145 "REFTEXT", //146 "TEXTREF", //147 "INDIRECT", //148 "REGISTER", //149 "CALL", //150 "ADD.BAR", //151 "ADD.MENU", //152 "ADD.COMMAND", //153 "ENABLE.COMMAND", //154 "CHECK.COMMAND", //155 "RENAME.COMMAND", //156 "SHOW.BAR", //157 "DELETE.MENU", //158 "DELETE.COMMAND", //159 "GET.CHART.ITEM", //160 "DIALOG.BOX", //161 "CLEAN", //162 "MDETERM", //163 "MINVERSE", //164 "MMULT", //165 "FILES", //166 "IPMT", //167 "PPMT", //168 "COUNTA", //169 "CANCEL.KEY", //170 "FOR", //171 "WHILE", //172 "BREAK", //173 "NEXT", //174 "INITIATE", //175 "REQUEST", //176 "POKE", //177 "EXECUTE", //178 "TERMINATE", //179 "RESTART", //180 "HELP", //181 "GET.BAR", //182 "PRODUCT", //183 "FACT", //184 "GET.CELL", //185 "GET.WORKSPACE", //186 "GET.WINDOW", //187 "GET.DOCUMENT", //188 "DPRODUCT", //189 "ISNONTEXT", //190 "GET.NOTE", //191 "NOTE", //192 "STDEVP", //193 "VARP", //194 "DSTDEVP", //195 "DVARP", //196 "TRUNC", //197 "ISLOGICAL", //198 "DCOUNTA", //199 "DELETE.BAR", //200 "UNREGISTER", //201 NULL, NULL, "USDOLLAR", //204 "FINDB", //205 "SEARCHB", //206 "REPLACEB", //207 "LEFTB", //208 "RIGHTB", //209 "MIDB", //210 "LENB", //211 "ROUNDUP", //212 "ROUNDDOWN", //213 "ASC", //214 "DBCS", //215 "RANK", //216 NULL, NULL, "ADDRESS", //219 "DAYS360", //220 "TODAY", //221 "VDB", //222 "ELSE", //223 "ELSE.IF", //224 "END.IF", //225 "FOR.CELL", //226 "MEDIAN", //227 "SUMPRODUCT", //228 "SINH", //229 "COSH", //230 "TANH", //231 "ASINH", //232 "ACOSH", //233 "ATANH", //234 "DGET", //235 "CREATE.OBJECT", //236 "VOLATILE", //237 "LAST.ERROR", //238 "CUSTOM.UNDO", //239 "CUSTOM.REPEAT", //240 "FORMULA.CONVERT", //241 "GET.LINK.INFO", //242 "TEXT.BOX", //243 "INFO", //244 "GROUP", //245 "GET.OBJECT", //246 "DB", //247 "PAUSE", //248 NULL, NULL, "RESUME", //251 "FREQUENCY", //252 "ADD.TOOLBAR", //253 "DELETE.TOOLBAR", //254 "User Defined Function", //255 "RESET.TOOLBAR", //256 "EVALUATE", //257 "GET.TOOLBAR", //258 "GET.TOOL", //259 "SPELLING.CHECK", //260 "ERROR.TYPE", //261 "APP.TITLE", //262 "WINDOW.TITLE", //263 "SAVE.TOOLBAR", //264 "ENABLE.TOOL", //265 "PRESS.TOOL", //266 "REGISTER.ID", //267 "GET.WORKBOOK", //268 "AVEDEV", //269 "BETADIST", //270 "GAMMALN", //271 "BETAINV", //272 "BINOMDIST", //273 "CHIDIST", //274 "CHIINV", //275 "COMBIN", //276 "CONFIDENCE", //277 "CRITBINOM", //278 "EVEN", //279 "EXPONDIST", //280 "FDIST", //281 "FINV", //282 "FISHER", //283 "FISHERINV", //284 "FLOOR", //285 "GAMMADIST", //286 "GAMMAINV", //287 "CEILING", //288 "HYPGEOMDIST", //289 "LOGNORMDIST", //290 "LOGINV", //291 "NEGBINOMDIST", //292 "NORMDIST", //293 "NORMSDIST", //294 "NORMINV", //295 "NORMSINV", //296 "STANDARDIZE", //297 "ODD", //298 "PERMUT", //299 "POISSON", //300 "TDIST", //301 "WEIBULL", //302 "SUMXMY2", //303 "SUMX2MY2", //304 "SUMX2PY2", //305 "CHITEST", //306 "CORREL", //307 "COVAR", //308 "FORECAST", //309 "FTEST", //310 "INTERCEPT", //311 "PEARSON", //312 "RSQ", //313 "STEYX", //314 "SLOPE", //315 "TTEST", //316 "PROB", //317 "DEVSQ", //318 "GEOMEAN", //319 "HARMEAN", //320 "SUMSQ", //321 "KURT", //322 "SKEW", //323 "ZTEST", //324 "LARGE", //325 "SMALL", //326 "QUARTILE", //327 "PERCENTILE", //328 "PERCENTRANK", //329 "MODE", //330 "TRIMMEAN", //331 "TINV", //332 NULL, "MOVIE.COMMAND", //334 "GET.MOVIE", //335 "CONCATENATE", //336 "POWER", //337 "PIVOT.ADD.DATA", //338 "GET.PIVOT.TABLE", //339 "GET.PIVOT.FIELD", //340 "GET.PIVOT.ITEM", //341 "RADIANS", //342 "DEGREES", //343 "SUBTOTAL", //344 "SUMIF", //345 "COUNTIF", //346 "COUNTBLANK", //347 "SCENARIO.GET", //348 "OPTIONS.LISTS.GET", //349 "ISPMT", //350 "DATEDIF", //351 "DATESTRING", //352 "NUMBERSTRING", //353 "ROMAN", //354 "OPEN.DIALOG", //355 "SAVE.DIALOG", //356 "VIEW.GET", //357 "GETPIVOTDATA", //358 "HYPERLINK", //359 "PHONETIC", //360 "AVERAGEA", //361 "MAXA", //362 "MINA", //363 "STDEVPA", //364 "VARPA", //365 "STDEVA", //366 "VARA", //367 "BAHTTEXT", //368 "THAIDAYOFWEEK", //369 "THAIDIGIT", //370 "THAIMONTHOFYEAR", //371 "THAINUMSOUND", //372 "THAINUMSTRING", //373 "THAISTRINGLENGTH", //374 "ISTHAIDIGIT", //375 "ROUNDBAHTDOWN", //376 "ROUNDBAHTUP", //377 "THAIYEAR", //378 "RTD", //379 }; // clang-format on // clang-format off char *EXTENDED_FUNCTIONS[] = { "BEEP", //32768 "OPEN", //32769 "OPEN.LINKS", //32770 "CLOSE.ALL", //32771 "SAVE", //32772 "SAVE.AS", //32773 "FILE.DELETE", //32774 "PAGE.SETUP", //32775 "PRINT", //32776 "PRINTER.SETUP", //32777 "QUIT", //32778 "NEW.WINDOW", //32779 "ARRANGE.ALL", //32780 "WINDOW.SIZE", //32781 "WINDOW.MOVE", //32782 "FULL", //32783 "CLOSE", //32784 "RUN", //32785 NULL, NULL, NULL, NULL, "SET.PRINT.AREA", //32790 "SET.PRINT.TITLES", //32791 "SET.PAGE.BREAK", //32792 "REMOVE.PAGE.BREAK", //32793 "FONT", //32794 "DISPLAY", //32795 "PROTECT.DOCUMENT", //32796 "PRECISION", //32797 "A1.R1C1", //32798 "CALCULATE.NOW", //32799 "CALCULATION", //32800 NULL, "DATA.FIND", //32802 "EXTRACT", //32803 "DATA.DELETE", //32804 "SET.DATABASE", //32805 "SET.CRITERIA", //32806 "SORT", //32807 "DATA.SERIES", //32808 "TABLE", //32809 "FORMAT.NUMBER", //32810 "ALIGNMENT", //32811 "STYLE", //32812 "BORDER", //32813 "CELL.PROTECTION", //32814 "COLUMN.WIDTH", //32815 "UNDO", //32816 "CUT", //32817 "COPY", //32818 "PASTE", //32819 "CLEAR", //32820 "PASTE.SPECIAL", //32821 "EDIT.DELETE", //32822 "INSERT", //32823 "FILL.RIGHT", //32824 "FILL.DOWN", //32825 NULL, NULL, NULL, "DEFINE.NAME", //32829 "CREATE.NAMES", //32830 "FORMULA.GOTO", //32831 "FORMULA.FIND", //32832 "SELECT.LAST.CELL", //32833 "SHOW.ACTIVE.CELL", //32834 "GALLERY.AREA", //32835 "GALLERY.BAR", //32836 "GALLERY.COLUMN", //32837 "GALLERY.LINE", //32838 "GALLERY.PIE", //32839 "GALLERY.SCATTER", //32840 "COMBINATION", //32841 "PREFERRED", //32842 "ADD.OVERLAY", //32843 "GRIDLINES", //32844 "SET.PREFERRED", //32845 "AXES", //32846 "LEGEND", //32847 "ATTACH.TEXT", //32848 "ADD.ARROW", //32849 "SELECT.CHART", //32850 "SELECT.PLOT.AREA", //32851 "PATTERNS", //32852 "MAIN.CHART", //32853 "OVERLAY", //32854 "SCALE", //32855 "FORMAT.LEGEND", //32856 "FORMAT.TEXT", //32857 "EDIT.REPEAT", //32858 "PARSE", //32859 "JUSTIFY", //32860 "HIDE", //32861 "UNHIDE", //32862 "WORKSPACE", //32863 "FORMULA", //32864 "FORMULA.FILL", //32865 "FORMULA.ARRAY", //32866 "DATA.FIND.NEXT", //32867 "DATA.FIND.PREV", //32868 "FORMULA.FIND.NEXT", //32869 "FORMULA.FIND.PREV", //32870 "ACTIVATE", //32871 "ACTIVATE.NEXT", //32872 "ACTIVATE.PREV", //32873 "UNLOCKED.NEXT", //32874 "UNLOCKED.PREV", //32875 "COPY.PICTURE", //32876 "SELECT", //32877 "DELETE.NAME", //32878 "DELETE.FORMAT", //32879 "VLINE", //32880 "HLINE", //32881 "VPAGE", //32882 "HPAGE", //32883 "VSCROLL", //32884 "HSCROLL", //32885 "ALERT", //32886 "NEW", //32887 "CANCEL.COPY", //32888 "SHOW.CLIPBOARD", //32889 "MESSAGE", //32890 NULL, "PASTE.LINK", //32892 "APP.ACTIVATE", //32893 "DELETE.ARROW", //32894 "ROW.HEIGHT", //32895 "FORMAT.MOVE", //32896 "FORMAT.SIZE", //32897 "FORMULA.REPLACE", //32898 "SEND.KEYS", //32899 "SELECT.SPECIAL", //32900 "APPLY.NAMES", //32901 "REPLACE.FONT", //32902 "FREEZE.PANES", //32903 "SHOW.INFO", //32904 "SPLIT", //32905 "ON.WINDOW", //32906 "ON.DATA", //32907 "DISABLE.INPUT", //32908 NULL, "OUTLINE", //32910 "LIST.NAMES", //32911 "FILE.CLOSE", //32912 "SAVE.WORKBOOK", //32913 "DATA.FORM", //32914 "COPY.CHART", //32915 "ON.TIME", //32916 "WAIT", //32917 "FORMAT.FONT", //32918 "FILL.UP", //32919 "FILL.LEFT", //32920 "DELETE.OVERLAY", //32921 NULL, "SHORT.MENUS", //32923 NULL, NULL, NULL, "SET.UPDATE.STATUS", //32927 NULL, "COLOR.PALETTE", //32929 "DELETE.STYLE", //32930 "WINDOW.RESTORE", //32931 "WINDOW.MAXIMIZE", //32932 NULL, "CHANGE.LINK", //32934 "CALCULATE.DOCUMENT", //32935 "ON.KEY", //32936 "APP.RESTORE", //32937 "APP.MOVE", //32938 "APP.SIZE", //32939 "APP.MINIMIZE", //32940 "APP.MAXIMIZE", //32941 "BRING.TO.FRONT", //32942 "SEND.TO.BACK", //32943 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "MAIN.CHART.TYPE", //32953 "OVERLAY.CHART.TYPE", //32954 "SELECT.END", //32955 "OPEN.MAIL", //32956 "SEND.MAIL", //32957 "STANDARD.FONT", //32958 "CONSOLIDATE", //32959 "SORT.SPECIAL", //32960 "GALLERY.3D.AREA", //32961 "GALLERY.3D.COLUMN", //32962 "GALLERY.3D.LINE", //32963 "GALLERY.3D.PIE", //32964 "VIEW.3D", //32965 "GOAL.SEEK", //32966 "WORKGROUP", //32967 "FILL.GROUP", //32968 "UPDATE.LINK", //32969 "PROMOTE", //32970 "DEMOTE", //32971 "SHOW.DETAIL", //32972 NULL, "UNGROUP", //32974 "OBJECT.PROPERTIES", //32975 "SAVE.NEW.OBJECT", //32976 "SHARE", //32977 "SHARE.NAME", //32978 "DUPLICATE", //32979 "APPLY.STYLE", //32980 "ASSIGN.TO.OBJECT", //32981 "OBJECT.PROTECTION", //32982 "HIDE.OBJECT", //32983 "SET.EXTRACT", //32984 "CREATE.PUBLISHER", //32985 "SUBSCRIBE.TO", //32986 "ATTRIBUTES", //32987 "SHOW.TOOLBAR", //32988 NULL, "PRINT.PREVIEW", //32990 "EDIT.COLOR", //32991 "SHOW.LEVELS", //32992 "FORMAT.MAIN", //32993 "FORMAT.OVERLAY", //32994 "ON.RECALC", //32995 "EDIT.SERIES", //32996 "DEFINE.STYLE", //32997 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "LINE.PRINT", //33008 NULL, NULL, "ENTER.DATA", //33011 NULL, NULL, NULL, NULL, NULL, "GALLERY.RADAR", //33017 "MERGE.STYLES", //33018 "EDITION.OPTIONS", //33019 "PASTE.PICTURE", //33020 "PASTE.PICTURE.LINK", //33021 "SPELLING", //33022 NULL, "ZOOM", //33024 NULL, NULL, "INSERT.OBJECT", //33027 "WINDOW.MINIMIZE", //33028 NULL, NULL, NULL, NULL, "SOUND.NOTE", //33033 "SOUND.PLAY", //33034 "FORMAT.SHAPE", //33035 "EXTEND.POLYGON", //33036 "FORMAT.AUTO", //33037 NULL, NULL, "GALLERY.3D.BAR", //33040 "GALLERY.3D.SURFACE", //33041 "FILL.AUTO", //33042 NULL, "CUSTOMIZE.TOOLBAR", //33044 "ADD.TOOL", //33045 "EDIT.OBJECT", //33046 "ON.DOUBLECLICK", //33047 "ON.ENTRY", //33048 "WORKBOOK.ADD", //33049 "WORKBOOK.MOVE", //33050 "WORKBOOK.COPY", //33051 "WORKBOOK.OPTIONS", //33052 "SAVE.WORKSPACE", //33053 NULL, NULL, "CHART.WIZARD", //33056 "DELETE.TOOL", //33057 "MOVE.TOOL", //33058 "WORKBOOK.SELECT", //33059 "WORKBOOK.ACTIVATE", //33060 "ASSIGN.TO.TOOL", //33061 NULL, "COPY.TOOL", //33063 "RESET.TOOL", //33064 "CONSTRAIN.NUMERIC", //33065 "PASTE.TOOL", //33066 NULL, NULL, NULL, "WORKBOOK.NEW", //33070 NULL, NULL, "SCENARIO.CELLS", //33073 "SCENARIO.DELETE", //33074 "SCENARIO.ADD", //33075 "SCENARIO.EDIT", //33076 "SCENARIO.SHOW", //33077 "SCENARIO.SHOW.NEXT", //33078 "SCENARIO.SUMMARY", //33079 "PIVOT.TABLE.WIZARD", //33080 "PIVOT.FIELD.PROPERTIES", //33081 "PIVOT.FIELD", //33082 "PIVOT.ITEM", //33083 "PIVOT.ADD.FIELDS", //33084 NULL, "OPTIONS.CALCULATION", //33086 "OPTIONS.EDIT", //33087 "OPTIONS.VIEW", //33088 "ADDIN.MANAGER", //33089 "MENU.EDITOR", //33090 "ATTACH.TOOLBARS", //33091 "VBAActivate", //33092 "OPTIONS.CHART", //33093 NULL, NULL, "VBA.INSERT.FILE", //33096 NULL, "VBA.PROCEDURE.DEFINITION", //33098 NULL, NULL, NULL, NULL, NULL, "ROUTING.SLIP", //33104 NULL, "ROUTE.DOCUMENT", //33106 "MAIL.LOGON", //33107 NULL, NULL, "INSERT.PICTURE", //33110 "EDIT.TOOL", //33111 "GALLERY.DOUGHNUT", //33112 NULL, NULL, NULL, NULL, NULL, "CHART.TREND", //33118 NULL, "PIVOT.ITEM.PROPERTIES", //33120 NULL, "WORKBOOK.INSERT", //33122 "OPTIONS.TRANSITION", //33123 "OPTIONS.GENERAL", //33124 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "FILTER.ADVANCED", //33138 NULL, NULL, "MAIL.ADD.MAILER", //33141 "MAIL.DELETE.MAILER", //33142 "MAIL.REPLY", //33143 "MAIL.REPLY.ALL", //33144 "MAIL.FORWARD", //33145 "MAIL.NEXT.LETTER", //33146 "DATA.LABEL", //33147 "INSERT.TITLE", //33148 "FONT.PROPERTIES", //33149 "MACRO.OPTIONS", //33150 "WORKBOOK.HIDE", //33151 "WORKBOOK.UNHIDE", //33152 "WORKBOOK.DELETE", //33153 "WORKBOOK.NAME", //33154 NULL, "GALLERY.CUSTOM", //33156 NULL, "ADD.CHART.AUTOFORMAT", //33158 "DELETE.CHART.AUTOFORMAT", //33159 "CHART.ADD.DATA", //33160 "AUTO.OUTLINE", //33161 "TAB.ORDER", //33162 "SHOW.DIALOG", //33163 "SELECT.ALL", //33164 "UNGROUP.SHEETS", //33165 "SUBTOTAL.CREATE", //33166 "SUBTOTAL.REMOVE", //33167 "RENAME.OBJECT", //33168 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "WORKBOOK.SCROLL", //33180 "WORKBOOK.NEXT", //33181 "WORKBOOK.PREV", //33182 "WORKBOOK.TAB.SPLIT", //33183 "FULL.SCREEN", //33184 "WORKBOOK.PROTECT", //33185 NULL, NULL, "SCROLLBAR.PROPERTIES", //33188 "PIVOT.SHOW.PAGES", //33189 "TEXT.TO.COLUMNS", //33190 "FORMAT.CHARTTYPE", //33191 "LINK.FORMAT", //33192 "TRACER.DISPLAY", //33193 NULL, NULL, NULL, NULL, "TRACER.NAVIGATE", //33198 "TRACER.CLEAR", //33199 "TRACER.ERROR", //33200 "PIVOT.FIELD.GROUP", //33201 "PIVOT.FIELD.UNGROUP", //33202 "CHECKBOX.PROPERTIES", //33203 "LABEL.PROPERTIES", //33204 "LISTBOX.PROPERTIES", //33205 "EDITBOX.PROPERTIES", //33206 "PIVOT.REFRESH", //33207 "LINK.COMBO", //33208 "OPEN.TEXT", //33209 "HIDE.DIALOG", //33210 "SET.DIALOG.FOCUS", //33211 "ENABLE.OBJECT", //33212 "PUSHBUTTON.PROPERTIES", //33213 "SET.DIALOG.DEFAULT", //33214 "FILTER", //33215 "FILTER.SHOW.ALL", //33216 "CLEAR.OUTLINE", //33217 "FUNCTION.WIZARD", //33218 "ADD.LIST.ITEM", //33219 "SET.LIST.ITEM", //33220 "REMOVE.LIST.ITEM", //33221 "SELECT.LIST.ITEM", //33222 "SET.CONTROL.VALUE", //33223 "SAVE.COPY.AS", //33224 NULL, "OPTIONS.LISTS.ADD", //33226 "OPTIONS.LISTS.DELETE", //33227 "SERIES.AXES", //33228 "SERIES.X", //33229 "SERIES.Y", //33230 "ERRORBAR.X", //33231 "ERRORBAR.Y", //33232 "FORMAT.CHART", //33233 "SERIES.ORDER", //33234 "MAIL.LOGOFF", //33235 "CLEAR.ROUTING.SLIP", //33236 "APP.ACTIVATE.MICROSOFT", //33237 "MAIL.EDIT.MAILER", //33238 "ON.SHEET", //33239 "STANDARD.WIDTH", //33240 "SCENARIO.MERGE", //33241 "SUMMARY.INFO", //33242 "FIND.FILE", //33243 "ACTIVE.CELL.FONT", //33244 "ENABLE.TIPWIZARD", //33245 "VBA.MAKE.ADDIN", //33246 NULL, "INSERTDATATABLE", //33248 "WORKGROUP.OPTIONS", //33249 "MAIL.SEND.MAILER", //33250 NULL, NULL, "AUTOCORRECT", //33253 NULL, NULL, NULL, "POST.DOCUMENT", //33257 NULL, "PICKLIST", //33259 NULL, "VIEW.SHOW", //33261 "VIEW.DEFINE", //33262 "VIEW.DELETE", //33263 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "SHEET.BACKGROUND", //33277 "INSERT.MAP.OBJECT", //33278 "OPTIONS.MENONO", //33279 NULL, NULL, NULL, NULL, NULL, "MSOCHECKS", //33285 "NORMAL", //33286 "LAYOUT", //33287 "RM.PRINT.AREA", //33288 "CLEAR.PRINT.AREA", //33289 "ADD.PRINT.AREA", //33290 "MOVE.BRK", //33291 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "HIDECURR.NOTE", //33313 "HIDEALL.NOTES", //33314 "DELETE.NOTE", //33315 "TRAVERSE.NOTES", //33316 "ACTIVATE.NOTES", //33317 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "PROTECT.REVISIONS", //33388 "UNPROTECT.REVISIONS", //33389 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "OPTIONS.ME", //33415 NULL, NULL, NULL, NULL, NULL, "WEB.PUBLISH", //33421 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "NEWWEBQUERY", //33435 NULL, NULL, NULL, NULL, NULL, "PIVOT.TABLE.CHART", //33441 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "OPTIONS.SAVE", //33521 NULL, "OPTIONS.SPELL", //33523 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "HIDEALL.INKANNOTS", //33576 }; char *TOKENS[] = { NULL, "ptgExp", //1 "ptgTbl", //2 "ptgAdd", //3 "ptgSub", //4 "ptgMul", //5 "ptgDiv", //6 "ptgPower", //7 "ptgConcat", //8 "ptgLT", //9 "ptgLE", //10 "ptgEQ", //11 "ptgGE", //12 "ptgGT", //13 "ptgNE", //14 "ptgIsect", //15 "ptgUnion", //16 "ptgRange", //17 "ptgUplus", //18 "ptgUminus", //19 "ptgPercent", //20 "ptgParen", //21 "ptgMissArg", //22 "ptgStr", //23 NULL, "ptgAttr", //25 "ptgSheet", //26 "ptgEndSheet", //27 "ptgErr", //28 "ptgBool", //29 "ptgInt", //30 "ptgNum", //31 "ptgArray", //32 "ptgFunc", //33 "ptgFuncVar", //34 "ptgName", //35 "ptgRef", //36 "ptgArea", //37 "ptgMemArea", //38 "ptgMemErr", //39 "ptgMemNoMem", //40 "ptgMemFunc", //41 "ptgRefErr", //42 "ptgAreaErr", //43 "ptgRefN", //44 "ptgAreaN", //45 "ptgMemAreaN", //46 "ptgMemNoMemN", //47 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "ptgNameX", //57 "ptgRef3d", //58 "ptgArea3d", //59 "ptgRefErr3d", //60 "ptgAreaErr3d", //61 NULL, NULL, "ptgArrayV", //64 "ptgFuncV", //65 "ptgFuncVarV", //66 "ptgNameV", //67 "ptgRefV", //68 "ptgAreaV", //69 "ptgMemAreaV", //70 "ptgMemErrV", //71 "ptgMemNoMemV", //72 "ptgMemFuncV", //73 "ptgRefErrV", //74 "ptgAreaErrV", //75 "ptgRefNV", //76 "ptgAreaNV", //77 "ptgMemAreaNV", //78 "ptgMemNoMemNV", //79 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "ptgFuncCEV", //88 "ptgNameXV", //89 "ptgRef3dV", //90 "ptgArea3dV", //91 "ptgRefErr3dV", //92 "ptgAreaErr3dV", //93 NULL, NULL, "ptgArrayA", //96 "ptgFuncA", //97 "ptgFuncVarA", //98 "ptgNameA", //99 "ptgRefA", //100 "ptgAreaA", //101 "ptgMemAreaA", //102 "ptgMemErrA", //103 "ptgMemNoMemA", //104 "ptgMemFuncA", //105 "ptgRefErrA", //106 "ptgAreaErrA", //107 "ptgRefNA", //108 "ptgAreaNA", //109 "ptgMemAreaNA", //110 "ptgMemNoMemNA", //111 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "ptgFuncCEA", //120 "ptgNameXA", //121 "ptgRef3dA", //122 "ptgArea3dA", //123 "ptgRefErr3dA", //124 "ptgAreaErr3dA", //125 }; // clang-format on typedef enum ptg_expr { ptgExp = 0x01, ptgTbl = 0x02, ptgAdd = 0x03, ptgSub = 0x04, ptgMul = 0x05, ptgDiv = 0x06, ptgPower = 0x07, ptgConcat = 0x08, ptgLt = 0x09, ptgLe = 0x0A, ptgEq = 0x0B, ptgGe = 0x0C, ptgGt = 0x0D, ptgNe = 0x0E, ptgIsect = 0x0F, ptgUnion = 0x10, ptgRange = 0x11, ptgUplus = 0x12, ptgUminus = 0x13, ptgPercent = 0x14, ptgParen = 0x15, ptgMissArg = 0x16, ptgStr = 0x17, ptgEscape1 = 0x18, ptgAttr = 0x19, ptgErr = 0x1C, ptgBool = 0x1D, ptgInt = 0x1E, ptgNum = 0x1F, ptgArray = 0x20, ptgFunc = 0x21, ptgFuncVar = 0x22, ptgName = 0x23, ptgRef = 0x24, ptgArea = 0x25, ptgMemArea = 0x26, ptgMemErr = 0x27, ptgMemNoMem = 0x28, ptgMemFunc = 0x29, ptgRefErr = 0x2A, ptgAreaErr = 0x2B, ptgRefN = 0x2C, ptgAreaN = 0x2D, ptgNameX = 0x39, ptgRef3d = 0x3A, ptgArea3d = 0x3B, ptgRefErr3d = 0x3C, ptgAreaErr3d = 0x3D, ptgArrayV = 0x40, ptgFuncV = 0x41, ptgFuncVarV = 0x42, ptgNameV = 0x43, ptgRefV = 0x44, ptgAreaV = 0x45, ptgMemAreaV = 0x46, ptgMemErrV = 0x47, ptgMemNoMemV = 0x48, ptgMemFuncV = 0x49, ptgRefErrV = 0x4A, ptgAreaErrV = 0x4B, ptgRefNV = 0x4C, ptgAreaNV = 0x4D, ptgNameXV = 0x59, ptgRef3dV = 0x5A, ptgArea3dV = 0x5B, ptgRefErr3dV = 0x5C, ptgAreaErr3dV = 0x5D, ptgArrayA = 0x60, ptgFuncA = 0x61, ptgFuncVarA = 0x62, ptgNameA = 0x63, ptgRefA = 0x64, ptgAreaA = 0x65, ptgMemAreaA = 0x66, ptgMemErrA = 0x67, ptgMemNoMemA = 0x68, ptgMemFuncA = 0x69, ptgRefErrA = 0x6A, ptgAreaErrA = 0x6B, ptgRefNA = 0x6C, ptgAreaNA = 0x6D, ptgNameXA = 0x79, ptgRef3dA = 0x7A, ptgArea3dA = 0x7B, ptgRefErr3dA = 0x7C, ptgAreaErr3dA = 0x7D, } ptg_expr; static const char *get_function_name(unsigned index) { if (index < sizeof(FUNCTIONS) / sizeof(FUNCTIONS[0])) { return FUNCTIONS[index]; } else if (index >= 0x8000 && (index - 0x8000 < sizeof(EXTENDED_FUNCTIONS) / sizeof(EXTENDED_FUNCTIONS[0]))) { return EXTENDED_FUNCTIONS[index - 0x8000]; } else { return NULL; } } static cl_error_t parse_formula(FILE *out_file, char data[], unsigned data_size) { cl_error_t status = CL_EFORMAT; unsigned data_pos = 0; int len; size_t size_written; while (data_pos < data_size) { ptg_expr ptg = data[data_pos] & 0x7f; if (((uint8_t)data[data_pos]) < sizeof(TOKENS) / sizeof(TOKENS[0])) { len = fprintf(out_file, " %s", TOKENS[ptg]); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting token name\n"); goto done; } } switch (ptg) { case ptgAdd: case ptgSub: case ptgMul: case ptgDiv: case ptgConcat: case ptgLt: case ptgLe: case ptgEq: case ptgGe: case ptgGt: case ptgNe: case ptgMissArg: case ptgRange: data_pos += 1; break; case ptgStr: if (data_pos + 2 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgStr record\n"); goto done; } if (data[data_pos + 2] == 1 && data_pos + 2 + 2 * data[data_pos + 1] <= data_size) { char *utf8 = NULL; size_t utf8_size = 0; //TODO: Is this really times two here? Or is the string length in bytes? size_t str_len = data[data_pos + 1] * 2; if (str_len > data_size - data_pos) { str_len = data_size - data_pos; } if (CL_SUCCESS == cli_codepage_to_utf8(&data[data_pos + 3], str_len, CODEPAGE_UTF16_LE, &utf8, &utf8_size)) { if (0 < utf8_size) { size_written = fwrite(utf8, 1, utf8_size, out_file); free(utf8); if (size_written < utf8_size) { cli_dbgmsg("[cli_xlm_extract_macros] Error writing STRING record message with UTF16LE content\n"); goto done; } } } else { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Failed to decode UTF16LE string in formula\n"); len = fprintf(out_file, ""); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgStr message with UTF16LE content\n"); goto done; } } data_pos += 3 + str_len; } else if (data[data_pos + 2] == 0 && data_pos + 2 + data[data_pos + 1] <= data_size) { unsigned str_len = data[data_pos + 1]; if (str_len > data_size - data_pos) { str_len = data_size - data_pos; } if (0 < str_len) { size_written = fwrite(&data[data_pos], 1, str_len, out_file); if (size_written < str_len) { cli_dbgmsg("[cli_xlm_extract_macros] Error writing STRING record message with UTF16LE content\n"); goto done; } } data_pos += 3 + str_len; } else { cli_dbgmsg("[cli_xlm_extract_macros] Invalid or truncated string record!\n"); goto done; } break; case ptgAttr: if (data_pos + 1 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgAttr record\n"); goto done; } if (data[data_pos + 1] & 0x40) { uint16_t coffset; if (data_pos + 3 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgAttrChoose record\n"); goto done; } coffset = data[data_pos + 2] | (data[data_pos + 3] << 8); len = fprintf(out_file, " CHOOSE (%u)", (unsigned)(coffset + 1)); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgAttr message\n"); goto done; } data_pos += 4 + 2 * (coffset + 1); } else { data_pos += 4; } break; case ptgBool: if (data_pos + 1 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgBool record\n"); goto done; } len = fprintf(out_file, " %s", data[data_pos + 1] ? "TRUE" : "FALSE"); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgBool message\n"); goto done; } data_pos += 2; break; case ptgInt: if (data_pos + 2 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgInt record\n"); goto done; } len = fprintf(out_file, " %d", data[data_pos + 1] | (data[data_pos + 2] << 8)); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgInt message\n"); goto done; } data_pos += 3; break; case ptgFunc: case ptgFuncV: case ptgFuncA: { if (data_pos + 2 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgFunc record\n"); goto done; } uint16_t func_id = data[data_pos + 1] | (data[data_pos + 2] << 8); const char *func_name = get_function_name(func_id); len = fprintf(out_file, " %s (0x%04x)", func_name == NULL ? "" : func_name, func_id); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgFunc message\n"); goto done; } data_pos += 3; break; } case ptgFuncVar: case ptgFuncVarV: case ptgFuncVarA: { if (data_pos + 3 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgFuncVar record\n"); goto done; } uint16_t func_id = data[data_pos + 2] | (data[data_pos + 3] << 8); const char *func_name = get_function_name(func_id); len = fprintf( out_file, " args %u func %s (0x%04x)", (unsigned)data[data_pos + 1], func_name == NULL ? "" : func_name, func_id); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgFuncVar message\n"); goto done; } data_pos += 4; if (func_id == 0x806d) { data_pos += 9; } break; } case ptgName: { if (data_pos + 4 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgName record\n"); goto done; } uint32_t val = data[data_pos + 1] | (data[data_pos + 2] << 8) | (data[data_pos + 3] << 16) | (data[data_pos + 4] << 24); len = fprintf(out_file, " 0x%08x", val); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgName message\n"); goto done; } data_pos += 5; break; } case ptgNum: { if (data_pos + 8 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgNum record\n"); goto done; } double val = *(double *)&data[data_pos + 1]; len = fprintf(out_file, " %f", val); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgNum message\n"); goto done; } data_pos += 9; break; } case ptgMemArea: { if (data_pos + 6 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgMemArea record\n"); goto done; } len = fprintf(out_file, " REFERENCE-EXPRESSION"); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgMemArea message\n"); goto done; } data_pos += 7; break; } case ptgExp: { if (data_pos + 4 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgExp record\n"); goto done; } uint16_t row = data[data_pos + 1] | (data[data_pos + 2] << 8); uint16_t column = data[data_pos + 3] | (data[data_pos + 4] << 8); len = fprintf(out_file, " R%uC%u", (unsigned)(row + 1), (unsigned)(column + 1)); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgExp message\n"); goto done; } data_pos += 5; break; } case ptgRef: case ptgRefV: { if (data_pos + 4 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgRef record\n"); goto done; } uint16_t row = data[data_pos + 1] | (data[data_pos + 2] << 8); uint16_t column = data[data_pos + 3] | (data[data_pos + 4] << 8); len = fprintf( out_file, " R%s%uC%s%u", (row & (1 << 14)) ? "~" : "", (unsigned)((row & 0x3fff) + ((row & (1 << 14)) ? 0 : 1)), (row & (1 << 15)) ? "~" : "", (unsigned)(column + ((row & (1 << 15)) ? 0 : 1))); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgRef message\n"); goto done; } data_pos += 5; break; } case ptgArea: { if (data_pos + 8 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgArea record\n"); goto done; } uint16_t row1 = data[data_pos + 1] | (data[data_pos + 2] << 8); uint16_t column1 = data[data_pos + 3] | (data[data_pos + 4] << 8); uint16_t row2 = data[data_pos + 5] | (data[data_pos + 6] << 8); uint16_t column2 = data[data_pos + 7] | (data[data_pos + 8] << 8); len = fprintf( out_file, " R%s%uC%s%u:R%s%uC%s%u", (row1 & (1 << 14)) ? "~" : "", (unsigned)((row1 & 0x3fff) + ((row1 & (1 << 14)) ? 0 : 1)), (row1 & (1 << 15)) ? "~" : "", (unsigned)(column1 + ((row1 & (1 << 15)) ? 0 : 1)), (row2 & (1 << 14)) ? "~" : "", (unsigned)((row2 & 0x3fff) + ((row2 & (1 << 14)) ? 0 : 1)), (row2 & (1 << 15)) ? "~" : "", (unsigned)(column2 + ((row2 & (1 << 15)) ? 0 : 1))); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgArea message\n"); goto done; } data_pos += 9; break; } case ptgRef3d: case ptgRef3dV: { if (data_pos + 6 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgRef3d record\n"); goto done; } uint16_t row = data[data_pos + 3] | (data[data_pos + 4] << 8); uint16_t column = data[data_pos + 5] | (data[data_pos + 6] << 8); len = fprintf( out_file, " R%s%uC%s%u", (row & (1 << 14)) ? "~" : "", (unsigned)((row & 0x3fff) + ((row & (1 << 14)) ? 0 : 1)), (row & (1 << 15)) ? "~" : "", (unsigned)(column + ((row & (1 << 15)) ? 0 : 1))); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgRef3d message\n"); goto done; } data_pos += 7; break; } case ptgNameX: { if (data_pos + 6 >= data_size) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Malformed ptgNameX record\n"); goto done; } uint16_t name = data[data_pos + 3] | (data[data_pos + 4] << 8); len = fprintf( out_file, " NAMEIDX %u", (unsigned)name); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros:parse_formula] Error formatting ptgNameX message\n"); goto done; } data_pos += 7; break; } default: if (ptg < sizeof(TOKENS) / sizeof(char *)) { cli_dbgmsg("[cli_extract_xlm_macros_and_images:parse_formula] Encountered unexpected ptg token: %s\n", TOKENS[ptg]); } else { cli_dbgmsg("[cli_extract_xlm_macros_and_images:parse_formula] Encountered unknown ptg token: 0x%02x\n", ptg); } goto done; } } status = CL_SUCCESS; done: return status; } cl_error_t cli_xlm_extract_macros(const char *dir, cli_ctx *ctx, struct uniq *U, char *hash, uint32_t which) { char fullname[PATH_MAX]; int in_fd = -1, out_fd = -1; FILE *out_file = NULL; cl_error_t ret = CL_SUCCESS; const char *opcode_name; char *tempfile = NULL; char *data = NULL; int len; size_t size_written; size_t size_read; struct { uint16_t opcode; uint16_t length; } __attribute__((packed)) biff_header; const char FILE_HEADER[] = "-- BIFF content extracted and disassembled from CL_TYPE_MSXL .xls file because a XLM macro was found in the document\n"; UNUSEDPARAM(U); snprintf(fullname, sizeof(fullname), "%s" PATHSEP "%s_%u", dir, hash, which); fullname[sizeof(fullname) - 1] = '\0'; in_fd = open(fullname, O_RDONLY | O_BINARY); if (in_fd == -1) { cli_dbgmsg("[cli_xlm_extract_macros] Failed to open input file\n"); ret = CL_EACCES; goto done; } if ((ret = cli_gentempfd_with_prefix(ctx->sub_tmpdir, "xlm_macros", &tempfile, &out_fd)) != CL_SUCCESS) { cli_dbgmsg("[cli_xlm_extract_macros] Failed to open output file descriptor\n"); goto done; } out_file = fdopen(out_fd, "wb"); if (NULL == out_file) { cli_dbgmsg("[cli_xlm_extract_macros] Failed to open output file pointer\n"); goto done; } if ((data = malloc(BIFF8_MAX_RECORD_LENGTH)) == NULL) { cli_dbgmsg("[cli_xlm_extract_macros] Failed to allocate memory for BIFF data\n"); ret = CL_EMEM; goto done; } if (cli_writen(out_fd, FILE_HEADER, sizeof(FILE_HEADER) - 1) != sizeof(FILE_HEADER) - 1) { cli_dbgmsg("[cli_xlm_extract_macros] Failed to write header\n"); ret = CL_EWRITE; goto done; } cli_dbgmsg("[cli_xlm_extract_macros] Extracting macros to %s\n", tempfile); while (sizeof(biff_header) == (size_read = cli_readn(in_fd, &biff_header, sizeof(biff_header)))) { biff_header.opcode = le16_to_host(biff_header.opcode); biff_header.length = le16_to_host(biff_header.length); if (biff_header.opcode < sizeof(OPCODE_NAMES) / sizeof(OPCODE_NAMES[0])) { opcode_name = OPCODE_NAMES[biff_header.opcode]; } else { opcode_name = NULL; } len = fprintf(out_file, "%04x %6d %s", biff_header.opcode, biff_header.length, opcode_name == NULL ? "" : opcode_name); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros] Error formatting opcode message\n"); ret = CL_EFORMAT; goto done; } len = 0; if (biff_header.length > BIFF8_MAX_RECORD_LENGTH) { cli_dbgmsg("[cli_xlm_extract_macros] Record size exceeds maximum allowed\n"); ret = CL_EFORMAT; goto done; } if (cli_readn(in_fd, data, biff_header.length) != biff_header.length) { cli_dbgmsg("[cli_xlm_extract_macros] Failed to read BIFF record data\n"); ret = CL_EREAD; goto done; } switch (biff_header.opcode) { case OPC_FORMULA: { struct { uint16_t row; uint16_t column; uint16_t length; } formula_header; if (biff_header.length >= 21) { formula_header.row = data[0] | (data[1] << 8); formula_header.column = data[2] | (data[3] << 8); formula_header.length = data[20] | (data[21] << 8); len = fprintf( out_file, " - R%dC%d len=%d ", (unsigned)(formula_header.row + 1), (unsigned)(formula_header.column + 1), formula_header.length); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros] Error formatting FORMULA record message\n"); ret = CL_EFORMAT; goto done; } ret = parse_formula(out_file, &data[22], biff_header.length - 21); if (CL_SUCCESS != ret) { cli_dbgmsg("[cli_xlm_extract_macros] Error parsing formula in FORMULA record message\n"); goto done; } } break; } case OPC_NAME: { if (biff_header.length >= 16) { if (data[0] & 0x20) { char code = data[14] != 0 ? data[14] : data[15]; char *name; switch (code) { case 1: name = "auto_open"; break; case 2: name = "auto_close"; break; default: name = "?"; break; } len = fprintf(out_file, " - built-in-name %u %s", (unsigned)code, name); } else { int name_len = data[3] | (data[4] << 8); size_t offset = data[14] != 0 ? 14 : 15; name_len = min(name_len, (int)(biff_header.length - offset)); len = fprintf(out_file, " - %.*s", name_len, &data[offset]); } if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros] Error formatting NAME record message\n"); ret = CL_EFORMAT; goto done; } } else { cli_dbgmsg("[cli_xlm_extract_macros] Skipping broken NAME record (length %u)\n", biff_header.length); } break; } case OPC_BOUNDSHEET: { if (biff_header.length >= 6) { const char *sheet_type; const char *sheet_state; switch (data[4]) { case 0: sheet_state = "visible"; break; case 1: sheet_state = "hidden"; break; case 2: sheet_state = "very hidden"; break; default: sheet_state = "unknown visibility"; break; } switch (data[5]) { case 0: sheet_type = "worksheet or dialog sheet"; break; case 1: sheet_type = "Excel 4.0 macro sheet"; break; case 2: sheet_type = "chart"; break; case 6: sheet_type = "Visual Basic module"; break; default: sheet_type = "unknown type"; break; } len = fprintf(out_file, " - %s, %s", sheet_type, sheet_state); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros] Error formatting BOUNDSHEET record message\n"); ret = CL_EFORMAT; break; } } else { cli_dbgmsg("[cli_xlm_extract_macros] Skipping broken BOUNDSHEET record (length %u)\n", biff_header.length); } break; } case OPC_STRING: { //Documented in Microsoft Office Excel97-2007Binary File Format (.xls) Specification //Page 17: Unicode Strings in BIFF8 if (biff_header.length >= 4) { uint16_t string_length = data[0] | (data[1] << 8); uint8_t flags = data[2]; if (flags & 0x4) { cli_dbgmsg("[cli_xlm_extract_macros] East Asian extended strings not implemented\n"); } if (flags & 0x8) { cli_dbgmsg("[cli_xlm_extract_macros] Rich strings not implemented\n"); } if (!(flags & 0x1)) { //String is compressed len = fprintf(out_file, " - \"%.*s\"", (int)(biff_header.length - 3), &data[6]); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros] Error formatting STRING record message with ANSI content\n"); ret = CL_EFORMAT; break; } } else { char *utf8 = NULL; size_t utf8_size = 0; len = fprintf(out_file, " - "); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros] Error formatting STRING record message with UTF16 content\n"); ret = CL_EFORMAT; break; } if (string_length > biff_header.length - 3) { string_length = biff_header.length - 3; } if (CL_SUCCESS == cli_codepage_to_utf8(&data[3], string_length, CODEPAGE_UTF16_LE, &utf8, &utf8_size)) { if (0 < utf8_size) { size_written = fwrite(utf8, 1, utf8_size, out_file); free(utf8); if (size_written < utf8_size) { cli_dbgmsg("[cli_xlm_extract_macros] Error writing STRING record message with UTF16LE content\n"); goto done; } } } else { cli_dbgmsg("[cli_xlm_extract_macros] Failed to decode UTF16LE string\n"); len = fprintf(out_file, ""); if (len < 0) { cli_dbgmsg("[cli_xlm_extract_macros] Error formatting STRING record message with UTF16LE content\n"); goto done; } } } } else { cli_dbgmsg("[cli_xlm_extract_macros] Skipping broken STRING record (length %u)\n", biff_header.length); } //Not implemented. See Microsoft Office Excel97-2007Binary File Format (.xls) Specification Page 18 for details. break; } default: { break; } } len = fputc('\n', out_file); if (len == EOF) { cli_dbgmsg("[cli_xlm_extract_macros] Error writing new line to out file\n"); goto done; } } /* Scan the extracted content */ if (lseek(out_fd, 0, SEEK_SET) != 0) { cli_dbgmsg("cli_xlm_extract_macros: Failed to seek to beginning of temporary file\n"); ret = CL_ESEEK; goto done; } if (cli_scan_desc(out_fd, ctx, CL_TYPE_SCRIPT, 0, NULL, AC_SCAN_VIR, NULL, NULL) == CL_VIRUS) { ret = CL_VIRUS; goto done; } /* If a read failed, return with an error. */ if (size_read == (size_t)-1) { cli_dbgmsg("cli_xlm_extract_macros: Read error occured when trying to read BIFF header. Truncated or malformed XLM macro file?\n"); ret = CL_EREAD; goto done; } ret = CL_SUCCESS; done: if (in_fd != -1) { close(in_fd); in_fd = -1; } if (NULL != out_file) { fclose(out_file); out_file = NULL; } else if (-1 != out_fd) { close(out_fd); out_fd = -1; } if (data != NULL) { free(data); data = NULL; } if (tempfile != NULL) { free(tempfile); tempfile = NULL; } return ret; }