home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume9
/
fplan
/
part05
< prev
next >
Wrap
Text File
|
1989-11-26
|
29KB
|
1,044 lines
Newsgroups: comp.sources.misc
subject: v09i015: FPLAN 5/6
from: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
Reply-To: tynor@prism.gatech.edu (Steve Tynor)
Posting-number: Volume 9, Issue 15
Submitted-by: tynor@prism.gatech.edu (Steve Tynor)
Archive-name: fplan/part05
#This is part 5/6 of FPLAN
#!/bin/sh
# shar: Shell Archiver (v1.22)
# Packed Mon Nov 20 19:28:40 EST 1989 by gaffa!tynor
# from directory /files/home/users/tynor/src/fplan
#
# Run the following text with /bin/sh to create:
# main.c
# misc.c
# db.c
# strings.c
#
echo "x - extracting main.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > main.c &&
X/*
X * $Id: main.c,v 2.12 89/11/11 19:13:48 tynor Exp $
X *----------------------------------------------------------------------------
X * FPLAN - Flight Planner
X * Steve Tynor
X * tynor@prism.gatech.edu
X *
X * This program is in the public domain. Permission to copy,
X * distribute, modify this program is hearby given as long as this header
X * remains. If you redistribute this program after modifying it, please
X * document your changes so that I do not take the blame (or credit) for
X * those changes. If you fix bugs or add features, please send me a
X * patch so that I can keep the 'official' version up-to-date.
X *
X * Bug reports are welcome and I'll make an attempt to fix those
X * that are reported.
X *
X * USE AT YOUR OWN RISK! I assume no responsibility for any
X * errors in this program, its database or documentation. I will make an
X * effort to fix bugs, but if you crash and burn because, for example,
X * fuel estimates in this program were inaccurate, it's your own fault
X * for trusting somebody else's code! Remember, as PIC, it's _your_
X * responsibility to do complete preflight planning. Use this program as
X * a flight planning aid, but verify its results before using them.
X *----------------------------------------------------------------------------
X */
X
Xstatic char rcsid[] = "$Id: main.c,v 2.12 89/11/11 19:13:48 tynor Exp $";
X
X#include <stdio.h>
X#include "wp_info.h"
X#include "version.h"
X
X#define EXIT_GOOD 0
X#define EXIT_BAD 1
X
Xextern FILE *yyin;
Xextern BOOLEAN open_dbs ();
Xextern BOOLEAN close_dbs ();
Xextern BOOLEAN compute_plan ();
Xextern void print_plan ();
Xextern void set_output_units ();
Xextern void set_format ();
Xextern void set_brief ();
Xextern char yytext[];
Xextern BOOLEAN lookup_desig ();
Xextern void put_db_summary ();
Xextern void print_reverse ();
X
X/*
X * if any of the GFX_* options are defined, define GFX
X */
X#ifdef GFX_SUNVIEW
X#define GFX
X#endif
X#ifdef GFX_X
X#undef GFX
X#define GFX
X#endif
X#ifdef GFX_POSTSCRIPT
X#undef GFX
X#define GFX
X#endif
X
X/*----------------------------------------------------------------------------*/
Xstatic void do_lookup (desig)
X char *desig;
X{
X DATABASE_INFO *db1 = (DATABASE_INFO*)0;
X DATABASE_INFO *db2 = (DATABASE_INFO*)0;
X
X if (lookup_desig (WP_VIA, desig, &db1))
X put_db (stdout, db1);
X
X if (lookup_desig (WP_FROM, desig, &db2))
X if (!db1 || (db1->mode != db2->mode))
X put_db (stdout, db2);
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic void init (brief)
X BOOLEAN brief;
X{
X /*
X * NOTE: we count on all variables being set to 0 (thus all optional values
X * are 'off' by default).
X */
X num_waypoints = 0;
X num_cached = 0;
X set_brief (brief);
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic BOOLEAN parse_script ()
X{
X return (BOOLEAN) (! yyparse ());
X}
X
X/*----------------------------------------------------------------------------*/
Xusage (progname)
X char *progname;
X{
X fprintf (stderr, "FPLAN %s\n", VERSION);
X /*
X * LOOKUP mode:
X */
X fprintf (stderr, "usage: %s -l designator ...\n", progname);
X fprintf (stderr, "\t-l - lookup the designator(s) in the databases\n");
X
X /*
X * REVERSE mode:
X */
X fprintf (stderr, " or\n");
X fprintf (stderr, " %s -r [-|planfile]\n", progname);
X fprintf (stderr, "\t-r - compute the return trip, prints the reversed plan to stdout.\n");
X fprintf (stderr, "\t- - read 'planfile' from the standard input.\n");
X
X#ifdef GFX
X /*
X * GRAPHICS mode:
X */
X fprintf (stderr, " or\n");
X fprintf (stderr, " %s -g [-|planfile]\n", progname);
X
X#ifdef GFX_SUNVIEW
X fprintf (stderr, "\t-g - preview the route graphically in a Sunview window\n");
X#endif /* GFX_SUNVIEW */
X#ifdef GFX_X
X fprintf (stderr, "\t-g - preview the route graphically in an X window\n");
X#endif /* GFX_X*/
X#ifdef GFX_POSTSCRIPT
X fprintf (stderr, "\t-g - create a PostScript program to draw the route\n");
X#endif /* GFX_POSTSCRIPT*/
X fprintf (stderr, "\t- - read 'planfile' from the standard input.\n");
X#endif /* GFX */
X
X /*
X * NORMAL mode:
X */
X fprintf (stderr, " or\n");
X fprintf (stderr, " %s [-n|w][-b][-t][-s][-e][-|planfile]\n",
X progname);
X fprintf (stderr, "\t-n - selects the narrow (no VOR fixes) format form [default]\n");
X fprintf (stderr, "\t-w - selects the wide (VOR fixes) format form \n");
X fprintf (stderr, "\t-s - selects Statute miles for output format [default = Nautical]\n");
X fprintf (stderr, "\t-t - disable automatically tracking navaids in NAV1 [default = enabled]\n");
X fprintf (stderr, "\t-b - set BRIEF mode - ignore 'incremental' waypoints\n");
X fprintf (stderr, "\t-e - use Epson (PC) box characters on output form\n");
X fprintf (stderr, "\t-d - append a summary of all database objects used\n");
X fprintf (stderr, "\t- - read 'planfile' from the standard input.\n");
X fprintf (stderr, " the planfile format is described in FPLAN(1)\n");
X exit (EXIT_BAD);
X}
X
X/*----------------------------------------------------------------------------*/
Xint main (argc, argv)
X int argc;
X char *argv[];
X{
X enum {WIDE, NARROW} format = NARROW;
X int i;
X BOOLEAN auto_nav1 = TRUE;
X BOOLEAN brief = FALSE;
X BOOLEAN epson_box_chars = FALSE;
X BOOLEAN reverse = FALSE;
X BOOLEAN database_summary = FALSE;
X#ifdef GFX_SUNVIEW
X BOOLEAN draw_sunview = FALSE;
X#endif
X#ifdef GFX_X
X BOOLEAN draw_x = FALSE;
X#endif
X#ifdef GFX_POSTSCRIPT
X BOOLEAN draw_postscript = FALSE;
X#endif
X
X if (argc < 2)
X usage (argv[0]);
X
X if (! open_dbs ())
X exit (EXIT_BAD);
X
X if ((argv[1][0] == '-') && (argv[1][1] == 'l')) {
X for (i = 2; i < argc; i++)
X do_lookup (argv[i]);
X exit (EXIT_GOOD);
X }
X
X yyin = NULL;
X set_output_units (1);
X for (i = 1; i < argc; i++) {
X if (argv[i][0] == '-') {
X switch (argv[i][1]) {
X case 'g':
X /*
X *leave these separate for now, we'll probably want to link in all
X * three on some systems...
X */
X#ifdef GFX_SUNVIEW
X draw_sunview = TRUE;
X#endif
X#ifdef GFX_X
X draw_x = TRUE;
X#endif
X#ifdef GFX_POSTSCRIPT
X draw_postscript = TRUE;
X#endif
X break;
X case 'r':
X reverse = TRUE;
X break;
X case 'e':
X epson_box_chars = TRUE;
X break;
X case 'd':
X database_summary = TRUE;
X break;
X case 's':
X set_output_units (0);
X break;
X case 'n':
X format = NARROW;
X break;
X case 'w':
X format = WIDE;
X break;
X case 'b':
X brief = TRUE;
X break;
X case 't':
X auto_nav1 = FALSE;
X break;
X case '\0':
X if (yyin) {
X fprintf (stderr,
X "ERROR: cannot read from stdin and planfile: \"%s\".\n",
X argv[i]);
X usage (argv[0]);
X } else {
X yyin = stdin;
X }
X break;
X default:
X fprintf (stderr, "ERROR: unknown option: \"%s\".\n", argv[i]);
X usage (argv[0]);
X break;
X }
X } else {
X if (yyin) {
X fprintf (stderr, "ERROR: only one planfile allowed: \"%s\".\n",
X argv[i]);
X usage (argv[0]);
X } else {
X yyin = fopen (argv[i], "r");
X if (! yyin) {
X fprintf (stderr, "ERROR: could not open script file: %s.\n",
X argv[i]);
X usage (argv[0]);
X }
X }
X }
X }
X
X if (! yyin) {
X fprintf (stderr, "ERROR: no planfile\n");
X usage (argv[0]);
X }
X init (brief);
X
X if (! parse_script ())
X exit (EXIT_BAD);
X
X if (! compute_plan (auto_nav1) )
X exit (EXIT_BAD);
X
X if (reverse) {
X print_reverse ();
X#ifdef GFX_SUNVIEW
X } else if (draw_sunview) {
X sv_draw (brief);
X#endif
X#ifdef GFX_X
X } else if (draw_x) {
X x_draw (brief);
X#endif
X#ifdef GFX_POSTSCRIPT
X } else if (draw_postscript) {
X ps_draw (brief);
X#endif
X } else {
X if (format == NARROW)
X max_nav = -1;
X else if (auto_nav1)
X max_nav = MAX (0, max_nav);
X set_format (max_nav, epson_box_chars);
X
X print_plan ();
X
X if (database_summary)
X put_db_summary (stdout);
X }
X
X if (! close_dbs ())
X exit (EXIT_BAD);
X}
X
X
X/*----------------------------------------------------------------------------*/
Xint yyerror(s)
Xchar* s;
X{
X extern int yylineno;
X
X fprintf (stderr, "ERROR: line %d: %s\n", yylineno, s);
X exit (EXIT_BAD);
X}
X
X/*----------------------------------------------------------------------------*/
Xint yywrap ()
X{
X return (1);
X}
X
X/*----------------------------------------------------------------------------*/
Xint yyreject ()
X{
X printf ("ERROR: parser rejecting %s\n", yytext);
X return (1);
X}
X
SHAR_EOF
chmod 0444 main.c || echo "restore of main.c fails"
echo "x - extracting misc.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > misc.c &&
X/*
X * $Id: misc.c,v 2.3 89/11/05 11:23:46 tynor Exp $
X *----------------------------------------------------------------------------
X * FPLAN - Flight Planner
X * Steve Tynor
X * tynor@prism.gatech.edu
X *
X * This program is in the public domain. Permission to copy,
X * distribute, modify this program is hearby given as long as this header
X * remains. If you redistribute this program after modifying it, please
X * document your changes so that I do not take the blame (or credit) for
X * those changes. If you fix bugs or add features, please send me a
X * patch so that I can keep the 'official' version up-to-date.
X *
X * Bug reports are welcome and I'll make an attempt to fix those
X * that are reported.
X *
X * USE AT YOUR OWN RISK! I assume no responsibility for any
X * errors in this program, its database or documentation. I will make an
X * effort to fix bugs, but if you crash and burn because, for example,
X * fuel estimates in this program were inaccurate, it's your own fault
X * for trusting somebody else's code! Remember, as PIC, it's _your_
X * responsibility to do complete preflight planning. Use this program as
X * a flight planning aid, but verify its results before using them.
X *----------------------------------------------------------------------------
X */
X
Xstatic char rcsid[] = "$Id: misc.c,v 2.3 89/11/05 11:23:46 tynor Exp $";
X
X#include <math.h>
X
X/*----------------------------------------------------------------------------*/
Xdouble degrees_mins_2_decimal (hm)
X double hm;
X{
X /*
X * input looks like: 40.45 (40 deg, 45 min), output is 40.75 (40.75 deg)
X */
X double i = (double) floor (hm);
X
X return (i + (hm - i) / 0.6);
X}
X
X/*----------------------------------------------------------------------------*/
Xdouble decimal_2_degrees_mins (dec)
X double dec;
X{
X /*
X * input looks like: 40.75 (40.75 deg), output is 40 and 45 (40 deg, 45 min)
X */
X double tmp = (double) floor (dec);
X
X return (tmp + 0.6 * (dec - tmp));
X}
X
SHAR_EOF
chmod 0444 misc.c || echo "restore of misc.c fails"
echo "x - extracting db.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > db.c &&
X/*
X * $Id: db.c,v 2.9 89/11/11 19:09:34 tynor Exp $
X *----------------------------------------------------------------------------
X * FPLAN - Flight Planner
X * Steve Tynor
X * tynor@prism.gatech.edu
X *
X * This program is in the public domain. Permission to copy,
X * distribute, modify this program is hearby given as long as this header
X * remains. If you redistribute this program after modifying it, please
X * document your changes so that I do not take the blame (or credit) for
X * those changes. If you fix bugs or add features, please send me a
X * patch so that I can keep the 'official' version up-to-date.
X *
X * Bug reports are welcome and I'll make an attempt to fix those
X * that are reported.
X *
X * USE AT YOUR OWN RISK! I assume no responsibility for any
X * errors in this program, its database or documentation. I will make an
X * effort to fix bugs, but if you crash and burn because, for example,
X * fuel estimates in this program were inaccurate, it's your own fault
X * for trusting somebody else's code! Remember, as PIC, it's _your_
X * responsibility to do complete preflight planning. Use this program as
X * a flight planning aid, but verify its results before using them.
X *----------------------------------------------------------------------------
X */
X
X#include "mystring.h"
X#include <stdio.h>
X#include <ctype.h>
X#include "wp_info.h"
X
Xextern char *malloc();
Xextern char *getenv();
Xextern int qsort();
X
Xstatic char rcsid[] = "$Id: db.c,v 2.9 89/11/11 19:09:34 tynor Exp $";
X
X/*
X * the database file pointers:
X */
X
Xtypedef struct {
X FILE *fp;
X long rec_size;
X long num_recs;
X} DB_FILE;
X
X
XDB_FILE pub_airports, pvt_airports, pub_vors, pvt_vors;
X
X/*
X * environment variables for where the databases are:
X */
X#define HOME "HOME"
X#define NAV_PUBLIC "NAV"
X#define NAV_PRIVATE "NAV_PRIVATE"
X
X#ifndef DEFAULT_PVT_DIRECTORY
X#ifdef MSDOS
X#define DEFAULT_PVT_DIRECTORY "\\flight"
X#else
X#define DEFAULT_PVT_DIRECTORY "~/preflight"
X#endif
X#endif
X
X#ifndef DEFAULT_PUB_DIRECTORY
X#ifdef MSDOS
X#define DEFAULT_PUB_DIRECTORY "\\lib\\flight"
X#else
X#define DEFAULT_PUB_DIRECTORY "/usr/local/lib/preflight"
X#endif
X#endif
X
X#ifdef MSDOS
X#define AIRPORTS_NAME "\\airports.nav"
X#define VORS_NAME "\\vors.nav"
X#else
X#define AIRPORTS_NAME "/airports.nav"
X#define VORS_NAME "/vors.nav"
X#endif
X
X#define FSEEK_FROM_BEGINNING 0
X#define FSEEK_FROM_CURRENT 1
X#define FSEEK_FROM_END 2
X
X/*----------------------------------------------------------------------------*/
Xstatic long get_rec_size (buffer)
Xchar *buffer;
X{
X long i;
X
X for (i = 0;; i++) {
X if (buffer[i] == '\n') {
X return (i + 1L);
X }
X }
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic long get_num_recs (rec_size, fp, filename)
X long rec_size;
X FILE **fp;
X char *filename;
X{
X long file_size;
X
X if (fseek (*fp, 0L, FSEEK_FROM_END)) {
X fprintf (stderr, "ERROR: could not seek in db file: %s\n", filename);
X *fp = NULL;
X return (0L);
X }
X file_size = ftell (*fp);
X
X#ifndef MSDOS
X /*
X * can't figure out why MSC doesn't do this properly - maybe it's an
X * inconsistency in the way fseek works? For now, just assume that
X * database is in the proper format.
X */
X if ((file_size % rec_size) != 0L) {
X fprintf (stderr,
X "ERROR: file size (%ld/%ld) inconsistency in db file: %s\n",
X file_size, rec_size, filename);
X *fp = NULL;
X return (0L);
X }
X#endif
X return (file_size / rec_size);
X}
X
X/*----------------------------------------------------------------------------*/
XBOOLEAN open_dbs ()
X{
X char *pub_dir, *pvt_dir;
X BOOLEAN ok;
X
X#define BUFSIZE 200
X char filename[BUFSIZE];
X char buffer[BUFSIZE];
X
X#ifdef MSDOS
X#define OPEN_MODE "rb"
X#else
X#define OPEN_MODE "r"
X#endif
X
X if (! (pub_dir = getenv (NAV_PUBLIC)))
X pub_dir = DEFAULT_PUB_DIRECTORY;
X
X if (! (pvt_dir = getenv (NAV_PRIVATE)))
X pvt_dir = DEFAULT_PVT_DIRECTORY;
X
X#ifndef MSDOS
X if (pvt_dir[0] == '~') {
X strcpy (filename, getenv (HOME));
X strcat (filename, &pvt_dir[1]);
X pvt_dir = strdup (filename);
X }
X#endif
X
X strcpy (filename, pub_dir);
X strcat (filename, AIRPORTS_NAME);
X if (pub_airports.fp = fopen (filename, OPEN_MODE)) {
X fgets (buffer, BUFSIZE, pub_airports.fp);
X pub_airports.rec_size = get_rec_size (buffer);
X pub_airports.num_recs = get_num_recs (pub_airports.rec_size,
X &pub_airports.fp, filename);
X }
X
X strcpy (filename, pvt_dir);
X strcat (filename, AIRPORTS_NAME);
X if (pvt_airports.fp = fopen (filename, OPEN_MODE)) {
X fgets (buffer, BUFSIZE, pvt_airports.fp);
X pvt_airports.rec_size = get_rec_size (buffer);
X pvt_airports.num_recs = get_num_recs (pvt_airports.rec_size,
X &pvt_airports.fp, filename);
X }
X
X strcpy (filename, pub_dir);
X strcat (filename, VORS_NAME);
X if (pub_vors.fp = fopen (filename, OPEN_MODE)) {
X fgets (buffer, BUFSIZE, pub_vors.fp);
X pub_vors.rec_size = get_rec_size (buffer);
X pub_vors.num_recs = get_num_recs (pub_vors.rec_size,
X &pub_vors.fp, filename);
X }
X
X strcpy (filename, pvt_dir);
X strcat (filename, VORS_NAME);
X if (pvt_vors.fp = fopen (filename, OPEN_MODE)) {
X fgets (buffer, BUFSIZE, pvt_vors.fp);
X pvt_vors.rec_size = get_rec_size (buffer);
X pvt_vors.num_recs = get_num_recs (pvt_vors.rec_size,
X &pvt_vors.fp, filename);
X }
X ok = TRUE;
X
X if (!pub_airports.fp && !pvt_airports.fp) {
X ok = FALSE;
X fprintf (stderr, "ERROR: neither public or private airports db found\n");
X }
X if (!pub_vors.fp && !pvt_vors.fp) {
X ok = FALSE;
X fprintf (stderr, "ERROR: neither public or private vors db found\n");
X }
X return (ok);
X}
X
X/*----------------------------------------------------------------------------*/
XBOOLEAN close_dbs ()
X{
X if (pub_airports.fp)
X fclose (pub_airports.fp);
X if (pvt_airports.fp)
X fclose (pvt_airports.fp);
X if (pub_vors.fp)
X fclose (pub_vors.fp);
X if (pvt_vors.fp)
X fclose (pvt_vors.fp);
X
X return (TRUE);
X}
X
X
X/*----------------------------------------------------------------------------*/
Xstatic BOOLEAN lookup_desig_internal (db, desig, buffer_size, buffer)
X DB_FILE db;
X char *desig;
X int buffer_size;
X char *buffer;
X{
X long low, high, mid;
X int cmp;
X if (! db.fp)
X return FALSE;
X
X#ifdef NO_BINARY_SEARCH
X rewind (db.fp);
X while (fgets (buffer, buffer_size, db.fp)) {
X if (!strcmp (desig, strtok (buffer, ":\n")))
X return TRUE;
X }
X return FALSE;
X#else
X low = 0L;
X high = db.num_recs;
X while (low <= high) {
X mid = (low + high) / 2L;
X fseek (db.fp, mid * db.rec_size, FSEEK_FROM_BEGINNING);
X fgets (buffer, buffer_size, db.fp);
X cmp =strcmp (desig, strtok (buffer, ":\n"));
X if (!cmp)
X return TRUE;
X else if (cmp > 0)
X low = mid + 1;
X else
X high = mid - 1;
X }
X return FALSE;
X#endif
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic void decode_common (db)
X DATABASE_INFO *db;
X{
X extern double atof ();
X extern double degrees_mins_2_decimal ();
X double d1, d2;
X
X db->altitude.value = atof (strtok ((char*)0, ":\n"));
X db->altitude.valid = TRUE;
X
X d1 = atof (strtok ((char*)0, ":\n"));
X d2 = atof (strtok ((char*)0, ":\n"));
X db->mag_variation = d1 + d2 / 60.0;
X
X d1 = atof (strtok ((char*)0, ":\n"));
X d2 = atof (strtok ((char*)0, ":\n"));
X db->latitude = d1 + d2 / 60.0;
X
X d1 = atof (strtok ((char*)0, ":\n"));
X d2 = atof (strtok ((char*)0, ":\n"));
X db->longitude = d1 + d2 / 60.0;
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic void decode_vor (db)
X DATABASE_INFO *db;
X{
X char *tok;
X
X db->name = strdup (strtok ((char*)0, ":\n"));
X
X tok = strdup (strtok ((char*)0, ":\n"));
X if (tok[0] != '\0') {
X db->freq.valid = TRUE;
X db->freq.value = atof (tok);
X } else
X db->freq.valid = FALSE;
X
X decode_common (db);
X
X tok = strtok ((char*)0, ":\n");
X if (!strcmp ("NDB", tok))
X db->mode = WP_NDB;
X else if (!strcmp ("VOR", tok))
X db->mode = WP_VOR;
X else if (!strcmp ("DME", tok))
X db->mode = WP_DME;
X else if (!strcmp ("TAC", tok))
X db->mode = WP_TAC;
X else if (!strcmp ("ILS", tok))
X db->mode = WP_ILS;
X else if (!strcmp ("INT", tok))
X db->mode = WP_NAMED_INTERSECTION;
X else if (!strcmp ("WPT", tok))
X db->mode = WP_WPT;
X else if (!strcmp ("LOM", tok))
X db->mode = WP_LOM;
X else if (!strcmp ("LMM", tok))
X db->mode = WP_LMM;
X else
X db->mode = WP_UNK;
X
X tok = strtok ((char*)0, ":\n");
X if (tok)
X db->comment = strdup (tok);
X else
X db->comment = NULL;
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic void decode_airport (db)
X DATABASE_INFO *db;
X{
X char *tok;
X
X db->mode = WP_AIRPORT;
X db->city = strdup (strtok ((char*)0, ":\n"));
X db->name = strdup (strtok ((char*)0, ":\n"));
X
X decode_common (db);
X
X tok = strdup (strtok ((char*)0, ":\n"));
X
X if (tok[0] != '\0') {
X db->freq.valid = TRUE;
X db->freq.value = atof (tok);
X } else
X db->freq.valid = FALSE;
X
X tok = strtok ((char*)0, ":\n");
X if (tok)
X db->comment = strdup (tok);
X else
X db->comment = NULL;
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic void str_upcase (str)
X char *str;
X{
X int i;
X
X for (i = 0; str[i] != '\0'; i++)
X if (islower (str[i]))
X str[i] = toupper (str[i]);
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic BOOLEAN in_cache (mode, desig)
X WAYPOINT_MODE mode;
X char *desig;
X{
X int i;
X
X for (i = 0; i < num_cached; i++) {
X if ((!strcmp (desig, cache[i]->desig)) &&
X (mode == cache[i]->mode)) {
X return TRUE;
X }
X }
X return FALSE;
X}
X
X/*----------------------------------------------------------------------------*/
XBOOLEAN lookup_desig (kind, desig, db)
X WAYPOINT_KIND kind;
X char *desig;
X DATABASE_INFO **db;
X{
X#undef BUFSIZE
X#define BUFSIZE 200
X char buffer [BUFSIZE];
X DB_FILE fps[4];
X int i;
X BOOLEAN found;
X extern yyerror();
X enum {VOR, AIRPORT} db_kind;
X
X str_upcase (desig);
X
X if (kind == WP_VIA) {
X /*
X * prefer the VOR databases
X */
X fps[0] = pvt_vors;
X fps[1] = pub_vors;
X fps[2] = pvt_airports;
X fps[3] = pub_airports;
X } else {
X /*
X * prefer the AIRPORT databases
X */
X fps[0] = pvt_airports;
X fps[1] = pub_airports;
X fps[2] = pvt_vors;
X fps[3] = pub_vors;
X }
X
X for (i = 0; i < 4; i++) {
X if (found = lookup_desig_internal (fps[i], desig, BUFSIZE, buffer)) {
X#if 0
X printf ("%s found w/db %d[%ld] (%s)\n",desig,i,fps[i].fp,
X ((fps[i].fp == pub_airports.fp) ||
X (fps[i].fp == pvt_airports.fp)) ? "APT" : "VOR");
X#endif
X if ((fps[i].fp == pub_airports.fp) || (fps[i].fp == pvt_airports.fp))
X db_kind = AIRPORT;
X else
X db_kind = VOR;
X break;
X }
X }
X if (! found) {
X fprintf (stderr, "ERROR: could not find %s in any database\n", desig);
X return FALSE;
X }
X
X /*
X * now, convert it into a db record...
X */
X
X *db = (DATABASE_INFO*) malloc (sizeof (DATABASE_INFO));
X if (! *db)
X yyerror ("unable to allocate space for database element");
X
X (*db)->desig = desig; /* no need to strdup - the parser already did */
X
X if (db_kind == VOR)
X decode_vor (*db);
X else
X decode_airport (*db);
X
X /*
X * append to the cache: (NOTE: it might already be there if we didn't grab
X * it out of the cach because of incompatible modes - e.g. the cached wp is
X * an airport, but this is a via node - we forced a recheck in case there was
X * a navaid with the same desig)
X */
X if (num_cached < CACHE_SIZE)
X if (! in_cache ((*db)->mode, desig)) {
X cache[num_cached++] = *db;
X }
X return TRUE;
X}
X
X/*----------------------------------------------------------------------------*/
Xstatic int dbcmp (db1, db2)
X DATABASE_INFO **db1, **db2;
X{
X return (strcmp ((*db1)->desig, (*db2)->desig));
X}
X
X/*----------------------------------------------------------------------------*/
Xvoid put_db_summary (out_fp)
X FILE *out_fp;
X{
X int i;
X
X /*
X * first, sort the cache
X */
X qsort ((char*) &cache[0], num_cached, sizeof(DATABASE_INFO*), dbcmp);
X
X /*
X * now, print it out.
X */
X fprintf (out_fp, "\f\n");
X for (i = 0; i < num_cached; i++)
X put_db (out_fp, cache[i]);
X}
X
X
X/*----------------------------------------------------------------------------*/
Xvoid min_max_lat_long (min_lat, max_lat, min_long, max_long)
X double *min_lat, *max_lat, *min_long, *max_long;
X{
X int i;
X
X *min_lat = 190.0;
X *max_lat = -190.0;
X *min_long = 190.0;
X *max_long = -190.0;
X
X for (i = 0; i < num_cached; i++) {
X *min_lat = MIN (cache[i]->latitude, *min_lat);
X *max_lat = MAX (cache[i]->latitude, *max_lat);
X *min_long = MIN (cache[i]->longitude, *min_long);
X *max_long = MAX (cache[i]->longitude, *max_long);
X }
X}
SHAR_EOF
chmod 0444 db.c || echo "restore of db.c fails"
echo "x - extracting strings.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > strings.c &&
X/*
X * $Id: strings.c,v 1.7 89/11/11 19:13:40 tynor Exp $
X *----------------------------------------------------------------------------
X * FPLAN - Flight Planner
X * Steve Tynor
X * tynor@prism.gatech.edu
X *
X * This program is in the public domain. Permission to copy,
X * distribute, modify this program is hearby given as long as this header
X * remains. If you redistribute this program after modifying it, please
X * document your changes so that I do not take the blame (or credit) for
X * those changes. If you fix bugs or add features, please send me a
X * patch so that I can keep the 'official' version up-to-date.
X *
X * Bug reports are welcome and I'll make an attempt to fix those
X * that are reported.
X *
X * USE AT YOUR OWN RISK! I assume no responsibility for any
X * errors in this program, its database or documentation. I will make an
X * effort to fix bugs, but if you crash and burn because, for example,
X * fuel estimates in this program were inaccurate, it's your own fault
X * for trusting somebody else's code! Remember, as PIC, it's _your_
X * responsibility to do complete preflight planning. Use this program as
X * a flight planning aid, but verify its results before using them.
X *----------------------------------------------------------------------------
X */
X
Xstatic char rcsid[] = "$Id: strings.c,v 1.7 89/11/11 19:13:40 tynor Exp $";
X
X#include "mystring.h"
X#include "wp_info.h"
X#include "math.h"
X
Xextern char* malloc();
X
X/*
X * define a couple of functions that are in SunOS string(3), but apparently
X * aren't 'standard' - so much for the wonder of the portability of the
X * standard C library...
X *
X * The only thing we count on is strlen().
X */
X
X/*---------------------------------------------------------------------------*/
Xchar* index (s, c)
X char *s, c;
X{
X char *p;
X for (p = s; *p; p++)
X if (*p == c)
X return p;
X if (!c)
X return p;
X else
X return (char*) 0;
X}
X
X/*---------------------------------------------------------------------------*/
Xchar* strdup (s)
X char *s;
X{
X int len = strlen (s);
X char *new = (char*) malloc (len + 1);
X
X if (new)
X strcpy (new, s);
X return (new);
X}
X
Xstatic char *buffer;
Xstatic int start;
Xstatic int buf_len;
X
X/*---------------------------------------------------------------------------*/
Xchar *strtok (str, separators)
X char *str;
X char *separators;
X{
X int i, k;
X int len = strlen (separators);
X char *ptr;
X
X if (str) {
X buf_len = strlen (str);
X buffer = str;
X start = 0;
X }
X if (start > buf_len) {
X return (char*) 0;
X }
X for (i = 0; i <= len; i++) {
X /*
X * notice we cheat and use the '\0' terminator in the separators string
X * to always recognize '\0' as a separator.
X */
X if (ptr = index (&buffer[start], separators[i])) {
X *ptr = '\0';
X k = start;
X start = (int) (ptr - buffer + 1);
X return (&buffer[k]);
X }
X }
X return (char*) 0;
X}
X
SHAR_EOF
chmod 0444 strings.c || echo "restore of strings.c fails"
exit 0