summaryrefslogtreecommitdiffstats
path: root/games/hack/makedefs.c
diff options
context:
space:
mode:
Diffstat (limited to 'games/hack/makedefs.c')
-rw-r--r--games/hack/makedefs.c224
1 files changed, 224 insertions, 0 deletions
diff --git a/games/hack/makedefs.c b/games/hack/makedefs.c
new file mode 100644
index 0000000..aa113b9
--- /dev/null
+++ b/games/hack/makedefs.c
@@ -0,0 +1,224 @@
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/* makedefs.c - version 1.0.2 */
+
+#include <stdio.h>
+
+/* construct definitions of object constants */
+#define LINSZ 1000
+#define STRSZ 40
+
+int fd;
+char string[STRSZ];
+
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+register int index = 0;
+register int propct = 0;
+register char *sp;
+ if (argc != 2) {
+ (void)fprintf(stderr, "usage: makedefs file\n");
+ exit(1);
+ }
+ if ((fd = open(argv[1], 0)) < 0) {
+ perror(argv[1]);
+ exit(1);
+ }
+ skipuntil("objects[] = {");
+ while(getentry()) {
+ if(!*string){
+ index++;
+ continue;
+ }
+ for(sp = string; *sp; sp++)
+ if(*sp == ' ' || *sp == '\t' || *sp == '-')
+ *sp = '_';
+ if(!strncmp(string, "RIN_", 4)){
+ capitalize(string+4);
+ printf("#define %s u.uprops[%d].p_flgs\n",
+ string+4, propct++);
+ }
+ for(sp = string; *sp; sp++) capitalize(sp);
+ /* avoid trouble with stupid C preprocessors */
+ if(!strncmp(string, "WORTHLESS_PIECE_OF_", 19))
+ printf("/* #define %s %d */\n", string, index);
+ else
+ printf("#define %s %d\n", string, index);
+ index++;
+ }
+ printf("\n#define CORPSE DEAD_HUMAN\n");
+ printf("#define LAST_GEM (JADE+1)\n");
+ printf("#define LAST_RING %d\n", propct);
+ printf("#define NROFOBJECTS %d\n", index-1);
+ exit(0);
+}
+
+char line[LINSZ], *lp = line, *lp0 = line, *lpe = line;
+int eof;
+
+readline(){
+register int n = read(fd, lp0, (line+LINSZ)-lp0);
+ if(n < 0){
+ printf("Input error.\n");
+ exit(1);
+ }
+ if(n == 0) eof++;
+ lpe = lp0+n;
+}
+
+char
+nextchar(){
+ if(lp == lpe){
+ readline();
+ lp = lp0;
+ }
+ return((lp == lpe) ? 0 : *lp++);
+}
+
+skipuntil(s) char *s; {
+register char *sp0, *sp1;
+loop:
+ while(*s != nextchar())
+ if(eof) {
+ printf("Cannot skipuntil %s\n", s);
+ exit(1);
+ }
+ if(strlen(s) > lpe-lp+1){
+ register char *lp1, *lp2;
+ lp2 = lp;
+ lp1 = lp = lp0;
+ while(lp2 != lpe) *lp1++ = *lp2++;
+ lp2 = lp0; /* save value */
+ lp0 = lp1;
+ readline();
+ lp0 = lp2;
+ if(strlen(s) > lpe-lp+1) {
+ printf("error in skipuntil");
+ exit(1);
+ }
+ }
+ sp0 = s+1;
+ sp1 = lp;
+ while(*sp0 && *sp0 == *sp1) sp0++, sp1++;
+ if(!*sp0){
+ lp = sp1;
+ return(1);
+ }
+ goto loop;
+}
+
+getentry(){
+int inbraces = 0, inparens = 0, stringseen = 0, commaseen = 0;
+int prefix = 0;
+char ch;
+#define NSZ 10
+char identif[NSZ], *ip;
+ string[0] = string[4] = 0;
+ /* read until {...} or XXX(...) followed by ,
+ skip comment and #define lines
+ deliver 0 on failure
+ */
+ while(1) {
+ ch = nextchar();
+ swi:
+ if(letter(ch)){
+ ip = identif;
+ do {
+ if(ip < identif+NSZ-1) *ip++ = ch;
+ ch = nextchar();
+ } while(letter(ch) || digit(ch));
+ *ip = 0;
+ while(ch == ' ' || ch == '\t') ch = nextchar();
+ if(ch == '(' && !inparens && !stringseen)
+ if(!strcmp(identif, "WAND") ||
+ !strcmp(identif, "RING") ||
+ !strcmp(identif, "POTION") ||
+ !strcmp(identif, "SCROLL"))
+ (void) strncpy(string, identif, 3),
+ string[3] = '_',
+ prefix = 4;
+ }
+ switch(ch) {
+ case '/':
+ /* watch for comment */
+ if((ch = nextchar()) == '*')
+ skipuntil("*/");
+ goto swi;
+ case '{':
+ inbraces++;
+ continue;
+ case '(':
+ inparens++;
+ continue;
+ case '}':
+ inbraces--;
+ if(inbraces < 0) return(0);
+ continue;
+ case ')':
+ inparens--;
+ if(inparens < 0) {
+ printf("too many ) ?");
+ exit(1);
+ }
+ continue;
+ case '\n':
+ /* watch for #define at begin of line */
+ if((ch = nextchar()) == '#'){
+ register char pch;
+ /* skip until '\n' not preceded by '\\' */
+ do {
+ pch = ch;
+ ch = nextchar();
+ } while(ch != '\n' || pch == '\\');
+ continue;
+ }
+ goto swi;
+ case ',':
+ if(!inparens && !inbraces){
+ if(prefix && !string[prefix])
+ string[0] = 0;
+ if(stringseen) return(1);
+ printf("unexpected ,\n");
+ exit(1);
+ }
+ commaseen++;
+ continue;
+ case '\'':
+ if((ch = nextchar()) == '\\') ch = nextchar();
+ if(nextchar() != '\''){
+ printf("strange character denotation?\n");
+ exit(1);
+ }
+ continue;
+ case '"':
+ {
+ register char *sp = string + prefix;
+ register char pch;
+ register int store = (inbraces || inparens)
+ && !stringseen++ && !commaseen;
+ do {
+ pch = ch;
+ ch = nextchar();
+ if(store && sp < string+STRSZ)
+ *sp++ = ch;
+ } while(ch != '"' || pch == '\\');
+ if(store) *--sp = 0;
+ continue;
+ }
+ }
+ }
+}
+
+capitalize(sp) register char *sp; {
+ if('a' <= *sp && *sp <= 'z') *sp += 'A'-'a';
+}
+
+letter(ch) register char ch; {
+ return( ('a' <= ch && ch <= 'z') ||
+ ('A' <= ch && ch <= 'Z') );
+}
+
+digit(ch) register char ch; {
+ return( '0' <= ch && ch <= '9' );
+}
OpenPOWER on IntegriCloud