ohmu
·
2026-10-15
1#include "FFPlatform_private.h"
2#include "common/strutil.h"
3#include "common/io.h"
4#include "detection/version/version.h"
5
6void ffPlatformInit(FFPlatform* platform) {
7 ffStrbufInit(&platform->homeDir);
8 ffStrbufInit(&platform->cacheDir);
9 ffListInit(&platform->configDirs);
10 ffListInit(&platform->dataDirs);
11 ffStrbufInit(&platform->exePath);
12 ffStrbufInit(&platform->cwd);
13
14 ffStrbufInit(&platform->userName);
15 ffStrbufInit(&platform->fullUserName);
16 ffStrbufInit(&platform->hostName);
17 ffStrbufInit(&platform->userShell);
18
19#ifdef _WIN32
20 ffStrbufInit(&platform->sid);
21 platform->initCP = 0;
22#endif
23
24 FFPlatformSysinfo* info = &platform->sysinfo;
25
26 ffStrbufInit(&info->name);
27 ffStrbufInit(&info->release);
28 ffStrbufInit(&info->version);
29 ffStrbufInit(&info->architecture);
30 info->pageSizeShift = 12; // 4096, reasonable fallback
31
32 ffPlatformInitImpl(platform);
33
34 if (info->name.length == 0) {
35 ffStrbufSetStatic(&info->name, ffVersionResult.sysName);
36 }
37
38 if (info->architecture.length == 0) {
39 ffStrbufSetStatic(&info->architecture, ffVersionResult.architecture);
40 }
41}
42
43void ffPlatformDestroy(FFPlatform* platform) {
44 ffStrbufDestroy(&platform->homeDir);
45 ffStrbufDestroy(&platform->cacheDir);
46
47 FF_LIST_FOR_EACH (FFstrbuf, dir, platform->configDirs) {
48 ffStrbufDestroy(dir);
49 }
50 ffListDestroy(&platform->configDirs);
51
52 FF_LIST_FOR_EACH (FFstrbuf, dir, platform->dataDirs) {
53 ffStrbufDestroy(dir);
54 }
55 ffListDestroy(&platform->dataDirs);
56 ffStrbufDestroy(&platform->exePath);
57 ffStrbufDestroy(&platform->cwd);
58
59 ffStrbufDestroy(&platform->userName);
60 ffStrbufDestroy(&platform->hostName);
61 ffStrbufDestroy(&platform->userShell);
62 ffStrbufDestroy(&platform->fullUserName);
63
64#ifdef _WIN32
65 ffStrbufDestroy(&platform->sid);
66#endif
67
68 FFPlatformSysinfo* info = &platform->sysinfo;
69 ffStrbufDestroy(&info->architecture);
70 ffStrbufDestroy(&info->name);
71 ffStrbufDestroy(&info->release);
72 ffStrbufDestroy(&info->version);
73}
74
75void ffPlatformPathAddAbsolute(FFlist* dirs, const char* path) {
76 if (!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) {
77 return;
78 }
79
80 FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreateS(path);
81 ffStrbufEnsureEndsWithC(&buffer, '/');
82 if (!FF_LIST_CONTAINS(*dirs, &buffer, ffStrbufEqual)) {
83 ffStrbufInitMove(FF_LIST_ADD(FFstrbuf, *dirs), &buffer);
84 }
85}
86
87void ffPlatformPathAddHome(FFlist* dirs, const FFPlatform* platform, const char* suffix) {
88 FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreateA(64);
89 ffStrbufAppend(&buffer, &platform->homeDir);
90 ffStrbufAppendS(&buffer, suffix);
91 ffStrbufEnsureEndsWithC(&buffer, '/');
92 if (ffPathExists(buffer.chars, FF_PATHTYPE_DIRECTORY) && !FF_LIST_CONTAINS(*dirs, &buffer, ffStrbufEqual)) {
93 ffStrbufInitMove(FF_LIST_ADD(FFstrbuf, *dirs), &buffer);
94 }
95}