source: git/src/diffpos.c @ e3513a5

RELEASE/1.0RELEASE/1.1RELEASE/1.2debug-cidebug-ci-sanitisersfaster-cavernloglog-selectstereowalls-datawalls-data-hanging-as-warningwarn-only-for-hanging-survey
Last change on this file since e3513a5 was d06141c, checked in by Olly Betts <olly@…>, 23 years ago

Created sorterr to allow sorting .err files by various criteria.

git-svn-id: file:///home/survex-svn/survex/trunk@1030 4b37db11-9a0c-4f06-9ece-9ab7cdaee568

  • Property mode set to 100644
File size: 4.3 KB
Line 
1/* > diffpos.c */
2/* (Originally quick and dirty) program to compare two SURVEX .pos files */
3/* Copyright (C) 1994,1996,1998,1999,2001 Olly Betts
4 *
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.
9 *
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.
14 *
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20#ifdef HAVE_CONFIG_H
21# include <config.h>
22#endif
23
24/* size of line buffer */
25#define BUFLEN 256
26
27#include <stdio.h>
28#include <stdlib.h>
29#include <string.h>
30#include <math.h>
31
32#include "cavern.h" /* just for REAL_EPSILON */
33#include "cmdline.h"
34
35#define sqrd(X) ((X)*(X))
36
37/* macro to just convert argument to a string */
38#define STRING(X) _STRING(X)
39#define _STRING(X) #X
40
41/* very small value for comparing floating point numbers with */
42#define EPSILON (REAL_EPSILON * 1000)
43
44/* default threshold is 1cm */
45#define DFLT_MAX_THRESHOLD 0.01
46
47static int diff_pos(FILE *fh1, FILE *fh2, double threshold);
48static int read_line(FILE *fh, double *px, double *py, double *pz, char *id);
49
50static const struct option long_opts[] = {
51   /* const char *name; int has_arg (0 no_argument, 1 required_*, 2 optional_*); int *flag; int val; */
52   {"help", no_argument, 0, HLP_HELP},
53   {"version", no_argument, 0, HLP_VERSION},
54   {0, 0, 0, 0}
55};
56
57#define short_opts ""
58
59static struct help_msg help[] = {
60/*                              <-- */
61   {0, 0}
62};
63
64int
65main(int argc, char **argv)
66{
67   double threshold = DFLT_MAX_THRESHOLD;
68   char *fnm1, *fnm2;
69   FILE *fh1, *fh2;
70
71   msg_init(argv[0]);
72
73   cmdline_set_syntax_message("POS_FILE POS_FILE [THRESHOLD]",
74                              "THRESHOLD is the max. ignorable change along "
75                              "any axis in metres (default "
76                              STRING(DFLT_MAX_THRESHOLD)")");
77   cmdline_init(argc, argv, short_opts, long_opts, NULL, help, 2, 3);
78   while (cmdline_getopt() != EOF) {
79      /* do nothing */
80   }
81   fnm1 = argv[optind++];
82   fnm2 = argv[optind++];
83   if (argv[optind]) {
84      optarg = argv[optind];
85      threshold = cmdline_double_arg();
86   }
87   fh1 = fopen(fnm1, "rb");
88   if (!fh1) {
89      printf("Can't open file `%s'\n", fnm1);
90      exit(1);
91   }
92   fh2 = fopen(fnm2, "rb");
93   if (!fh2) {
94      printf("Can't open file `%s'\n", fnm2);
95      exit(1);
96   }
97   return diff_pos(fh1, fh2, threshold);
98}
99
100typedef enum { Eof, Haveline, Needline } state;
101
102int
103diff_pos(FILE *fh1, FILE *fh2, double threshold)
104{
105   state pos1 = Needline, pos2 = Needline;
106   int result = 0;
107
108   while (1) {
109      double x1, y1, z1, x2, y2, z2;
110      char id1[BUFLEN], id2[BUFLEN];
111
112      if (pos1 == Needline) {
113         pos1 = Haveline;
114         if (!read_line(fh1, &x1, &y1, &z1, id1)) pos1 = Eof;
115      }
116
117      if (pos2 == Needline) {
118         pos2 = Haveline;
119         if (!read_line(fh2, &x2, &y2, &z2, id2)) pos2 = Eof;
120      }
121
122      if (pos1 == Eof) {
123         if (pos2 == Eof) break;
124         result = 1;
125         printf("Added: %s (at end of file)\n", id2);
126         pos2 = Needline;
127      } else if (pos2 == Eof) {
128         result = 1;
129         printf("Deleted: %s (at end of file)\n", id1);
130         pos1 = Needline;
131      } else {
132         int cmp = strcmp(id1, id2);
133         if (cmp == 0) {
134            if (fabs(x1 - x2) - threshold > EPSILON ||
135                fabs(y1 - y2) - threshold > EPSILON ||
136                fabs(z1 - z2) - threshold > EPSILON) {
137               result = 1;
138               printf("Moved by (%3.2f,%3.2f,%3.2f): %s\n",
139                      x1 - x2, y1 - y2, z1 - z2, id1);
140            }
141            pos1 = pos2 = Needline;
142         } else {
143            result = 1;
144            if (cmp < 0) {
145               printf("Deleted: %s\n", id1);
146               pos1 = Needline;
147            } else {
148               printf("Added: %s\n", id2);
149               pos2 = Needline;
150            }
151         }
152      }
153   }
154   return result;
155}
156
157static int
158read_line(FILE *fh, double *px, double *py, double *pz, char *id)
159{
160   char buf[BUFLEN];
161   while (1) {
162      if (!fgets(buf, BUFLEN, fh)) return 0;
163      if (sscanf(buf, "(%lf,%lf,%lf )%s", px, py, pz, id) == 4) break;
164      printf("Ignoring line: %s\n", buf);
165   }
166   return 1;
167}
Note: See TracBrowser for help on using the repository browser.