1 | /* SCCS Id: @(#)version.c 3.3 1999/12/01 */
2 | /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3 | /* NetHack may be freely redistributed. See license for details. */
4 |
5 | #include "hack.h"
6 | #include "date.h"
7 | /*
8 | * All the references to the contents of patchlevel.h have been moved
9 | * into makedefs....
10 | */
11 | #ifdef SHORT_FILENAMES
12 | #include "patchlev.h"
13 | #else
14 | #include "patchlevel.h"
15 | #endif
16 |
17 | /* fill and return the given buffer with the nethack version string */
18 | char *
19 | getversionstring(buf)
20 | char *buf;
21 | {
22 | return strcpy(buf, VERSION_ID);
23 | }
24 |
25 | int
26 | doversion()
27 | {
28 | char buf[BUFSZ];
29 |
30 | pline(getversionstring(buf));
31 | return 0;
32 | }
33 |
34 | int
35 | doextversion()
36 | {
37 | display_file(OPTIONS_USED, TRUE);
38 | return 0;
39 | }
40 |
41 | #ifdef MICRO
42 | boolean
43 | comp_times(filetime)
44 | long filetime;
45 | {
46 | return((boolean)(filetime < BUILD_TIME));
47 | }
48 | #endif
49 |
50 | boolean
51 | check_version(version_data, filename, complain)
52 | struct version_info *version_data;
53 | const char *filename;
54 | boolean complain;
55 | {
56 | if (
57 | #ifdef VERSION_COMPATIBILITY
58 | version_data->incarnation < VERSION_COMPATIBILITY ||
59 | version_data->incarnation > VERSION_NUMBER
60 | #else
61 | version_data->incarnation != VERSION_NUMBER
62 | #endif
63 | ) {
64 | if (complain)
65 | pline("Version mismatch for file \"%s\".", filename);
66 | return FALSE;
67 | } else if (version_data->feature_set != VERSION_FEATURES ||
68 | version_data->entity_count != VERSION_SANITY1 ||
69 | version_data->struct_sizes != VERSION_SANITY2) {
70 | if (complain)
71 | pline("Configuration incompatability for file \"%s\".",
72 | filename);
73 | return FALSE;
74 | }
75 | return TRUE;
76 | }
77 |
78 | /* this used to be based on file date and somewhat OS-dependant,
79 | but now examines the initial part of the file's contents */
80 | boolean
81 | uptodate(fd, name)
82 | int fd;
83 | const char *name;
84 | {
85 | int rlen;
86 | struct version_info vers_info;
87 | boolean verbose = name ? TRUE : FALSE;
88 |
89 | rlen = read(fd, (genericptr_t) &vers_info, sizeof vers_info);
90 | minit(); /* ZEROCOMP */
91 | if (rlen == 0) {
92 | if (verbose) {
93 | pline("File \"%s\" is empty?", name);
94 | wait_synch();
95 | }
96 | return FALSE;
97 | }
98 | if (!check_version(&vers_info, name, verbose)) {
99 | if (verbose) wait_synch();
100 | return FALSE;
101 | }
102 | return TRUE;
103 | }
104 |
105 | void
106 | store_version(fd)
107 | int fd;
108 | {
109 | static struct version_info version_data = {
110 | VERSION_NUMBER, VERSION_FEATURES,
111 | VERSION_SANITY1, VERSION_SANITY2
112 | };
113 |
114 | bufoff(fd);
115 | /* bwrite() before bufon() uses plain write() */
116 | bwrite(fd,(genericptr_t)&version_data,(unsigned)(sizeof version_data));
117 | bufon(fd);
118 | return;
119 | }
120 |
121 | #ifdef AMIGA
122 | const char amiga_version_string[] = AMIGA_VERSION_STRING;
123 | #endif
124 |
125 | unsigned long
126 | get_feature_notice_ver(str)
127 | char *str;
128 | {
129 | char buf[BUFSZ];
130 | int ver_maj, ver_min, patch;
131 | char *istr[3];
132 | int j = 0;
133 |
134 | if (!str) return 0L;
135 | str = strcpy(buf, str);
136 | istr[j] = str;
137 | while (*str) {
138 | if (*str == '.') {
139 | *str++ = '\0';
140 | j++;
141 | istr[j] = str;
142 | if (j == 2) break;
143 | } else if (index("0123456789", *str) != 0) {
144 | str++;
145 | } else
146 | return 0L;
147 | }
148 | if (j != 2) return 0L;
149 | ver_maj = atoi(istr[0]);
150 | ver_min = atoi(istr[1]);
151 | patch = atoi(istr[2]);
152 | return FEATURE_NOTICE_VER(ver_maj,ver_min,patch);
153 | /* macro from hack.h */
154 | }
155 |
156 | unsigned long
157 | get_current_feature_ver()
158 | {
159 | return FEATURE_NOTICE_VER(VERSION_MAJOR,VERSION_MINOR,PATCHLEVEL);
160 | }
161 |
162 | /*version.c*/