| ︙ | | |
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
+
+
+
+
+
-
-
|
#ifdef HAVE_SYS_UTSNAME_H
# include <sys/utsname.h>
#endif
#if defined(OF_MACOS) || defined(OF_NETBSD)
# include <sys/sysctl.h>
#endif
#ifdef OF_AMIGAOS
# include <exec/execbase.h>
# include <proto/exec.h>
#endif
#if defined(OF_AMIGAOS4)
# include <exec/exectags.h>
# include <proto/exec.h>
#elif defined(OF_MORPHOS)
# include <exec/system.h>
# include <proto/exec.h>
#endif
#import "OFSystemInfo.h"
#import "OFApplication.h"
#import "OFArray.h"
#import "OFDictionary.h"
#import "OFLocale.h"
|
| ︙ | | |
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
|
-
-
-
-
+
+
+
+
-
-
|
}
} @finally {
objc_autoreleasePoolPop(pool);
}
# endif
#elif defined(OF_ANDROID)
/* TODO */
#elif defined(OF_MORPHOS)
/* TODO */
#elif defined(OF_AMIGAOS4)
/* TODO */
#elif defined(OF_AMIGAOS)
operatingSystemVersion = [[OFString alloc]
initWithFormat: @"Kickstart %u.%u",
SysBase->LibNode.lib_Version, SysBase->SoftVer];
#elif defined(OF_AMIGAOS_M68K)
/* TODO */
#elif defined(OF_WII) || defined(NINTENDO_3DS) || defined(OF_NINTENDO_DS) || \
defined(OF_PSP) || defined(OF_MSDOS)
/* Intentionally nothing */
#elif defined(HAVE_SYS_UTSNAME_H) && defined(HAVE_UNAME)
struct utsname utsname;
if (uname(&utsname) != 0)
|
| ︙ | | |
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
|
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
|
-
+
-
|
+ (OFString *)userDataPath
{
# if defined(OF_MACOS) || defined(OF_IOS)
char pathC[PATH_MAX];
OFMutableString *path;
# ifdef HAVE_SYSDIR_START_SEARCH_PATH_ENUMERATION
/* (1) to disable dead code warning when it is not a weak symbol */
if (@available(macOS 10.12, iOS 10, *)) {
if ((1) && &sysdir_start_search_path_enumeration != NULL) {
sysdir_search_path_enumeration_state state;
state = sysdir_start_search_path_enumeration(
SYSDIR_DIRECTORY_APPLICATION_SUPPORT,
SYSDIR_DOMAIN_MASK_USER);
if (sysdir_get_next_search_path_enumeration(state, pathC) == 0)
@throw [OFNotImplementedException
|
| ︙ | | |
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
|
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
|
-
+
-
|
+ (OFString *)userConfigPath
{
# if defined(OF_MACOS) || defined(OF_IOS)
char pathC[PATH_MAX];
OFMutableString *path;
# ifdef HAVE_SYSDIR_START_SEARCH_PATH_ENUMERATION
/* (1) to disable dead code warning when it is not a weak symbol */
if (@available(macOS 10.12, iOS 10, *)) {
if ((1) && &sysdir_start_search_path_enumeration != NULL) {
sysdir_search_path_enumeration_state state;
state = sysdir_start_search_path_enumeration(
SYSDIR_DIRECTORY_LIBRARY, SYSDIR_DOMAIN_MASK_USER);
if (sysdir_get_next_search_path_enumeration(state, pathC) == 0)
@throw [OFNotImplementedException
exceptionWithSelector: _cmd
|
| ︙ | | |
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
|
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
if ((var = [env objectForKey: @"HOME"]) == nil)
@throw [OFNotImplementedException exceptionWithSelector: _cmd
object: self];
return [var stringByAppendingPathComponent: @".config"];
# endif
}
+ (OFString *)temporaryDirectoryPath
{
# if defined(OF_MACOS) || defined(OF_IOS)
char buffer[PATH_MAX];
size_t length;
if ((length = confstr(_CS_DARWIN_USER_TEMP_DIR, buffer, PATH_MAX)) == 0)
return @"/tmp";
return [OFString stringWithCString: buffer
encoding: [OFLocale encoding]
length: length - 1];
# elif defined(OF_WINDOWS)
if ([self isWindowsNT]) {
wchar_t buffer[PATH_MAX];
if (!GetTempPathW(PATH_MAX, buffer))
return nil;
return [OFString stringWithUTF16String: buffer];
} else {
char buffer[PATH_MAX];
if (!GetTempPathA(PATH_MAX, buffer))
return nil;
return [OFString stringWithCString: buffer
encoding: [OFLocale encoding]];
}
# elif defined(OF_HAIKU)
char pathC[PATH_MAX];
if (find_directory(B_SYSTEM_TEMP_DIRECTORY, 0, false,
pathC, PATH_MAX) != B_OK)
@throw [OFNotImplementedException exceptionWithSelector: _cmd
object: self];
return [OFString stringWithUTF8String: pathC];
# elif defined(OF_AMIGAOS)
return @"T:";
# else
OFString *path =
[[OFApplication environment] objectForKey: @"XDG_RUNTIME_DIR"];
if (path != nil)
return path;
return @"/tmp";
# endif
}
#endif
+ (OFString *)CPUVendor
{
#if (defined(OF_X86_64) || defined(OF_X86)) && defined(__GNUC__)
struct X86Regs regs = x86CPUID(0, 0);
uint32_t buffer[3];
if (regs.eax == 0)
return nil;
buffer[0] = regs.ebx;
buffer[1] = regs.edx;
buffer[2] = regs.ecx;
return [OFString stringWithCString: (char *)buffer
encoding: OFStringEncodingASCII
length: 12];
#elif defined(OF_M68K)
return @"Motorola";
#else
return nil;
#endif
}
+ (OFString *)CPUModel
{
|
| ︙ | | |
572
573
574
575
576
577
578
579
580
581
582
583
584
585
|
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
|
+
+
+
+
+
+
+
+
+
+
+
+
+
|
GCIT_VersionString, &version, TAG_END);
if (version != NULL)
return [OFString stringWithFormat: @"%s V%s", model, version];
else
return [OFString stringWithCString: model
encoding: OFStringEncodingASCII];
#elif defined(OF_AMIGAOS_M68K)
if (SysBase->AttnFlags & AFF_68060)
return @"68060";
if (SysBase->AttnFlags & AFF_68040)
return @"68040";
if (SysBase->AttnFlags & AFF_68030)
return @"68030";
if (SysBase->AttnFlags & AFF_68020)
return @"68020";
if (SysBase->AttnFlags & AFF_68010)
return @"68010";
else
return @"68000";
#else
return nil;
#endif
}
#if defined(OF_X86_64) || defined(OF_X86)
+ (bool)supportsMMX
|
| ︙ | | |