/*
 * CodeView 4 Debug format - declarations
 *
 * (based on cvinfo.h and cvexefmt.h from the Win32 SDK)
 *
 * Copyright 2000 John R. Sheets for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#define sstModule           0x120
#define sstAlignSym         0x125
#define sstSrcModule        0x127
#define sstLibraries        0x128
#define sstGlobalSym        0x129
#define sstGlobalPub        0x12a
#define sstGlobalTypes      0x12b
#define sstSegMap           0x12d
#define sstFileIndex        0x133
#define sstStaticSym        0x134

#if 0
/* Old, crusty value */
#define S_PUB32             0x0203
#endif

#define S_PUB32             0x1009

#include "pshpack1.h"

/*
 * CodeView headers
 */

typedef struct OMFSignature
{
    char        Signature[4];
    long        filepos;
} OMFSignature;

typedef struct OMFDirHeader
{
    unsigned short  cbDirHeader;
    unsigned short  cbDirEntry;
    unsigned long   cDir;
    long            lfoNextDir;
    unsigned long   flags;
} OMFDirHeader;

typedef struct OMFDirEntry
{
    unsigned short  SubSection;
    unsigned short  iMod;
    long            lfo;
    unsigned long   cb;
} OMFDirEntry;


/*
 * sstModule subsection
 */

typedef struct OMFSegDesc
{
    unsigned short  Seg;
    unsigned short  pad;
    unsigned long   Off;
    unsigned long   cbSeg;
} OMFSegDesc;

/* Must chop off the OMFSegDesc* field, because we need to write this
 * struct out to a file.  If we write the whole struct out, we'll end up
 * with (*OMFSegDesc), not (OMFSegDesc).  See OMFModuleFull.
 */
typedef struct OMFModule
{
    unsigned short  ovlNumber;
    unsigned short  iLib;
    unsigned short  cSeg;
    char            Style[2];
} OMFModule;

/* Full version, with memory pointers, too.  Use OMFModule for writing out to
 * a file, and OMFModuleFull for reading.  If offsetof() were available, we
 * could use that instead.
 */
typedef struct OMFModuleFull
{
    unsigned short  ovlNumber;
    unsigned short  iLib;
    unsigned short  cSeg;
    char            Style[2];
    OMFSegDesc      *SegInfo;
    char            *Name;
} OMFModuleFull;


/*
 * sstGlobalPub section
 */

/* Header for symbol table.
 */
typedef struct OMFSymHash
{
    unsigned short  symhash;
    unsigned short  addrhash;
    unsigned long   cbSymbol;
    unsigned long   cbHSym;
    unsigned long   cbHAddr;
} OMFSymHash;

/* Symbol table entry.
 */
typedef struct DATASYM32
{
    unsigned short  reclen;
    unsigned short  rectyp;
    unsigned long   typind;
    unsigned long   off;
    unsigned short  seg;
} DATASYM32;
typedef DATASYM32 PUBSYM32;

/*
 * sstSegMap section
 */

typedef struct OMFSegMapDesc
{
    unsigned short  flags;
    unsigned short  ovl;
    unsigned short  group;
    unsigned short  frame;
    unsigned short  iSegName;
    unsigned short  iClassName;
    unsigned long   offset;
    unsigned long   cbSeg;
} OMFSegMapDesc;

typedef struct OMFSegMap
{
    unsigned short  cSeg;
    unsigned short  cSegLog;
/*    OMFSegMapDesc   rgDesc[0];*/
} OMFSegMap;


/*
 * sstSrcModule section
 */

typedef struct OMFSourceLine
{
    unsigned short  Seg;
    unsigned short  cLnOff;
    unsigned long   offset[1];
    unsigned short  lineNbr[1];
} OMFSourceLine;

typedef struct OMFSourceFile
{
    unsigned short  cSeg;
    unsigned short  reserved;
    unsigned long   baseSrcLn[1];
    unsigned short  cFName;
    char            Name;
} OMFSourceFile;

typedef struct OMFSourceModule
{
    unsigned short  cFile;
    unsigned short  cSeg;
    unsigned long   baseSrcFile[1];
} OMFSourceModule;
