summaryrefslogtreecommitdiff
path: root/pkg.h
blob: af59e671ada26c77b2a1fb5f41516e532056734d (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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
 * pkg - Package management utility for rawnix.org
 * https://rawnix.org
 *
 * Copyright (c) 2025 zorz@gmx.com
 * SPDX-License-Identifier: BSD-2-Clause
 */

#ifndef PKG_H
#define PKG_H

#define _POSIX_C_SOURCE 200809L

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <sys/types.h>

#define PKG_VERSION "1.4.0"

/* Maximum line length for reading files */
#define MAX_LINE 4096

/* Default hash table bucket count (shared by all hash tables) */
#define HASH_BUCKETS 256

/* String array - dynamic array of strings */
typedef struct {
    char **data;
    size_t size;
    size_t capacity;
} strarray_t;

/* String list - linked list for temporary string storage */
typedef struct strlist {
    char *data;
    struct strlist *next;
} strlist_t;

/* Package information from MAKEPKG */
typedef struct {
    char *name;
    char *path;           /* port directory path */
    char *version;
    char *release;
    char *description;
    char *url;
    char *maintainer;

    strarray_t *depends;      /* runtime dependencies */
    strarray_t *makedeps;     /* build-time dependencies */
    strarray_t *provides;     /* virtual packages this provides */
    strarray_t *variant;      /* variant description (words) */

    bool loaded;          /* lazy loading flag */
} package_t;

/* Allocators (abort on failure) */
char *xstrdup(const char *str);
void *xmalloc(size_t size);
void *xrealloc(void *ptr, size_t size);

/* String array */
void strarray_init(strarray_t *arr);
void strarray_free(strarray_t *arr);
int strarray_add(strarray_t *arr, const char *str);
bool strarray_contains(strarray_t *arr, const char *str);

/* String utilities */
char *str_trim(char *str);

/* String list */
strlist_t *strlist_new(const char *data);
void strlist_free(strlist_t *list);
int strlist_add(strlist_t **list, const char *data);

/* Filesystem helpers */
int mkdirp(const char *path);
void ensure_parent_dir(const char *path);

/* Path construction: joins root + relative with separator */
char *build_root_path(const char *root, const char *relative);

/* Version string builder: writes "version-release" into buf */
void version_build(char *buf, size_t len,
                   const char *version, const char *release);

/* Safe file close: fflush + ferror check before fclose */
int file_close_checked(FILE *fp);

/* Process execution: fork + exec with optional chdir */
int run_cmd(const char *cmd, char *const argv[], const char *dir);

/* Package functions */
package_t *package_new(const char *name, const char *path);
void package_free(package_t *pkg);

/* MAKEPKG parser */
int makepkg_parse(const char *path, package_t *pkg);

/* Hash function (shared by all hash tables) */
unsigned long hash_djb2(const char *str);

#endif /* PKG_H */