diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-11-14 19:35:45 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2024-11-14 19:35:45 +0100 |
commit | df5520aa2dae5b3ce7abf8733dcdd152898af163 (patch) | |
tree | 00d3047bfb14f682bfb5a21010c731ed649bfed7 /app/bin/common.h | |
parent | df247efec654e512242e4f4f1b0212034f9e01fe (diff) | |
parent | ec3c0f6f6e7153fa797dc57a0e95779cbc63a23b (diff) |
Merge branch 'release/debian/1_5.3.0GA-1'debian/1_5.3.0GA-1
Diffstat (limited to 'app/bin/common.h')
-rw-r--r-- | app/bin/common.h | 247 |
1 files changed, 210 insertions, 37 deletions
diff --git a/app/bin/common.h b/app/bin/common.h index 2db961f..f03a04c 100644 --- a/app/bin/common.h +++ b/app/bin/common.h @@ -1,5 +1,5 @@ /** \file common.h - * Defnitions of basic types + * Defnitions of basic types */ /* XTrkCad - Model Railroad CAD @@ -17,26 +17,105 @@ * * 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. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef COMMON_H #define COMMON_H -#include <stdlib.h> +// INCLUDES +#include <ctype.h> +#include <errno.h> +#include <locale.h> +#include <math.h> +#include <stdarg.h> #include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <time.h> + +#include "wlib.h" + +#ifndef WINDOWS +// Unix/Mac +#include <dirent.h> +#include <unistd.h> + +#define PATH_SEPARATOR "/" + +#else +// Windows +#include <io.h> +#include <process.h> +#include "include/dirent.h" +#include "direct.h" +#include "getopt.h" + +// DEFINES +#define UTFCONVERT +#define M_PI 3.14159265358979323846 + +#define F_OK (00) +#define W_OK (02) +#define R_OK (04) +#define PATH_SEPARATOR "\\" + +// ALIASES for WINDOWS +#define access _access +#define unlink(a) _unlink((a)) +#define rmdir(a) _rmdir((a)) +#define open(name, flag, mode) _open((name), (flag), (mode)) +#define close(file) _close((file)) +#define getpid() _getpid() +#define strcasecmp _stricmp +#define strncasecmp _strnicmp +#define mkdir( DIR, MODE ) _mkdir( (DIR) ) +#if _MSC_VER >1300 +#define strnicmp _strnicmp +#define stricmp _stricmp +#define strdup _strdup +#endif +// starting from Visual Studio 2015 round is in the runtime library, fake otherwise +#if ( _MSC_VER < 1900 ) +#define round(x) floor((x)+0.5) +#endif + +/* suppress warning from *.bmp about conversion of int to char */ +#pragma warning( disable : 4305 ) +/* suppress warning about array references */ +#pragma warning( disable : 6385 ) +#endif + +// We need to pass integer values via void* objects +// typically context vars (declared as void*) which sometimes pass pointers and some times integers +// For example see paramData_t.context. +// Also some wlib calls take a generic parameter, declared as void* but somethings used to pass integers +// These are used in logical pairs; VP=I2VP(INTEGER); ...a lot of code...; INTEGER=VP2L(VP); +// Note: we never use VP2L to manipulate integer-ized values of a pointer and all integer values we use fit in a long +#define I2VP(VAL) ((void*)(intptr_t)(VAL)) +#define VP2L(VAL) ((long)(intptr_t)(VAL)) + #ifndef TRUE #define TRUE (1) #define FALSE (0) #endif +#define DIST_INF 2.0E9 + #define NUM_LAYERS (99) +// TYPEDEFS + typedef double FLOAT_T; typedef double POS_T; typedef double DIST_T; typedef double ANGLE_T; +typedef double LWIDTH_T; + #define SCANF_FLOAT_FORMAT "%lf" typedef double DOUBLE_T; @@ -44,8 +123,8 @@ typedef double WDOUBLE_T; typedef double FONTSIZE_T; typedef struct { - POS_T x,y; - } coOrd; + POS_T x,y; +} coOrd; typedef struct { coOrd pt; @@ -66,52 +145,80 @@ typedef signed char TRKTYP_T; typedef int TRKINX_T; typedef long DEBUGF_T; typedef int REGION_T; +typedef long SCALEINX_T; +typedef long GAUGEINX_T; +typedef long SCALEDESCINX_T; + enum paramFileState { PARAMFILE_UNLOADED = 0, PARAMFILE_NOTUSABLE, PARAMFILE_COMPATIBLE, PARAMFILE_FIT, PARAMFILE_MAXSTATE }; -#define SCALE_ANY (-2) -#define SCALE_DEMO (-1) +// DYNARRAY typedef struct { - int cnt; - int max; - void * ptr; - } dynArr_t; - -#if defined(WINDOWS) && ! defined(WIN32) -#define CHECK_SIZE(T,DA) \ - if ( (long)((DA).max) * (long)(sizeof *(T*)NULL) > 65500L ) \ - AbortProg( "Dynamic array too large at %s:%d", __FILE__, __LINE__ ); -#else + int cnt; + int max; + void * ptr; +} dynArr_t; + #define CHECK_SIZE(T,DA) -#endif +/** + * Append INCR mambers to DA + * INCR is > 1 if we plan to add more members soon + * Increments .cnt for the next member + * Note: new members may not be empty + */ #define DYNARR_APPEND(T,DA,INCR) \ { if ((DA).cnt >= (DA).max) { \ - (DA).max += INCR; \ - CHECK_SIZE(T,DA) \ + (DA).max += (INCR); \ + CHECK_SIZE((T),(DA)) \ (DA).ptr = MyRealloc( (DA).ptr, (DA).max * sizeof *(T*)NULL ); \ if ( (DA).ptr == NULL ) \ abort(); \ } \ (DA).cnt++; } -#define DYNARR_ADD(T,DA,INCR) DYNARR_APPEND(T,DA,INCR) +/** + * Return Last member of DA + */ #define DYNARR_LAST(T,DA) \ (((T*)(DA).ptr)[(DA).cnt-1]) +/** + * Return N't member of DA + */ #define DYNARR_N(T,DA,N) \ (((T*)(DA).ptr)[N]) +/** + * Logically empty the DA + * .max and .ptr are untouched + */ #define DYNARR_RESET(T,DA) \ (DA).cnt=0 +/** + * Set number of members to N + * If extending (.cnt > .max ), new values will be 0'd, otherwise not + */ #define DYNARR_SET(T,DA,N) \ - { if ((DA).max < N) { \ - (DA).max = N; \ - CHECK_SIZE(T,DA) \ + { if ((DA).max < (N)) { \ + (DA).max = (N); \ + CHECK_SIZE((T),(DA)) \ (DA).ptr = MyRealloc( (DA).ptr, (DA).max * sizeof *(T*)NULL ); \ if ( (DA).ptr == NULL ) \ abort(); \ } \ - (DA).cnt = N; } + (DA).cnt = (N); } +/** + * Initializes DA to empty when .ptr might be garbage (ie local vars) + * All fields are cleared + */ +#define DYNARR_INIT(T,DA) \ + { (DA).ptr = NULL; \ + (DA).max = 0; \ + (DA).cnt = 0; \ + } +/** + * Initializes DA to empty and frees .ptr + */ #define DYNARR_FREE(T,DA) \ { if ((DA).ptr) { \ MyFree( (DA).ptr); \ @@ -119,27 +226,93 @@ typedef struct { } \ (DA).max = 0; \ (DA).cnt = 0; } -#define DYNARR_REMOVE(T,DA,I) \ +/** + * Removes N'th member from DA + * (Not used) + */ +#define DYNARR_REMOVE(T,DA,N) \ { \ - { if ((DA).cnt-1 > I) { \ - for (int i=I;i<(DA).cnt-1;i++) { \ + { if ((DA).cnt-1 > (N)) { \ + for (int i=(N);i<(DA).cnt-1;i++) { \ (((T*)(DA).ptr)[i])= (((T*)(DA).ptr)[i+1]); \ } \ } \ } \ - if ((DA.cnt)>=I) (DA).cnt--; \ + if ((DA).cnt>=(N)) (DA).cnt--; \ } +// Base DotsPerInch +#define BASE_DPI (75.0) -#ifdef WINDOWS -#define M_PI 3.14159 -#define strcasecmp _stricmp -#define strncasecmp _strnicmp -#endif +// FILE VERSIONS - non-backward file format changes +// Descriptions added for Bezier, Cornu, Joint +#define VERSION_DESCRIPTION2 (12) +// Inline quoted text replaces multiline text in Notes and Cars +#define VERSION_INLINENOTE (12) +// END is replaced by END$SEGS, END$TRK, ... +#define VERSION_NONAKEDENDS (12) -#if _MSC_VER >1300 - #define strdup _strdup -#endif + +// FORWARD TYPE DECLS +typedef struct drawCmd_t * drawCmd_p; +typedef struct track_t * track_p; +typedef struct track_t * track_cp; +typedef struct trkSeg_t * trkSeg_p; +typedef struct traverseTrack_t * traverseTrack_p; +typedef struct trkEndPt_t * trkEndPt_p; +typedef void (*doSaveCallBack_p)( void ); +typedef void (*addButtonCallBack_t)(void*); +typedef STATUS_T (*procCommand_t) (wAction_t, coOrd); + + +// base class for extraData*_t: each of which must include this struct as the first element +typedef struct extraDataBase_t { + TRKTYP_T trkType; +} extraDataBase_t; +// We check if TRKTYP_T in trk, trk->extraDataBase and the code context (TRKTYP) match. +// If TRKTYP is T_NOTRACK then we are dealing with T_TURNOUT/T_STRUCTURE or T_BEZIER/T_BEZLIN which +// share a log of code and have the same extraData*_t structure. +#define GET_EXTRA_DATA(TRK,TRKTYP,TYPE) \ + ((TYPE*)GetTrkExtraData( (TRK), (TRKTYP) )) +extraDataBase_t * GetTrkExtraData( track_p, TRKTYP_T ); + + +typedef struct { + BOOL_T valid; + DIST_T length; + DIST_T width; + DIST_T spacing; +} tieData_t, *tieData_p; + +// Syntactic suger for exported (non-static) objects +#define EXPORT + +#define COUNT(A) (sizeof(A)/sizeof(A[0])) + +#define STR_SIZE (256) +#define STR_SHORT_SIZE (80) +#define STR_LONG_SIZE (1024) +#define STR_HUGE_SIZE (10240) + +#define CAST_AWAY_CONST (char*) + +#define TITLEMAXLEN (40) + + + +// COMMON INCLUDES +// If you add includes here, please remove them elsewhere + +#include "i18n.h" +#include "utility.h" +#include "acclkeys.h" +#include "misc.h" + +// TODO - move these includes to the files that need them +#include "dlayer.h" +#include "scale.h" +#include "command.h" +#include "menu.h" #endif |