1 /* SCCS Id: @(#)version.c 3.4 2003/12/06 */
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 /* #define BETA_INFO "" */ /* "[ beta n]" */
18
19 /* fill buffer with short version (so caller can avoid including date.h) */
20 char *
version_string(buf)21 version_string(buf)
22 char *buf;
23 {
24 return strcpy(buf, VERSION_STRING);
25 }
26
27 /* fill and return the given buffer with the long nethack version string */
28 char *
getversionstring(buf)29 getversionstring(buf)
30 char *buf;
31 {
32 Strcpy(buf, VERSION_ID);
33 #if defined(BETA) && defined(BETA_INFO)
34 Sprintf(eos(buf), " %s", BETA_INFO);
35 #endif
36 #if defined(RUNTIME_PORT_ID)
37 append_port_id(buf);
38 #endif
39 return buf;
40 }
41
42 int
doversion()43 doversion()
44 {
45 char buf[BUFSZ];
46
47 pline("%s", getversionstring(buf));
48 return 0;
49 }
50
51 int
doextversion()52 doextversion()
53 {
54 display_file_area(NH_OPTIONS_USED_AREA, OPTIONS_USED, TRUE);
55 return 0;
56 }
57
58 #ifdef MICRO
59 boolean
comp_times(filetime)60 comp_times(filetime)
61 long filetime;
62 {
63 return((boolean)(filetime < BUILD_TIME));
64 }
65 #endif
66
67 boolean
check_version(version_data,filename,complain)68 check_version(version_data, filename, complain)
69 struct version_info *version_data;
70 const char *filename;
71 boolean complain;
72 {
73 if (
74 #ifdef VERSION_COMPATIBILITY
75 version_data->incarnation < VERSION_COMPATIBILITY ||
76 version_data->incarnation > VERSION_NUMBER
77 #else
78 version_data->incarnation != VERSION_NUMBER
79 #endif
80 ) {
81 if (complain)
82 pline("Version mismatch for file \"%s\".", filename);
83 return FALSE;
84 } else if (
85 #ifndef IGNORED_FEATURES
86 version_data->feature_set != VERSION_FEATURES ||
87 #else
88 (version_data->feature_set & ~IGNORED_FEATURES) !=
89 (VERSION_FEATURES & ~IGNORED_FEATURES) ||
90 #endif
91 version_data->entity_count != VERSION_SANITY1 ||
92 version_data->struct_sizes != VERSION_SANITY2) {
93 if (complain)
94 pline("Configuration incompatibility for file \"%s\".",
95 filename);
96 return FALSE;
97 }
98 return TRUE;
99 }
100
101 /* this used to be based on file date and somewhat OS-dependant,
102 but now examines the initial part of the file's contents */
103 boolean
uptodate(fd,name)104 uptodate(fd, name)
105 int fd;
106 const char *name;
107 {
108 int rlen;
109 struct version_info vers_info;
110 boolean verbose = name ? TRUE : FALSE;
111
112 rlen = read(fd, (genericptr_t) &vers_info, sizeof vers_info);
113 minit(); /* ZEROCOMP */
114 if (rlen == 0) {
115 if (verbose) {
116 pline("File \"%s\" is empty?", name);
117 wait_synch();
118 }
119 return FALSE;
120 }
121 if (!check_version(&vers_info, name, verbose)) {
122 if (verbose) wait_synch();
123 return FALSE;
124 }
125 return TRUE;
126 }
127
128 void
store_version(fd)129 store_version(fd)
130 int fd;
131 {
132 static const struct version_info version_data = {
133 VERSION_NUMBER, VERSION_FEATURES,
134 VERSION_SANITY1, VERSION_SANITY2
135 };
136
137 bufoff(fd);
138 /* bwrite() before bufon() uses plain write() */
139 bwrite(fd,(genericptr_t)&version_data,(unsigned)(sizeof version_data));
140 bufon(fd);
141 return;
142 }
143
144 #ifdef AMIGA
145 const char amiga_version_string[] = AMIGA_VERSION_STRING;
146 #endif
147
148 unsigned long
get_feature_notice_ver(str)149 get_feature_notice_ver(str)
150 char *str;
151 {
152 char buf[BUFSZ];
153 int ver_maj, ver_min, patch;
154 char *istr[3];
155 int j = 0;
156
157 if (!str) return 0L;
158 str = strcpy(buf, str);
159 istr[j] = str;
160 while (*str) {
161 if (*str == '.') {
162 *str++ = '\0';
163 j++;
164 istr[j] = str;
165 if (j == 2) break;
166 } else if (index("0123456789", *str) != 0) {
167 str++;
168 } else
169 return 0L;
170 }
171 if (j != 2) return 0L;
172 ver_maj = atoi(istr[0]);
173 ver_min = atoi(istr[1]);
174 patch = atoi(istr[2]);
175 return FEATURE_NOTICE_VER(ver_maj,ver_min,patch);
176 /* macro from hack.h */
177 }
178
179 unsigned long
get_current_feature_ver()180 get_current_feature_ver()
181 {
182 return FEATURE_NOTICE_VER(VERSION_MAJOR,VERSION_MINOR,PATCHLEVEL);
183 }
184
185 /*version.c*/
186