1 /*
2  * This software is licensed under the terms of the MIT License.
3  * See COPYING for further information.
4  * ---
5  * Copyright (c) 2011-2019, Lukas Weber <laochailan@web.de>.
6  * Copyright (c) 2012-2019, Andrei Alexeyev <akari@taisei-project.org>.
7  */
8 
9 #include "taisei.h"
10 
11 #include "version.h"
12 
taisei_version_compare(TaiseiVersion * v1,TaiseiVersion * v2,TaiseiVersionCmpLevel level)13 int taisei_version_compare(TaiseiVersion *v1, TaiseiVersion *v2, TaiseiVersionCmpLevel level) {
14 	int result = 0;
15 
16 	if((result = (int)v1->major - (int)v2->major) && level >= VCMP_MAJOR) return result;
17 	if((result = (int)v1->minor - (int)v2->minor) && level >= VCMP_MINOR) return result;
18 	if((result = (int)v1->patch - (int)v2->patch) && level >= VCMP_PATCH) return result;
19 	if((result = (int)v1->tweak - (int)v2->tweak) && level >= VCMP_TWEAK) return result;
20 
21 	return result;
22 }
23 
taisei_version_read(SDL_RWops * rwops,TaiseiVersion * version)24 size_t taisei_version_read(SDL_RWops *rwops, TaiseiVersion *version) {
25 	// XXX: detect errors somehow?
26 
27 	version->major = SDL_ReadU8(rwops);
28 	version->minor = SDL_ReadU8(rwops);
29 	version->patch = SDL_ReadU8(rwops);
30 	version->tweak = SDL_ReadLE16(rwops);
31 
32 	return TAISEI_VERSION_SIZE;
33 }
34 
taisei_version_write(SDL_RWops * rwops,TaiseiVersion * version)35 size_t taisei_version_write(SDL_RWops *rwops, TaiseiVersion *version) {
36 	size_t wrote_now = 0, wrote_total = 0;
37 
38 	if(!(wrote_now = SDL_WriteU8(rwops, version->major))) {
39 		return wrote_total;
40 	} else {
41 		wrote_total += wrote_now;
42 	}
43 
44 	if(!(wrote_now = SDL_WriteU8(rwops, version->minor))) {
45 		return wrote_total;
46 	} else {
47 		wrote_total += wrote_now;
48 	}
49 
50 	if(!(wrote_now = SDL_WriteU8(rwops, version->patch))) {
51 		return wrote_total;
52 	} else {
53 		wrote_total += wrote_now;
54 	}
55 
56 	if(!(wrote_now = 2 * SDL_WriteLE16(rwops, version->tweak))) {
57 		return wrote_total;
58 	} else {
59 		wrote_total += wrote_now;
60 	}
61 
62 	assert(wrote_total == TAISEI_VERSION_SIZE);
63 	return wrote_total;
64 }
65 
taisei_version_tostring(TaiseiVersion * version)66 char* taisei_version_tostring(TaiseiVersion *version) {
67 	if(!version->tweak) {
68 		if(!version->patch) {
69 			return strfmt("%u.%u", version->major, version->minor);
70 		}
71 
72 		return strfmt("%u.%u.%u", version->major, version->minor, version->patch);
73 	}
74 
75 	return strfmt("%u.%u.%u.%u", version->major, version->minor, version->patch, version->tweak);
76 }
77