Annotation of early-roguelike/rogue5/scmisc.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * copies of several routines needed for score
! 3: *
! 4: * @(#)smisc.c 4.7 (Berkeley) 02/05/99
! 5: *
! 6: * Rogue: Exploring the Dungeons of Doom
! 7: * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
! 8: * All rights reserved.
! 9: *
! 10: * See the file LICENSE.TXT for full copyright and licensing information.
! 11: */
! 12:
! 13: # include <stdio.h>
! 14: # include <sys/types.h>
! 15: # include <sys/stat.h>
! 16: # include <ctype.h>
! 17:
! 18: # define TRUE 1
! 19: # define FALSE 0
! 20: # define MAXSTR 80
! 21: # define when break;case
! 22: # define otherwise break;default
! 23:
! 24: typedef struct {
! 25: char *m_name;
! 26: } MONST;
! 27:
! 28: char *s_vowelstr();
! 29:
! 30: char *lockfile = "/tmp/.fredlock";
! 31:
! 32: char prbuf[MAXSTR]; /* buffer for sprintfs */
! 33:
! 34: MONST monsters[] = {
! 35: { "aquator" }, { "bat" }, { "centaur" }, { "dragon" }, { "emu" },
! 36: { "venus flytrap" }, { "griffin" }, { "hobgoblin" }, { "ice monster" },
! 37: { "jabberwock" }, { "kobold" }, { "leprechaun" }, { "medusa" },
! 38: { "nymph" }, { "orc" }, { "phantom" }, { "quasit" }, { "rattlesnake" },
! 39: { "snake" }, { "troll" }, { "ur-vile" }, { "vampire" }, { "wraith" },
! 40: { "xeroc" }, { "yeti" }, { "zombie" }
! 41: };
! 42:
! 43: /*
! 44: * s_lock_sc:
! 45: * lock the score file. If it takes too long, ask the user if
! 46: * they care to wait. Return TRUE if the lock is successful.
! 47: */
! 48: int
! 49: s_lock_sc(void)
! 50: {
! 51: int cnt;
! 52: struct stat sbuf;
! 53:
! 54: over:
! 55: close(8); /* just in case there are no files left */
! 56: if (creat(lockfile, 0000) >= 0)
! 57: return TRUE;
! 58: for (cnt = 0; cnt < 5; cnt++)
! 59: {
! 60: md_sleep(1);
! 61: if (creat(lockfile, 0000) >= 0)
! 62: return TRUE;
! 63: }
! 64: if (stat(lockfile, &sbuf) < 0)
! 65: {
! 66: creat(lockfile, 0000);
! 67: return TRUE;
! 68: }
! 69: if (time(NULL) - sbuf.st_mtime > 10)
! 70: {
! 71: if (md_unlink(lockfile) < 0)
! 72: return FALSE;
! 73: goto over;
! 74: }
! 75: else
! 76: {
! 77: printf("The score file is very busy. Do you want to wait longer\n");
! 78: printf("for it to become free so your score can get posted?\n");
! 79: printf("If so, type \"y\"\n");
! 80: (void) fgets(prbuf, MAXSTR, stdin);
! 81: if (prbuf[0] == 'y')
! 82: for (;;)
! 83: {
! 84: if (creat(lockfile, 0000) >= 0)
! 85: return TRUE;
! 86: if (stat(lockfile, &sbuf) < 0)
! 87: {
! 88: creat(lockfile, 0000);
! 89: return TRUE;
! 90: }
! 91: if (time(NULL) - sbuf.st_mtime > 10)
! 92: {
! 93: if (md_unlink(lockfile) < 0)
! 94: return FALSE;
! 95: }
! 96: md_sleep(1);
! 97: }
! 98: else
! 99: return FALSE;
! 100: }
! 101: }
! 102:
! 103: /*
! 104: * s_unlock_sc:
! 105: * Unlock the score file
! 106: */
! 107: void
! 108: s_unlock_sc(void)
! 109: {
! 110: md_unlink(lockfile);
! 111: }
! 112:
! 113: /*
! 114: * s_encwrite:
! 115: * Perform an encrypted write
! 116: */
! 117: void
! 118: s_encwrite(char *start, size_t size, FILE *outf)
! 119: {
! 120: char *e1, *e2, fb;
! 121: int temp;
! 122:
! 123: e1 = encstr;
! 124: e2 = statlist;
! 125: fb = 0;
! 126:
! 127: while (size--)
! 128: {
! 129: putc(*start++ ^ *e1 ^ *e2 ^ fb, outf);
! 130: temp = *e1++;
! 131: fb += temp * *e2++;
! 132: if (*e1 == '\0')
! 133: e1 = encstr;
! 134: if (*e2 == '\0')
! 135: e2 = statlist;
! 136: }
! 137: }
! 138:
! 139: /*
! 140: * s_encread:
! 141: * Perform an encrypted read
! 142: */
! 143:
! 144: s_encread(char *start, size_t size, int inf)
! 145: {
! 146: char *e1, *e2, fb;
! 147: int temp;
! 148: int read_size;
! 149:
! 150: fb = 0;
! 151:
! 152: if ((read_size = read(inf, start, size)) == 0 || read_size == -1)
! 153: return;
! 154:
! 155: e1 = encstr;
! 156: e2 = statlist;
! 157:
! 158: while (size--)
! 159: {
! 160: *start++ ^= *e1 ^ *e2 ^ fb;
! 161: temp = *e1++;
! 162: fb += temp * *e2++;
! 163: if (*e1 == '\0')
! 164: e1 = encstr;
! 165: if (*e2 == '\0')
! 166: e2 = statlist;
! 167: }
! 168: }
! 169:
! 170: /*
! 171: * s_killname:
! 172: * Convert a code to a monster name
! 173: */
! 174: char *
! 175: s_killname(int monst, int doart)
! 176: {
! 177: char *sp;
! 178: int article;
! 179:
! 180: article = TRUE;
! 181: switch (monst)
! 182: {
! 183: case 'a':
! 184: sp = "arrow";
! 185: when 'b':
! 186: sp = "bolt";
! 187: when 'd':
! 188: sp = "dart";
! 189: when 's':
! 190: sp = "starvation";
! 191: article = FALSE;
! 192: when 'h':
! 193: sp = "hypothermia";
! 194: article = FALSE;
! 195: otherwise:
! 196: if (isupper(monst))
! 197: sp = monsters[monst-'A'].m_name;
! 198: else
! 199: {
! 200: sp = "God";
! 201: article = FALSE;
! 202: }
! 203: }
! 204: if (doart && article)
! 205: sprintf(prbuf, "a%s ", s_vowelstr(sp));
! 206: else
! 207: prbuf[0] = '\0';
! 208: strcat(prbuf, sp);
! 209: return prbuf;
! 210: }
! 211:
! 212: /*
! 213: * s_vowelstr:
! 214: * For printfs: if string starts with a vowel, return "n" for an
! 215: * "an".
! 216: */
! 217: char *
! 218: s_vowelstr(char *str)
! 219: {
! 220: switch (*str)
! 221: {
! 222: case 'a': case 'A':
! 223: case 'e': case 'E':
! 224: case 'i': case 'I':
! 225: case 'o': case 'O':
! 226: case 'u': case 'U':
! 227: return "n";
! 228: default:
! 229: return "";
! 230: }
! 231: }
CVSweb