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*/