🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by FisherTS Sun, 01 Dec 1985 22:46
Visual Empire for Old Empire 2 of 2
#405
Author: FisherTS
Date: Sun, 01 Dec 1985 22:46
2589 lines
59253 bytes
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by tsf on Sun Dec  1 15:01:36 MST 1985
# Contents:  ./EUPD/ ./EUPD/_unix.O/ ./GENLIB/ ./TERMLIB/ ./TERMLIB/hdrs/
#	./UPDLIB/ ./MISC/ ./MISC/_unix.O/ ./ECRE/ ./ECRE/_unix.O/ ./EUPD/eupd.y
#	./EUPD/Makefile ./EUPD/_unix.O/y.tab.o ./EUPD/eupd.l ./GENLIB/Makefile
#	./GENLIB/secno.c ./GENLIB/getsec.c ./GENLIB/getship.c ./GENLIB/getopt.c
#	./GENLIB/4.2mkfile ./GENLIB/strchr.c ./GENLIB/strspn.c
#	./TERMLIB/termcap.c ./TERMLIB/tgoto.c ./TERMLIB/tputs.c
#	./TERMLIB/Makefile ./TERMLIB/hdrs/uparm.h ./TERMLIB/4.2mkfile
#	./UPDLIB/Makefile ./UPDLIB/docen.c ./UPDLIB/domap.c ./UPDLIB/dorad.c
#	./UPDLIB/dospy.c ./UPDLIB/4.2mkfile ./MISC/clust.sh ./MISC/Makefile
#	./MISC/_unix.O/pworld.o ./MISC/nomine.sh ./MISC/pworld.c ./MISC/pl.sh
#	./MISC/rdship.c ./MISC/mine.sh ./MISC/sink.sh ./MISC/makeloo.sh
#	./MISC/vspos.sh ./MISC/shsup.A ./ECRE/ecre.c ./ECRE/Makefile
#	./ECRE/_unix.O/ecre.o
 
echo mkdir - ./EUPD
mkdir ./EUPD
chmod u=rwx,g=rx,o=rx ./EUPD
 
echo x - ./EUPD/eupd.y
sed 's/^@//' > "./EUPD/eupd.y" <<'@//E*O*F ./EUPD/eupd.y//'
%{
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	<stdio.h>
#include	"emp.h"
#include	"ship.h"

FILE	*fopen(), *fdsec, *fdship;
struct	sector	s;
struct	shpstr	Ship;

extern	char	Stype[], Cenflags[];
extern  char    Rscan[MAXSCN][2*MAXSCN], Raddes[]; 
extern	int	Nrows, Xrad, Yrad, Rngrad;
int	Radflag;

int	Maphdr = 0;
int	Mapx, Mapy, Maplcol, Maptens;
int	Colno = 0;
int	Line = 0;
int	Debug = 0;
int	loo_corm[2], i, n;
int	Xfly, Yfly;

main(argc, argv)
int	argc;
char	**argv;
{
	extern	FILE	*fopen(), *fdsec;
	extern	int	yydebug, Debug;
	extern	struct	sector	s;
	extern	int	optind;
	extern	char	*optarg;

	int	c, x, y, n;
	int	pflg, errflg;

	if( (fdsec=fopen("empsect","r+")) == NULL ) {
		fprintf(stderr,"Can't open empsect\n");
		exit(1);
	}
	if( (fdship=fopen("empship","r+")) == NULL ) {
		fprintf(stderr,"Can't open empship\n");
	}

	while(( c = getopt(argc, argv, "pd")) != EOF ) {
		switch( c ) {
		case 'p':
			pflg++;
			break;
		case 'd':
			Debug++;
			break;
		case '?':
			errflg++;
		}

		if( errflg ) {
			fprintf(stderr, "Usage: %s [-p]\n", argv[0] );
			exit(2);
		}
		if( pflg ) {
			fprintf(stderr, "Purging world\n");
			for( y = 0; y < XYMAX; y++ ) {
				for( x = 0; x < XYMAX; x++ ) {
					getsec(&s, (n = secno(x, y)));
					if( s.s_coun == 0 &&
					  s.s_des != '.' && s.s_des != ' ' &&
					  s.s_des != '\0' && 
					  (s.s_rsrc[CIV]>0 || s.s_rsrc[MIL]>0)){
						s.s_coun = 98;
						putsec(&s, n);
					}
				}
			}
			fprintf(stderr, "World purged\n");
			exit(0);
		}
	}
	yyparse();
}
%}
%token	EOL SECTLET SECTNLET ANYCHAR
%token	NUM CMD EX
%token	SPY DPRTD
%token	SHIP SECT
%token	STPD SUB AT
%token	EFF WITH APPRX CIVTKN MILTKN
%token	SHLTKN GUNTKN PLNTKN ORETKN BARTKN
%token	DLVR FROM TO THRSH
%token	YOUR UNOWN
%token	BAROM RANGE RADAR
%token	CMSGPOB CENFLGS SECTORS
%token	NWOVR FLYOVR CMPRTLY CNSTRCTD
%token	MAPHDR
%start	session
%%

session		:	cmdout
		|	session	cmdout
		;
cmdout		:	cprompt
		|	EOL
		|	cenout
		|	mapout
		|	ship_rec
		|	nav_rec
		|	nav_info
		|	loo_rec
		|	radout
		|	del_rec
		|	spy_rec
		|	fly_rec
		|	error EOL
			{
				if( Debug ) {
					printf("%dp\n", Line);
				}
			}
		;
cprompt		:	'[' NUM ':' NUM ']' cmd_or_ex ':'
				{printf("[%d:%d]\n", $2, $4);
				}
		;
cmd_or_ex	:	CMD
		|	EX
		;
cenout		:	error CMSGPOB
			error EOL
			cen_recs NUM SECTORS EOL
			{	printf("%d sectors\n", $6);	}
		;
cen_recs	:	cen_rec
		|	cen_recs cen_rec
		;
cen_rec		:	error EOL
		|	NUM ',' NUM CENFLGS SECT NUM '%'
			NUM NUM NUM NUM NUM NUM NUM NUM NUM NUM NUM EOL
			{
				getsec(&s, (n = secno($1, $3)));
				s.s_coun = 0;
				s.s_ckpt = Cenflags[0];
				for( i = 0; i <= 6; i++ ) {
					setdel(Cenflags[i+1], &s.s_del[i]);
				}
				s.s_def  = Cenflags[8];
				s.s_des  = $5;
				s.s_eff  = $6;
				s.s_min  = $8;
				s.s_gold = $9;
				s.s_mob  = $10;
				s.s_rsrc[0] = $11;
                                s.s_rsrc[1] = $12;
                                s.s_rsrc[2] = $13;
                                s.s_rsrc[3] = $14;
                                s.s_rsrc[4] = $15;
                                s.s_rsrc[5] = $16;
                                s.s_rsrc[6] = $17;
				s.s_prod = $18;
				putsec(&s, n);
			}
		;
mapout		:	MAPHDR EOL MAPHDR EOL map_recs MAPHDR EOL MAPHDR EOL
		;
map_recs	:	map_rec
		|	map_recs map_rec
		;
map_rec		:	NUM
			{ Mapy = $1; }
			map_chars NUM EOL
		|	NUM NUM EOL
		;
map_chars	:	map_char
			{	if( Colno < 6 || Colno > Maplcol ) YYERROR;
				if( Colno%2 != 0 ) YYERROR;
				domap(Mapx, Mapy, Colno, (char)$1);
			}
		|	map_chars map_char
			{	if( Colno < 6 || Colno > Maplcol ) YYERROR;
				if( Colno%2 != 0 ) YYERROR;
				domap(Mapx, Mapy, Colno, (char)$2);
			}
		;
map_char	:	SECTLET
		|	SECTNLET
		|	'#'
			{ $$ = (int)'#'; }
		|	')'
			{ $$ = (int)')'; }
		| 	'.'
			{ $$ = (int)'.'; }
		;
ship_rec	:	NUM SHIP NUM ',' NUM ship_fleet NUM '%'
			{	if( $4 != 20 || $8 != 30 ) YYERROR;
			}
			NUM NUM NUM NUM NUM NUM NUM EOL
			{	Ship.shp_type = $2;
				Ship.shp_own  = 0;
				Ship.shp_xp   = $3;
				Ship.shp_yp   = $5;
				Ship.shp_fleet= $6;
				Ship.shp_effc = $7;
				Ship.shp_crew = $10;
				Ship.shp_shels= $11;
				Ship.shp_gun = $12;
				Ship.shp_plns = $13;
				Ship.shp_or   = $14;
				Ship.shp_gld  = $15;
				Ship.shp_mbl  = $16;
				putship(&Ship, $1);
			}
		;
ship_fleet	:	SECTLET
		|	ANYCHAR
		|
			{	$$ = ' ';		}
		;
nav_rec		:	SHIP '#' NUM STPD AT NUM ',' NUM EOL
			{	printf("Ship %d stopped at %3d,%-3d\n",
					$3, $6, $8);
				if( getship(&Ship, $3) == ERROR ) {
					Ship.shp_fleet = ' ';
					Ship.shp_crew  = 0;
					Ship.shp_shels = Ship.shp_gun = 0;
					Ship.shp_plns  = Ship.shp_or  = 0;
					Ship.shp_gld   = Ship.shp_mbl = 0;
					Ship.shp_effc = 100;
				}
				Ship.shp_own  = 0;
				Ship.shp_xp   = $6;
				Ship.shp_yp   = $8;
				putship(&Ship, $3);
			}
		;
nav_info	:	 '<' NUM '.' NUM ':' NUM '.' NUM ':' NUM ',' NUM '>' 
		;
