22#include <OS.h>
33#include <image.h>
44
5- // https://github.com/haiku/haiku/blob/e63683b2fb337d2034059a7e053c170eaf978142/headers/os/BeBuild.h#L36
6- #ifndef B_HAIKU_VERSION_1_PRE_BETA_6
7- #define B_HAIKU_VERSION_1_PRE_BETA_6 0x00000901
8- #endif
9- #ifndef B_HAIKU_VERSION_1_BETA_6
10- #define B_HAIKU_VERSION_1_BETA_6 0x00000A00
11- #endif
12- #ifndef B_HAIKU_VERSION_1_PRE_BETA_7
13- #define B_HAIKU_VERSION_1_PRE_BETA_7 0x00000A01
14- #endif
15- #ifndef B_HAIKU_VERSION_1_BETA_7
16- #define B_HAIKU_VERSION_1_BETA_7 0x00000B00
17- #endif
18- #ifndef B_HAIKU_VERSION_1_PRE_BETA_8
19- #define B_HAIKU_VERSION_1_PRE_BETA_8 0x00000B01
20- #endif
21- #ifndef B_HAIKU_VERSION_1_BETA_8
22- #define B_HAIKU_VERSION_1_BETA_8 0x00000C00
23- #endif
24- #ifndef B_HAIKU_VERSION_1_PRE_BETA_9
25- #define B_HAIKU_VERSION_1_PRE_BETA_9 0x00000C01
26- #endif
27- #ifndef B_HAIKU_VERSION_1_BETA_9
28- #define B_HAIKU_VERSION_1_BETA_9 0x00000D00
29- #endif
30- #ifndef B_HAIKU_VERSION_1
31- #define B_HAIKU_VERSION_1 0x00010000
32- #endif
33-
345void ffDetectOSImpl (FFOSResult * os )
356{
36- system_info sys ;
37-
387 ffStrbufSetStatic (& os -> name , "Haiku" );
398
409 ffStrbufSetStatic (& os -> id , "haiku" );
@@ -43,49 +12,61 @@ void ffDetectOSImpl(FFOSResult* os)
4312 int32 cookie = 0 ;
4413 while (get_next_image_info (B_SYSTEM_TEAM , & cookie , & image ) == B_OK )
4514 {
46- if (image .api_version > 0 )
15+ int32 ver = image .api_version ;
16+ if (ver == 0 ) continue ;
17+
18+ // https://github.com/haiku/haiku/blob/e63683b2fb337d2034059a7e053c170eaf978142/headers/os/BeBuild.h#L36
19+ if (ver < B_HAIKU_VERSION_1_ALPHA_1 )
4720 {
48- switch (image . api_version )
21+ switch (ver )
4922 {
50- #define FF_TEST_HAIKU_VERSION (versionNum , versionStr ) \
51- case B_HAIKU_VERSION_ ## versionNum: \
52- ffStrbufSetStatic(&os->version, versionStr); \
53- break;
54-
55- FF_TEST_HAIKU_VERSION (1 _ALPHA_1 , "R1A1" )
56- FF_TEST_HAIKU_VERSION (1 _PRE_ALPHA_2 , "R1A2-" )
57- FF_TEST_HAIKU_VERSION (1 _ALPHA_2 , "R1A2" )
58- FF_TEST_HAIKU_VERSION (1 _PRE_ALPHA_3 , "R1A3-" )
59- FF_TEST_HAIKU_VERSION (1 _ALPHA_3 , "R1A3" )
60- FF_TEST_HAIKU_VERSION (1 _PRE_ALPHA_4 , "R1A4-" )
61- FF_TEST_HAIKU_VERSION (1 _ALPHA_4 , "R1A4" )
62- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_1 , "R1B1-" )
63- FF_TEST_HAIKU_VERSION (1 _BETA_1 , "R1B1" )
64- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_2 , "R1B2-" )
65- FF_TEST_HAIKU_VERSION (1 _BETA_2 , "R1B2" )
66- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_3 , "R1B3-" )
67- FF_TEST_HAIKU_VERSION (1 _BETA_3 , "R1B3" )
68- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_4 , "R1B4-" )
69- FF_TEST_HAIKU_VERSION (1 _BETA_4 , "R1B4" )
70- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_5 , "R1B5-" )
71- FF_TEST_HAIKU_VERSION (1 _BETA_5 , "R1B5" )
72- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_6 , "R1B6-" )
73- FF_TEST_HAIKU_VERSION (1 _BETA_6 , "R1B6" )
74- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_7 , "R1B7-" )
75- FF_TEST_HAIKU_VERSION (1 _BETA_7 , "R1B7" )
76- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_8 , "R1B8-" )
77- FF_TEST_HAIKU_VERSION (1 _BETA_8 , "R1B8" )
78- FF_TEST_HAIKU_VERSION (1 _PRE_BETA_9 , "R1B9-" )
79- FF_TEST_HAIKU_VERSION (1 _BETA_9 , "R1B9" )
80- FF_TEST_HAIKU_VERSION (1 , "R1" )
23+ case B_HAIKU_VERSION_BEOS :
24+ ffStrbufSetStatic (& os -> version , "BEOS" );
25+ break ;
26+ case B_HAIKU_VERSION_BONE :
27+ ffStrbufSetStatic (& os -> version , "BONE" );
28+ break ;
29+ case B_HAIKU_VERSION_DANO :
30+ ffStrbufSetStatic (& os -> version , "DANO" );
31+ break ;
32+ }
33+ }
34+ else
35+ {
36+ int32 relVer = ver / 0x10000 ;
37+ ver %= 0x10000 ;
38+ if (ver == 0 )
39+ {
40+ ffStrbufSetF (& os -> version , "R%d" , relVer );
8141 }
42+ else
43+ {
44+ relVer ++ ;
8245
83- break ;
46+ bool isPre = !!(ver & 1 );
47+ if (ver < B_HAIKU_VERSION_1_PRE_BETA_1 )
48+ {
49+ int32 alphaVer = ver / 0x100 ;
50+ if (isPre )
51+ ffStrbufSetF (& os -> version , "R%dA%d-" , relVer , alphaVer + 1 );
52+ else
53+ ffStrbufSetF (& os -> version , "R%dA%d" , relVer , alphaVer );
54+ }
55+ else if (ver < 0x00010000 /* B_HAIKU_VERSION_1 */ )
56+ {
57+ int32 betaVer = (ver - B_HAIKU_VERSION_1_ALPHA_4 ) / 0x100 ;
58+ if (isPre )
59+ ffStrbufSetF (& os -> version , "R%dB%d-" , relVer , betaVer + 1 );
60+ else
61+ ffStrbufSetF (& os -> version , "R%dB%d" , relVer , betaVer );
62+ }
63+ }
8464 }
8565 }
8666
8767 if (!os -> version .length )
8868 {
69+ system_info sys ;
8970 if (get_system_info (& sys ) == B_OK )
9071 ffStrbufAppendF (& os -> version , "R%ldx" , sys .kernel_version );
9172 }
0 commit comments