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: }

Defined functions

doset defined in line 174; used 2 times
initoptions defined in line 8; used 1 times
parseoptions defined in line 25; used 3 times
Last modified: 1985-12-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2750
Valid CSS Valid XHTML 1.0 Strict