loo_rec         :       loo_count SHIP '#' NUM '@' NUM ',' NUM EOL 
			{	if( getship(&Ship, $4) == ERROR ) {
					Ship.shp_fleet = ' ';
					Ship.shp_crew  = 0;
					Ship.shp_shels = Ship.shp_gun = 0;
					Ship.shp_plns  = Ship.shp_or  = 0;
					Ship.shp_gld   = Ship.shp_mbl = 0;
				}
				Ship.shp_effc = 100;
				Ship.shp_own  = $1;
				Ship.shp_type = $2;
				Ship.shp_xp   = $6;
				Ship.shp_yp   = $8;
				putship(&Ship, $4);
			}
		|	SUB AT NUM ',' NUM EOL
			{	printf("Sub at %3d,%-3d\n", $3, $5);
			}
		|	loo_count SECT NUM '%' EFF
			{	loo_corm[0] = -1;
				loo_corm[1] = -1;
			}
			loo_cntnt '@' NUM ',' NUM EOL
			{
				if( $1 != 0 ) {
					getsec(&s, (n = secno($9, $11)));
					s.s_coun = $1;
					s.s_des = $2;
					s.s_eff = $3 * 2;
					if( loo_corm[0] > 0 ) {
						s.s_rsrc[CIV]=loo_corm[0];
						if( s.s_des == 'u' ) {
							s.s_rsrc[CIV] *= 10;
						}
					}
					if( loo_corm[1] > 0 ) {
						s.s_rsrc[MIL]=loo_corm[1];
					}
					putsec(&s, n);
				}
			}
		;
loo_count	:	UNOWN
			{	$$ = 99	;	}
		|	YOUR
			{	$$ = 0;		}
		|	error '(' '#' NUM ')'
			{	$$ = $4;	}
		;
loo_cntnt	:
		|	WITH NUM loo_rsrc
			{	loo_corm[$3] = $2;	}
		|	WITH APPRX NUM loo_rsrc
			{	loo_corm[$4] = $3 * 2;	}
		|	WITH NUM loo_rsrc '&' NUM loo_rsrc
			{
				loo_corm[$3] = $2;
				loo_corm[$6] = $5;
			}
		|	WITH APPRX NUM loo_rsrc WITH APPRX NUM loo_rsrc
			{
				loo_corm[$4] = $3 * 2;
				loo_corm[$8] = $7 * 2;
			}
		;
loo_rsrc	:	CIVTKN
			{	$$ = 0;		}
		|	MILTKN
			{	$$ = 1;		}
		;
radout		:	rad_source NUM ',' NUM EOL
			{
				Xrad = $2;
				Yrad = $4;
			}
			EFF NUM '%' ',' BAROM AT NUM ','
			RANGE NUM '.' 
			{
				Rngrad = $16;
				Radflag = 1;
				Nrows = 0;
			}
			NUM EOL
		;
rad_source	:	RADAR AT
		|	SHIP NUM AT
		;
del_rec		:	DLVR del_rsrc FROM SECT '@' NUM ',' NUM
			TO NUM ',' NUM del_thrsh EOL
			{
				i = $13/8;
				getsec(&s, (n = secno($6, $8)));
				if( $4 == 'u' && $2 == CIV ) i /= 10;
				if( $4 == 'b' && $2 == BAR ) i /= 4;
				if( $4 == 'w' && ($2==SHL || $2==GUN ||
					$2==ORE) ) i /= 10;
				s.s_del[$2] &= 017;
				s.s_del[$2] |= (i & 017) << 4;
				putsec(&s, n);
			}
		;
del_rsrc	:	CIVTKN
		|	MILTKN
		|	SHLTKN
		|	GUNTKN
		|	PLNTKN
		|	ORETKN
		|	BARTKN
		;
del_thrsh	:
			{	$$ = 0;			}
		|	'(' THRSH NUM ')'
			{	$$ = $3;		}
		;
spy_rec		:	NUM ',' NUM NUM spy_sect NUM '%' 
			{
				if( $2 != 4 || $7 != 17 ) YYERROR;
			}
			NUM NUM NUM NUM NUM NUM EOL
			{

				getsec(&s, (n = secno($1, $3)));
				s.s_coun = ($4==0 ? 99 : $4);
				s.s_des = (char)$5;
				s.s_eff = 2 * $6;
				s.s_rsrc[CIV] = 2 * $9;
				s.s_rsrc[MIL] = 2 * $10;
				s.s_rsrc[SHL] = 2 * $11;
				s.s_rsrc[GUN] = 2 * $12;
				s.s_rsrc[ORE] = 2 * $13;
				s.s_rsrc[PLN] = 2 * $14;
				putsec(&s, n);
			}
		|	SPY DPRTD FROM NUM ',' NUM '.' EOL
			{
				getsec(&s, (n = secno($4, $6)));
				if( s.s_coun == 0 ) {
					s.s_coun = 98;
					putsec(&s, n);
				}
			}
		;
spy_sect	:	SECTLET
		|	SECTNLET
		|	'#'
			{ $$ = (int)'#'; }
		|	')'
			{ $$ = (int)')'; }
		;
fly_rec		:	fly_info fly_rec
		|	fly_info NWOVR CMPRTLY CNSTRCTD SECT '.' EOL 
			{
				getsec(&s, n = secno(Xfly, Yfly));
				s.s_des = $5;
				putsec(&s, n);
			}
		|	fly_info FLYOVR SECT '.' EOL
			{
				getsec(&s, n = secno(Xfly, Yfly));
				s.s_des = $3;
				putsec(&s, n);
			}
		;
fly_info	:	'<' NUM '.' NUM ':' NUM ':' NUM ':' NUM ',' NUM '>'
			{
				Xfly = $10;
				Yfly = $12;
			}
		;
%%
#include	"lex.yy.c"

yyerror(s)
char	*s;
{
}
@//E*O*F ./EUPD/eupd.y//
chmod u=rw,g=r,o=r ./EUPD/eupd.y
 
echo x - ./EUPD/Makefile
sed 's/^@//' > "./EUPD/Makefile" <<'@//E*O*F ./EUPD/Makefile//'
CFLAGS = -c
HDRDIR=../hdrs
INSDIR=..
LIBDIR=../_unix.O
GENLIB=$(LIBDIR)/genlib.a
UPDLIB=$(LIBDIR)/updlib.a

eupd:	$(INSDIR)/eupd

$(INSDIR)/eupd:	_unix.O/y.tab.o $(UPDLIB) $(GENLIB)
	$(CC) -o $@ _unix.O/y.tab.o $(UPDLIB) $(GENLIB) -ll

_unix.O/y.tab.o:	y.tab.c lex.yy.c $(HDRDIR)/emp.h $(HDRDIR)/ship.h
	$(CC) $(CFLAGS) -I$(HDRDIR) y.tab.c
	@mv y.tab.o $@

y.tab.c:	eupd.y
	yacc eupd.y

lex.yy.c:	eupd.l
	lex -n eupd.l

clean:
	rm -f lex.yy.c y.tab.c _unix.O/y.tab.o

clobber: clean
	rm -f $(INSDIR)/eupd
@//E*O*F ./EUPD/Makefile//
chmod u=rw,g=r,o=r ./EUPD/Makefile
 
echo mkdir - ./EUPD/_unix.O
mkdir ./EUPD/_unix.O
chmod u=rwx,g=rx,o=rx ./EUPD/_unix.O
 
echo x - ./EUPD/_unix.O/y.tab.o
sed 's/^@//' > "./EUPD/_unix.O/y.tab.o" <<'@//E*O*F ./EUPD/_unix.O/y.tab.o//'
@//E*O*F ./EUPD/_unix.O/y.tab.o//
chmod u=rw,g=r,o=r ./EUPD/_unix.O/y.tab.o
 
echo x - ./EUPD/eupd.l
sed 's/^@//' > "./EUPD/eupd.l" <<'@//E*O*F ./EUPD/eupd.l//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

