597 lines
14 KiB
C
597 lines
14 KiB
C
/*
|
|
dump - dumps individual records for analysis
|
|
Copyright 2002 Charles N Wyble <jackshck@thewybles.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "config.h" /* Created by ./configure script */
|
|
#include "cole.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h> /* for strcpy() */
|
|
#include <ctype.h> /* For isprint */
|
|
|
|
|
|
#define MODE 0 /* 0 - ascii; 1 - hex */
|
|
#define TEXT 0 /* In ascii mode, 0 - ascii, 1 - hex */
|
|
|
|
#define PRGNAME "xldump"
|
|
#define MAX_COLS 64
|
|
#define MAX_ROWS 512
|
|
|
|
static char FileName[2][12] = /* The section of the Excel Spreadsheet we read in */
|
|
{
|
|
"/Workbook", /* Office 97 */
|
|
"/Book" /* Everything else ? */
|
|
};
|
|
|
|
/* Function Prototypes */
|
|
COLE_LOCATE_ACTION_FUNC dump_file;
|
|
/*static void main_line_processor(int opcode, char data);*/
|
|
static void output_opcode_string (int);
|
|
|
|
/* Global data */
|
|
static char filename[128];
|
|
|
|
int aggressive = 0; /*!< Aggressive html optimization */
|
|
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
int f_ptr = 0;
|
|
COLEFS *cfs;
|
|
COLERRNO colerrno;
|
|
|
|
if (argc < 2)
|
|
{
|
|
fprintf (stderr, "dump - Outputs excel file records for analysis.\n"
|
|
"Usage: " PRGNAME " <FILE>\n");
|
|
exit (1);
|
|
}
|
|
else
|
|
{
|
|
strncpy (filename, argv[1], 124);
|
|
cfs = cole_mount (filename, &colerrno);
|
|
if (cfs == NULL)
|
|
{
|
|
cole_perror (PRGNAME, colerrno);
|
|
exit (1);
|
|
}
|
|
}
|
|
|
|
while (cole_locate_filename
|
|
(cfs, FileName[f_ptr], NULL, dump_file, &colerrno))
|
|
{
|
|
if (f_ptr)
|
|
{
|
|
cole_perror (PRGNAME, colerrno);
|
|
break;
|
|
}
|
|
else
|
|
f_ptr++;
|
|
}
|
|
|
|
if (cole_umount (cfs, &colerrno))
|
|
{
|
|
cole_perror ("travel", colerrno);
|
|
exit (1);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void
|
|
dump_file (COLEDIRENT * cde, void *_info)
|
|
{
|
|
unsigned int length = 0, opcode = 0, target = 0, count = 0;
|
|
unsigned char buf[16];
|
|
COLEFILE *cf;
|
|
COLERRNO err;
|
|
|
|
(void) _info;
|
|
/*UNUSED*/ cf = cole_fopen_direntry (cde, &err);
|
|
|
|
/* Ouput Header */
|
|
printf ("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n");
|
|
printf ("<HTML><HEAD><TITLE>%s", filename);
|
|
printf ("</TITLE></HEAD><BODY>\n");
|
|
|
|
/* Output body */
|
|
#if (MODE == 1)
|
|
while (cole_fread (cf, buf, 8, &err)) /* For mode >= 1 */
|
|
#else
|
|
while (cole_fread (cf, buf, 1, &err))
|
|
#endif
|
|
{
|
|
if (MODE == 0)
|
|
{
|
|
if (count == 0)
|
|
{
|
|
length = 0;
|
|
opcode = (unsigned) buf[0];
|
|
target = 80; /* ficticious number */
|
|
printf ("<br>");
|
|
}
|
|
else if (count == 1)
|
|
opcode |= (buf[0] << 8) & 0x0000FFFFL;
|
|
else if (count == 2)
|
|
length = (unsigned) buf[0];
|
|
else if (count == 3)
|
|
{
|
|
length |= (buf[0] << 8);
|
|
target = length;
|
|
printf ("<br>\nLength:%04X Opcode:%04X - ", length, opcode);
|
|
output_opcode_string (opcode);
|
|
puts ("<br>\n");
|
|
}
|
|
if (count > 3)
|
|
{ /* Here is where we want to process the data */
|
|
/* based on the opcode... */
|
|
#if (TEXT == 0)
|
|
if (isprint (buf[0]))
|
|
putc (buf[0], stdout);
|
|
#else
|
|
printf ("%02X ", buf[0]);
|
|
if (((count - 3) % 8) == 0)
|
|
printf ("<br>\n");
|
|
#endif
|
|
}
|
|
if (count == (target + 3))
|
|
count = 0;
|
|
else
|
|
count++;
|
|
}
|
|
else /* mode >= 1 */
|
|
{
|
|
printf
|
|
("%02x %02x %02x %02x %02x %02x %02x %02x ",
|
|
(unsigned) buf[0], (unsigned) buf[1], (unsigned) buf[2],
|
|
(unsigned) buf[3], (unsigned) buf[4], (unsigned) buf[5],
|
|
(unsigned) buf[6], (unsigned) buf[7]);
|
|
putchar (buf[0]);
|
|
putchar (buf[1]);
|
|
putchar (buf[2]);
|
|
putchar (buf[3]);
|
|
putchar (buf[4]);
|
|
putchar (buf[5]);
|
|
putchar (buf[6]);
|
|
putchar (buf[7]);
|
|
printf ("<br>\n");
|
|
}
|
|
}
|
|
|
|
/* Output Tail */
|
|
printf ("</BODY></HTML>\n");
|
|
cole_fclose (cf, &err);
|
|
}
|
|
|
|
/*static void main_line_processor(int opcode, char data)
|
|
{
|
|
}
|
|
*/
|
|
|
|
static void
|
|
output_opcode_string (int opcode)
|
|
{
|
|
switch (opcode & 0x00FF)
|
|
{
|
|
|
|
/* start of documented general opcodes */
|
|
|
|
case 0x0A:
|
|
puts ("\nEOF: End of File");
|
|
break;
|
|
case 0x0C:
|
|
puts ("CALCCOUNT: Iteration count");
|
|
break;
|
|
case 0x0D:
|
|
puts ("CalcMode: Calculation mode");
|
|
break;
|
|
case 0x0E:
|
|
puts ("Precision");
|
|
break;
|
|
case 0x0F:
|
|
puts ("Reference Mode");
|
|
break;
|
|
case 0x10:
|
|
puts ("Delta: Iteration Increment");
|
|
break;
|
|
case 0x11:
|
|
puts ("Iteration Mode");
|
|
break;
|
|
case 0x12:
|
|
puts ("Protection Flag");
|
|
break;
|
|
case 0x13:
|
|
puts ("Protection Password");
|
|
break;
|
|
case 0x14:
|
|
puts ("Print Header on each page");
|
|
break;
|
|
case 0x15:
|
|
puts ("Print Footer on each page");
|
|
break;
|
|
case 0x16:
|
|
puts ("External Count: Number of external references");
|
|
break;
|
|
case 0x17:
|
|
puts ("External reference");
|
|
break;
|
|
case 0x18:
|
|
puts ("NAME");
|
|
break;
|
|
case 0x19:
|
|
puts ("Windows are Protected");
|
|
break;
|
|
case 0x1A:
|
|
puts ("Vertical Page Breaks");
|
|
break;
|
|
case 0x1B:
|
|
puts ("Horizontal Page Breaks");
|
|
break;
|
|
case 0x1C:
|
|
puts ("Cell Note");
|
|
break;
|
|
case 0x1D:
|
|
puts ("Selection");
|
|
break;
|
|
case 0x22:
|
|
puts ("1904 date system");
|
|
break;
|
|
case 0x26:
|
|
puts ("Left Margin Measurement");
|
|
break;
|
|
case 0x27:
|
|
puts ("Right Margin Measurement");
|
|
break;
|
|
case 0x28:
|
|
puts ("Top Margin Measurement");
|
|
break;
|
|
case 0x29:
|
|
puts ("Bottom Margin Measurement");
|
|
break;
|
|
case 0x2A:
|
|
puts ("Print Row/Column Labels");
|
|
break;
|
|
case 0x2B:
|
|
puts ("Print Gridlines Flag");
|
|
break;
|
|
case 0x2F:
|
|
puts ("File is Password protected");
|
|
break;
|
|
case 0x31:
|
|
puts ("FONT");
|
|
break;
|
|
case 0x3C:
|
|
puts ("Continues long records");
|
|
break;
|
|
case 0x3D:
|
|
puts ("Window1");
|
|
break;
|
|
case 0x40:
|
|
puts ("BACKUP: Save Backup Version of the File");
|
|
break;
|
|
case 0x41:
|
|
puts ("Number of Panes and their position");
|
|
break;
|
|
case 0x42:
|
|
puts ("CODEPAGE: Default code page");
|
|
break;
|
|
case 0x4D:
|
|
puts ("PLS: Environment specific print record");
|
|
break;
|
|
case 0x50:
|
|
puts ("DCON: Data consolidation information");
|
|
break;
|
|
case 0x51:
|
|
puts ("DCONREF: Data consolidation references");
|
|
break;
|
|
case 0x52:
|
|
puts ("DCONNAME: Data Consolidation Named References");
|
|
break;
|
|
case 0x55:
|
|
puts ("DEFCOLWIDTH: Default Column Width");
|
|
break;
|
|
case 0x59:
|
|
puts ("XCT: CRN Record Count");
|
|
break;
|
|
case 0x5A:
|
|
puts ("CRN: Nonresident operands");
|
|
break;
|
|
case 0x5B:
|
|
puts ("FILESHARING:File-sharing information");
|
|
break;
|
|
case 0x5C:
|
|
puts ("Write Access");
|
|
break;
|
|
case 0x5D:
|
|
puts ("OBJ: Describes a Graphic object");
|
|
break;
|
|
case 0x5E:
|
|
puts ("UNCALCED: Recalculation Status");
|
|
break;
|
|
case 0x5F:
|
|
puts ("SAVERECALC: Recalculate before save");
|
|
break;
|
|
case 0x60:
|
|
puts ("TEMPLATE: Workbook is a template");
|
|
break;
|
|
case 0x63:
|
|
puts ("OBJPROTECT: Objects are protected");
|
|
break;
|
|
case 0x7D:
|
|
puts ("COLINFO: Column formatting information");
|
|
break;
|
|
case 0x7E:
|
|
puts ("RK Number");
|
|
break;
|
|
case 0x7F:
|
|
puts ("IMDATA: Image data");
|
|
break;
|
|
case 0x80:
|
|
puts ("GUTS: Size of row and column gutters");
|
|
break;
|
|
case 0x81:
|
|
puts ("WSBOOL: Additional workspace information");
|
|
break;
|
|
case 0x82:
|
|
puts ("GRIDSET: State change of gridlines option");
|
|
break;
|
|
case 0x83:
|
|
puts ("HCENTER: Center between horizontal margins");
|
|
break;
|
|
case 0x84:
|
|
puts ("VCENTER: Center between vertical margins");
|
|
break;
|
|
case 0x85:
|
|
puts ("BoundSheet");
|
|
break;
|
|
case 0x86:
|
|
puts ("WRITEPROT: Workbook is Write-protected");
|
|
break;
|
|
case 0x87:
|
|
puts ("ADDIN: Workbook is add-in macro");
|
|
break;
|
|
case 0x88:
|
|
puts ("EDG: Edition globals");
|
|
break;
|
|
case 0x89:
|
|
puts ("PUB: Publisher");
|
|
break;
|
|
case 0x8C:
|
|
puts ("COUNTRY: Default country and WIN.INI Country");
|
|
break;
|
|
case 0x8D:
|
|
puts ("HIDEOBJ: Object display options");
|
|
break;
|
|
case 0x90:
|
|
puts ("SORT: Sorting options");
|
|
break;
|
|
case 0x91:
|
|
puts ("SUB: Subscriber");
|
|
break;
|
|
case 0x92:
|
|
puts ("Palette Info");
|
|
break;
|
|
case 0x94:
|
|
puts ("LHRECORD: .WK? File Conversion Information");
|
|
break;
|
|
case 0x95:
|
|
puts ("LHNGRAPH: Named Graph Information");
|
|
break;
|
|
case 0x96:
|
|
puts ("SOUND: Sound note");
|
|
break;
|
|
case 0x98:
|
|
puts ("LPR: Sheet was printed using LINE.PRINT()");
|
|
break;
|
|
case 0x99:
|
|
puts ("STANDARDWIDTH: Standard column width");
|
|
break;
|
|
case 0x9A:
|
|
puts ("FNGROUPNAME: Function Group name");
|
|
break;
|
|
case 0x9B:
|
|
puts ("FILTERMODE: Sheet contains filtered list");
|
|
break;
|
|
case 0x9C:
|
|
puts ("FNGROUPCOUNT: Built-in function group count");
|
|
break;
|
|
case 0x9D:
|
|
puts ("AUTOFILTERINFO: Drop Down Arrow Count");
|
|
break;
|
|
case 0x9E:
|
|
puts ("AUTOFILTER: AutoFilter data");
|
|
break;
|
|
case 0xA0:
|
|
puts ("SCL: Window Zoom magnification");
|
|
break;
|
|
case 0xA1:
|
|
puts ("Page Setup");
|
|
break;
|
|
case 0xA9:
|
|
puts ("COORDLIST: Polygon Object Vertex coordinates");
|
|
break;
|
|
case 0xAB:
|
|
puts ("GCW: Global Column-Wdith flags");
|
|
break;
|
|
case 0xAE:
|
|
puts ("SCENMAN: Scenario Output data");
|
|
break;
|
|
case 0xAF:
|
|
puts ("PROT4REV: Shared Workbook protection flag");
|
|
break;
|
|
case 0xB0:
|
|
puts ("SXVIEW: View Definition");
|
|
break;
|
|
case 0xB1:
|
|
puts ("SXVD: View Fields");
|
|
break;
|
|
case 0xB2:
|
|
puts ("SXVI: View Item");
|
|
break;
|
|
case 0xB4:
|
|
puts ("SXIVD: Row/Column Field Ids");
|
|
break;
|
|
case 0xB5:
|
|
puts ("SXLI: Line item array");
|
|
break;
|
|
case 0xB6:
|
|
puts ("SXPI: Page item");
|
|
break;
|
|
case 0xB8:
|
|
puts ("DOCROUTE: Routing slip information");
|
|
break;
|
|
case 0xB9:
|
|
puts ("RECIPNAME: Recipient name");
|
|
break;
|
|
case 0xBC:
|
|
puts ("SHRFMLA: Shared formula");
|
|
break;
|
|
case 0xBD:
|
|
puts ("MULRK: Multiple RK cells");
|
|
break;
|
|
case 0xBE:
|
|
puts ("Multiple Blanks");
|
|
break;
|
|
case 0xC1:
|
|
puts ("MMS: ADDMENU/DELMENU Record Group count");
|
|
break;
|
|
case 0xC2:
|
|
puts ("ADDMENU: Menu Addition");
|
|
break;
|
|
case 0xC3:
|
|
puts ("DELMENU: Menu Deletion");
|
|
break;
|
|
case 0xC5:
|
|
puts ("SXDI: Data Item");
|
|
break;
|
|
case 0xC6:
|
|
puts ("SXDB: PivtoTable Cache Data");
|
|
break;
|
|
case 0xCD:
|
|
puts ("SXSTRING: String");
|
|
break;
|
|
case 0xD0:
|
|
puts ("SXTBL: Multiple Consolidation Source Info");
|
|
break;
|
|
case 0xD1:
|
|
puts ("SXTBRGIITM: Page Item Name Count");
|
|
break;
|
|
case 0xD2:
|
|
puts ("SXTBPG: Page Item Indexes");
|
|
break;
|
|
case 0xD3:
|
|
puts ("OBPROJ: Visual Basic Project");
|
|
break;
|
|
case 0xD5:
|
|
puts ("SXIDSTM: Stream ID");
|
|
break;
|
|
case 0xD6:
|
|
puts ("RString");
|
|
break;
|
|
case 0xD7:
|
|
puts ("DBCELL: Stream offsets");
|
|
break;
|
|
case 0xDA:
|
|
puts ("BOOKBOOL: Workbook option flag");
|
|
break;
|
|
|
|
/* error in ms docs
|
|
case 0xDC:
|
|
puts("PARAMQRY: Query parameters");
|
|
break;
|
|
case 0xDC:
|
|
puts("SXEXT: External source information");
|
|
break;
|
|
*/
|
|
|
|
case 0xDD:
|
|
puts ("SCENPROTECT: Scenario protection");
|
|
break;
|
|
case 0xDE:
|
|
puts ("OLESIZE: Size of an OLE object");
|
|
break;
|
|
case 0xDF:
|
|
puts ("UDDESC: Description string for chart autoformat");
|
|
break;
|
|
case 0xE0:
|
|
puts ("Extended Format");
|
|
break;
|
|
case 0xE1:
|
|
puts ("INTERFACEHDR: Beginning of User Interface Records");
|
|
break;
|
|
case 0xE2:
|
|
puts ("INTERFACEEND: End of User interface records");
|
|
break;
|
|
case 0xE3:
|
|
puts ("SXVS: View source");
|
|
break;
|
|
case 0xEA:
|
|
puts ("TABIDCONF: Sheet tab ID of Conflict history");
|
|
break;
|
|
case 0xEB:
|
|
puts ("MSODRAWINGGROUP: MS Office Drawing Group");
|
|
break;
|
|
case 0xEC:
|
|
puts ("MSODRAWING: MS Office Drawing");
|
|
break;
|
|
case 0xED:
|
|
puts ("MS Office Drawing Selection");
|
|
break;
|
|
case 0xF0:
|
|
puts ("SXRULE: PivotTable Rule data");
|
|
break;
|
|
case 0xF1:
|
|
puts ("SXEX: PivotTable Extended information");
|
|
break;
|
|
case 0xF2:
|
|
puts ("SXFILT: PivotTable Rule Filter");
|
|
break;
|
|
case 0xF6:
|
|
puts ("SXNAME: PivotTable Name");
|
|
break;
|
|
case 0xF7:
|
|
puts ("SXSELECT: PivotTable Selection Information");
|
|
break;
|
|
case 0xF8:
|
|
puts ("PivotTable Name Pair");
|
|
break;
|
|
case 0xF9:
|
|
puts ("PivotTable Parsed Expression");
|
|
break;
|
|
case 0xFB:
|
|
puts ("PivotTable Format Record");
|
|
break;
|
|
case 0xFC:
|
|
puts ("Shared String Table");
|
|
break;
|
|
case 0xFD:
|
|
puts ("Cell Value, String Constant/SST");
|
|
break;
|
|
case 0xFF:
|
|
puts ("Extended Shared String Table");
|
|
break;
|
|
|
|
|
|
default:
|
|
puts ("Unknown Opcode");
|
|
break;
|
|
}
|
|
}
|