tsf@druxn.UUCP (FisherTS) (12/02/85)
# 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(§, 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