RADDES  [-.^cudg*ihamwtfr+#)=!bxs? BCDFMPST/]
SECTDES [-.^cudg*ihamwtfr+#)=!bxs]
%{
#define	SMAXNO	24
char	*Sect[] = { "se", "mo", "sa", "wi", "ca", "ur", "de",
		    "sh", "mi", "go", "ha", "wa", "ai",
		    "ag", "te", "fo", "re", "hi", "ra",
		    "we", "br", "br", "ba", "ex"
		  };
char	Sectchar[] = { '.', '^', 's', '-', 'c', 'u', 'd',
		       'i', 'm', 'g', 'h', 'w', '*',
		       'a', 't', 'f', 'r', '+', ')',
		       '!', '#', '=', 'b', 'x'
		     };
char	Cenflags[16];
extern	int	Maphdr, Maptens, Maplcol, Mapx;
extern	int	Colno, Line;
extern	int	Nrows, Radflag;
extern	char	Stype[];
int	j;
%}
%p 3000
%Start	RAD CEN MAP
%%
cmsgpob							{
			Colno += yyleng;
			BEGIN CEN;
			return(CMSGPOB);
							}
<CEN>("*"|" ")[$.0-7]+("%"|" ")				{
			if( Colno != 7 ) REJECT;
			if( yyleng != 9 ) REJECT;
			strncpy(Cenflags, yytext, 9);
			Colno += yyleng;
			return(CENFLGS);
							}
<CEN>" "{SECTDES}" "					{
			if( Colno != 16 ) REJECT;
			Colno += yyleng;
			yylval = (int)yytext[1];
			return(SECT);
							}
<CEN>" sector"s?					{
			Colno += yyleng;
			BEGIN 0;
			return(SECTORS);
							}
<RAD>^({RADDES}[ /])+{RADDES}				{
			strncpy(Rscan[Nrows++], yytext, MAXSCN*2);
			Colno += yyleng;
							}
<RAD>.							{
			Radflag = 0;
			if( Nrows ) dorad();
			BEGIN 0;
			REJECT;
							}
<MAP>^"     "[-0-9](" "[-0-9])+				{
			if( yyleng < 8 ) REJECT;
			Maphdr++;
			if( Maphdr == 4 ) {
				Maphdr = 0;
				BEGIN 0;
				return(MAPHDR);
			}
			if( Maphdr == 2 ) {
				Mapx = yytext[5] - '0'; /* units part first */
				j = Mapx - yytext[7] + '0'; /* check sign */
				Mapx += Maptens * 10; /* now add in tens */
				if( j == 1 || j == -9 ) Mapx = -Mapx;
				Maplcol = yyleng;
			}
			return(MAPHDR);
							}
"     "[-0-9](" "[-0-9])+				{
			if( Maphdr != 0 || yyleng < 8 ) REJECT;
			if( yytext[5] == '-' ) {
				Maptens = 0;
			} else {
				Maptens = yytext[5] - '0';
			}
			Maphdr = 1;
			BEGIN MAP;
			return(MAPHDR);
							}
"rad"a?r?						{
			Colno += yyleng;
			return(RADAR);
							}
"Efficiency"						{
			Colno += yyleng;
			return(EFF);
							}
"barometer"						{
			Colno += yyleng;
			return(BAROM);
							}
"max range"						{
			Colno += yyleng;
			return(RANGE);
							}
"Command"						{
			Colno += 7;
			BEGIN 0;
			return(CMD);
							}
"Execute"						{
			Colno += 7;
			BEGIN 0;
			return(EX);
							}
"Spy"							{
			Colno += yyleng;
			return(SPY);
							}
"deported"						{
			Colno += yyleng;
			return(DPRTD);
							}
(pt" "b|mines|destr|subma|freig|tende|battl|carri)[^ ]*	{
			Colno += yyleng;
			for( j=0; i<=TMAXNO; j++ ) {
				if( yytext[0] == Stype[j] ) break;
			}
			yylval = j;
			return(SHIP);
							}
"stopped"						{
			Colno += yyleng;
			return(STPD);
							}
"Snorkel"						{
			Colno += yyleng;
			return(SUB);
							}
Your							{
			Colno += yyleng;
			return(YOUR);
							}
Unowned							{
			Colno += yyleng;
			return(UNOWN);
							}
eff							{
			Colno += yyleng;
			return(EFF);
							}
with							{
			Colno += yyleng;
			return(WITH);
							}
approx"."						{
			Colno += yyleng;
			return(APPRX);
							}
Deliver							{
			Colno += yyleng;
			return(DLVR);
							}
"from "							{
			Colno += yyleng;
			return(FROM);
							}
" to "							{
			Colno += yyleng;
			return(TO);
							}
thresh							{
			Colno += yyleng;
			return(THRSH);
							}
"Now over"						{
			Colno += yyleng;
			return(NWOVR);
							}
"Flying over"						{
			Colno += yyleng;
			return(FLYOVR);
							}
(completely|partially|minimally)					{
			Colno += yyleng;
			return(CMPRTLY);
							}
constructed						{
			Colno += yyleng;
			return(CNSTRCTD);
							}
civilians						{
			Colno += yyleng;
			yylval = CIV;
			return(CIVTKN);
							}
(troops|military)					{
			Colno += yyleng;
			yylval = MIL;
			return(MILTKN);
							}
shells							{
			Colno += yyleng;
			yylval = SHL;
			return(SHLTKN);
							}
guns							{
			Colno += yyleng;
			yylval = GUN;
			return(GUNTKN);
							}
planes							{
			Colno += yyleng;
			yylval = PLN;
			return(PLNTKN);
							}
" ore "							{
			Colno += yyleng;
			yylval = ORE;
			return(ORETKN);
							}
"bars of gold"						{
			Colno += yyleng;
			yylval = BAR;
			return(BARTKN);
							}
(sea|mount|sanct|wilde|capit|urban" "a|defense" "p)[a-z]*		{
			Colno += yyleng;
			yylval = schar(yytext);
			return(SECT);
							}
(shell" "i|mine|gold" "m|harb|ware|airf|agri)[a-z]*	{
			Colno += yyleng;
			yylval = schar(yytext);
			return(SECT);
							}
(technical" "c|fortr|research" "l|high|radar" "i)[a-z]*	{
			Colno += yyleng;
			yylval = schar(yytext);
			return(SECT);
							}
(weather" "s|bridge" "h|bridge" "s|bank|exch)[a-z]*	{
			Colno += yyleng;
			yylval = schar(yytext);
			return(SECT);
							}
-?[0-9]+						{
			Colno += yyleng;
			yylval = atoi(yytext);
			return(NUM);
							}
" at"							{
			Colno += yyleng;
			return(AT);
							}
[ \t]			Colno++;
\n							{
			Colno = 0;
			Line++;
			if( Radflag ) {
				BEGIN RAD;
			}
			return(EOL);
							}
([:,%#.@<>()&]|"["|"]")				{
			Colno++;
			yylval = Colno;
			return((int)*yytext);
							}
[abcdfghimrstuwx]					{
			Colno++;
			yylval = (int)*yytext;
			return(SECTLET);
							}
[-!=^*+?]						{
			Colno++;
			yylval = (int)*yytext;
			return(SECTNLET);
							}
@.							{
			Colno++;
			yylval = Colno;
			return(ANYCHAR);
							}
%%
schar(s)
char	*s;
{
	extern	char	*Sect[], Sectchar[];
	int	i;

	for( i=0; i<SMAXNO; i++ ) {
		if( strncmp( s, Sect[i], 2) == 0 ) break;
	}
/*
	Adjust for bridge span
*/
	if( Sectchar[i] == '#' && s[7] == 's' ) i++;
	return( (int)Sectchar[i] );
}
@//E*O*F ./EUPD/eupd.l//
chmod u=rw,g=r,o=r ./EUPD/eupd.l
 
echo mkdir - ./GENLIB
mkdir ./GENLIB
chmod u=rwx,g=rx,o=rx ./GENLIB
 
echo x - ./GENLIB/Makefile
sed 's/^@//' > "./GENLIB/Makefile" <<'@//E*O*F ./GENLIB/Makefile//'
CFLAGS= -c -O
HDRDIR =../hdrs
INSDIR=../_unix.O
LIB=$(INSDIR)/genlib.a

$(LIB): \
	$(LIB)(getopt.o) \
	$(LIB)(strchr.o) \
	$(LIB)(strspn.o) \
	$(LIB)(secno.o) \
	$(LIB)(getsec.o) \
	$(LIB)(getship.o)
	$(CC) $(CFLAGS) -I$(HDRDIR) $(?:.o=.c)
	@ar r $(LIB) *.o
	@rm -f *.o
	@echo $@ is now up to date
@.c.a:;

$(LIB)(secno.o):	$(HDRDIR)/emp.h

$(LIB)(getsec.o):	$(HDRDIR)/emp.h

$(LIB)(getship.o):	$(HDRDIR)/emp.h $(HDRDIR)/ship.h

clean:

clobber:
	rm -f $(LIB)

@.PRECIOUS:	$(LIB)

@//E*O*F ./GENLIB/Makefile//
chmod u=rw,g=r,o=r ./GENLIB/Makefile
 
echo x - ./GENLIB/secno.c
sed 's/^@//' > "./GENLIB/secno.c" <<'@//E*O*F ./GENLIB/secno.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	"emp.h"

secno(x, y)
int	x, y;
{
	return((x + XYMAX) % XYMAX + ((y + XYMAX) % XYMAX) * XYMAX);
}
@//E*O*F ./GENLIB/secno.c//
chmod u=rw,g=r,o=r ./GENLIB/secno.c
 
echo x - ./GENLIB/getsec.c
sed 's/^@//' > "./GENLIB/getsec.c" <<'@//E*O*F ./GENLIB/getsec.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	<stdio.h>
#include	"emp.h"

extern	FILE	*fdsec;

getsec(buf, n)
struct	sector	*buf;
int	n;
{
	if( fseek(fdsec, ((long)n)*sizeof(struct sector), 0) != 0 ) return(ERROR);
	if( fread(buf, sizeof(struct sector), 1, fdsec) != 1) return(ERROR);
}

putsec(buf, n)
struct	sector	*buf;
int	n;
{
	if( fseek(fdsec, ((long)n)*sizeof(struct sector), 0) != 0 ) return(ERROR);
	if( fwrite(buf, sizeof(struct sector), 1, fdsec) != 1 ) return(ERROR);
}
@//E*O*F ./GENLIB/getsec.c//
chmod u=rw,g=r,o=r ./GENLIB/getsec.c
 
echo x - ./GENLIB/getship.c
sed 's/^@//' > "./GENLIB/getship.c" <<'@//E*O*F ./GENLIB/getship.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	<stdio.h>
#include	"emp.h"
#include	"ship.h"

extern	FILE	*fdship;

getship(buf, num)
struct	shpstr	*buf;
int	num;
{
	if( fseek(fdship, ((long)num)*sizeof(struct shpstr), 0 ) != 0 ) return(ERROR);
	if( fread(buf, sizeof(struct shpstr), 1, fdship) != 1 ) return(ERROR);
	return(OK);
}

putship(buf, num)
struct	shpstr	*buf;
int	num;
{
	if( fseek(fdship, ((long)num)*sizeof(struct shpstr), 0 ) != 0 ) return(ERROR);
	if( fwrite(buf, sizeof(struct shpstr), 1, fdship) != 1 ) return(ERROR);
	return(OK);
}
@//E*O*F ./GENLIB/getship.c//
chmod u=rw,g=r,o=r ./GENLIB/getship.c
 
echo x - ./GENLIB/getopt.c
sed 's/^@//' > "./GENLIB/getopt.c" <<'@//E*O*F ./GENLIB/getopt.c//'
#include	<stdio.h>

int	optind = 1;
char	*optarg;

getopt(argc, argv, ostr)
int	argc;
char	**argv, *ostr;
{
	int c;
	char *cp, *strchr();

	if( optind >= argc ||
	   argv[optind][0] != '-' || argv[optind][1] == '\0' )
		return(EOF);
	c = argv[optind][1];
	if( (cp = strchr(ostr, c)) == NULL ) {
		optind++;
		return((int)'?');
	}
	if( *++cp == ':' ) {
		if( argv[optind][2] != '\0' ) {
			optarg = &argv[optind][2];
		} else if( ++optind >= argc ) {
			fprintf(stderr, "missing argument to %c option\n", c);
			return((int)'?');
		} else {
			optarg = argv[optind];
		}
	}
	optind++;
	return(c);
}
@//E*O*F ./GENLIB/getopt.c//
chmod u=rw,g=r,o=r ./GENLIB/getopt.c
 
echo x - ./GENLIB/4.2mkfile
sed 's/^@//' > "./GENLIB/4.2mkfile" <<'@//E*O*F ./GENLIB/4.2mkfile//'
CFLAGS=-c -O
HDRDIR=../hdrs
INSDIR=../_unix.O
LIB=$(INSDIR)/genlib.a
LIBSRC= \
	getopt.c \
	strchr.c \
	strspn.c \
	getsec.c \
	getship.c \
	secno.c

$(LIB)::        $(HDRDIR)/emp.h
	@touch getsec.c getship.c secno.c; # header change implies source change

$(LIB)::        $(HDRDIR)/ship.h
	@touch getship.c;       # header change implies source change

$(LIB)::        $(LIBSRC)
	$(CC) $(CFLAGS) -I$(HDRDIR) $?
	@ar r $(LIB) *.o
	@ranlib $(LIB);         # 4.2 archive needs table of contents
	@rm -f *.o
	@echo $(LIB) is now up to date

clean:

clobber:
	rm -f $(LIB)

@.PRECIOUS:      $(LIB)
@//E*O*F ./GENLIB/4.2mkfile//
chmod u=rw,g=r,o=r ./GENLIB/4.2mkfile
 
echo x - ./GENLIB/strchr.c
sed 's/^@//' > "./GENLIB/strchr.c" <<'@//E*O*F ./GENLIB/strchr.c//'
#include	<stdio.h>

char	*
strchr(s, c)
char	*s, c;
{
	register char	*p;

	for( p = s; *p != '\0'; p++ ) {
		if( *p == c ) return(p);
	}
	return((char *)NULL);
}
@//E*O*F ./GENLIB/strchr.c//
chmod u=rw,g=r,o=r ./GENLIB/strchr.c
 
echo x - ./GENLIB/strspn.c
sed 's/^@//' > "./GENLIB/strspn.c" <<'@//E*O*F ./GENLIB/strspn.c//'
strspn(s, cset)
char	*s;
char	*cset;
{
	char *s1, *s2;

	for( s1 = s; *s1 != '\0'; s1++ ) {
		for( s2 = cset; *s2 != '\0' && *s2 != *s1; s2++ )
			;
		if( *s2 == '\0' )
			break;
	}
	return(s1 - s);
}
@//E*O*F ./GENLIB/strspn.c//
chmod u=rw,g=r,o=r ./GENLIB/strspn.c
 
echo mkdir - ./TERMLIB
mkdir ./TERMLIB
chmod u=rwx,g=rx,o=rx ./TERMLIB
 
echo x - ./TERMLIB/termcap.c
sed 's/^@//' > "./TERMLIB/termcap.c" <<'@//E*O*F ./TERMLIB/termcap.c//'
/* Copyright (c) 1979 Regents of the University of California */
#define	BUFSIZ	1024
#define MAXHOP	32	/* max number of tc= indirections */

#include <ctype.h>
#include "uparm.h"
/*
 * termcap - routines for dealing with the terminal capability data base
 *
 * BUG:		Should use a "last" pointer in tbuf, so that searching
 *		for capabilities alphabetically would not be a n**2/2
 *		process when large numbers of capabilities are given.
 * Note:	If we add a last pointer now we will screw up the
 *		tc capability. We really should compile termcap.
 *
 * Essentially all the work here is scanning and decoding escapes
 * in string capabilities.  We don't use stdio because the editor
 * doesn't, and because living w/o it is not hard.
 */

static	char *tbuf;
static	int hopcount;	/* detect infinite loops in termcap, init 0 */
char	*tskip();
char	*tgetstr();
char	*tdecode();
char	*getenv();

/*
 * Get an entry for terminal name in buffer bp,
 * from the termcap file.  Parse is very rudimentary;
 * we just notice escaped newlines.
 */
tgetent(bp, name)
	char *bp, *name;
{
	register char *cp;
	register int c;
	register int i = 0, cnt = 0;
	char ibuf[BUFSIZ];
	char *cp2, *getenv(), *strcat();
	int tf;

	tbuf = bp;
	tf = 0;
#ifndef V6
       /*
	* Default/form file name for termcap.
	*
	*    Use, $TERMCAP,  else  $EXLIB/termcap,  else  TERMFILE.
	*/
	cp = getenv("TERMCAP");
	if ( !cp && (cp=getenv("EXLIB")) )
		cp = strcat( strcpy(ibuf,cp), "/termcap" );
	/*
	 * TERMCAP can have one of two things in it. It can be the
	 * name of a file to use instead of /etc/termcap. In this
	 * case it better start with a "/", or ".". Or it can be an entry to
	 * use so we don't have to read the file. In this case it
	 * has to already have the newlines crunched out.
	 */
	if (cp && *cp) {
		if ( (*cp!='/') && (*cp!='.') ){
  			cp2 = getenv("TERM");
  			if (cp2==(char *) 0 || strcmp(name,cp2)==0) {
				strcpy(bp,cp);
				return(tnchktc());
			} else {
				tf = open(E_TERMCAP, 0);
			}
		} else
			tf = open(cp, 0);
	}
	if (tf==0)
		tf = open(E_TERMCAP, 0);
#else
	tf = open(E_TERMCAP, 0);
#endif
	if (tf < 0)
		return (-1);
	for (;;) {
		cp = bp;
		for (;;) {
			if (i == cnt) {
				cnt = read(tf, ibuf, BUFSIZ);
				if (cnt <= 0) {
					close(tf);
					return (0);
				}
				i = 0;
			}
			c = ibuf[i++];
			if (c == '\n') {
				if (cp > bp && cp[-1] == '\\'){
					cp--;
					continue;
				}
				break;
			}
			if (cp >= bp+BUFSIZ) {
				write(2,"Termcap entry too long\n", 23);
				break;
			} else
				*cp++ = c;
		}
		*cp = 0;

		/*
		 * The real work for the match.
		 */
		if (tnamatch(name)) {
			close(tf);
			return(tnchktc());
		}
	}
}

/*
 * tnchktc: check the last entry, see if it's tc=xxx. If so,
 * recursively find xxx and append that entry (minus the names)
 * to take the place of the tc=xxx entry. This allows termcap
 * entries to say "like an HP2621 but doesn't turn on the labels".
 * Note that this works because of the left to right scan.
 */
tnchktc()
{
	register char *p, *q;
	char tcname[16];	/* name of similar terminal */
	char tcbuf[BUFSIZ];
	char *holdtbuf = tbuf;
	int l;

	p = tbuf + strlen(tbuf) - 2;	/* before the last colon */
	while (*--p != ':')
		if (p<tbuf) {
			write(2, "Bad termcap entry\n", 18);
			return (0);
		}
	p++;
	/* p now points to beginning of last field */
	if (p[0] != 't' || p[1] != 'c')
		return(1);
	strcpy(tcname,p+3);
	q = tcname;
	while (q && *q != ':')
		q++;
	*q = 0;
	if (++hopcount > MAXHOP) {
		write(2, "Infinite tc= loop\n", 18);
		return (0);
	}
	if (tgetent(tcbuf, tcname) != 1)
		return(0);
	for (q=tcbuf; *q != ':'; q++)
		;
	l = p - holdtbuf + strlen(q);
	if (l > BUFSIZ) {
		write(2, "Termcap entry too long\n", 23);
		q[BUFSIZ - (p-tbuf)] = 0;
	}
	strcpy(p, q+1);
	tbuf = holdtbuf;
	return(1);
}

/*
 * Tnamatch deals with name matching.  The first field of the termcap
 * entry is a sequence of names separated by |'s, so we compare
 * against each such name.  The normal : terminator after the last
 * name (before the first field) stops us.
 */
tnamatch(np)
	char *np;
{
	register char *Np, *Bp;

	Bp = tbuf;
	if (*Bp == '#')
		return(0);
	for (;;) {
		for (Np = np; *Np && *Bp == *Np; Bp++, Np++)
			continue;
		if (*Np == 0 && (*Bp == '|' || *Bp == ':' || *Bp == 0))
			return (1);
		while (*Bp && *Bp != ':' && *Bp != '|')
			Bp++;
		if (*Bp == 0 || *Bp == ':')
			return (0);
		Bp++;
	}
}

/*
 * Skip to the next field.  Notice that this is very dumb, not
 * knowing about \: escapes or any such.  If necessary, :'s can be put
 * into the termcap file in octal.
 */
static char *
tskip(bp)
	register char *bp;
{

	while (*bp && *bp != ':')
		bp++;
	if (*bp == ':')
		bp++;
	return (bp);
}

/*
 * Return the (numeric) option id.
 * Numeric options look like
 *	li#80
 * i.e. the option string is separated from the numeric value by
 * a # character.  If the option is not found we return -1.
 * Note that we handle octal numbers beginning with 0.
 */
tgetnum(id)
	char *id;
{
	register int i, base;
	register char *bp = tbuf;

	for (;;) {
		bp = tskip(bp);
		if (*bp == 0)
			return (-1);
		if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
			continue;
		if (*bp == '@')
			return(-1);
		if (*bp != '#')
			continue;
		bp++;
		base = 10;
		if (*bp == '0')
			base = 8;
		i = 0;
		while (isdigit(*bp))
			i *= base, i += *bp++ - '0';
		return (i);
	}
}

/*
 * Handle a flag option.
 * Flag options are given "naked", i.e. followed by a : or the end
 * of the buffer.  Return 1 if we find the option, or 0 if it is
 * not given.
 */
tgetflag(id)
	char *id;
{
	register char *bp = tbuf;

	for (;;) {
		bp = tskip(bp);
		if (!*bp)
			return (0);
		if (*bp++ == id[0] && *bp != 0 && *bp++ == id[1]) {
			if (!*bp || *bp == ':')
				return (1);
			else if (*bp == '@')
				return(0);
		}
	}
}

/*
 * Get a string valued option.
 * These are given as
 *	cl=^Z
 * Much decoding is done on the strings, and the strings are
 * placed in area, which is a ref parameter which is updated.
 * No checking on area overflow.
 */
char *
tgetstr(id, area)
	char *id, **area;
{
	register char *bp = tbuf;

	for (;;) {
		bp = tskip(bp);
		if (!*bp)
			return (0);
		if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
			continue;
		if (*bp == '@')
			return(0);
		if (*bp != '=')
			continue;
		bp++;
		return (tdecode(bp, area));
	}
}

/*
 * Tdecode does the grung work to decode the
 * string capability escapes.
 */
static char *
tdecode(str, area)
	register char *str;
	char **area;
{
	register char *cp;
	register int c;
	register char *dp;
	int i;

	cp = *area;
	while ((c = *str++) && c != ':') {
		switch (c) {

		case '^':
			c = *str++ & 037;
			break;

		case '\\':
			dp = "E\033^^\\\\::n\nr\rt\tb\bf\f";
			c = *str++;
nextc:
			if (*dp++ == c) {
				c = *dp++;
				break;
			}
			dp++;
			if (*dp)
				goto nextc;
			if (isdigit(c)) {
				c -= '0', i = 2;
				do
					c <<= 3, c |= *str++ - '0';
				while (--i && isdigit(*str));
			}
			break;
		}
		*cp++ = c;
	}
	*cp++ = 0;
	str = *area;
	*area = cp;
	return (str);
}
@//E*O*F ./TERMLIB/termcap.c//
chmod u=rw,g=r,o=r ./TERMLIB/termcap.c
 
echo x - ./TERMLIB/tgoto.c
sed 's/^@//' > "./TERMLIB/tgoto.c" <<'@//E*O*F ./TERMLIB/tgoto.c//'
/* Copyright (c) 1979 Regents of the University of California */
#define	CTRL(c)	('c' & 037)

char	*UP;
char	*BC;

/*
 * Routine to perform cursor addressing.
 * CM is a string containing printf type escapes to allow
 * cursor addressing.  We start out ready to print the destination
 * line, and switch each time we print row or column.
 * The following escapes are defined for substituting row/column:
 *
 *	%d	as in printf
 *	%2	like %2d
 *	%3	like %3d
 *	%.	gives %c hacking special case characters
 *	%+x	like %c but adding x first
 *
 *	The codes below affect the state but don't use up a value.
 *
 *	%>xy	if value > x add y
 *	%r	reverses row/column
 *	%i	increments row/column (for one origin indexing)
 *	%%	gives %
 *	%B	BCD (2 decimal digits encoded in one byte)
 *	%D	Delta Data (backwards bcd)
 *
 * all other characters are ``self-inserting''.
 */
char *
tgoto(CM, destcol, destline)
	char *CM;
	int destcol, destline;
{
	static char result[16];
	static char added[10];
	char *cp = CM;
	register char *dp = result;
	register int c;
	int oncol = 0;
	register int which = destline;

	if (cp == 0) {
toohard:
		/*
		 * ``We don't do that under BOZO's big top''
		 */
		return ("OOPS");
	}
	added[0] = 0;
	while (c = *cp++) {
		if (c != '%') {
			*dp++ = c;
			continue;
		}
		switch (c = *cp++) {

#ifdef CM_N
		case 'n':
			destcol ^= 0140;
			destline ^= 0140;
			goto setwhich;
#endif

		case 'd':
			if (which < 10)
				goto one;
			if (which < 100)
				goto two;
			/* fall into... */

		case '3':
			*dp++ = (which / 100) | '0';
			which %= 100;
			/* fall into... */

		case '2':
two:	
			*dp++ = which / 10 | '0';
one:
			*dp++ = which % 10 | '0';
swap:
			oncol = 1 - oncol;
setwhich:
			which = oncol ? destcol : destline;
			continue;

#ifdef CM_GT
		case '>':
			if (which > *cp++)
				which += *cp++;
			else
				cp++;
			continue;
#endif

		case '+':
			which += *cp++;
			/* fall into... */

		case '.':
casedot:
			/*
			 * This code is worth scratching your head at for a
			 * while.  The idea is that various weird things can
			 * happen to nulls, EOT's, tabs, and newlines by the
			 * tty driver, arpanet, and so on, so we don't send
			 * them if we can help it.
			 *
			 * Tab is taken out to get Ann Arbors to work, otherwise
			 * when they go to column 9 we increment which is wrong
			 * because bcd isn't continuous.  We should take out
			 * the rest too, or run the thing through more than
			 * once until it doesn't make any of these, but that
			 * would make termlib (and hence pdp-11 ex) bigger,
			 * and also somewhat slower.  This requires all
			 * programs which use termlib to stty tabs so they
			 * don't get expanded.  They should do this anyway
			 * because some terminals use ^I for other things,
			 * like nondestructive space.
			 */
			if (which == 0 || which == CTRL(d) || which == '\t' || which == '\n') {
				if (oncol || UP) /* Assumption: backspace works */
					/*
					 * Loop needed because newline happens
					 * to be the successor of tab.
					 */
					do {
						strcat(added, oncol ? (BC ? BC : "\b") : UP);
						which++;
					} while (which == '\n');
			}
			*dp++ = which;
			goto swap;

		case 'r':
			oncol = 1;
			goto setwhich;

		case 'i':
			destcol++;
			destline++;
			which++;
			continue;

		case '%':
			*dp++ = c;
			continue;

#ifdef CM_B
		case 'B':
			which = (which/10 << 4) + which%10;
			continue;
#endif

#ifdef CM_D
		case 'D':
			which = which - 2 * (which%16);
			continue;
#endif

		default:
			goto toohard;
		}
	}
	strcpy(dp, added);
	return (result);
}
@//E*O*F ./TERMLIB/tgoto.c//
chmod u=rw,g=r,o=r ./TERMLIB/tgoto.c
 
echo x - ./TERMLIB/tputs.c
sed 's/^@//' > "./TERMLIB/tputs.c" <<'@//E*O*F ./TERMLIB/tputs.c//'
/* Copyright (c) 1979 Regents of the University of California */
#include <sgtty.h>
#include <ctype.h>

/*
 * The following array gives the number of tens of milliseconds per
 * character for each speed as returned by gtty.  Thus since 300
 * baud returns a 7, there are 33.3 milliseconds per char at 300 baud.
 */
static
short	tmspc10[] = {
	0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10
};

short	ospeed;
char	PC;

/*
 * Put the character string cp out, with padding.
 * The number of affected lines is affcnt, and the routine
 * used to output one character is outc.
 */
tputs(cp, affcnt, outc)
	register char *cp;
	int affcnt;
	int (*outc)();
{
	register int i = 0;
	register int mspc10;

	if (cp == 0)
		return;

	/*
	 * Convert the number representing the delay.
	 */
	if (isdigit(*cp)) {
		do
			i = i * 10 + *cp++ - '0';
		while (isdigit(*cp));
	}
	i *= 10;
	if (*cp == '.') {
		cp++;
		if (isdigit(*cp))
			i += *cp - '0';
		/*
		 * Only one digit to the right of the decimal point.
		 */
		while (isdigit(*cp))
			cp++;
	}

	/*
	 * If the delay is followed by a `*', then
	 * multiply by the affected lines count.
	 */
	if (*cp == '*')
		cp++, i *= affcnt;

	/*
	 * The guts of the string.
	 */
	while (*cp)
		(*outc)(*cp++);

	/*
	 * If no delay needed, or output speed is
	 * not comprehensible, then don't try to delay.
	 */
	if (i == 0)
		return;
	if (ospeed <= 0 || ospeed >= (sizeof tmspc10 / sizeof tmspc10[0]))
		return;

	/*
	 * Round up by a half a character frame,
	 * and then do the delay.
	 * Too bad there are no user program accessible programmed delays.
	 * Transmitting pad characters slows many
	 * terminals down and also loads the system.
	 */
	mspc10 = tmspc10[ospeed];
	i += mspc10 / 2;
	for (i /= mspc10; i > 0; i--)
		(*outc)(PC);
}
@//E*O*F ./TERMLIB/tputs.c//
chmod u=rw,g=r,o=r ./TERMLIB/tputs.c
 
echo x - ./TERMLIB/Makefile
sed 's/^@//' > "./TERMLIB/Makefile" <<'@//E*O*F ./TERMLIB/Makefile//'
CFLAGS= -c -O -DCM_N -DCM_GT -DCM_B -DCM_D
HDRDIR =./hdrs
INSDIR=../_unix.O
LIB=$(INSDIR)/termlib.a
HDRDEP=$(LIB)(termcap.o)

$(LIB): \
	$(LIB)(termcap.o) \
	$(LIB)(tgoto.o) \
	$(LIB)(tputs.o)
	$(CC) $(CFLAGS) -I$(HDRDIR) $(?:.o=.c)
	@ar r $(LIB) *.o
	@rm -f *.o
	@echo $@ is now up to date
@.c.a:;

$(HDRDEP):	$(HDRDIR)/uparm.h

clean:

clobber:
	rm -f $(LIB)

@.PRECIOUS:	$(LIB)

@//E*O*F ./TERMLIB/Makefile//
chmod u=rw,g=r,o=r ./TERMLIB/Makefile
 
echo mkdir - ./TERMLIB/hdrs
mkdir ./TERMLIB/hdrs
chmod u=rwx,g=rx,o=rx ./TERMLIB/hdrs
 
echo x - ./TERMLIB/hdrs/uparm.h
sed 's/^@//' > "./TERMLIB/hdrs/uparm.h" <<'@//E*O*F ./TERMLIB/hdrs/uparm.h//'
extern char *libpath();

#define loclibpath(file) "/usr/local/lib/file"
#define binpath(file)    "/usr/ucb/file"
#define usrpath(file)    "/usr/file"
#define LIBPATH          "/usr/lib"
#define E_TERMCAP	 "/etc/termcap"
#define B_CSH		 "/bin/csh"
@//E*O*F ./TERMLIB/hdrs/uparm.h//
chmod u=rw,g=r,o=r ./TERMLIB/hdrs/uparm.h
 
echo x - ./TERMLIB/4.2mkfile
sed 's/^@//' > "./TERMLIB/4.2mkfile" <<'@//E*O*F ./TERMLIB/4.2mkfile//'
CFLAGS=-c -O
HDRDIR=./hdrs
INSDIR=../_unix.O
LIB=$(INSDIR)/termlib.a
LIBSRC= \
	termcap.c \
	tgoto.c \
	tputs.c

$(LIB)::        $(HDRDIR)/uparm.h
	@touch termcap.c;       # header change implies source change

$(LIB)::        $(LIBSRC)
	$(CC) $(CFLAGS) -I$(HDRDIR) $?
	@ar r $(LIB) *.o
	@ranlib $(LIB);         # 4.2 archive needs table of contents
	@rm -f *.o
	@echo $(LIB) is now up to date

clean:

clobber:
	rm -f $(LIB)

@.PRECIOUS:      $(LIB)
@//E*O*F ./TERMLIB/4.2mkfile//
chmod u=rw,g=r,o=r ./TERMLIB/4.2mkfile
 
echo mkdir - ./UPDLIB
mkdir ./UPDLIB
chmod u=rwx,g=rx,o=rx ./UPDLIB
 
echo x - ./UPDLIB/Makefile
sed 's/^@//' > "./UPDLIB/Makefile" <<'@//E*O*F ./UPDLIB/Makefile//'
CFLAGS= -c -O
HDRDIR =../hdrs
INSDIR=../_unix.O
LIB=$(INSDIR)/updlib.a
HDRDEP= \
	$(LIB)(docen.o) \
	$(LIB)(domap.o) \
	$(LIB)(dorad.o) \
	$(LIB)(dospy.o)

$(LIB): \
	$(LIB)(docen.o) \
	$(LIB)(domap.o) \
	$(LIB)(dorad.o) \
	$(LIB)(dospy.o)
	$(CC) $(CFLAGS) -I$(HDRDIR) $(?:.o=.c)
	@ar r $(LIB) *.o
	@rm -f *.o
	@echo $@ is now up to date
@.c.a:;

$(HDRDEP):	$(HDRDIR)/emp.h

clean:

clobber:
	rm -f $(LIB)

@.PRECIOUS:	$(LIB)

@//E*O*F ./UPDLIB/Makefile//
chmod u=rw,g=r,o=r ./UPDLIB/Makefile
 
echo x - ./UPDLIB/docen.c
sed 's/^@//' > "./UPDLIB/docen.c" <<'@//E*O*F ./UPDLIB/docen.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	<stdio.h>
#include	"emp.h"

char	Stype[] = { 'p', 'm', 'd', 's', 'f', 't', 'b', 'c' };
extern	struct	sector	s;

docen(line)
char	*line;
{
		int	x, y, n;

		if( sscanf(line," %d,%d ", &x, &y) != 2 ) {
			fprintf(stderr,"empupd: bad x,y\n");
			return(ERROR);
		}
                if( getsec(&s, (n = secno(x,y))) == ERROR ) { 
			fprintf(stderr,"getsec: ERROR\n");
			return(ERROR);
		}
		s.s_coun = 0;
		s.s_ckpt = line[7];
		setdel( line[8], &s.s_del[0] );
                setdel( line[9], &s.s_del[1] );
                setdel( line[10], &s.s_del[2] );
                setdel( line[11], &s.s_del[3] );
                setdel( line[12], &s.s_del[4] );
                setdel( line[13], &s.s_del[5] );
                setdel( line[14], &s.s_del[6] );
		s.s_def  = line[15]; 
		s.s_des  = line[17]; 
		sscanf(&line[18],"%d%*c %d %d %d %d %d %d %d %d %d %d %d",
		&s.s_eff, &s.s_min, &s.s_gold, &s.s_mob,
		&s.s_rsrc[0], &s.s_rsrc[1], &s.s_rsrc[2], &s.s_rsrc[3],
		&s.s_rsrc[4], &s.s_rsrc[5], &s.s_rsrc[6], &s.s_prod);
		if( putsec(&s, n) == ERROR ) {
			printf(stderr,"putsec: ERROR\n");
			return(ERROR);
		}
}

setdel( dchar, sdel )
char	dchar, *sdel;
{
	*sdel &= 0360;
	switch( dchar ) {
	case '.':
		break;
	case '$':
		*sdel |= 01;
		break;
	default:
		*sdel |= ((dchar - '0')&017) | 010;
		break;
	}
}
@//E*O*F ./UPDLIB/docen.c//
chmod u=rw,g=r,o=r ./UPDLIB/docen.c
 
echo x - ./UPDLIB/domap.c
sed 's/^@//' > "./UPDLIB/domap.c" <<'@//E*O*F ./UPDLIB/domap.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	"emp.h"

extern	struct	sector	s;

domap(mapx, y, col, mapchar)
int	mapx, y, col;
char	mapchar;
{
	int	x, n;

	x = (col - 6)/2 + mapx;
	getsec(&s, (n = secno(x, y)));
	if( mapchar == '?' ) {
		if( s.s_des == ' ' || s.s_des == '\0' ) s.s_des = '?';
		if( s.s_coun == 0 ) s.s_coun = 98;
	} else {
		s.s_des = mapchar;
	}
	putsec(&s, n);
}
@//E*O*F ./UPDLIB/domap.c//
chmod u=rw,g=r,o=r ./UPDLIB/domap.c
 
echo x - ./UPDLIB/dorad.c
sed 's/^@//' > "./UPDLIB/dorad.c" <<'@//E*O*F ./UPDLIB/dorad.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	<stdio.h>
#include	"emp.h"

char	Rscan[MAXSCN][2*MAXSCN]; 
char    Raddes[] = "-.^cudg*ihamwtfr+#)=!bxs?"; 
int	Nrows = 0;
int	Xrad, Yrad, Rngrad;
extern	struct	sector	s;
extern	FILE	*fdsec;

dorad()
{

	int	i, j, lcol, rcol, trow, brow;
	int	cencol, cenrow;
	int	row, col, n, x, y;
	char	c;

	cencol = cenrow = 0;
	for( i=0; i<Nrows; i++ ) {
		lcol = rcol = -1;
		for( j=0; j<MAXSCN*2; j += 2 ) {
			if( Rscan[i][j] != ' ' && Rscan[i][j] != '\0' ) break;
		}
		if( j < MAXSCN*2 ) {
			if( strspn(&Rscan[i][j], Raddes) == 1 ) lcol=j;
		}
		for( j=MAXSCN*2 - 2; j>=0; j -= 2 ) {
			if( Rscan[i][j] != ' ' && Rscan[i][j] != '\0' ) break;
		}
		if( j >= 0 ) {
			if( strspn(&Rscan[i][j], Raddes) == 1 ) rcol=j;
		}
		if( lcol >= 0 && rcol > 0 ) {
			if( ((rcol - lcol)%4) == 0 ) {
				cencol = (rcol - lcol)/2 + lcol;
				break;
			}
		}
	}
	if( cencol == 0 ) {
		Nrows = 0;
		return;
	}
	for( i=0; i<MAXSCN*2; i += 2 ) {
		trow = brow = -1;
		for( j=0; j<Nrows; j++ ) {
			if( Rscan[j][i] != ' ' && Rscan[j][i] != '\0' ) break;
		}
		if( j < Nrows ) {
			if( strspn(&Rscan[j][i], Raddes) == 1 ) trow=j;
		}
		for( j=Nrows-1; j>=0; j-- ) {
			if( Rscan[j][i] != ' ' && Rscan[j][i] != '\0' ) break;
		}
		if( j >= 0 ) {
			if( strspn(&Rscan[j][i], Raddes) == 1 ) brow=j;
		}
		if( trow >= 0 && brow > 0 ) {
			if( ((brow - trow)%2) == 0 ) {
				cenrow = (brow - trow)/2 + trow;
				break;
			}
		}
	}
	if( cenrow == 0 ) {
		Nrows = 0;
		return;
	}
	if( (cenrow-Rngrad+1) < 0 || (cenrow+Rngrad-1) >= Nrows ||
	    (cencol-2*Rngrad+2) < 0 || (cencol+2*Rngrad-2) >= 2*MAXSCN ) {
		Nrows = 0;
		return;
	}
	y = Yrad - Rngrad;
	for( row=cenrow-Rngrad; row<=cenrow+Rngrad; row++ ) {
		x = Xrad - Rngrad;
		for( col=cencol-2*Rngrad; col<=cencol+2*Rngrad; col += 2) {
			if( strspn(&Rscan[row][col], Raddes) == 1 ) {
				getsec( &s, (n = secno(x, y)) );
				c = Rscan[row][col];
				if( c == '?' ) {
					if( s.s_coun == 0 ) s.s_coun = 98;
					if( s.s_des == ' ' ) s.s_des = '?';
				} else {
					s.s_des = c;
				}
				putsec( &s, n );
			}
			x++;
		}
		y++;
	}
	Nrows = 0;
}
@//E*O*F ./UPDLIB/dorad.c//
chmod u=rw,g=r,o=r ./UPDLIB/dorad.c
 
echo x - ./UPDLIB/dospy.c
sed 's/^@//' > "./UPDLIB/dospy.c" <<'@//E*O*F ./UPDLIB/dospy.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	"emp.h"

extern	struct 	sector	s;

dospy(line)
char	*line;
{
	int	x, y, n;

	if( sscanf(line," %d,%d", &x, &y ) != 2 ) return;
	getsec( &s, (n = secno(x,y)) );
	if( sscanf(&line[7]," %d %*c %d%% %d %d %d %d %d %d",
		&s.s_coun,
		&s.s_eff,
		&s.s_rsrc[CIV],		&s.s_rsrc[MIL],
		&s.s_rsrc[SHL],		&s.s_rsrc[GUN],
		&s.s_rsrc[ORE],		&s.s_rsrc[PLN] ) != 8 ) return;
	s.s_des = line[11];
	s.s_eff *= 2;
	s.s_rsrc[CIV] *= 2;
	s.s_rsrc[MIL] *= 2;
	s.s_rsrc[SHL] *= 2;
	s.s_rsrc[GUN] *= 2;
	s.s_rsrc[PLN] *= 2;
	s.s_rsrc[ORE] *= 2;
	putsec( &s, n );
}
@//E*O*F ./UPDLIB/dospy.c//
chmod u=rw,g=r,o=r ./UPDLIB/dospy.c
 
echo x - ./UPDLIB/4.2mkfile
sed 's/^@//' > "./UPDLIB/4.2mkfile" <<'@//E*O*F ./UPDLIB/4.2mkfile//'
CFLAGS=-c -O
HDRDIR=../hdrs
INSDIR=../_unix.O
LIB=$(INSDIR)/updlib.a
LIBSRC= \
	dospy.c \
	domap.c \
	docen.c \
	dorad.c

$(LIB)::        $(HDRDIR)/emp.h
	@touch $(LIBSRC);       # header change implies source change

$(LIB)::        $(LIBSRC)
	$(CC) $(CFLAGS) -I$(HDRDIR) $?
	@ar r $(LIB) *.o
	@ranlib $(LIB);         # 4.2 archive needs table of contents
	@rm -f *.o
	@echo $(LIB) is now up to date

clean:

clobber:
	rm -f $(LIB)

@.PRECIOUS:      $(LIB)
@//E*O*F ./UPDLIB/4.2mkfile//
chmod u=rw,g=r,o=r ./UPDLIB/4.2mkfile
 
echo mkdir - ./MISC
mkdir ./MISC
chmod u=rwx,g=rx,o=rx ./MISC
 
echo x - ./MISC/clust.sh
sed 's/^@//' > "./MISC/clust.sh" <<'@//E*O*F ./MISC/clust.sh//'
# clust - shell/awk program to show where ships are clustered
#	input:	output of rdship command
#	output:	sorted list of coordinates and number of ships at that location
#		1	4,3
#		4	-5,-16
#		23	10,-2
#		..	..
#	usage: rdship [-c cno] [| optional_filter] | clust

awk '
$2 ~ /pt/	{
		if( x[$4] == 0 ) x[n++] = $4;
		x[$4]++;
		next;
		}
	{
		if( x[$3] == 0 ) x[n++] = $3;
		x[$3]++;
	}
END	{
		for( i=0; i<n; i++ ) {
			printf "%3d\t%s\n", x[x[i]], x[i];
		}
	}
' | sort -n
@//E*O*F ./MISC/clust.sh//
chmod u=rwx,g=rx,o=rx ./MISC/clust.sh
 
echo x - ./MISC/Makefile
sed 's/^@//' > "./MISC/Makefile" <<'@//E*O*F ./MISC/Makefile//'
INSDIR=..
LIBDIR=../_unix.O
GENLIB=$(LIBDIR)/genlib.a
HDRDIR=../hdrs
CFLAGS= -c -O

all:	pworld rdship
	
pworld:	$(INSDIR)/pworld

$(INSDIR)/pworld:	_unix.O/pworld.o $(GENLIB)
	$(CC) -o $(INSDIR)/pworld _unix.O/pworld.o $(GENLIB)

_unix.O/pworld.o:	pworld.c $(HDRDIR)/emp.h 
	$(CC) $(CFLAGS) -I$(HDRDIR) pworld.c
	@mv pworld.o _unix.O/pworld.o

rdship:	$(INSDIR)/rdship

$(INSDIR)/rdship:	_unix.O/rdship.o $(GENLIB)
	$(CC) -o $(INSDIR)/rdship _unix.O/rdship.o $(GENLIB)

_unix.O/rdship.o:	rdship.c $(HDRDIR)/ship.h 
	$(CC) $(CFLAGS) -I$(HDRDIR) rdship.c
	@mv rdship.o _unix.O/rdship.o

clean:
	rm -f _unix.O/*.o

clobber:	clean
	rm -f $(INSDIR)/pworld $(INSDIR)/rdship

FRC:
@//E*O*F ./MISC/Makefile//
chmod u=rw,g=r,o=r ./MISC/Makefile
 
echo mkdir - ./MISC/_unix.O
mkdir ./MISC/_unix.O
chmod u=rwx,g=rx,o=rx ./MISC/_unix.O
 
echo x - ./MISC/_unix.O/pworld.o
sed 's/^@//' > "./MISC/_unix.O/pworld.o" <<'@//E*O*F ./MISC/_unix.O/pworld.o//'
@//E*O*F ./MISC/_unix.O/pworld.o//
chmod u=rw,g=r,o=r ./MISC/_unix.O/pworld.o
 
echo x - ./MISC/nomine.sh
sed 's/^@//' > "./MISC/nomine.sh" <<'@//E*O*F ./MISC/nomine.sh//'
# nomine - shell program to clear a mine
#	Use this when you're sure all the mines have been cleared

#	usage: nomine x,y

(
echo "[0:0] Command :"
echo "  sect  cmsgpob des eff min gold mob  civ mil   sh  gun  pl  ore bar prod"
SECT=`expr "   $1   " : ".*\(...,...\).*"`
echo "$SECT .......  .   0%   0    0   0    0   0    0    0   0    0   0   0"
echo "    1 sectors"
) | eupd
@//E*O*F ./MISC/nomine.sh//
chmod u=rwx,g=rx,o=rx ./MISC/nomine.sh
 
echo x - ./MISC/pworld.c
sed 's/^@//' > "./MISC/pworld.c" <<'@//E*O*F ./MISC/pworld.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	"emp.h"
#include	<stdio.h>

FILE	*fdsec, *fdship;

main()
{
	struct	sector	sect;
	int	i, j;

	if( (fdsec = fopen("empsect", "r")) == NULL ) {
		fprintf(stderr, "Can't open empsect file\n");
		exit(1);
	}
	putchar('\n');
	for( j = -32; j <= 31; j++ ) {
		for( i = -32; i <= 31; i++ ) {
			getsec(&sect, secno(i, j));
			putchar(sect.s_des);
			putchar(' ');
		}
		putchar('\n');
	}
}
@//E*O*F ./MISC/pworld.c//
chmod u=rw,g=r,o=r ./MISC/pworld.c
 
echo x - ./MISC/pl.sh
sed 's/^@//' > "./MISC/pl.sh" <<'@//E*O*F ./MISC/pl.sh//'
# pl - shell program to enter empire, save output, provide minimal security

#	usage: pl [ > /dev/null ]

trap "chmod 700 .;mv .yout .oyout" 1 2 3 9 15
chmod 711 .			# open up read access for empire
empire Cname rep | tee eout	# execute the script (.yout)
chmod 700 .			# prevent access by snoopy adversaries
mv .yout .oyout			# save script in case it's needed
@//E*O*F ./MISC/pl.sh//
chmod u=rwx,g=rx,o=rx ./MISC/pl.sh
 
echo x - ./MISC/rdship.c
sed 's/^@//' > "./MISC/rdship.c" <<'@//E*O*F ./MISC/rdship.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	<stdio.h>
#include	"emp.h"
#include	"ship.h"

FILE	*fopen(), *fdshp, *fdnshp;
struct	shpstr	Ship;

char	*Stype[] =	{
			"pt boat", "minesweep", "destroyer", "submarine",
			"freighter", "tender", "battleship", "carrier" };

main(argc, argv)
int	argc;
char	**argv;
{

	short	n, shipnum;
	short	mbl;
	char	*getenv(), *foestr;
	int	c;
	short	errflg;
	short	cflg, cno;
	short	relocflg, newx, newy;
	char	*fname;
	extern	char	*optarg;

	newx = newy = cflg = 0;
	fname = NULL;
	while( (c = getopt(argc, argv, "c:x:y:f:")) != EOF ) {
		switch( c ) {
		case 'c':
			cno = atoi(optarg);
			cflg++;
			break;
		case 'x':
			newx = atoi(optarg);
			break;
		case 'y':
			newy = atoi(optarg);
			break;
		case 'f':
			fname = optarg;
			break;
		case '?':
			errflg++;
			break;
		}
	}
	if( errflg ) {
		printf("Usage: %s [-c country_no] [-x newx] [-y newy]\n",
			argv[0]);
		exit(1);
	}
	if( newx || newy ) {
		relocflg++;
		if( (fdnshp = fopen("newship","w")) == NULL ) {
			fprintf(stderr,"Can't create newship file\n");
			exit(2);
		}
	}
	if( fname == NULL ) fname = "empship";
	if( (fdshp = fopen(fname, "r")) == NULL ) {
		fprintf(stderr, "Can't access %s file\n", fname);
		exit(3);
	}
	if( cno == 0 ) {
		foestr = getenv("FOES");
		if( foestr == NULL ) {
			cno = 0;
		} else {
			cno = atoi(foestr);
	}
	}
	shipnum = -1;
	while( (n=fread(&Ship, sizeof(struct shpstr), 1, fdshp)) == 1 ) { 
		shipnum++;
		if( !relocflg && Ship.shp_own != cno ) continue;
		if( Ship.shp_effc < 20 ) continue;
		if( relocflg ) {
			Ship.shp_xp -= newx;
			Ship.shp_yp -= newy;
		}
		Ship.shp_xp = Ship.shp_xp % XYMAX;
		if( Ship.shp_xp > XYMAX/2 ) Ship.shp_xp -= XYMAX;
		Ship.shp_yp = Ship.shp_yp % XYMAX;
		if( Ship.shp_yp > XYMAX/2 ) Ship.shp_yp -= XYMAX;
		if( relocflg ) {
			fwrite(&Ship, sizeof(struct shpstr), 1, fdnshp);
		} else {
			if( (mbl = Ship.shp_mbl) > 127 ) mbl -= 256;
        		printf("%4d %-11s%3d,%-3d%6d%%%4d%4d%4d%4d%4d%4d%4d\n",
				shipnum,
				Stype[(int)Ship.shp_type],
				Ship.shp_xp,	Ship.shp_yp,
				(int)Ship.shp_effc,
				(int)Ship.shp_crew,
				(int)Ship.shp_shels, (int)Ship.shp_gun,
				(int)Ship.shp_plns, (int)Ship.shp_or,
				(int)Ship.shp_gld,  mbl);
		}
	}
	if( relocflg ) fclose(fdnshp);
}
@//E*O*F ./MISC/rdship.c//
chmod u=rw,g=r,o=r ./MISC/rdship.c
 
echo x - ./MISC/mine.sh
sed 's/^@//' > "./MISC/mine.sh" <<'@//E*O*F ./MISC/mine.sh//'
# mine - shell program to drop a mine (shell) in sea sector
#	Use this whenever one (or more!) of your ships
#	"detects" one of the little cuties

#	usage:	mine x,y

(
echo "[0:0] Command :"
echo "  sect  cmsgpob des eff min gold mob  civ mil   sh  gun  pl  ore bar prod"
SECT=`expr "   $1   " : ".*\(...,...\).*"`
echo "$SECT .......  .   0%   0    0   0    0   0    1    0   0    0   0   0"
echo "    1 sectors"
) | eupd
@//E*O*F ./MISC/mine.sh//
chmod u=rwx,g=rx,o=rx ./MISC/mine.sh
 
echo x - ./MISC/sink.sh
sed 's/^@//' > "./MISC/sink.sh" <<'@//E*O*F ./MISC/sink.sh//'
#	sink - shell program to remove ships from ship file
#		usage: sink [shipno ...]
(
echo "[0:0] Command :"
for i
do
SHIP=`expr "    $i" : ".*\(....\)"`
echo "$SHIP battleship   0,0       0%   0   0   0   0   0   0   0"
done
) | eupd
@//E*O*F ./MISC/sink.sh//
chmod u=rwx,g=rx,o=rx ./MISC/sink.sh
 
echo x - ./MISC/makeloo.sh
sed 's/^@//' > "./MISC/makeloo.sh" <<'@//E*O*F ./MISC/makeloo.sh//'
# makeloo - shell/awk program to generate a script of loo commands that
#	is a comprehensive coverage of everything the ships given as 
#	input can see.  Try to get a B and D in each sector (for 
#	range and sonar).  If neither B nor D is in a sector then use 
#	a S if present, and also one of the following: C, P, T, F, M if
#	present.
#	Creates a file called "looall" in current directory.  Use empire
#	"ex" command to execute the script (ex looall).

#	usage: makeloo

trap "rm -f /usr/tmp/ml.$$ /usr/tmp/ml.$$.q" 1 2 3 9 15
rm -f /usr/tmp/ml.$$ /usr/tmp/ml.$$.q
umask 077
rdship > /usr/tmp/ml.$$
echo rdship done

# Set up for awk:
# Save only ship no., type, and coord
# Change pt boat to pt_boat
# Change comma between x and y coord to space
sed  -e "s/ *[^ ]*%.*//" -e "s/pt b/pt_b/" -e "s/,/ /" < /usr/tmp/ml.$$ > /usr/tmp/ml.$$.q
echo sed done

# Sort by coordinate
sort -n -o /usr/tmp/ml.$$ +2 -3 +3 -4 /usr/tmp/ml.$$.q
echo sort done

umask 022
awk '
	{
		coord = $3 "," $4;
		if( x[coord] == 0 ) x[n++] = coord;
		x[coord]++;
		if( $2 == "pt_boat"   ) p[coord] = $1;
		if( $2 == "minesweep" ) m[coord] = $1;
		if( $2 == "destroyer" ) d[coord] = $1;
		if( $2 == "submarine" ) s[coord] = $1;
		if( $2 == "freighter" ) f[coord] = $1;
		if( $2 == "tender"    ) t[coord] = $1;
		if( $2 == "battleship") b[coord] = $1;
		if( $2 == "carrier"   ) c[coord] = $1;
	}
END	{
		ships = 0;
		loostr = "loo ";
		for( i=0; i<n; i++ ) {
			coord = x[i];
			batt = "";
			if( b[coord] != "" ) batt = b[coord];
			dest = "";
			if( d[coord] != "" ) dest = d[coord];
			sub = "";
			if( batt == "" && dest == "" ) {
				if( s[coord] != "" ) {
					sub = s[coord];
				}
			}
			other = "";
			if( batt == "" && dest == "" ) {
				if( c[coord] != "" )
					other = c[coord];
				else if( p[coord] != "" )
					other = p[coord];
				else if( t[coord] != "" )
					other = t[coord];
				else if( f[coord] != "" )
					other = f[coord];
				else if( m[coord] != "" )
					other = m[coord];
			}
			if( batt != "" ) {
				loostr = loostr batt "/";
				ships++;
			}
			if( dest != "" ) {
				loostr = loostr dest "/";
				ships++;
			}
			if( sub != "" ) {
				loostr = loostr sub "/";
				ships++;
			}
			if( other != "" ) {
				loostr = loostr other "/";
				ships++;
			}
			if( ships < 12 ) continue;
			print substr(loostr,1,length(loostr)-1);
			ships = 0;
			loostr = "loo ";
		}
		if( ships > 0 ) print substr(loostr,1,length(loostr)-1);
	}
' /usr/tmp/ml.$$ > looall
rm -f /usr/tmp/ml.$$ /usr/tmp/ml.$$.q
@//E*O*F ./MISC/makeloo.sh//
chmod u=rwx,g=rx,o=rx ./MISC/makeloo.sh
 
echo x - ./MISC/vspos.sh
sed 's/^@//' > "./MISC/vspos.sh" <<'@//E*O*F ./MISC/vspos.sh//'
# vspos - shell/awk program to update the ship file with info obtained
#	from buzzing harbors/sea from planes
#	Save the output from a flyover and strip everything but the
#	type shipno
#	list.  Note the coordinates, and guess at the country number

#	To update the ship file:
#	vspos coord cno < shiplist | eupd

if [ $# -eq 0 ];then
	echo "Usage: $0 coord cno < shiplist(type,shipno)"
	exit 1
fi
echo "[0:0] Command :"
awk '{
	type = $1;
	numb = $2;
	if( $1 == "pt" ) {
		type = $1 " " $2;
		numb = $3;
	}
	printf "Country (#%d) %s %s @%s\n", CNO, type, numb, COORD;
}'  COORD=$1  CNO=$2 -
@//E*O*F ./MISC/vspos.sh//
chmod u=rwx,g=rx,o=rx ./MISC/vspos.sh
 
echo x - ./MISC/shsup.A
sed 's/^@//' > "./MISC/shsup.A" <<'@//E*O*F ./MISC/shsup.A//'
#	shsup.A - awk filter to list ships in need of supply
#	input:	output of rdship command
#	output: same as input with well supplied ships deleted

#	carriers should have 60 mil, 40 shells, 2 guns, 20 planes
$2=="carrier"	{if( $5<60 || $6<40 || $7<2 || $8<20 ) print $0 }

#	battleships should have 10 mil, 127 shells, 4 guns 
$2=="battleship"	{
		if( $5<10 || $6<127 || $7<4 ) print $0
			}

#	destroyers should have 10 mil, 40 shells, 2 guns
$2=="destroyer"	{if( $5<10 || $6<40 || $7<2 ) print $0 }

#	tenders should have 100 mil, 127 shells, 10 guns
$2=="tender"	{if( $5<100 || $6<127 || $7<10 ) print $0 }

#	submarine should have 25 shells, 2 guns
$2=="submarine" {if( $6<25 || $7<2 ) print $0 }
@//E*O*F ./MISC/shsup.A//
chmod u=rw,g=r,o=r ./MISC/shsup.A
 
echo mkdir - ./ECRE
mkdir ./ECRE
chmod u=rwx,g=rx,o=rx ./ECRE
 
echo x - ./ECRE/ecre.c
sed 's/^@//' > "./ECRE/ecre.c" <<'@//E*O*F ./ECRE/ecre.c//'
/* Copyright (c) 1985 by Thomas S. Fisher - Westminster, CO 80030 */

#include	<stdio.h>
#include	"emp.h"

FILE	*fopen(), *fdnew, *fdold;
struct	sector	s;
extern	int	optind;
extern	char	*optarg;

main(argc, argv)
int	argc;
char	**argv;
{
	int	c, errflg;
	int	capx, capy, capflg;

	capx = capy = capflg = 0;
	while( (c = getopt(argc, argv, "x:y:")) != EOF ) {
		switch( c ) {
		case 'x':
			capx = atoi(optarg);
			capflg++;
			break;
		case 'y':
			capy = atoi(optarg);
			capflg++;
			break;
		case '?':
			errflg++;
			break;
		}
	}
	if( errflg ) {
		printf("Usage: %s [-x new_capx] [-y new_capy]\n", argv[0]);
		exit(1);
	}
	if( capflg ) {
		movwrld(capx, capy);
	} else {
		newwrld();
	}
}

newwrld()
{
	int	x, y;

	s.s_des = ' ';
	if( (fdnew = fopen("newsect", "w")) == NULL ) {
		fprintf(stderr, "Can't create newsect\n");
		exit(1);
	}
	for( y = 0; y < XYMAX; y++ ) {
		for( x = 0; x < XYMAX; x++ ) {
			if( ptsec(fdnew, &s, sctno(x,y)) == ERROR ) {
				fprintf(stderr, "ptsec: ERROR\n");
				exit(3);
			}
		}
	}
}

movwrld(capx, capy)
int	capx, capy;
{
	int	x, y;

	if( (fdold = fopen("empsect", "r")) == NULL ) {
		fprintf(stderr, "Can't access empsect\n");
		exit(1);
	}
	if( (fdnew = fopen("newsect", "w")) == NULL ) {
		fprintf(stderr, "Can't create newsect\n");
		exit(2);
	}
	for( y = 0; y < XYMAX; y++ ) {
		for( x = 0; x < XYMAX; x++ ) {
			gtsec(fdold,  &s, sctno(x, y));
			ptsec(fdnew,  &s, sctno(x-capx, y-capy));
		}
	}
}

sctno(x, y)
int	x, y;
{
	return((x + XYMAX) % XYMAX + ((y+XYMAX) % XYMAX) * XYMAX );
}

ptsec(fd, buf, n)
FILE	*fd;
struct	sector	*buf;
int	n;
{
	if( fseek(fd, ((long)n)*sizeof(struct sector), 0) != 0 ) return(ERROR);
	if( fwrite(buf, sizeof(struct sector), 1, fd) != 1 ) return(ERROR);
}
gtsec(fd, buf, n)
FILE	*fd;
struct	sector	*buf;
int	n;
{
	if( fseek(fd, ((long)n)*sizeof(struct sector), 0) != 0 ) return(ERROR);
	if( fread(buf, sizeof(struct sector), 1, fd) != 1 ) return(ERROR);
}
@//E*O*F ./ECRE/ecre.c//
chmod u=rw,g=r,o=r ./ECRE/ecre.c
 
echo x - ./ECRE/Makefile
sed 's/^@//' > "./ECRE/Makefile" <<'@//E*O*F ./ECRE/Makefile//'
INSDIR=..
LIBDIR=../_unix.O
GENLIB=$(LIBDIR)/genlib.a
HDRDIR=../hdrs
CFLAGS= -c -O

ecre:	$(INSDIR)/ecre

$(INSDIR)/ecre:	_unix.O/ecre.o $(GENLIB)
	$(CC) -o $(INSDIR)/ecre _unix.O/ecre.o $(GENLIB)

_unix.O/ecre.o:	ecre.c $(HDRDIR)/emp.h 
	$(CC) $(CFLAGS) -I$(HDRDIR) ecre.c
	@mv ecre.o _unix.O/ecre.o

clean:
	rm -f _unix.O/*.o

clobber:	clean
	rm -f $(INSDIR)/ecre

FRC:
@//E*O*F ./ECRE/Makefile//
chmod u=rw,g=r,o=r ./ECRE/Makefile
 
echo mkdir - ./ECRE/_unix.O
mkdir ./ECRE/_unix.O
chmod u=rwx,g=rx,o=rx ./ECRE/_unix.O
 
echo x - ./ECRE/_unix.O/ecre.o
sed 's/^@//' > "./ECRE/_unix.O/ecre.o" <<'@//E*O*F ./ECRE/_unix.O/ecre.o//'
@//E*O*F ./ECRE/_unix.O/ecre.o//
chmod u=rw,g=r,o=r ./ECRE/_unix.O/ecre.o
 
exit 0
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads