1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 2: /* hack.options.c - version 1.0.3 */ 3: 4: #include "config.h" 5: #include "hack.h" 6: extern char *eos(); 7: 8: initoptions() 9: { 10: register char *opts; 11: extern char *getenv(); 12: 13: flags.time = flags.nonews = flags.notombstone = flags.end_own = 14: flags.standout = flags.nonull = FALSE; 15: flags.no_rest_on_space = TRUE; 16: flags.invlet_constant = TRUE; 17: flags.end_top = 5; 18: flags.end_around = 4; 19: flags.female = FALSE; /* players are usually male */ 20: 21: if(opts = getenv("HACKOPTIONS")) 22: parseoptions(opts,TRUE); 23: } 24: 25: parseoptions(opts, from_env) 26: register char *opts; 27: boolean from_env; 28: { 29: register char *op,*op2; 30: unsigned num; 31: boolean negated; 32: 33: if(op = index(opts, ',')) { 34: *op++ = 0; 35: parseoptions(op, from_env); 36: } 37: if(op = index(opts, ' ')) { 38: op2 = op; 39: while(*op++) 40: if(*op != ' ') *op2++ = *op; 41: } 42: if(!*opts) return; 43: negated = FALSE; 44: while((*opts == '!') || !strncmp(opts, "no", STRLEN("no"))) { 45: if(*opts == '!') opts++; else opts += STRLEN("no"); 46: negated = !negated; 47: } 48: 49: if(!strncmp(opts,"standout",STRLEN("standout"))) { 50: flags.standout = !negated; 51: return; 52: } 53: 54: if(!strncmp(opts,"null",3)) { 55: flags.nonull = negated; 56: return; 57: } 58: 59: if(!strncmp(opts,"tombstone",4)) { 60: flags.notombstone = negated; 61: return; 62: } 63: 64: if(!strncmp(opts,"news",STRLEN("news"))) { 65: flags.nonews = negated; 66: return; 67: } 68: 69: if(!strncmp(opts,"time",STRLEN("time"))) { 70: flags.time = !negated; 71: flags.botl = 1; 72: return; 73: } 74: 75: if(!strncmp(opts,"restonspace",4)) { 76: flags.no_rest_on_space = negated; 77: return; 78: } 79: 80: if(!strncmp(opts,"fixinv",4)) { 81: if(from_env) 82: flags.invlet_constant = !negated; 83: else 84: pline("The fixinvlet option must be in HACKOPTIONS."); 85: return; 86: } 87: 88: if(!strncmp(opts,"male",STRLEN("male"))) { 89: flags.female = negated; 90: return; 91: } 92: if(!strncmp(opts,"female",STRLEN("female"))) { 93: flags.female = !negated; 94: return; 95: } 96: 97: /* name:string */ 98: if(!strncmp(opts,"name",STRLEN("name"))) { 99: extern char plname[PL_NSIZ]; 100: if(!from_env) { 101: pline("The playername can be set only from HACKOPTIONS."); 102: return; 103: } 104: op = index(opts,':'); 105: if(!op) goto bad; 106: (void) strncpy(plname, op+1, sizeof(plname)-1); 107: return; 108: } 109: 110: /* endgame:5t[op] 5a[round] o[wn] */ 111: if(!strncmp(opts,"endgame",3)) { 112: op = index(opts,':'); 113: if(!op) goto bad; 114: op++; 115: while(*op) { 116: num = 1; 117: if(digit(*op)) { 118: num = atoi(op); 119: while(digit(*op)) op++; 120: } else 121: if(*op == '!') { 122: negated = !negated; 123: op++; 124: } 125: switch(*op) { 126: case 't': 127: flags.end_top = num; 128: break; 129: case 'a': 130: flags.end_around = num; 131: break; 132: case 'o': 133: flags.end_own = !negated; 134: break; 135: default: 136: goto bad; 137: } 138: while(letter(*++op)) ; 139: if(*op == '/') op++; 140: } 141: return; 142: } 143: bad: 144: if(!from_env) { 145: if(!strncmp(opts, "help", STRLEN("help"))) { 146: pline("%s%s%s", 147: "To set options use `HACKOPTIONS=\"<options>\"' in your environment, or ", 148: "give the command 'O' followed by the line `<options>' while playing. ", 149: "Here <options> is a list of <option>s separated by commas." ); 150: pline("%s%s%s", 151: "Simple (boolean) options are rest_on_space, news, time, ", 152: "null, tombstone, (fe)male. ", 153: "These can be negated by prefixing them with '!' or \"no\"." ); 154: pline("%s", 155: "A string option is name, as in HACKOPTIONS=\"name:Merlin-W\"." ); 156: pline("%s%s%s", 157: "A compound option is endgame; it is followed by a description of what ", 158: "parts of the scorelist you want to see. You might for example say: ", 159: "`endgame:own scores/5 top scores/4 around my score'." ); 160: return; 161: } 162: pline("Bad option: %s.", opts); 163: pline("Type `O help<cr>' for help."); 164: return; 165: } 166: puts("Bad syntax in HACKOPTIONS."); 167: puts("Use for example:"); 168: puts( 169: "HACKOPTIONS=\"!restonspace,notombstone,endgame:own/5 topscorers/4 around me\"" 170: ); 171: getret(); 172: } 173: 174: doset() 175: { 176: char buf[BUFSZ]; 177: 178: pline("What options do you want to set? "); 179: getlin(buf); 180: if(!buf[0] || buf[0] == '\033') { 181: (void) strcpy(buf,"HACKOPTIONS="); 182: (void) strcat(buf, flags.female ? "female," : "male,"); 183: if(flags.standout) (void) strcat(buf,"standout,"); 184: if(flags.nonull) (void) strcat(buf,"nonull,"); 185: if(flags.nonews) (void) strcat(buf,"nonews,"); 186: if(flags.time) (void) strcat(buf,"time,"); 187: if(flags.notombstone) (void) strcat(buf,"notombstone,"); 188: if(flags.no_rest_on_space) 189: (void) strcat(buf,"!rest_on_space,"); 190: if(flags.end_top != 5 || flags.end_around != 4 || flags.end_own){ 191: (void) sprintf(eos(buf), "endgame: %u topscores/%u around me", 192: flags.end_top, flags.end_around); 193: if(flags.end_own) (void) strcat(buf, "/own scores"); 194: } else { 195: register char *eop = eos(buf); 196: if(*--eop == ',') *eop = 0; 197: } 198: pline(buf); 199: } else 200: parseoptions(buf, FALSE); 201: 202: return(0); 203: }