1use std::cmp::Ordering;
2use std::ffi::{c_char, c_int};
3
4use pkgcraft::dep::{Cpn, Cpv, Dep, Version};
5use pkgcraft::eapi::Eapi;
6use pkgcraft::pkg::{Package, Pkg, RepoPackage};
7use pkgcraft::repo::Repo;
8use pkgcraft::restrict::{Restrict, Restriction};
9use pkgcraft::traits::Intersects;
10use pkgcraft::utils::hash;
11
12use crate::macros::*;
13
14pub mod ebuild;
15
16#[repr(C)]
17pub enum PkgFormat {
18 Configured,
19 Ebuild,
20 Fake,
21}
22
23impl From<&Pkg<'_>> for PkgFormat {
24 fn from(pkg: &Pkg) -> Self {
25 match pkg {
26 Pkg::Configured(_, _) => Self::Configured,
27 Pkg::Ebuild(_, _) => Self::Ebuild,
28 Pkg::Fake(_, _) => Self::Fake,
29 }
30 }
31}
32
33#[no_mangle]
38pub unsafe extern "C" fn pkgcraft_pkg_format(p: *mut Pkg) -> PkgFormat {
39 let pkg = try_ref_from_ptr!(p);
40 pkg.into()
41}
42
43#[no_mangle]
48pub unsafe extern "C" fn pkgcraft_pkg_cpv(p: *mut Pkg) -> *mut Cpv {
49 let pkg = try_ref_from_ptr!(p);
50 Box::into_raw(Box::new(pkg.cpv().clone()))
51}
52
53#[no_mangle]
58pub unsafe extern "C" fn pkgcraft_pkg_repo(p: *mut Pkg) -> *const Repo {
59 let pkg = try_ref_from_ptr!(p);
60 pkg.repo()
61}
62
63#[no_mangle]
68pub unsafe extern "C" fn pkgcraft_pkg_eapi(p: *mut Pkg) -> *const Eapi {
69 let pkg = try_ref_from_ptr!(p);
70 pkg.eapi()
71}
72
73#[no_mangle]
78pub unsafe extern "C" fn pkgcraft_pkg_version(p: *mut Pkg) -> *mut Version {
79 let pkg = try_ref_from_ptr!(p);
80 Box::into_raw(Box::new(pkg.version().clone()))
81}
82
83#[no_mangle]
89pub unsafe extern "C" fn pkgcraft_pkg_cmp<'a>(p1: *mut Pkg<'a>, p2: *mut Pkg<'a>) -> c_int {
90 let pkg1 = try_ref_from_ptr!(p1);
91 let pkg2 = try_ref_from_ptr!(p2);
92
93 match pkg1.cmp(pkg2) {
94 Ordering::Less => -1,
95 Ordering::Equal => 0,
96 Ordering::Greater => 1,
97 }
98}
99
100#[no_mangle]
105pub unsafe extern "C" fn pkgcraft_pkg_intersects_dep(p: *mut Pkg, d: *mut Dep) -> bool {
106 let pkg = try_ref_from_ptr!(p);
107 let dep = try_ref_from_ptr!(d);
108 pkg.intersects(dep)
109}
110
111#[no_mangle]
116pub unsafe extern "C" fn pkgcraft_pkg_intersects_cpv(p: *mut Pkg, c: *mut Cpv) -> bool {
117 let pkg = try_ref_from_ptr!(p);
118 let cpv = try_ref_from_ptr!(c);
119 pkg.intersects(cpv)
120}
121
122#[no_mangle]
127pub unsafe extern "C" fn pkgcraft_pkg_intersects_cpn(p: *mut Pkg, c: *mut Cpn) -> bool {
128 let pkg = try_ref_from_ptr!(p);
129 let cpn = try_ref_from_ptr!(c);
130 pkg.intersects(cpn)
131}
132
133#[no_mangle]
138pub unsafe extern "C" fn pkgcraft_pkg_str(p: *mut Pkg) -> *mut c_char {
139 let pkg = try_ref_from_ptr!(p);
140 try_ptr_from_str!(pkg.to_string())
141}
142
143#[no_mangle]
148pub unsafe extern "C" fn pkgcraft_pkg_hash(p: *mut Pkg) -> u64 {
149 let pkg = try_ref_from_ptr!(p);
150 hash(pkg)
151}
152
153#[no_mangle]
158pub unsafe extern "C" fn pkgcraft_pkg_restrict(p: *mut Pkg) -> *mut Restrict {
159 let pkg = try_ref_from_ptr!(p);
160 Box::into_raw(Box::new(pkg.into()))
161}
162
163#[no_mangle]
168pub unsafe extern "C" fn pkgcraft_pkg_restrict_matches(p: *mut Pkg, r: *mut Restrict) -> bool {
169 let pkg = try_ref_from_ptr!(p);
170 let r = try_ref_from_ptr!(r);
171 r.matches(pkg)
172}
173
174#[no_mangle]
179pub unsafe extern "C" fn pkgcraft_pkg_free(p: *mut Pkg) {
180 if !p.is_null() {
181 unsafe { drop(Box::from_raw(p)) };
182 }
183}