summaryrefslogtreecommitdiffhomepage
path: root/lib/libsteps/dev/lib/steps.hpp
blob: ce6be51eebf99ee0b0f33e06bb31d5ee53dfaf71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* -------------------------------------------

Copyright (C) 2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.

------------------------------------------- */

#pragma once

#include <cstring>
#include <fstream>
#include <libsteps/dev/lib/defines.hpp>

#define kStepsExtension ".stp"
#define kStepsStrLen (256U)

#define kStepsMagic " pls"
#define kStepsMagicLen (4U)
#define kStepsVersion (0x0100)

namespace ocl::steps {
struct __attribute__((packed)) record final {
  ocl::char_type magic[kStepsMagicLen] = {kStepsMagic[0], kStepsMagic[1],
                                          kStepsMagic[2], kStepsMagic[3]};
  ocl::char_type name[kStepsStrLen] = "";
  ocl::char_type company[kStepsStrLen] = "";
  ocl::char_type author[kStepsStrLen] = "";
  int32_t version = 0;
  int32_t pages = 0;
  int32_t check_page = 0, eula_page = 0;
};

inline bool is_valid(record& r) noexcept {
  return r.pages > 1 && r.version > 0 && strcmp(r.magic, kStepsMagic) == 0;
}

namespace operators {
inline std::ifstream &operator>>(std::ifstream &f, record &r) {
  f.read((char *)&r, sizeof(r));
  return f;
}

inline std::ofstream &operator<<(std::ofstream &f, record &r) {
  f.write((char *)&r, sizeof(r));
  return f;
}

/// =========================================================== ///
/// @brief Equal operator for steps records.
/// =========================================================== ///
inline bool operator==(const record &r, const record &l) {
  return (std::strncmp(r.magic, l.magic, kStepsMagicLen) == 0);
}

/// =========================================================== ///
/// @brief Not equal operator for steps records.
/// =========================================================== ///
inline bool operator!=(const record &r, const record &l) {
  return (std::strncmp(r.magic, l.magic, kStepsMagicLen) > 0);
}
} // namespace operators
} // namespace ocl::steps