From: deragon@JETHRO.CS.NYU.EDU (John Deragon)
Newsgroups: alt.games.gb
Subject: Small utility
Date: 1 Jan 1993 21:20:45 -0600
Organization: UTexas Mail-to-News Gateway
NNTP-Posting-Host: cs.utexas.edu



	Howdy....  enclosed is a small utility progammed called exship
	(examine ship).  It will basically open the "ship" database, and 
	check for problems with it. (ie: ships with cargo greater than 
	ships capacity). 

	Also you can specify a ship number, and the program will print out
	various details of the specified ship.

	See the README file for more info.   Be warned, this was only something
	I hacked together in about 30 minutes, its not in anyway a work or art,
	but it is useful.

#!/bin/sh
# This is a shell archive (shar 3.43)
# made 01/02/1993 03:14 UTC by deragon@jethro
# Source directory /work/devel/GB+/utils
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#   6927 -r--r--r-- exship.c
#   2528 -rw-rw-r-- README
#
# ============= exship.c ==============
if test -f 'exship.c' -a X"$1" != X"-c"; then
	echo 'x - skipping exship.c (File already exists)'
else
echo 'x - extracting exship.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'exship.c' &&
#ident  "@(#)exship.c	1.2 1/1/93 "
/***********************************************
X * exship.c
X *
X * Created: Fri Jan  1 19:34:23 EST 1993
X * Author:  J. Deragon (deragon@jethro.nyu.edu)
X *
X * Version: 1.2 22:05:01
X *
X *	This software is provided "as is" and without any express or
X *	implied warranties, including, without limitation, the implied
X *	warranties of merchantibility and fitness for a particular
X *	purpose.
X *
X ***********************************************/
X
/*
X * includes
X */
#include <strings.h>
#include <signal.h>
#include <sys/file.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#define EXTERN extern
#include "ships.h"
#include "shipdata.h"
X
X
#define DATAFILE "ship"
X
/*
X * Prototypes
X */
X
void            check_ship();
void            check_size();
void            display_ship();
#ifdef __STDC__
void            main(int, char **);
void            readship(shiptype **, int);
#else
void            main();
void            readship();
#endif
X
X
/*
X * Global vars
X */
X
static int      ship_fd;	/* the file descriptor of the datafile     */
struct stat     buffer;		/* used for getting the size of the file   */
int             num_ships;	/* number of total ships in database       */
int             bad_ship_count = 0;	/* the number of bad ships in the
X					 * database */
shiptype       *display;	/* this ship we are currently working on   */
X
/*
X * main:
X * 
X * arguments: shipnumber
X * 
X * called by:
X * 
X * description:  If invoked with zero arguments, it will open the ship datafile
X * and go through looking for obvious errors. If invoked with a ship number
X * it will print out a very verbose listing of the requested ship.
X * 
X */
void
main(argc, argv)
X	int             argc;
X	char           *argv[];
{
X	int             i;
X
X	if ((ship_fd = open(DATAFILE, 000, 0777)) < 0) {
X		perror(main);
X		printf("unable to open %s\n", DATAFILE);
X		exit(-1);
X	}
X	check_size();
X
X	if (argc == 1) {	/* check the whole database for errors */
X		for (i = 1; i <= num_ships; i++) {
X			readship(&display, i);
X			check_ship();
X			free(display);
X		}
X		printf("I found a total of %d bad ships out of %d\n",
X		       bad_ship_count, num_ships);
X	} else {		/* we want a specific ship display */
X		readship(&display, atoi(argv[1]));
X		display_ship();
X	}
X	printf("All Done \n");
X
X	exit(3);
}
X
/*
X * readship:
X * 
X * arguments: shiptype structure, shipnumber
X * 
X * called by:
X * 
X * description:  This funtion reads the actual data from the file.
X * 
X */
X
void
readship(s, shipnum)
X	shiptype      **s;
X	int             shipnum;
{
X	int             n;
X
X	if (shipnum <= 0)
X		exit(1);
X
X	if ((*s = (shiptype *) malloc(sizeof(shiptype))) == 0) {
X		printf("getship:Malloc() error\n");
X		exit(0);
X	}
X	if (lseek(ship_fd, (shipnum - 1) * sizeof(shiptype), L_SET) < 0) {
X		perror(lseek);
X		exit(1);
X	}
X	if ((n = read(ship_fd, (char *) *s, sizeof(shiptype))) != sizeof(shiptype))
X		perror(read);
X
X
X
}
X
/*
X * check_size:
X * 
X * arguments: none
X * 
X * called by: main
X * 
X * description:  gets the number of ships in the current database
X * 
X */
void
check_size()
{
X
X
X	fstat(ship_fd, &buffer);
X	num_ships = buffer.st_size / sizeof(shiptype);
X	printf("Number of ships in database is %d\n", num_ships);
}
X
/*
X * check_ship:
X * 
X * arguments: none
X * 
X * called by: main
X * 
X * description:  checks basic cargo to make sure its within limits of ships
X * ability.
X * 
X */
void
check_ship()
{
X	int             ship_ok = 1;
X	int             pop, troops, res, des, fu, speed, hanger;
X
X	pop = troops = res = des = fu = speed = hanger = 1;
X
X	if (display->type == OTYPE_FACTORY) {
X		if (display->popn > Shipdata[(display)->type][ABIL_MAXCREW])
X			ship_ok = pop = 0;
X		if (display->troops > Shipdata[(display)->type][ABIL_MAXCREW])
X			ship_ok = troops = 0;
X		if ((display->popn + display->troops) >
X		    Shipdata[(display)->type][ABIL_MAXCREW])
X			ship_ok = pop = troops = 0;
X	} else {
X		if (display->popn > display->max_crew)
X			ship_ok = pop = 0;
X		if (display->troops > display->max_crew)
X			ship_ok = troops = 0;
X		if ((display->popn + display->troops) > display->max_crew)
X			ship_ok = pop = troops = 0;
X	}
X	if (display->resource > Max_resource(display))
X		ship_ok = res = 0;
X	if (display->destruct > Max_destruct(display))
X		ship_ok = des = 0;
X	if ((int) display->fuel > Max_fuel(display))
X		ship_ok = fu = 0;
X	if (display->speed > Max_speed(display))
X		ship_ok = speed = 0;
X	if (display->hanger > display->max_hanger)
X		ship_ok = hanger = 0;
X
X	if (!ship_ok) {
X		bad_ship_count++;
X
X		printf("Problem with ship number %d\n", display->number);
X		printf("\t\tOwner: %d\n", display->owner);
X		printf("\t\tGovernor: %d\n", display->governor);
X		printf("\t\tName: %s\n", display->name);
X		printf("\t\tType: %c\n", Shipltrs[display->type]);
X		printf("\n");
X
X		printf("\t %s popn: %d\t max_popn: %d:\n",
X		pop ? "      " : "----->", display->popn, display->max_crew);
X		printf("\t %s troops: %d\t max_troops: %d\n",
X		       troops ? "      " : "----->", display->troops, display->max_crew);
X		printf("\t %s resources: %d\t max_resources: %d\n",
X		       res ? "      " : "----->", display->resource,
X		       display->max_resource);
X		printf("\t %s destruct: %d\t max_destruct: %d\n",
X		       des ? "      " : "----->", display->destruct,
X		       display->max_destruct);
X		printf("\t %s fuel: %d\t max_fuel: %d\n",
X		       fu ? "      " : "----->", (int) display->fuel,
X		       (int) display->max_fuel);
X		printf("\t %s speed: %d\t max_speed: %d\n",
X		       speed ? "      " : "----->", display->speed, display->max_speed);
X		printf("\t %s hanger: %d\t max_hanger: %d\n",
X		       hanger ? "      " : "----->", display->hanger,
X		       display->max_hanger);
X	}
}
X
/*
X * display_ship:
X * 
X * arguments: none
X * 
X * called by: main
X * 
X * description:  Prints a _long_ description a a specific ship.
X * 
X */
void
display_ship()
{
X	printf("Ship Number: %d\tShip Type: %c\tShip Owner: %d\tShip Governor %d\n",
X	       display->number, Shipltrs[display->type],
X	       display->owner, display->governor);
X	printf("Ship Name: %s\n", display->name);
X
X	printf("\nCrew: %-9d\t  Troops: %-6d\tArmor: %d\n",
X	       display->popn, display->troops, display->armor);
X	printf("Size: %-9d\t  Base Mass: %-4.1f\tBase Tech: %4.1f\n",
X	       display->size, display->base_mass, display->tech);
X	printf("Destruct: %-6d  Resources: %-6d\tCrystals: %d\n",
X	       display->destruct, display->resource, display->crystals);
X	printf("Fuel: 4.1f\n", display->fuel);
X	printf("\n");
X	printf("Guns:\tPrimary: %-3d%c\n", display->primary,
X	       (display->primtype == LIGHT ? 'L' :
X		display->primtype == MEDIUM ? 'M' :
X		display->primtype == HEAVY ? 'H' : 'N'));
X	printf("     \tSecondary:  %-3d%c\n", display->primary,
X	       (display->primtype == LIGHT ? 'L' :
X		display->primtype == MEDIUM ? 'M' :
X		display->primtype == HEAVY ? 'H' : 'N'));
X
X	printf("\nNextship: %-6d\t (%s)\n", display->nextship,
X	       display->alive ? "ALIVE" : "DEAD");
}
SHAR_EOF
chmod 0444 exship.c ||
echo 'restore of exship.c failed'
Wc_c="`wc -c < 'exship.c'`"
test 6927 -eq "$Wc_c" ||
	echo 'exship.c: original size 6927, current size' "$Wc_c"
