ref: 9a257cdf78ee4fa7d3de5bbb5be3ca733b06077f
parent: 50fd94fa5ff1b6a468880ca63c64e506d6de295f
author: Stephen Finniss <scfinniss@gmail.com>
date: Sat Feb 25 17:51:13 EST 2017
Support for Watcom C This adds support for compiling using Watcom C. The main change is the addition of the PACKED_STRUCT() macro, as Watcom uses a different syntax to gcc for marking structs as packed. Also, remove a couple of gccisms that are not supported in Watcom, and the last leftover __WATCOMC__ defines from heretic's d_main.c, which are obsolete anyway. Thanks to @scfinniss for this work.
--- a/src/doom/doomdata.h
+++ b/src/doom/doomdata.h
@@ -54,16 +54,16 @@
// A single Vertex.
-typedef struct
+typedef PACKED_STRUCT (
{
short x;
short y;
-} PACKEDATTR mapvertex_t;
+}) mapvertex_t;
// A SideDef, defining the visual appearance of a wall,
// by setting textures and offsets.
-typedef struct
+typedef PACKED_STRUCT (
{
short textureoffset;
short rowoffset;
@@ -72,13 +72,13 @@
char midtexture[8];
// Front sector, towards viewer.
short sector;
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
// A LineDef, as used for editing, and as input
// to the BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
{
short v1;
short v2;
@@ -87,7 +87,7 @@
short tag;
// sidenum[1] will be -1 if one sided
short sidenum[2];
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
//
@@ -135,7 +135,7 @@
// Sector definition, from editing.
-typedef struct
+typedef PACKED_STRUCT (
{
short floorheight;
short ceilingheight;
@@ -144,20 +144,20 @@
short lightlevel;
short special;
short tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
// SubSector, as generated by BSP.
-typedef struct
+typedef PACKED_STRUCT (
{
short numsegs;
// Index of first one, segs are stored sequentially.
short firstseg;
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
// LineSeg, generated by splitting LineDefs
// using partition lines selected by BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
{
short v1;
short v2;
@@ -165,7 +165,7 @@
short linedef;
short side;
short offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
@@ -174,7 +174,7 @@
// Indicate a leaf.
#define NF_SUBSECTOR 0x8000
-typedef struct
+typedef PACKED_STRUCT (
{
// Partition line from (x,y) to x+dx,y+dy)
short x;
@@ -190,7 +190,7 @@
// else it's a node of another subtree.
unsigned short children[2];
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
@@ -197,7 +197,7 @@
// Thing definition, position, orientation and type,
// plus skill/visibility flags and attributes.
-typedef struct
+typedef PACKED_STRUCT (
{
short x;
short y;
@@ -204,7 +204,7 @@
short angle;
short type;
short options;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
--- a/src/doom/p_setup.c
+++ b/src/doom/p_setup.c
@@ -677,11 +677,13 @@
unsigned int rejectpad[4] =
{
- ((totallines * 4 + 3) & ~3) + 24, // Size
+ 0, // Size
0, // Part of z_zone block header
50, // PU_LEVEL
0x1d4a11 // DOOM_CONST_ZONEID
};
+
+ rejectpad[0] = ((totallines * 4 + 3) & ~3) + 24;
// Copy values from rejectpad into the destination array.
--- a/src/doom/r_data.c
+++ b/src/doom/r_data.c
@@ -56,7 +56,7 @@
// into the rectangular texture space using origin
// and possibly other attributes.
//
-typedef struct
+typedef PACKED_STRUCT (
{
short originx;
short originy;
@@ -63,7 +63,7 @@
short patch;
short stepdir;
short colormap;
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
//
@@ -71,7 +71,7 @@
// A DOOM wall texture is a list of patches
// which are to be combined in a predefined order.
//
-typedef struct
+typedef PACKED_STRUCT (
{
char name[8];
int masked;
@@ -80,7 +80,7 @@
int obsolete;
short patchcount;
mappatch_t patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
// A single patch from a texture definition,
--- a/src/doomtype.h
+++ b/src/doomtype.h
@@ -63,7 +63,15 @@
#define PACKEDATTR
#endif
-// C99 integer types; with gcc we just use this. Other compilers
+#ifdef __WATCOMC__
+#define PACKEDPREFIX _Packed
+#else
+#define PACKEDPREFIX
+#endif
+
+#define PACKED_STRUCT(...) PACKEDPREFIX struct __VA_ARGS__ PACKEDATTR
+
+// C99 integer types; with gcc we just use this. Other compilers
// should add conditional statements that define the C99 types.
// What is really wanted here is stdint.h; however, some old versions
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -457,15 +457,6 @@
{
return;
}
- // haleyjd FIXME: convert to textscreen code?
-#ifdef __WATCOMC__
- _settextposition(23, 2);
- _setbkcolor(1);
- _settextcolor(0);
- _outtext(exrnwads);
- _settextposition(24, 2);
- _outtext(exrnwads2);
-#endif
}
boolean D_AddFile(char *file)
@@ -551,41 +542,6 @@
return;
}
-#if 0
- progress = (98 * thermCurrent) / thermMax;
- screen = (char *) 0xb8000 + (THERM_Y * 160 + THERM_X * 2);
- for (i = 0; i < progress / 2; i++)
- {
- switch (i)
- {
- case 4:
- case 9:
- case 14:
- case 19:
- case 29:
- case 34:
- case 39:
- case 44:
- *screen++ = 0xb3;
- *screen++ = (THERMCOLOR << 4) + 15;
- break;
- case 24:
- *screen++ = 0xba;
- *screen++ = (THERMCOLOR << 4) + 15;
- break;
- default:
- *screen++ = 0xdb;
- *screen++ = 0x40 + THERMCOLOR;
- break;
- }
- }
- if (progress & 1)
- {
- *screen++ = 0xdd;
- *screen++ = 0x40 + THERMCOLOR;
- }
-#else
-
// No progress? Don't update the screen.
progress = (50 * thermCurrent) / thermMax + 2;
@@ -608,7 +564,6 @@
}
TXT_UpdateScreen();
-#endif
}
void initStartup(void)
@@ -659,39 +614,7 @@
char tmsg[300];
void tprintf(char *msg, int initflag)
{
- // haleyjd FIXME: convert to textscreen code?
-#ifdef __WATCOMC__
- char temp[80];
- int start;
- int add;
- int i;
-
- if (initflag)
- tmsg[0] = 0;
- M_StringConcat(tmsg, msg, sizeof(tmsg));
- blitStartup();
- DrawThermo();
- _setbkcolor(4);
- _settextcolor(15);
- for (add = start = i = 0; i <= strlen(tmsg); i++)
- if ((tmsg[i] == '\n') || (!tmsg[i]))
- {
- memset(temp, 0, 80);
- M_StringCopy(temp, tmsg + start, sizeof(temp));
- if (i - start < sizeof(temp))
- {
- temp[i - start] = '\0';
- }
- _settextposition(MSG_Y + add, 40 - strlen(temp) / 2);
- _outtext(temp);
- start = i + 1;
- add++;
- }
- _settextposition(25, 1);
- drawstatus();
-#else
printf("%s", msg);
-#endif
}
// haleyjd: moved up, removed WATCOMC code
--- a/src/heretic/doomdata.h
+++ b/src/heretic/doomdata.h
@@ -48,26 +48,26 @@
};
-typedef struct
+typedef PACKED_STRUCT (
{
short x, y;
-} PACKEDATTR mapvertex_t;
+}) mapvertex_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short textureoffset;
short rowoffset;
char toptexture[8], bottomtexture[8], midtexture[8];
short sector; // on viewer's side
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short v1, v2;
short flags;
short special, tag;
short sidenum[2]; // sidenum[1] will be -1 if one sided
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
#define ML_BLOCKING 1
#define ML_BLOCKMONSTERS 2
@@ -88,43 +88,43 @@
#define ML_MAPPED 256 // set if allready drawn in automap
-typedef struct
+typedef PACKED_STRUCT (
{
short floorheight, ceilingheight;
char floorpic[8], ceilingpic[8];
short lightlevel;
short special, tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short numsegs;
short firstseg; // segs are stored sequentially
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short v1, v2;
short angle;
short linedef, side;
short offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
#define NF_SUBSECTOR 0x8000
-typedef struct
+typedef PACKED_STRUCT (
{
short x, y, dx, dy; // partition line
short bbox[2][4]; // bounding box for each child
unsigned short children[2]; // if NF_SUBSECTOR its a subsector
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short x, y;
short angle;
short type;
short options;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
#define MTF_EASY 1
#define MTF_NORMAL 2
@@ -139,7 +139,7 @@
===============================================================================
*/
-typedef struct
+typedef PACKED_STRUCT (
{
short originx;
short originy;
@@ -146,9 +146,9 @@
short patch;
short stepdir;
short colormap;
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
-typedef struct
+typedef PACKED_STRUCT (
{
char name[8];
boolean masked;
@@ -157,7 +157,7 @@
int obsolete;
short patchcount;
mappatch_t patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
/*
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -188,7 +188,7 @@
{
// only get hexen.cfg path if one is not already found
- if (!strcmp(SavePathConfig, ""))
+ if (SavePathConfig == NULL || !strcmp(SavePathConfig, ""))
{
// If we are not using a savegame path (probably because we are on
// Windows and not using a config dir), behave like Vanilla Hexen
--- a/src/hexen/p_acs.c
+++ b/src/hexen/p_acs.c
@@ -45,12 +45,12 @@
// TYPES -------------------------------------------------------------------
-typedef struct
+typedef PACKED_STRUCT (
{
int marker;
int infoOffset;
int code;
-} PACKEDATTR acsHeader_t;
+}) acsHeader_t;
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
--- a/src/hexen/xddefs.h
+++ b/src/hexen/xddefs.h
@@ -44,13 +44,13 @@
ML_BEHAVIOR
};
-typedef struct
+typedef PACKED_STRUCT (
{
short x;
short y;
-} PACKEDATTR mapvertex_t;
+}) mapvertex_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short textureoffset;
short rowoffset;
@@ -58,9 +58,9 @@
char bottomtexture[8];
char midtexture[8];
short sector; // on viewer's side
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short v1;
short v2;
@@ -72,7 +72,7 @@
byte arg4;
byte arg5;
short sidenum[2]; // sidenum[1] will be -1 if one sided
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
#define ML_BLOCKING 0x0001
#define ML_BLOCKMONSTERS 0x0002
@@ -96,7 +96,7 @@
#define SPAC_PUSH 4 // when player/monster pushes line
#define SPAC_PCROSS 5 // when projectile crosses line
-typedef struct
+typedef PACKED_STRUCT (
{
short floorheight;
short ceilingheight;
@@ -105,15 +105,15 @@
short lightlevel;
short special;
short tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short numsegs;
short firstseg; // segs are stored sequentially
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short v1;
short v2;
@@ -121,17 +121,17 @@
short linedef;
short side;
short offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
#define NF_SUBSECTOR 0x8000
-typedef struct
+typedef PACKED_STRUCT (
{
short x, y, dx, dy; // partition line
short bbox[2][4]; // bounding box for each child
unsigned short children[2]; // if NF_SUBSECTOR its a subsector
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
-typedef struct
+typedef PACKED_STRUCT (
{
short tid;
short x;
@@ -146,7 +146,7 @@
byte arg3;
byte arg4;
byte arg5;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
#define MTF_EASY 1
#define MTF_NORMAL 2
@@ -166,7 +166,7 @@
//
//--------------------------------------------------------------------------
-typedef struct
+typedef PACKED_STRUCT (
{
short originx;
short originy;
@@ -173,9 +173,9 @@
short patch;
short stepdir;
short colormap;
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
-typedef struct
+typedef PACKED_STRUCT (
{
char name[8];
boolean masked;
@@ -184,6 +184,6 @@
int obsolete;
short patchcount;
mappatch_t patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
#endif // __XDDEFS__
--- a/src/i_oplmusic.c
+++ b/src/i_oplmusic.c
@@ -46,7 +46,7 @@
#define PERCUSSION_LOG_LEN 16
-typedef struct
+typedef PACKED_STRUCT (
{
byte tremolo;
byte attack;
@@ -54,9 +54,9 @@
byte waveform;
byte scale;
byte level;
-} PACKEDATTR genmidi_op_t;
+}) genmidi_op_t;
-typedef struct
+typedef PACKED_STRUCT (
{
genmidi_op_t modulator;
byte feedback;
@@ -63,9 +63,9 @@
genmidi_op_t carrier;
byte unused;
short base_note_offset;
-} PACKEDATTR genmidi_voice_t;
+}) genmidi_voice_t;
-typedef struct
+typedef PACKED_STRUCT (
{
unsigned short flags;
byte fine_tuning;
@@ -72,7 +72,7 @@
byte fixed_note;
genmidi_voice_t voices[2];
-} PACKEDATTR genmidi_instr_t;
+}) genmidi_instr_t;
// Data associated with a channel of a track that is currently playing.
--- a/src/midifile.c
+++ b/src/midifile.c
@@ -33,19 +33,19 @@
#pragma pack(push, 1)
#endif
-typedef struct
+typedef PACKED_STRUCT (
{
byte chunk_id[4];
unsigned int chunk_size;
-} PACKEDATTR chunk_header_t;
+}) chunk_header_t;
-typedef struct
+typedef PACKED_STRUCT (
{
chunk_header_t chunk_header;
unsigned short format_type;
unsigned short num_tracks;
unsigned short time_division;
-} PACKEDATTR midi_header_t;
+}) midi_header_t;
// haleyjd 09/09/10: packing off.
#ifdef _MSC_VER
--- a/src/mus2mid.c
+++ b/src/mus2mid.c
@@ -53,7 +53,7 @@
} midievent;
// Structure to hold MUS file header
-typedef struct
+typedef PACKED_STRUCT (
{
byte id[4];
unsigned short scorelength;
@@ -61,7 +61,7 @@
unsigned short primarychannels;
unsigned short secondarychannels;
unsigned short instrumentcount;
-} PACKEDATTR musheader;
+}) musheader;
// Standard MIDI type 0 header + track header
static const byte midiheader[] =
--- a/src/strife/doomdata.h
+++ b/src/strife/doomdata.h
@@ -54,16 +54,16 @@
// A single Vertex.
-typedef struct
+typedef PACKED_STRUCT (
{
short x;
short y;
-} PACKEDATTR mapvertex_t;
+}) mapvertex_t;
// A SideDef, defining the visual appearance of a wall,
// by setting textures and offsets.
-typedef struct
+typedef PACKED_STRUCT (
{
short textureoffset;
short rowoffset;
@@ -72,13 +72,13 @@
char midtexture[8];
// Front sector, towards viewer.
short sector;
-} PACKEDATTR mapsidedef_t;
+}) mapsidedef_t;
// A LineDef, as used for editing, and as input
// to the BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
{
short v1;
short v2;
@@ -87,7 +87,7 @@
short tag;
// sidenum[1] will be -1 if one sided
short sidenum[2];
-} PACKEDATTR maplinedef_t;
+}) maplinedef_t;
//
@@ -147,7 +147,7 @@
// Sector definition, from editing.
-typedef struct
+typedef PACKED_STRUCT (
{
short floorheight;
short ceilingheight;
@@ -156,20 +156,20 @@
short lightlevel;
short special;
short tag;
-} PACKEDATTR mapsector_t;
+}) mapsector_t;
// SubSector, as generated by BSP.
-typedef struct
+typedef PACKED_STRUCT (
{
short numsegs;
// Index of first one, segs are stored sequentially.
short firstseg;
-} PACKEDATTR mapsubsector_t;
+}) mapsubsector_t;
// LineSeg, generated by splitting LineDefs
// using partition lines selected by BSP builder.
-typedef struct
+typedef PACKED_STRUCT (
{
short v1;
short v2;
@@ -177,7 +177,7 @@
short linedef;
short side;
short offset;
-} PACKEDATTR mapseg_t;
+}) mapseg_t;
@@ -186,7 +186,7 @@
// Indicate a leaf.
#define NF_SUBSECTOR 0x8000
-typedef struct
+typedef PACKED_STRUCT (
{
// Partition line from (x,y) to x+dx,y+dy)
short x;
@@ -202,7 +202,7 @@
// else it's a node of another subtree.
unsigned short children[2];
-} PACKEDATTR mapnode_t;
+}) mapnode_t;
@@ -209,7 +209,7 @@
// Thing definition, position, orientation and type,
// plus skill/visibility flags and attributes.
-typedef struct
+typedef PACKED_STRUCT (
{
short x;
short y;
@@ -216,7 +216,7 @@
short angle;
short type;
short options;
-} PACKEDATTR mapthing_t;
+}) mapthing_t;
--- a/src/strife/m_saves.c
+++ b/src/strife/m_saves.c
@@ -25,6 +25,8 @@
#include <win_opendir.h>
#elif defined(__GNUC__) || defined(POSIX)
#include <dirent.h>
+#elif defined(__WATCOMC__)
+#include <direct.h>
#else
#error Need an include for dirent.h!
#endif
--- a/src/strife/p_setup.c
+++ b/src/strife/p_setup.c
@@ -670,11 +670,13 @@
unsigned int rejectpad[4] =
{
- ((totallines * 4 + 3) & ~3) + 24, // Size
+ 0, // Size
0, // Part of z_zone block header
50, // PU_LEVEL
0x1d4a11 // DOOM_CONST_ZONEID
};
+
+ rejectpad[0] = ((totallines * 4 + 3) & ~3) + 24;
// Copy values from rejectpad into the destination array.
--- a/src/strife/r_data.c
+++ b/src/strife/r_data.c
@@ -52,7 +52,7 @@
// into the rectangular texture space using origin
// and possibly other attributes.
//
-typedef struct
+typedef PACKED_STRUCT (
{
short originx;
short originy;
@@ -59,7 +59,7 @@
short patch;
//short stepdir; // villsa [STRIFE] removed
//short colormap; // villsa [STRIFE] removed
-} PACKEDATTR mappatch_t;
+}) mappatch_t;
//
@@ -67,7 +67,7 @@
// A DOOM wall texture is a list of patches
// which are to be combined in a predefined order.
//
-typedef struct
+typedef PACKED_STRUCT (
{
char name[8];
int masked;
@@ -76,7 +76,7 @@
//int obsolete; // villsa [STRIFE] removed
short patchcount;
mappatch_t patches[1];
-} PACKEDATTR maptexture_t;
+}) maptexture_t;
// A single patch from a texture definition,
--- a/src/v_patch.h
+++ b/src/v_patch.h
@@ -26,22 +26,22 @@
// and we compose textures from the TEXTURE1/2 lists
// of patches.
-typedef struct
-{
- short width; // bounding box size
- short height;
- short leftoffset; // pixels to the left of origin
- short topoffset; // pixels below the origin
+typedef PACKED_STRUCT (
+{
+ short width; // bounding box size
+ short height;
+ short leftoffset; // pixels to the left of origin
+ short topoffset; // pixels below the origin
int columnofs[8]; // only [width] used
- // the [0] is &columnofs[width]
-} PACKEDATTR patch_t;
+ // the [0] is &columnofs[width]
+}) patch_t;
// posts are runs of non masked source pixels
-typedef struct
+typedef PACKED_STRUCT (
{
byte topdelta; // -1 is the last post in a column
byte length; // length data bytes follows
-} PACKEDATTR post_t;
+}) post_t;
// column_t is a list of 0 or more post_t, (byte)-1 terminated
typedef post_t column_t;
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -619,7 +619,7 @@
// SCREEN SHOTS
//
-typedef struct
+typedef PACKED_STRUCT (
{
char manufacturer;
char version;
@@ -643,7 +643,7 @@
char filler[58];
unsigned char data; // unbounded
-} PACKEDATTR pcx_t;
+}) pcx_t;
//
--- a/src/w_wad.c
+++ b/src/w_wad.c
@@ -35,21 +35,21 @@
#include "w_wad.h"
-typedef struct
+typedef PACKED_STRUCT (
{
// Should be "IWAD" or "PWAD".
char identification[4];
int numlumps;
int infotableofs;
-} PACKEDATTR wadinfo_t;
+}) wadinfo_t;
-typedef struct
+typedef PACKED_STRUCT (
{
int filepos;
int size;
char name[8];
-} PACKEDATTR filelump_t;
+}) filelump_t;
//
// GLOBALS