# 2.11BSD#431 - /usr/src/games/hack/hack.options.c

##### Functions

    doset             X
    initoptions       X
    parseoptions      X

       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

- in /usr/src/games/hack/hack.cmd.c line 11, 43

initoptions defined in line 8; used 1 times

- in /usr/src/games/hack/hack.main.c line 87

parseoptions defined in line 25; used 3 times

- in line 22, 35, 200

Last modified: 1985-12-17 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 867 |