|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)dumpgame.c 4.3 (Berkeley) 1/29/86"; ! 9: #endif not lint ! 10: ! 11: # include "trek.h" ! 12: ! 13: /*** THIS CONSTANT MUST CHANGE AS THE DATA SPACES CHANGE ***/ ! 14: # define VERSION 2 ! 15: ! 16: struct dump ! 17: { ! 18: char *area; ! 19: int count; ! 20: }; ! 21: ! 22: ! 23: struct dump Dump_template[] = ! 24: { ! 25: (char *)&Ship, sizeof (Ship), ! 26: (char *)&Now, sizeof (Now), ! 27: (char *)&Param, sizeof (Param), ! 28: (char *)&Etc, sizeof (Etc), ! 29: (char *)&Game, sizeof (Game), ! 30: (char *)Sect, sizeof (Sect), ! 31: (char *)Quad, sizeof (Quad), ! 32: (char *)&Move, sizeof (Move), ! 33: (char *)Event, sizeof (Event), ! 34: 0 ! 35: }; ! 36: ! 37: /* ! 38: ** DUMP GAME ! 39: ** ! 40: ** This routine dumps the game onto the file "trek.dump". The ! 41: ** first two bytes of the file are a version number, which ! 42: ** reflects whether this image may be used. Obviously, it must ! 43: ** change as the size, content, or order of the data structures ! 44: ** output change. ! 45: */ ! 46: ! 47: dumpgame() ! 48: { ! 49: int version; ! 50: register int fd; ! 51: register struct dump *d; ! 52: register int i; ! 53: ! 54: if ((fd = creat("trek.dump", 0644)) < 0) ! 55: return (printf("cannot dump\n")); ! 56: version = VERSION; ! 57: write(fd, &version, sizeof version); ! 58: ! 59: /* output the main data areas */ ! 60: for (d = Dump_template; d->area; d++) ! 61: { ! 62: write(fd, &d->area, sizeof d->area); ! 63: i = d->count; ! 64: write(fd, d->area, i); ! 65: } ! 66: ! 67: close(fd); ! 68: } ! 69: ! 70: ! 71: /* ! 72: ** RESTORE GAME ! 73: ** ! 74: ** The game is restored from the file "trek.dump". In order for ! 75: ** this to succeed, the file must exist and be readable, must ! 76: ** have the correct version number, and must have all the appro- ! 77: ** priate data areas. ! 78: ** ! 79: ** Return value is zero for success, one for failure. ! 80: */ ! 81: ! 82: restartgame() ! 83: { ! 84: register int fd; ! 85: int version; ! 86: ! 87: if ((fd = open("trek.dump", 0)) < 0 || ! 88: read(fd, &version, sizeof version) != sizeof version || ! 89: version != VERSION || ! 90: readdump(fd)) ! 91: { ! 92: printf("cannot restart\n"); ! 93: close(fd); ! 94: return (1); ! 95: } ! 96: ! 97: close(fd); ! 98: return (0); ! 99: } ! 100: ! 101: ! 102: /* ! 103: ** READ DUMP ! 104: ** ! 105: ** This is the business end of restartgame(). It reads in the ! 106: ** areas. ! 107: ** ! 108: ** Returns zero for success, one for failure. ! 109: */ ! 110: ! 111: readdump(fd1) ! 112: int fd1; ! 113: { ! 114: register int fd; ! 115: register struct dump *d; ! 116: register int i; ! 117: int junk; ! 118: ! 119: fd = fd1; ! 120: ! 121: for (d = Dump_template; d->area; d++) ! 122: { ! 123: if (read(fd, &junk, sizeof junk) != (sizeof junk)) ! 124: return (1); ! 125: if ((char *)junk != d->area) ! 126: return (1); ! 127: i = d->count; ! 128: if (read(fd, d->area, i) != i) ! 129: return (1); ! 130: } ! 131: ! 132: /* make quite certain we are at EOF */ ! 133: return (read(fd, &junk, 1)); ! 134: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.