source: git/src/cavern.h @ b9122e1

debug-cidebug-ci-sanitisersfaster-cavernloglog-selectstereo-2025walls-datawalls-data-hanging-as-warningwarn-only-for-hanging-survey
Last change on this file since b9122e1 was 37d6b84, checked in by Olly Betts <olly@…>, 3 years ago

cavern: Report results of each *declination auto

For each *declination auto command cavern now reports an "info"
message showing the range of calculated declination values and
the dates at which the ends of the range were obtained, and also
the grid convergence (which doesn't vary with time).

Fixes #92, reported by Rob Eavis.

  • Property mode set to 100644
File size: 14.6 KB
RevLine 
[0badc31]1/* cavern.h
[bb90203]2 * SURVEX Cave surveying software - header file
[37d6b84]3 * Copyright (C) 1991-2022 Olly Betts
[44bb30d]4 * Copyright (C) 2004 Simeon Warner
[846746e]5 *
[89231c4]6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
[846746e]10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
[89231c4]13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
[846746e]15 *
[89231c4]16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
[d333899]18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
[bb90203]19 */
20
[3875c32]21#ifndef CAVERN_H
22#define CAVERN_H
23
[05c700b]24/* Using covariances increases the memory required somewhat - may be
25 * desirable to disable this for small memory machines */
26
[93ac03a]27/* #define NO_COVARIANCES 1 */
[bb90203]28
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <ctype.h>
33#include <math.h>
34#include <float.h>
35
[b39e24a]36#include <proj.h>
[c092d72]37
[a405bc1]38#include "img_hosted.h"
[3d441da]39#include "useful.h"
[bb90203]40
[05c700b]41/* Set EXPLICIT_FIXED_FLAG to 1 to force an explicit fixed flag to be used
42 * in each pos struct, rather than using p[0]==UNFIXED_VAL to indicate
43 * unfixed-ness.  This may be slightly faster, but uses more memory.
[bb90203]44 */
45#ifndef EXPLICIT_FIXED_FLAG
46# define EXPLICIT_FIXED_FLAG 0
47#endif
48
49typedef double real; /* so we can change the precision used easily */
50#define HUGE_REAL HUGE_VAL
[7bdf66d]51#define REAL_EPSILON DBL_EPSILON
[bb90203]52
53#if (!EXPLICIT_FIXED_FLAG)
54# define UNFIXED_VAL HUGE_VAL /* if p[0]==UNFIXED_VAL, station is unfixed */
55#endif
56
[7d40549]57#define SPECIAL_EOL             0x0001
58#define SPECIAL_BLANK           0x0002
59#define SPECIAL_KEYWORD         0x0004
60#define SPECIAL_COMMENT         0x0008
61#define SPECIAL_OMIT            0x0010
[a882316]62#ifndef NO_DEPRECATED
[7d40549]63#define SPECIAL_ROOT            0x0020
[a882316]64#endif
[7d40549]65#define SPECIAL_SEPARATOR       0x0040
66#define SPECIAL_NAMES           0x0080
67#define SPECIAL_DECIMAL         0x0100
68#define SPECIAL_MINUS           0x0200
69#define SPECIAL_PLUS            0x0400
70#define SPECIAL_OPEN            0x0800
71#define SPECIAL_CLOSE           0x1000
[bb90203]72
[3875c32]73extern char *fnm_output_base;
74extern int fnm_output_base_is_dir;
75
[d1878c51]76extern bool fExportUsed;
77
[1ee204e]78extern int current_days_since_1900;
[e0c7cd1]79
[bb90203]80/* Types */
81
[05c700b]82typedef enum {
[009a9e4]83   Q_NULL = -1, Q_DEFAULT, Q_POS, Q_PLUMB, Q_LEVEL,
84   Q_GRADIENT, Q_BACKGRADIENT, Q_BEARING, Q_BACKBEARING,
[4f38f94]85   Q_LENGTH, Q_BACKLENGTH, Q_DEPTH, Q_DX, Q_DY, Q_DZ, Q_COUNT, Q_DECLINATION,
[009a9e4]86   Q_LEFT, Q_RIGHT, Q_UP, Q_DOWN,
87   Q_MAC
[05c700b]88} q_quantity;
[bb90203]89
[27b8b59]90typedef enum {
91   INFER_NULL = -1, INFER_EQUATES, INFER_EXPORTS, INFER_PLUMBS, INFER_SUBSURVEYS
92} infer_what;
93
[bb90203]94/* unsigned long to cope with 16-bit int-s */
95#define BIT(N) (1UL << (N))
96#define BITA(N) (1UL << ((N) - 'a'))
97
[7f08c83]98#define TSTBIT(W, N) (((W)>>(N))&1)
99
[bb90203]100/* masks for quantities which are length and angles respectively */
[4f38f94]101#define LEN_QMASK (BIT(Q_LENGTH) | BIT(Q_BACKLENGTH) | BIT(Q_DEPTH) |\
[9dc51ae]102   BIT(Q_DX) | BIT(Q_DY) | BIT(Q_DZ) | BIT(Q_POS) | BIT(Q_COUNT) |\
103   BIT(Q_LEFT) | BIT(Q_RIGHT) | BIT(Q_UP) | BIT(Q_DOWN))
[b14f44f]104#define ANG_QMASK (BIT(Q_BEARING) | BIT(Q_BACKBEARING) |\
105   BIT(Q_GRADIENT) | BIT(Q_BACKGRADIENT) | BIT(Q_PLUMB) | BIT(Q_LEVEL) |\
106   BIT(Q_DECLINATION))
[bb90203]107
[5c3c61a]108/* if you add/change the order, check factor_tab in commands.c */
[05c700b]109typedef enum {
110   UNITS_NULL = -1, UNITS_METRES, UNITS_FEET, UNITS_YARDS,
[00b10c1]111   UNITS_DEGS, UNITS_QUADRANTS, UNITS_GRADS, UNITS_PERCENT, UNITS_MINUTES,
112   UNITS_MAC, UNITS_DEPRECATED_ALIAS_FOR_GRADS
[05c700b]113} u_units;
[5c3c61a]114
[95c3272]115/* don't reorder these values!  They need to match with img.h too */
[5c3c61a]116typedef enum {
[95c3272]117   FLAGS_NOT = -2, FLAGS_UNKNOWN = -1, FLAGS_SURFACE, FLAGS_DUPLICATE,
[710ecc1]118   FLAGS_SPLAY,
[3d441da]119#if 0
120   /* underground, but through rock (e.g. radiolocation).  Want to hide from
121    * plots by default (so not cave) but don't want to include in surface
122    * triangulation nets (so not surface) */
[710ecc1]123   FLAGS_SKELETAL, /* FIXME */
[3d441da]124#endif
[dcbcae0]125   /* Don't need to match img.h: */
126   FLAGS_ANON_ONE_END,
[eb5aea0]127   FLAGS_IMPLICIT_SPLAY,
128   FLAGS_STYLE_BIT0, FLAGS_STYLE_BIT1, FLAGS_STYLE_BIT2
[5c3c61a]129} flags;
[bb90203]130
[eb5aea0]131/* flags are currently stored in an unsigned char */
132typedef int compiletimeassert_flags0[FLAGS_STYLE_BIT2 <= 7 ? 1 : -1];
133
134/* Mask to AND with to get bits to pass to img library. */
135#define FLAGS_MASK \
136    (BIT(FLAGS_SURFACE) | BIT(FLAGS_DUPLICATE) | BIT(FLAGS_SPLAY))
137
[ab4de24]138typedef int compiletimeassert_flags1[BIT(FLAGS_SURFACE) == img_FLAG_SURFACE ? 1 : -1];
139typedef int compiletimeassert_flags2[BIT(FLAGS_DUPLICATE) == img_FLAG_DUPLICATE ? 1 : -1];
140typedef int compiletimeassert_flags3[BIT(FLAGS_SPLAY) == img_FLAG_SPLAY ? 1 : -1];
141
[95c3272]142typedef enum {
[ee05463]143   /* Don't reorder these values!  They need to match with img.h too. */
[dfb4240]144   SFLAGS_SURFACE = 0, SFLAGS_UNDERGROUND, SFLAGS_ENTRANCE, SFLAGS_EXPORTED,
[dcbcae0]145   SFLAGS_FIXED, SFLAGS_ANON, SFLAGS_WALL,
[ee05463]146   /* These values don't need to match img.h, but mustn't clash. */
[f15cde77]147   SFLAGS_USED = 11,
[d333899]148   SFLAGS_SOLVED = 12, SFLAGS_SUSPECTTYPO = 13, SFLAGS_SURVEY = 14, SFLAGS_PREFIX_ENTERED = 15
[95c3272]149} sflags;
[ee05463]150
151/* Mask to AND with to get bits to pass to img library. */
152#define SFLAGS_MASK (BIT(SFLAGS_SURFACE) | BIT(SFLAGS_UNDERGROUND) |\
[a2c33ae]153        BIT(SFLAGS_ENTRANCE) | BIT(SFLAGS_EXPORTED) | BIT(SFLAGS_FIXED) |\
[dcbcae0]154        BIT(SFLAGS_ANON) | BIT(SFLAGS_WALL))
[95c3272]155
[ab4de24]156typedef int compiletimeassert_sflags1[BIT(SFLAGS_SURFACE) == img_SFLAG_SURFACE ? 1 : -1];
157typedef int compiletimeassert_sflags2[BIT(SFLAGS_UNDERGROUND) == img_SFLAG_UNDERGROUND ? 1 : -1];
158typedef int compiletimeassert_sflags3[BIT(SFLAGS_ENTRANCE) == img_SFLAG_ENTRANCE ? 1 : -1];
159typedef int compiletimeassert_sflags4[BIT(SFLAGS_EXPORTED) == img_SFLAG_EXPORTED ? 1 : -1];
160typedef int compiletimeassert_sflags5[BIT(SFLAGS_FIXED) == img_SFLAG_FIXED ? 1 : -1];
[a2c33ae]161typedef int compiletimeassert_sflags6[BIT(SFLAGS_ANON) == img_SFLAG_ANON ? 1 : -1];
[dcbcae0]162typedef int compiletimeassert_sflags7[BIT(SFLAGS_WALL) == img_SFLAG_WALL ? 1 : -1];
[ab4de24]163
[bb90203]164/* enumeration of field types */
[05c700b]165typedef enum {
[4f38f94]166   End = 0, Tape, Comp, Clino, BackTape, BackComp, BackClino,
167   Left, Right, Up, Down,
[21c226e]168   FrDepth, ToDepth, Dx, Dy, Dz, FrCount, ToCount,
[44bb30d]169   /* Up to here are readings are allowed multiple values
170    * and have slot in the value[] array in datain.c.
171    * (Depth, DepthChange, and Count can have multiple
172    * readings, but are actually handled using tokens
173    * above rather than as themselves).
174    *
175    * Fr must be the first reading after this comment!
176    */
[21c226e]177   Fr, To, Station, Depth, DepthChange, Count, Dir,
[44bb30d]178   Newline, IgnoreAllAndNewLine, Ignore, IgnoreAll,
179   /* IgnoreAll must be the last reading before this comment!
180    *
181    * Readings after this comment are only used in datain.c
182    * so can have enum values >= 32 because we only use a
183    * bitmask for those readings used in commands.c.
184    */
[07442af]185   CompassDATComp, CompassDATClino, CompassDATBackComp, CompassDATBackClino,
186   CompassDATLeft, CompassDATRight, CompassDATUp, CompassDATDown,
187   CompassDATFlags
[0395657]188} reading;
[05c700b]189
[90bb053f]190/* if IgnoreAll is >= 32, the compiler will choke on this */
191typedef char compiletimeassert_reading[IgnoreAll < 32 ? 1 : -1];
192
[3d441da]193/* position or length vector */
194typedef real delta[3];
195
196/* variance */
197#ifdef NO_COVARIANCES
198typedef real var[3];
199typedef var svar;
200#else
201typedef real var[3][3];
202typedef real svar[6];
203#endif
[bb90203]204
205/* station name */
206typedef struct Prefix {
207   struct Prefix *up, *down, *right;
208   struct Node *stn;
209   struct Pos *pos;
[eb18f4d]210   const char *ident;
[4d9eecd]211   const char *filename;
212   unsigned int line;
[c00c74a9]213   /* If (min_export == 0) then max_export is max # levels above is this
214    * prefix is used (and so needs to be exported) (0 == parent only).
215    * If (min_export > 0) then max_export is max # levels above this
[932f7e9]216    * prefix has been exported, and min_export is how far down the exports
217    * have got (if min_export > 1 after a run, this prefix hasn't been
[c00c74a9]218    * exported from below enough).
[27b8b59]219    * If INFER_EXPORTS is active when a station is encountered, we
[c00c74a9]220    * set min_export = USHRT_MAX and max_export gets set as usual.  Then at
221    * the end of the run, we also mark stations with min_export == USHRT_MAX
222    * and max_export > 0 as exported. */
223   unsigned short max_export, min_export;
[95c3272]224   /* stn flags - e.g. surface, underground, entrance
225    * also suspecttypo and survey */
[421b7d2]226   unsigned short sflags;
[c00c74a9]227   short shape;
[bb90203]228} prefix;
229
[b5a3219]230/* survey metadata */
231typedef struct Meta_data {
232    size_t ref_count;
[0e9e1ee]233    /* Days since 1900 for start and end date of survey, or -1 if undated. */
[1ee204e]234    int days1, days2;
[b5a3219]235} meta_data;
236
[bb90203]237/* stuff stored for both forward & reverse legs */
238typedef struct {
239   struct Node *to;
240   /* bits 0..1 = reverse leg number; bit7 is fFullLeg */
241   /* bit6 = fReplacementLeg (by reduction rules) */
[cb3d1e2]242   /* bit5 = articulation leg (i.e. carries no error) */
[67508f0]243   unsigned char reverse;
[5c3c61a]244   /* flags - e.g. surface, duplicate survey
[693388e]245    * only used if (FLAG_DATAHERE & !(FLAG_REPLACEMENTLEG|FLAG_FAKE))
[b5a3219]246    * This could be only in linkfor, but this is actually more space
247    * efficient.
[5c3c61a]248    */
[67508f0]249   unsigned char flags;
[bb90203]250} linkcommon;
[3d441da]251
[cb3d1e2]252#define FLAG_DATAHERE 0x80
253#define FLAG_REPLACEMENTLEG 0x40
[7f08c83]254#define FLAG_ARTICULATION 0x20
[693388e]255#define FLAG_FAKE 0x10 /* an equate or leg inside an sdfix */
[cb3d1e2]256#define MASK_REVERSEDIRN 0x03
[bb90203]257
258/* reverse leg - deltas & vars stored on other dirn */
259typedef struct LinkRev {
260   linkcommon l;
261} linkrev;
262
263/* forward leg - deltas & vars stored here */
264typedef struct Link {
265   linkcommon l;
[eb18f4d]266   delta d; /* Delta */
[59f2dbb]267   svar v; /* Variances */
[b5a3219]268   meta_data *meta;
[bb90203]269} linkfor;
270
271/* node - like a station, except several nodes are used to represent a
272 * station with more than 3 legs connected to it
273 */
274typedef struct Node {
275   struct Prefix *name;
276   struct Link *leg[3];
[564f471]277   struct Node *prev, *next;
[118eea4]278   long colour;
[bb90203]279} node;
280
281/* station position */
282typedef struct Pos {
[eb18f4d]283   delta p; /* Position */
[bb90203]284#if EXPLICIT_FIXED_FLAG
[67508f0]285   unsigned char fFixed; /* flag indicating if station is a fixed point */
[bb90203]286#endif
287} pos;
288
289/*
290typedef struct Inst {
291   real zero, scale, units;
292} inst;
293*/
294
[107b8bd]295/* Survey data styles */
296#define STYLE_NORMAL     0
297#define STYLE_DIVING     1
298#define STYLE_CARTESIAN  2
299#define STYLE_CYLPOLAR   3
[ac28f4f]300#define STYLE_NOSURVEY   4
301#define STYLE_PASSAGE    5
[ee05463]302#define STYLE_IGNORE     6
[107b8bd]303
[eb5aea0]304typedef int compiletimeassert_style1[STYLE_NORMAL == img_STYLE_NORMAL ? 1 : -1];
305typedef int compiletimeassert_style2[STYLE_DIVING == img_STYLE_DIVING ? 1 : -1];
306typedef int compiletimeassert_style3[STYLE_CARTESIAN == img_STYLE_CARTESIAN ? 1 : -1];
307typedef int compiletimeassert_style4[STYLE_CYLPOLAR == img_STYLE_CYLPOLAR ? 1 : -1];
308typedef int compiletimeassert_style5[STYLE_NOSURVEY == img_STYLE_NOSURVEY ? 1 : -1];
309
[bb90203]310/* various settings preserved by *BEGIN and *END */
311typedef struct Settings {
[b5a3219]312   struct Settings *next;
[eb18f4d]313   unsigned int Truncate;
[fa42426]314   bool f_clino_percent;
315   bool f_backclino_percent;
[00b10c1]316   bool f_bearing_quadrants;
317   bool f_backbearing_quadrants;
[dcbcae0]318   bool dash_for_anon_wall_station;
[27b8b59]319   unsigned char infer;
[bb90203]320   enum {OFF, LOWER, UPPER} Case;
[107b8bd]321   int style;
[bb90203]322   prefix *Prefix;
[613028c]323   prefix *begin_survey; /* used to check BEGIN and END match */
[bb90203]324   short *Translate; /* if short is >= 16 bits, which ANSI requires */
325   real Var[Q_MAC];
326   real z[Q_MAC];
327   real sc[Q_MAC];
[cb3d1e2]328   real units[Q_MAC];
[78ed938]329   const reading *ordering;
[47c7a94]330   int begin_lineno; /* 0 means no block started in this file */
[5c3c61a]331   int flags;
[b39e24a]332   char* proj_str;
[58c7b459]333   /* Location at which we calculate the declination if
[3830dc0]334    * z[Q_DECLINATION] == HUGE_REAL.
335    *
336    * Latitude and longitude are in radians; altitude is in metres above the
337    * ellipsoid.
338    */
339   real dec_lat, dec_lon, dec_alt;
[b5907bb]340   /* Cached auto-declination in radians, or HUGE_REAL for no cached value.
341    * Only meaningful if date1 != -1.
[95b0f1d]342    */
343   real declination;
[37d6b84]344   double min_declination, max_declination;
345   int min_declination_days, max_declination_days;
346   const char* dec_filename;
347   int dec_line;
348   /* Copy of the text of the `*declination auto ...` line (malloced). */
349   char* dec_context;
[b5907bb]350   /* Grid convergence in radians. */
[2c17123e]351   real convergence;
[b5a3219]352   meta_data * meta;
[bb90203]353} settings;
354
355/* global variables */
356extern settings *pcs;
357extern prefix *root;
[a2c33ae]358extern prefix *anon_list;
[bb90203]359extern node *stnlist;
[3875c32]360extern unsigned long optimize;
[c092d72]361extern char * proj_str_out;
[da9163b]362extern PJ * pj_cached;
[bd283cf6]363
[bb90203]364extern char *survey_title;
365extern int survey_title_len;
366
367extern bool fExplicitTitle;
368extern long cLegs, cStns, cComponents;
369extern FILE *fhErrStat;
[693388e]370extern img *pimg;
[bb90203]371extern real totadj, total, totplan, totvert;
[dfac588]372extern real min[6], max[6];
373extern prefix *pfxHi[6], *pfxLo[6];
[647407d]374extern bool fQuiet; /* just show brief summary + errors */
[ed0f5b6]375extern bool fMute; /* just show errors */
[c0b279c]376extern bool fSuppress; /* only output 3d file */
[bb90203]377
378/* macros */
379
380#define POS(S, D) ((S)->name->pos->p[(D)])
381#define POSD(S) ((S)->name->pos->p)
382
383#define data_here(L) ((L)->l.reverse & FLAG_DATAHERE)
[cb3d1e2]384#define reverse_leg_dirn(L) ((L)->l.reverse & MASK_REVERSEDIRN)
385#define reverse_leg(L) ((L)->l.to->leg[reverse_leg_dirn(L)])
[bb90203]386
387#if EXPLICIT_FIXED_FLAG
388# define pfx_fixed(N) ((N)->pos->fFixed)
[3e25a0d]389# define pos_fixed(P) ((P)->fFixed)
[bb90203]390# define fix(S) (S)->name->pos->fFixed = (char)fTrue
[084905c]391# define fixpos(P) (P)->fFixed = (char)fTrue
[bb90203]392# define unfix(S) (S)->name->pos->fFixed = (char)fFalse
393#else
394# define pfx_fixed(N) ((N)->pos->p[0] != UNFIXED_VAL)
[3e25a0d]395# define pos_fixed(P) ((P)->p[0] != UNFIXED_VAL)
[bb90203]396# define fix(S) NOP
[084905c]397# define fixpos(P) NOP
[bb90203]398# define unfix(S) POS((S), 0) = UNFIXED_VAL
399#endif
400#define fixed(S) pfx_fixed((S)->name)
401
[0af7076]402/* macros for special chars */
[bb90203]403
404#define isEol(c)    (pcs->Translate[(c)] & SPECIAL_EOL)
405#define isBlank(c)  (pcs->Translate[(c)] & SPECIAL_BLANK)
406#define isKeywd(c)  (pcs->Translate[(c)] & SPECIAL_KEYWORD)
407#define isComm(c)   (pcs->Translate[(c)] & SPECIAL_COMMENT)
408#define isOmit(c)   (pcs->Translate[(c)] & SPECIAL_OMIT)
[a882316]409#ifndef NO_DEPRECATED
[bb90203]410#define isRoot(c)   (pcs->Translate[(c)] & SPECIAL_ROOT)
[a882316]411#endif
[bb90203]412#define isSep(c)    (pcs->Translate[(c)] & SPECIAL_SEPARATOR)
413#define isNames(c)  (pcs->Translate[(c)] & SPECIAL_NAMES)
414#define isDecimal(c) (pcs->Translate[(c)] & SPECIAL_DECIMAL)
415#define isMinus(c)  (pcs->Translate[(c)] & SPECIAL_MINUS)
416#define isPlus(c)   (pcs->Translate[(c)] & SPECIAL_PLUS)
[21c226e]417#define isOpen(c)   (pcs->Translate[(c)] & SPECIAL_OPEN)
418#define isClose(c)  (pcs->Translate[(c)] & SPECIAL_CLOSE)
[bb90203]419
420#define isSign(c)   (pcs->Translate[(c)] & (SPECIAL_PLUS | SPECIAL_MINUS))
421#define isData(c)   (pcs->Translate[(c)] & (SPECIAL_OMIT | SPECIAL_ROOT|\
422   SPECIAL_SEPARATOR | SPECIAL_NAMES | SPECIAL_DECIMAL | SPECIAL_PLUS |\
423   SPECIAL_MINUS))
424
[647407d]425typedef struct nosurveylink {
426   node *fr, *to;
[b3bef47]427   int flags;
[ee05463]428   meta_data *meta;
[647407d]429   struct nosurveylink *next;
430} nosurveylink;
431
432extern nosurveylink *nosurveyhead;
433
[ee05463]434typedef struct lrud {
435    struct lrud * next;
436    prefix *stn;
[a6301a1]437    meta_data *meta;
[ee05463]438    real l, r, u, d;
439} lrud;
440
441typedef struct lrudlist {
442    lrud * tube;
443    struct lrudlist * next;
444} lrudlist;
445
446extern lrudlist * model;
447
448extern lrud ** next_lrud;
449
[3875c32]450#endif /* CAVERN_H */
Note: See TracBrowser for help on using the repository browser.