Wikihack
Advertisement

Below is the full text to version.c from the source code of SLASH'EM 0.0.7E7F2. To link to a particular line, write [[SLASH'EM 0.0.7E7F2/version.c#line123]], for example.

The latest source code for vanilla NetHack is at Source code.


The NetHack General Public License applies to screenshots, source code and other content from NetHack.
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_area(NH_OPTIONS_USED_AREA, NH_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*/
Advertisement