source: git/src/cavern.h @ de42f0f

main
Last change on this file since de42f0f was 0b99107, checked in by Olly Betts <olly@…>, 8 weeks ago

Eliminate old FSF addresses

Update GPL/LGPL licence files and boilerplate to direct people who
didn't receive the licence text to the FSF website, as the current
versions of the FSF licence texts now do, rather than giving a postal
address.

  • Property mode set to 100644
File size: 16.0 KB
RevLine 
[0badc31]1/* cavern.h
[bb90203]2 * SURVEX Cave surveying software - header file
[93a1c79]3 * Copyright (C) 1991-2025 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
[0b99107]17 * along with this program; if not, see
18 * <https://www.gnu.org/licenses/>.
[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
[1940bcd]38#include "img_for_survex.h"
[0532954]39#include "str.h"
[3d441da]40#include "useful.h"
[bb90203]41
42typedef double real; /* so we can change the precision used easily */
43#define HUGE_REAL HUGE_VAL
[7bdf66d]44#define REAL_EPSILON DBL_EPSILON
[bb90203]45
[b1d6069]46#define WGS84_DATUM_STRING "EPSG:4326"
47
[7d40549]48#define SPECIAL_EOL             0x0001
49#define SPECIAL_BLANK           0x0002
50#define SPECIAL_KEYWORD         0x0004
51#define SPECIAL_COMMENT         0x0008
52#define SPECIAL_OMIT            0x0010
[a882316]53#ifndef NO_DEPRECATED
[7d40549]54#define SPECIAL_ROOT            0x0020
[a882316]55#endif
[7d40549]56#define SPECIAL_SEPARATOR       0x0040
57#define SPECIAL_NAMES           0x0080
58#define SPECIAL_DECIMAL         0x0100
59#define SPECIAL_MINUS           0x0200
60#define SPECIAL_PLUS            0x0400
61#define SPECIAL_OPEN            0x0800
62#define SPECIAL_CLOSE           0x1000
[bb90203]63
[3875c32]64extern char *fnm_output_base;
[93a1c79]65extern bool fnm_output_base_is_dir;
[3875c32]66
[d1878c51]67extern bool fExportUsed;
68
[1ee204e]69extern int current_days_since_1900;
[cac5622]70extern unsigned current_year;
[e0c7cd1]71
[bb90203]72/* Types */
73
[05c700b]74typedef enum {
[009a9e4]75   Q_NULL = -1, Q_DEFAULT, Q_POS, Q_PLUMB, Q_LEVEL,
76   Q_GRADIENT, Q_BACKGRADIENT, Q_BEARING, Q_BACKBEARING,
[4f38f94]77   Q_LENGTH, Q_BACKLENGTH, Q_DEPTH, Q_DX, Q_DY, Q_DZ, Q_COUNT, Q_DECLINATION,
[009a9e4]78   Q_LEFT, Q_RIGHT, Q_UP, Q_DOWN,
79   Q_MAC
[05c700b]80} q_quantity;
[bb90203]81
[27b8b59]82typedef enum {
[4e00b50]83   INFER_NULL = -1,
84   INFER_EQUATES,
85   INFER_EXPORTS,
86   INFER_PLUMBS,
87   INFER_SUBSURVEYS,
88   /* In Compass DAT files a dummy zero-length leg from a station to itself is
89    * used to provide a place to specify LRUD for the start or end of a
90    * traverse (depending if dimensions are measured at the from or to
91    * station), so we shouldn't warn about equating a station to itself.
[f807847e]92    * This should be set *as well as* INFER_EQUATES.
[4e00b50]93    */
94   INFER_EQUATES_SELF_OK
[27b8b59]95} infer_what;
96
[bb90203]97/* unsigned long to cope with 16-bit int-s */
98#define BIT(N) (1UL << (N))
99#define BITA(N) (1UL << ((N) - 'a'))
100
[7f08c83]101#define TSTBIT(W, N) (((W)>>(N))&1)
102
[bb90203]103/* masks for quantities which are length and angles respectively */
[4f38f94]104#define LEN_QMASK (BIT(Q_LENGTH) | BIT(Q_BACKLENGTH) | BIT(Q_DEPTH) |\
[9dc51ae]105   BIT(Q_DX) | BIT(Q_DY) | BIT(Q_DZ) | BIT(Q_POS) | BIT(Q_COUNT) |\
106   BIT(Q_LEFT) | BIT(Q_RIGHT) | BIT(Q_UP) | BIT(Q_DOWN))
[b14f44f]107#define ANG_QMASK (BIT(Q_BEARING) | BIT(Q_BACKBEARING) |\
108   BIT(Q_GRADIENT) | BIT(Q_BACKGRADIENT) | BIT(Q_PLUMB) | BIT(Q_LEVEL) |\
109   BIT(Q_DECLINATION))
[bb90203]110
[5c3c61a]111/* if you add/change the order, check factor_tab in commands.c */
[05c700b]112typedef enum {
113   UNITS_NULL = -1, UNITS_METRES, UNITS_FEET, UNITS_YARDS,
[00b10c1]114   UNITS_DEGS, UNITS_QUADRANTS, UNITS_GRADS, UNITS_PERCENT, UNITS_MINUTES,
115   UNITS_MAC, UNITS_DEPRECATED_ALIAS_FOR_GRADS
[05c700b]116} u_units;
[5c3c61a]117
[95c3272]118/* don't reorder these values!  They need to match with img.h too */
[5c3c61a]119typedef enum {
[95c3272]120   FLAGS_NOT = -2, FLAGS_UNKNOWN = -1, FLAGS_SURFACE, FLAGS_DUPLICATE,
[710ecc1]121   FLAGS_SPLAY,
[3d441da]122#if 0
123   /* underground, but through rock (e.g. radiolocation).  Want to hide from
124    * plots by default (so not cave) but don't want to include in surface
125    * triangulation nets (so not surface) */
[710ecc1]126   FLAGS_SKELETAL, /* FIXME */
[3d441da]127#endif
[dcbcae0]128   /* Don't need to match img.h: */
129   FLAGS_ANON_ONE_END,
[eb5aea0]130   FLAGS_IMPLICIT_SPLAY,
131   FLAGS_STYLE_BIT0, FLAGS_STYLE_BIT1, FLAGS_STYLE_BIT2
[5c3c61a]132} flags;
[bb90203]133
[eb5aea0]134/* flags are currently stored in an unsigned char */
135typedef int compiletimeassert_flags0[FLAGS_STYLE_BIT2 <= 7 ? 1 : -1];
136
137/* Mask to AND with to get bits to pass to img library. */
138#define FLAGS_MASK \
139    (BIT(FLAGS_SURFACE) | BIT(FLAGS_DUPLICATE) | BIT(FLAGS_SPLAY))
140
[ab4de24]141typedef int compiletimeassert_flags1[BIT(FLAGS_SURFACE) == img_FLAG_SURFACE ? 1 : -1];
142typedef int compiletimeassert_flags2[BIT(FLAGS_DUPLICATE) == img_FLAG_DUPLICATE ? 1 : -1];
143typedef int compiletimeassert_flags3[BIT(FLAGS_SPLAY) == img_FLAG_SPLAY ? 1 : -1];
144
[95c3272]145typedef enum {
[ee05463]146   /* Don't reorder these values!  They need to match with img.h too. */
[dfb4240]147   SFLAGS_SURFACE = 0, SFLAGS_UNDERGROUND, SFLAGS_ENTRANCE, SFLAGS_EXPORTED,
[dcbcae0]148   SFLAGS_FIXED, SFLAGS_ANON, SFLAGS_WALL,
[ee05463]149   /* These values don't need to match img.h, but mustn't clash. */
[ba84079]150   SFLAGS_HANGING = 9,
[e315359]151   SFLAGS_UNUSED_FIXED_POINT = 10,
[ba84079]152   SFLAGS_SOLVED = 11,
153   SFLAGS_SUSPECTTYPO = 12,
154   SFLAGS_SURVEY = 13,
155   SFLAGS_PREFIX_ENTERED = 14,
156   // If set, use ident.i; if unset, use ident.p
157   SFLAGS_IDENT_INLINE = 15
[95c3272]158} sflags;
[ee05463]159
160/* Mask to AND with to get bits to pass to img library. */
161#define SFLAGS_MASK (BIT(SFLAGS_SURFACE) | BIT(SFLAGS_UNDERGROUND) |\
[a2c33ae]162        BIT(SFLAGS_ENTRANCE) | BIT(SFLAGS_EXPORTED) | BIT(SFLAGS_FIXED) |\
[dcbcae0]163        BIT(SFLAGS_ANON) | BIT(SFLAGS_WALL))
[95c3272]164
[ab4de24]165typedef int compiletimeassert_sflags1[BIT(SFLAGS_SURFACE) == img_SFLAG_SURFACE ? 1 : -1];
166typedef int compiletimeassert_sflags2[BIT(SFLAGS_UNDERGROUND) == img_SFLAG_UNDERGROUND ? 1 : -1];
167typedef int compiletimeassert_sflags3[BIT(SFLAGS_ENTRANCE) == img_SFLAG_ENTRANCE ? 1 : -1];
168typedef int compiletimeassert_sflags4[BIT(SFLAGS_EXPORTED) == img_SFLAG_EXPORTED ? 1 : -1];
169typedef int compiletimeassert_sflags5[BIT(SFLAGS_FIXED) == img_SFLAG_FIXED ? 1 : -1];
[a2c33ae]170typedef int compiletimeassert_sflags6[BIT(SFLAGS_ANON) == img_SFLAG_ANON ? 1 : -1];
[dcbcae0]171typedef int compiletimeassert_sflags7[BIT(SFLAGS_WALL) == img_SFLAG_WALL ? 1 : -1];
[ab4de24]172
[bb90203]173/* enumeration of field types */
[05c700b]174typedef enum {
[4f38f94]175   End = 0, Tape, Comp, Clino, BackTape, BackComp, BackClino,
176   Left, Right, Up, Down,
[21c226e]177   FrDepth, ToDepth, Dx, Dy, Dz, FrCount, ToCount,
[44bb30d]178   /* Up to here are readings are allowed multiple values
179    * and have slot in the value[] array in datain.c.
180    * (Depth, DepthChange, and Count can have multiple
181    * readings, but are actually handled using tokens
182    * above rather than as themselves).
183    *
184    * Fr must be the first reading after this comment!
185    */
[21c226e]186   Fr, To, Station, Depth, DepthChange, Count, Dir,
[44bb30d]187   Newline, IgnoreAllAndNewLine, Ignore, IgnoreAll,
188   /* IgnoreAll must be the last reading before this comment!
189    *
190    * Readings after this comment are only used in datain.c
191    * so can have enum values >= 32 because we only use a
192    * bitmask for those readings used in commands.c.
193    */
[5d59477]194   CompassDATFr, CompassDATTo,
[07442af]195   CompassDATComp, CompassDATClino, CompassDATBackComp, CompassDATBackClino,
196   CompassDATLeft, CompassDATRight, CompassDATUp, CompassDATDown,
[725d3b1]197   CompassDATFlags,
198
[5c4cef1]199   WallsSRVFr, WallsSRVTo, WallsSRVTape, WallsSRVComp, WallsSRVClino,
200   // Optional pair of readings giving heights above stations on CT surveys.
201   WallsSRVHeights,
202   // Optional delimited LRUD and variance overrides.
203   WallsSRVExtras
[0395657]204} reading;
[05c700b]205
[90bb053f]206/* if IgnoreAll is >= 32, the compiler will choke on this */
207typedef char compiletimeassert_reading[IgnoreAll < 32 ? 1 : -1];
208
[3d441da]209/* position or length vector */
210typedef real delta[3];
211
212/* variance */
213#ifdef NO_COVARIANCES
214typedef real var[3];
215typedef var svar;
216#else
217typedef real var[3][3];
218typedef real svar[6];
219#endif
[bb90203]220
221/* station name */
222typedef struct Prefix {
223   struct Prefix *up, *down, *right;
224   struct Node *stn;
225   struct Pos *pos;
[ba84079]226   union {
227       const char *p;
228       char i[sizeof(const char*)];
229   } ident;
[98b705d]230   // A filename:line:column where this name was used.  If it's a station used
231   // in *fix then this will be the location of such a *fix, otherwise if it's
232   // a station used in *equate then it's the location of such a *equate.
[bf669f6]233   // Otherwise it's the first place it was used.
[4d9eecd]234   const char *filename;
235   unsigned int line;
[98b705d]236   unsigned short column;
237   /* stn flags - e.g. surface, underground, entrance
238    * also suspecttypo and survey */
239   unsigned short sflags;
[c00c74a9]240   /* If (min_export == 0) then max_export is max # levels above is this
241    * prefix is used (and so needs to be exported) (0 == parent only).
242    * If (min_export > 0) then max_export is max # levels above this
[932f7e9]243    * prefix has been exported, and min_export is how far down the exports
244    * have got (if min_export > 1 after a run, this prefix hasn't been
[c00c74a9]245    * exported from below enough).
[27b8b59]246    * If INFER_EXPORTS is active when a station is encountered, we
[c00c74a9]247    * set min_export = USHRT_MAX and max_export gets set as usual.  Then at
248    * the end of the run, we also mark stations with min_export == USHRT_MAX
249    * and max_export > 0 as exported. */
250   unsigned short max_export, min_export;
[bb90203]251} prefix;
252
[ba84079]253static inline const char *prefix_ident(const prefix *p) {
254    return TSTBIT(p->sflags, SFLAGS_IDENT_INLINE) ? p->ident.i : p->ident.p;
255}
256
[b5a3219]257/* survey metadata */
258typedef struct Meta_data {
259    size_t ref_count;
[0e9e1ee]260    /* Days since 1900 for start and end date of survey, or -1 if undated. */
[1ee204e]261    int days1, days2;
[b5a3219]262} meta_data;
263
[bb90203]264/* stuff stored for both forward & reverse legs */
265typedef struct {
266   struct Node *to;
267   /* bits 0..1 = reverse leg number; bit7 is fFullLeg */
268   /* bit6 = fReplacementLeg (by reduction rules) */
[cb3d1e2]269   /* bit5 = articulation leg (i.e. carries no error) */
[67508f0]270   unsigned char reverse;
[5c3c61a]271   /* flags - e.g. surface, duplicate survey
[693388e]272    * only used if (FLAG_DATAHERE & !(FLAG_REPLACEMENTLEG|FLAG_FAKE))
[b5a3219]273    * This could be only in linkfor, but this is actually more space
274    * efficient.
[5c3c61a]275    */
[67508f0]276   unsigned char flags;
[bb90203]277} linkcommon;
[3d441da]278
[cb3d1e2]279#define FLAG_DATAHERE 0x80
280#define FLAG_REPLACEMENTLEG 0x40
[7f08c83]281#define FLAG_ARTICULATION 0x20
[693388e]282#define FLAG_FAKE 0x10 /* an equate or leg inside an sdfix */
[cb3d1e2]283#define MASK_REVERSEDIRN 0x03
[bb90203]284
285/* forward leg - deltas & vars stored here */
286typedef struct Link {
287   linkcommon l;
[eb18f4d]288   delta d; /* Delta */
[59f2dbb]289   svar v; /* Variances */
[b5a3219]290   meta_data *meta;
[bb90203]291} linkfor;
292
293/* node - like a station, except several nodes are used to represent a
294 * station with more than 3 legs connected to it
295 */
296typedef struct Node {
297   struct Prefix *name;
298   struct Link *leg[3];
[564f471]299   struct Node *prev, *next;
[103c026]300   // Used in netartic.c to identify unconnected components and articulation
301   // points within components.
302   //
303   // Used in matrix.c to record the matrix row corresponding to this node
304   // or -1 for nodes already fixed (more than one node may map to the same
305   // row).
[118eea4]306   long colour;
[bb90203]307} node;
308
309/* station position */
310typedef struct Pos {
[1339de3]311   // Easting, Northing, Altitude.
312   real p[3];
[bb90203]313} pos;
314
315/*
316typedef struct Inst {
317   real zero, scale, units;
318} inst;
319*/
320
[107b8bd]321/* Survey data styles */
322#define STYLE_NORMAL     0
323#define STYLE_DIVING     1
324#define STYLE_CARTESIAN  2
325#define STYLE_CYLPOLAR   3
[ac28f4f]326#define STYLE_NOSURVEY   4
327#define STYLE_PASSAGE    5
[ee05463]328#define STYLE_IGNORE     6
[107b8bd]329
[eb5aea0]330typedef int compiletimeassert_style1[STYLE_NORMAL == img_STYLE_NORMAL ? 1 : -1];
331typedef int compiletimeassert_style2[STYLE_DIVING == img_STYLE_DIVING ? 1 : -1];
332typedef int compiletimeassert_style3[STYLE_CARTESIAN == img_STYLE_CARTESIAN ? 1 : -1];
333typedef int compiletimeassert_style4[STYLE_CYLPOLAR == img_STYLE_CYLPOLAR ? 1 : -1];
334typedef int compiletimeassert_style5[STYLE_NOSURVEY == img_STYLE_NOSURVEY ? 1 : -1];
335
[bb90203]336/* various settings preserved by *BEGIN and *END */
337typedef struct Settings {
[b5a3219]338   struct Settings *next;
[eb18f4d]339   unsigned int Truncate;
[fa42426]340   bool f_clino_percent;
341   bool f_backclino_percent;
[00b10c1]342   bool f_bearing_quadrants;
343   bool f_backbearing_quadrants;
[dcbcae0]344   bool dash_for_anon_wall_station;
[52f46ed]345   bool from_equals_to_is_only_a_warning;
[27b8b59]346   unsigned char infer;
[bb90203]347   enum {OFF, LOWER, UPPER} Case;
[fdffa7d]348   /* STYLE_xxx value to process data as. */
[107b8bd]349   int style;
[fdffa7d]350   /* STYLE_xxx value to put in 3d file (different for Compass DAT diving
351    * data, as the data in the DAT file is always presented in the format
352    * tape,compass,clino even if that isn't how it was really measured).
353    */
354   int recorded_style;
[bb90203]355   prefix *Prefix;
[613028c]356   prefix *begin_survey; /* used to check BEGIN and END match */
[bb90203]357   short *Translate; /* if short is >= 16 bits, which ANSI requires */
358   real Var[Q_MAC];
359   real z[Q_MAC];
360   real sc[Q_MAC];
[cb3d1e2]361   real units[Q_MAC];
[78ed938]362   const reading *ordering;
[94aeeaf]363   long begin_lpos; /* File offset for start of BEGIN line */
[47c7a94]364   int begin_lineno; /* 0 means no block started in this file */
[94aeeaf]365   int begin_col; /* Column of prefix in BEGIN line (or 0 if none) */
[5c3c61a]366   int flags;
[b39e24a]367   char* proj_str;
[58c7b459]368   /* Location at which we calculate the declination if
[3830dc0]369    * z[Q_DECLINATION] == HUGE_REAL.
370    *
371    * Latitude and longitude are in radians; altitude is in metres above the
372    * ellipsoid.
373    */
374   real dec_lat, dec_lon, dec_alt;
[b5907bb]375   /* Cached auto-declination in radians, or HUGE_REAL for no cached value.
[3bf193a]376    * Only meaningful if days1 != -1.
[95b0f1d]377    */
378   real declination;
[37d6b84]379   double min_declination, max_declination;
380   int min_declination_days, max_declination_days;
381   const char* dec_filename;
382   int dec_line;
383   /* Copy of the text of the `*declination auto ...` line (malloced). */
384   char* dec_context;
[b5907bb]385   /* Grid convergence in radians. */
[2c17123e]386   real convergence;
[abe7192]387   /* Input grid convergence in radians. */
388   real input_convergence;
389   /* Rotation from North for `*data cartesian`. */
390   real cartesian_rotation;
391   /* Which North to use for `*data cartesian`. */
392   enum { TRUE_NORTH, GRID_NORTH, MAGNETIC_NORTH } cartesian_north;
[b5a3219]393   meta_data * meta;
[bb90203]394} settings;
395
396/* global variables */
397extern settings *pcs;
398extern prefix *root;
[a2c33ae]399extern prefix *anon_list;
[bf9faf6]400extern node *fixedlist;
[bb90203]401extern node *stnlist;
[3875c32]402extern unsigned long optimize;
[c092d72]403extern char * proj_str_out;
[da9163b]404extern PJ * pj_cached;
[bd283cf6]405
[0532954]406extern string survey_title;
[bb90203]407
408extern bool fExplicitTitle;
[2b5c6b3]409extern long cLegs, cStns, cComponents, cSolves;
[bb90203]410extern FILE *fhErrStat;
[693388e]411extern img *pimg;
[bb90203]412extern real totadj, total, totplan, totvert;
[b1d6069]413extern real min[9], max[9];
414extern prefix *pfxHi[9], *pfxLo[9];
[7811ed7]415extern int quiet; // 1 to turn off progress messages; >=2 turns off summary too.
[c0b279c]416extern bool fSuppress; /* only output 3d file */
[bb90203]417
418/* macros */
419
420#define POS(S, D) ((S)->name->pos->p[(D)])
421#define POSD(S) ((S)->name->pos->p)
422
423#define data_here(L) ((L)->l.reverse & FLAG_DATAHERE)
[cb3d1e2]424#define reverse_leg_dirn(L) ((L)->l.reverse & MASK_REVERSEDIRN)
425#define reverse_leg(L) ((L)->l.to->leg[reverse_leg_dirn(L)])
[bb90203]426
[f78034b]427/* if p[0]==UNFIXED_VAL, station is unfixed */
428#define UNFIXED_VAL HUGE_VAL
429#define pfx_fixed(N) ((N)->pos->p[0] != UNFIXED_VAL)
430#define pos_fixed(P) ((P)->p[0] != UNFIXED_VAL)
431#define unfix(S) POS((S), 0) = UNFIXED_VAL
[bb90203]432#define fixed(S) pfx_fixed((S)->name)
433
[0af7076]434/* macros for special chars */
[bb90203]435
436#define isEol(c)    (pcs->Translate[(c)] & SPECIAL_EOL)
437#define isBlank(c)  (pcs->Translate[(c)] & SPECIAL_BLANK)
438#define isKeywd(c)  (pcs->Translate[(c)] & SPECIAL_KEYWORD)
439#define isComm(c)   (pcs->Translate[(c)] & SPECIAL_COMMENT)
440#define isOmit(c)   (pcs->Translate[(c)] & SPECIAL_OMIT)
[a882316]441#ifndef NO_DEPRECATED
[bb90203]442#define isRoot(c)   (pcs->Translate[(c)] & SPECIAL_ROOT)
[a882316]443#endif
[bb90203]444#define isSep(c)    (pcs->Translate[(c)] & SPECIAL_SEPARATOR)
445#define isNames(c)  (pcs->Translate[(c)] & SPECIAL_NAMES)
446#define isDecimal(c) (pcs->Translate[(c)] & SPECIAL_DECIMAL)
447#define isMinus(c)  (pcs->Translate[(c)] & SPECIAL_MINUS)
448#define isPlus(c)   (pcs->Translate[(c)] & SPECIAL_PLUS)
[21c226e]449#define isOpen(c)   (pcs->Translate[(c)] & SPECIAL_OPEN)
450#define isClose(c)  (pcs->Translate[(c)] & SPECIAL_CLOSE)
[bb90203]451
452#define isSign(c)   (pcs->Translate[(c)] & (SPECIAL_PLUS | SPECIAL_MINUS))
453#define isData(c)   (pcs->Translate[(c)] & (SPECIAL_OMIT | SPECIAL_ROOT|\
454   SPECIAL_SEPARATOR | SPECIAL_NAMES | SPECIAL_DECIMAL | SPECIAL_PLUS |\
455   SPECIAL_MINUS))
456
[647407d]457typedef struct nosurveylink {
458   node *fr, *to;
[b3bef47]459   int flags;
[ee05463]460   meta_data *meta;
[647407d]461   struct nosurveylink *next;
462} nosurveylink;
463
464extern nosurveylink *nosurveyhead;
465
[ee05463]466typedef struct lrud {
467    struct lrud * next;
468    prefix *stn;
[a6301a1]469    meta_data *meta;
[ee05463]470    real l, r, u, d;
471} lrud;
472
473typedef struct lrudlist {
474    lrud * tube;
475    struct lrudlist * next;
476} lrudlist;
477
478extern lrudlist * model;
479
480extern lrud ** next_lrud;
481
[5d59477]482extern char output_separator;
483
[3875c32]484#endif /* CAVERN_H */
Note: See TracBrowser for help on using the repository browser.