summaryrefslogtreecommitdiffhomepage
path: root/lib/libsteps/include/steps/steps.hpp
blob: c5241497fb0aff743d2d8cfc1116719fe91b7fa8 (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
62
63
64
65
66
67
68
69
70
71
/* -------------------------------------------

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

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

#pragma once

#include <steps/config.hpp>

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

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

#ifdef __GNUC__
#define STEPS_PACKED __attribute__((packed)) 
#else
#define STEPS_PACKED
#endif

namespace ocl::steps {
struct STEPS_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 {
/// =========================================================== ///
/// @brief Read operator for steps records.
/// =========================================================== ///
inline std::ifstream &operator>>(std::ifstream &f, record &r) {
  f.read((char *)&r, sizeof(r));
  return f;
}

/// =========================================================== ///
/// @brief Write operator for steps records.
/// =========================================================== ///
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