OSDN Git Service

Initial Import
[nethackexpress/trunk.git] / src / version.c
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 *
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 *
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
43 doversion()
44 {
45         char buf[BUFSZ];
46
47         pline("%s", getversionstring(buf));
48         return 0;
49 }
50
51 int
52 doextversion()
53 {
54         display_file(OPTIONS_USED, TRUE);
55         return 0;
56 }
57
58 #ifdef MICRO
59 boolean
60 comp_times(filetime)
61 long filetime;
62 {
63         return((boolean)(filetime < BUILD_TIME));
64 }
65 #endif
66
67 boolean
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
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
129 store_version(fd)
130 int fd;
131 {
132         const static 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
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
180 get_current_feature_ver()
181 {
182         return FEATURE_NOTICE_VER(VERSION_MAJOR,VERSION_MINOR,PATCHLEVEL);
183 }
184
185 /*version.c*/