Fix coding style
[survex.git] / src / listpos.c
blobb5906dbdadfcc2ca26034b66d7b01b1d6dad73cc
1 /* listpos.c
2 * SURVEX Cave surveying software: stuff to do with stn position output
3 * Copyright (C) 1991-2002,2011,2012,2013,2014 Olly Betts
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #ifdef HAVE_CONFIG_H
21 # include <config.h>
22 #endif
24 #define PRINT_STN_POS_LIST 1
25 #define NODESTAT 1
27 #include <limits.h>
29 #include "cavern.h"
30 #include "datain.h"
31 #include "debug.h"
32 #include "filename.h"
33 #include "message.h"
34 #include "filelist.h"
35 #include "netbits.h"
36 #include "listpos.h"
37 #include "out.h"
39 /* Traverse prefix tree depth first starting at from, and
40 * calling function fn at each node */
41 static void
42 traverse_prefix_tree(prefix *from, void (*fn)(prefix *))
44 prefix *p;
46 fn(from);
48 p = from->down;
49 if (!p) return;
51 while (1) {
52 fn(p);
53 if (p->down) {
54 p = p->down;
55 } else {
56 if (!p->right) {
57 do {
58 p = p->up;
59 if (p == from) return; /* got back to start */
60 } while (!p->right);
62 p = p->right;
67 static void
68 check_node(prefix *p)
70 if (!p->pos) {
71 if (!TSTBIT(p->sflags, SFLAGS_SURVEY)) {
72 /* Could do away with the SFLAGS_SURVEY check and check
73 * p->min_export instead of p->max_export I think ... */
74 if (TSTBIT(p->sflags, SFLAGS_ENTRANCE) || p->max_export) {
75 /* p is a station which was referred to in "*entrance" and/or
76 * "*export" but not elsewhere (otherwise it'd have a position).
77 * p could also be a survey (SFLAGS_SURVEY) or be mentioned as
78 * a station, but only in a line of data which was rejected
79 * because of an error.
81 warning_in_file(p->filename, p->line,
82 /*Station “%s” referred to by *entrance or *export but never used*/190,
83 sprint_prefix(p));
86 } else {
87 /* Do we need to worry about export violations in hanging surveys? */
88 if (fExportUsed) {
89 #if 0
90 printf("L min %d max %d pfx %s\n",
91 p->min_export, p->max_export, sprint_prefix(p));
92 #endif
93 if ((p->min_export > 1 && p->min_export != USHRT_MAX) ||
94 (p->min_export == 0 && p->max_export)) {
95 char *s;
96 prefix *where = p->up;
97 int msgno;
98 SVX_ASSERT(where);
99 s = osstrdup(sprint_prefix(where));
100 /* Report better when station called 2.1 for example */
101 while (!where->filename && where->up) where = where->up;
103 if (TSTBIT(where->sflags, SFLAGS_PREFIX_ENTERED)) {
104 msgno = /*Station “%s” not exported from survey “%s”*/26;
105 } else {
106 /* TRANSLATORS: This error occurs if there's an attempt to
107 * export a station from a survey which doesn't actually exist.
109 * Here "survey" is a "cave map" rather than list of questions - it should be
110 * translated to the terminology that cavers using the language would use.
112 msgno = /*Reference to station “%s” from non-existent survey “%s”*/286;
114 compile_diagnostic_pfx(DIAG_ERR, where, msgno, sprint_prefix(p), s);
115 osfree(s);
119 if (TSTBIT(p->sflags, SFLAGS_SUSPECTTYPO)) {
120 /* TRANSLATORS: Here "station" is a survey station, not a train station. */
121 warning_in_file(p->filename, p->line,
122 /*Station “%s” referred to just once, with an explicit survey name - typo?*/70,
123 sprint_prefix(p));
128 #if NODESTAT
129 static int *cOrder;
130 static int icOrderMac;
132 static void
133 node_stat(prefix *p)
135 if (p->pos) {
136 int order;
137 SVX_ASSERT(pfx_fixed(p));
139 order = p->shape;
141 if (order >= icOrderMac) {
142 int c = order * 2;
143 cOrder = osrealloc(cOrder, c * ossizeof(int));
144 while (icOrderMac < c) cOrder[icOrderMac++] = 0;
146 cOrder[order]++;
149 check_node(p);
152 static void
153 node_stats(prefix *from)
155 prefix * p;
156 icOrderMac = 8; /* Start value */
157 cOrder = osmalloc(icOrderMac * ossizeof(int));
158 memset(cOrder, 0, icOrderMac * ossizeof(int));
159 traverse_prefix_tree(from, node_stat);
160 for (p = anon_list; p; p = p->right) {
161 node_stat(p);
164 #endif
166 extern void
167 print_node_stats(void)
169 #if NODESTAT
170 int c;
171 int max_c = 9999; /* Always allow space for 4 digits. */
172 int width;
173 node_stats(root);
174 for (c = 0; c < icOrderMac; c++) {
175 if (cOrder[c] > max_c) {
176 max_c = cOrder[c];
179 width = 1 + (int)log10((double)max_c);
180 for (c = 0; c < icOrderMac; c++) {
181 if (cOrder[c] > 0) {
182 printf("%*d %d-%s.\n", width, cOrder[c], c,
183 msg(cOrder[c] == 1 ?
184 /* TRANSLATORS: node/nodes as in: "Survey has 1 2-node and 2 3-nodes." */
185 /*node*/176 :
186 /* TRANSLATORS: node/nodes as in: "Survey has 1 2-node and 2 3-nodes." */
187 /*nodes*/177));
190 #endif
193 extern void
194 check_node_stats(void)
196 traverse_prefix_tree(root, check_node);