fi
# ============= README ==============
if test -f 'README' -a X"$1" != X"-c"; then
	echo 'x - skipping README (File already exists)'
else
echo 'x - extracting README (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'README' &&
X	This is a small utility to examine the ship database for Galactic
Bloodshed.  It can be used two ways:
X
X	a: run exship with no arguments, and it will scan through the entire
X	   database, looking for ships whose cargo exceeds the maximum allowed.
X
X	b: run exship with a ship_number and it will display a more verbose
X	   listing of the ships.  
X
X	The following are sample outputs from both cases...
X
X	tensha%: exship
X	Number of ships in database is 5
X	Problem with ship number 1
X                Owner: 1
X                Governor: 0
X                Name: Tester
X                Type: @
X
X                popn: 10         max_popn: 10:
X                troops: 0        max_troops: 10
X         -----> resources: 600   max_resources: 500
X                destruct: 100    max_destruct: 100
X                fuel: 1000       max_fuel: 1000
X                speed: 0         max_speed: 0
X                hanger: 0        max_hanger: 0
X	I found a total of 1 bad ships out of 5
X	All Done
-----
X	
X  As you can see there is a problem with the ship [denoted by the ----->]
X  in which the ship has more resources loaded then it should have.  It also
X  at the top of the screen will display the number of ships in the database.
X
X
X  When run with a argument, the following is the output:
X
X	tensha%: exship 1
X	Number of ships in database is 5
X	Ship Number: 1  Ship Type: @    Ship Owner: 1   Ship Governor 0
X	Ship Name: Tester
X
X	Crew: 10          Troops: 0             Armor: 20
X	Size: 25          Base Mass: 100.0      Base Tech: 100.0
X	Destruct: 100     Resources: 600        Crystals: 0
X	Fuel: 4.1f
X
X	Guns:   Primary: 10 L
X        Secondary:  10 L
X
X	Nextship: 2              (ALIVE)
X	All Done
X
-----
X
X	Compliling information:
X
X	This program has only been tested on a Suns running Sun OS 4.1.1, and
X	compiled succesfully with the Sun compilier and gcc 1.42.
X
X	compile with the following line:
X
X	gcc -I/work/GB/hdrs -g -o exship exship.c	
X
X	but change /work/GB/hdrs to be the location where the compiler can
X	find the ships.h and shipdata.h files. (these files are part of the GB
X	release)
X
X
X	This is something I hacked together very very quickly to just fix
X	a few problems with the database.  It is not meant to be a catch all
X	for database problems.   If I have some time in the future, I will
X	add new bells and whistles.  Feel free to modify this source, and if
X	you make any improvements, please email them back to me, so I can 
X	merge them into the next version.
X
X
X	John Paul Deragon
X	deragon@jethro.nyu.edu
X	Fri Jan  1 21:58:49 EST 1993
SHAR_EOF
chmod 0664 README ||
echo 'restore of README failed'
Wc_c="`wc -c < 'README'`"
test 2528 -eq "$Wc_c" ||
	echo 'README: original size 2528, current size' "$Wc_c"
fi
exit 0
-- 



-----
John Deragon		   deragon@cs.nyu.edu | deragon@jethro.cs.nyu.edu
-----
Space is big.  You just won't believe how vastly, hugely, mind-bogglingly
big it is.   I mean, you  may think it's a long  way down the road to the 
drug store, but that's just peanuts to space.
-- "The Hitchhiker's Guide to the Galaxy"

Newsgroups: alt.games.gb