Another commit of another iteration.

Another milestone: school project submission. Library doesn't work yet, though. Also licensing things, I guess
This commit is contained in:
2025-04-19 03:33:07 +03:00
parent f523468a52
commit f76f191d62
56 changed files with 2005 additions and 3495 deletions

3
.gitignore vendored Executable file
View File

@@ -0,0 +1,3 @@
*.o
*.a
lib/*/*

11
.gitmodules vendored Normal file
View File

@@ -0,0 +1,11 @@
[submodule "lib/ccsv"]
path = lib/ccsv
url = https://github.com/Ayush-Tripathy/ccsv
[submodule "lib/microtar"]
path = lib/microtar
url = https://github.com/rxi/microtar
[submodule "lib/ctl"]
path = lib/ctl
url = https://github.com/glouw/ctl

280
LICENSE Normal file
View File

@@ -0,0 +1,280 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
<https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS

View File

@@ -1,3 +1,24 @@
#
# Makefile
#
# Copyright 2024 keXa <nikitospikalov2008@gmail.com>
# Copyright 2025 keXa <nikitospikalov2008@gmail.com>, Egor00f
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
CC = kos32-gcc
LD = kos32-ld
AR = kos32-ar
@@ -8,18 +29,22 @@ CONTRIB_DIR = $(abspath $(HOME_DIR)/kolibrios/contrib)
SDK_DIR = $(CONTRIB_DIR)/sdk
C_LAYER = $(CONTRIB_DIR)/C_Layer
CFLAGS = -fno-ident -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I $(SDK_DIR)/sources/newlib/libc/include
LDFLAGS = -static -S -nostdlib -T app.lds --subsystem native -DNDEBUG -L $(TOOLCHAIN_DIR)/lib -L $(TOOLCHAIN_DIR)/mingw32/lib -L $(SDK_DIR)/lib
MICROTAR = lib/microtar/src
CCSV = lib/ccsv
INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I..
CFLAGS = -fno-ident -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -DNDEBUG -c
LDFLAGS = -static -S -nostdlib -T app.lds --subsystem native -L $(TOOLCHAIN_DIR)/lib -L $(TOOLCHAIN_DIR)/mingw32/lib -L $(SDK_DIR)/lib
INCLUDES = -I $(SDK_DIR)/sources/newlib/libc/include -I include -I $(SDK_DIR)/sources/newlib/libc/include -I $(MICROTAR) -I $(CCSV)/include
LIBPATH = -L $(SDK_DIR)/lib -L $(TOOLCHAIN_DIR)/mingw32/lib
MICROTAR_SOURCES = lib/microtar/src/microtar.c
CCSV_SOURCE = lib/ccsv/src/ccsv.c
MICROTAR_SOURCES = $(MICROTAR)/microtar.c
CCSV_SOURCE = $(CCSV)/src/ccsv.c
SOURCES := $(MICROTAR_SOURCES) $(CCSV_SOURCE) \
src/kospm_tar.c src/kospm_list.c src/kospm_common.c \
src/kospm_package.c src/kospm_db.c src/kospm.c
src/kospm_tar.c src/kospm_list.c src/kospm_csv.c \
src/kospm_pkgmeta.c src/kospm_pkgfile.c src/kospm_pkglist.c \
src/kospm_pkgbundle.c src/kospm_pkgdb.c src/kospm.c
OBJECTS := $(SOURCES:.c=.o)
@@ -32,4 +57,4 @@ libkospm.a: $(OBJECTS) Makefile
$(CC) $(CFLAGS) $(INCLUDES) -o $@ $<
clean:
rn -f $(OBJECTS) libkospm.a
rm -f $(OBJECTS) libkospm.a

View File

@@ -1,3 +1,6 @@
# kospm
#kospm - package management library for KolibriOS(WIP)
Package management library for KolibriOS
This is library used by [Nest/Eggs package manager](https://git.kolibrios.org/keXa/nest) to interact with software packages.
This library is licensed under [GNU GPL version 2 or later](LICENSE).
ccsv, microtar and ctl are licensed under MIT License, included in folders of respective submodules.

View File

@@ -1,7 +1,7 @@
/*
* kospm.h
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
* Copyright 2024-2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,11 +20,27 @@
*
*
*/
#include "kospm_db.h"
#include "kospm_package.h"
#include <stddef.h>
#include "kospm_pkgdb.h"
#include "kospm_pkgbundle.h"
int kospm_install(kospm_db_t *db, char *pkg_file);
enum kospm_query_modes {
KOSPM_FILELIST = 0x1,
KOSPM_BYTAG = 0x2,
};
int kospm_remove(kospm_db_t *db, char *pkg_name);
enum kospm_errors {
KOSPM_OK = 0,
KOSPM_ERROR = -1,
KOSPM_NODB = -2,
KOSPM_NOBUNDLE = -3,
KOSPM_NOSUCHPKG = -4,
KOSPM_FAULTYDB = -5,
KOSPM_FAULTYBUNDLE =-6
};
int kospm_query(kospm_db_t *db, char *pkg_name);
int kospm_install(kospm_pkg_db_t *db, char *pkg_file, char *pkg_name);
int kospm_remove(kospm_pkg_db_t *db, char *pkg_name);
int kospm_query(kospm_pkg_db_t *db, char *pkg_name, int8_t query_mode);

View File

@@ -1,7 +1,7 @@
/*
* kospm_common.h
* kospm_csv.h
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -28,7 +28,7 @@
#include "../lib/ccsv.h"
#include "kospm_list.h"
ccsv_reader_options _kospm_csv_reader_options = {
ccsv_reader_options kospm_csv_reader_options = {
.delim = ',',
.quote_char = '"',
.skip_initial_space = 1,
@@ -36,19 +36,25 @@ ccsv_reader_options _kospm_csv_reader_options = {
.skip_comments = 1
};
ccsv_reader_options _kospm_csv_writer_options = {
ccsv_reader_options kospm_csv_writer_options = {
.delim = ',',
.quote_char = '"'
};
typedef struct {
typedef struct kospm_csv_header_col {
int col_number;
char *col_name;
} kospm_csv_header_column;
} kospm_csv_header_col;
kospm_list_t* _kospm_csv_header_get(FILE* file);
typedef struct kospm_csv_header {
kospm_list_t *col_list;
int col_amount;
} kospm_csv_header;
int _kospm_csv_col_get(kospm_list_t* col_list, char* col_name);
kospm_csv_header* kospm_csv_header_get(FILE* file);
int kospm_csv_col_get(kospm_csv_header *header, char* col_name);
char* kospm_csv_string_get(ccsv_row *row, kospm_csv_header *header, char* col_name);
#endif

View File

@@ -1,73 +0,0 @@
/*
* kospm_db.h
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#ifndef KOSPM_DB
#define KOSPM_DB
#include <stdio.h>
#include "kospm_list.h"
#include "kospm_package.h"
#define DB_FOLDER "/kospm/db"
#define METADATA_TABLE "/packages.csv"
#define FILES_TABLE "/files.csv"
char **_kospm_db_metadata_table_header;
char **_kospm_db_files_table_header;
typedef struct kospm_db {
char *db_path;
FILE* metadata_table;
FILE* files_table;
kospm_list_t *packages;
kospm_list_t *files;
} kospm_db_t;
kospm_db_t* kospm_db_init(char *root_dir);
kospm_db_t* kospm_db_open(char *root_dir);
int kospm_db_save(kospm_db_t *db);
int kospm_db_close(kospm_db_t *db);
int kospm_db_package_add(kospm_db_t *db, kospm_package_t *package);
kospm_package_t* kospm_db_package_query(kospm_db_t *db, char *pkg_name);
int kospm_db_package_remove(kospm_db_t *db, char *pkg_name);
int kospm_db_file_add(kospm_db_t *db, char *pkg_name, kospm_package_file_t *file);
kospm_package_t* kospm_db_file_query(kospm_db_t *db, char *file_name);
int kospm_db_file_remove(kospm_db_t *db, char *filename);
int kospm_db_packages_add(kospm_db_t *db, kospm_package_list_t *package_list);
int kospm_db_files_add(kospm_db_t *db, kospm_list_t *file_list);
int kospm_db_packagelist_save(kospm_db_t *db);
int kospm_db_filelist_save(kospm_db_t *db);
#endif

View File

@@ -1,7 +1,7 @@
/*
* kospm_list.h
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
*
* Copyright 2024-2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -25,18 +25,33 @@
#include "stddef.h"
typedef struct {
void *data;
kospm_list_t *prev;
kospm_list_t *next;
} kospm_list_t;
//Do I need this since I am gonna move to CTL lists anyway?
//Maybe, if I won't like its container approach...
kospm_list_t* kospm_list_new(void *data);
typedef struct kospm_list_node {
void* data;
struct kospm_list_node *prev;
struct kospm_list_node *next;
} kospm_list_node_t;
void kospm_list_add(kospm_list_t **list, void *data);
typedef struct kospm_list {
kospm_list_node_t *current;
kospm_list_node_t *first;
kospm_list_node_t *last;
} kospm_list_t;
void kospm_list_del_by_value(kospm_list_t **list, void *data, int (*cmp)(void *, void *));
kospm_list_t* kospm_list_new();
void kospm_list_free(kospm_list_t *list);
void kospm_list_add(kospm_list_t *dlist, void *data);
void kospm_list_prev(kospm_list_t *dlist);
void kospm_list_next(kospm_list_t *dlist);
kospm_list_node_t* kospm_list_get_by_value(kospm_list_t *dlist, void *data, int (*cmp)(void *, void *));
void kospm_list_del_by_value(kospm_list_t *dlist, void *data, int (*cmp)(void *, void *), void (*free_alt)(void *));
void kospm_list_free(kospm_list_t *dlist, void (*free_alt)(void *));
#endif

31
include/kospm_macros.h Normal file
View File

@@ -0,0 +1,31 @@
/*
* kospm_macros.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
//some macros cuz I don't want to copy-paste type every time
#define MALLOCNEW(var_name, type) \
type* var_name = (type*)malloc(sizeof(type))
#define CALLOCNEW(var_name, type) \
type* var_name = (type*)calloc(sizeof(type))
#define MALLOCNEWARR(var_name, type, amount) \
type* var_name = (type*)malloc(amount*sizeof(type))

44
include/kospm_pkgbundle.h Normal file
View File

@@ -0,0 +1,44 @@
/*
* kospm_pkgbundle.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#ifndef KOSPM_PKGBUNDLE
#define KOSPM_PKGBUNDLE
#include "kospm_pkglist.h"
#define BUNDLE_CACHE "/tmp0/1/kospm/"
#define META_CACHE "/tmp0/1/kospm/META"
#define FILES_CACHE "/tmp0/1/kospm/FILES"
typedef struct kospm_pkg_bundle {
char* bundle_path;
kospm_pkg_list_t *package_list;
} kospm_pkg_bundle_t;
kospm_pkg_bundle_t* kospm_pkg_bundle_open(char* bundle_path);
int kospm_pkg_bundle_unpack(char *root_path,
kospm_pkg_bundle_t* pkg_bundle, char *pkg_name);
int kospm_pkg_bundle_close(kospm_pkg_bundle_t* pkg_bundle);
#endif

51
include/kospm_pkgdb.h Normal file
View File

@@ -0,0 +1,51 @@
/*
* kospm_pkgdb.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#ifndef KOSPM_PKGDB
#define KOSPM_PKGDB
#include "kospm_pkglist.h"
#define DB_FOLDER "/kospm/db"
typedef struct kospm_pkg_db {
char *root_path;
kospm_pkg_list_t *package_list;
} kospm_pkg_db_t;
kospm_pkg_db_t* kospm_db_init();
kospm_pkg_db_t* kospm_db_open(kospm_pkg_db_t *db, char *root_path);
int kospm_db_save(kospm_pkg_db_t *db);
int kospm_db_close(kospm_pkg_db_t *db);
int kospm_db_pkg_add(kospm_pkg_db_t *db, kospm_pkg_meta_t *package);
int kospm_db_pkg_remove(kospm_pkg_db_t *db, char *pkg_name);
int kospm_db_pkg_file_add(kospm_pkg_db_t *db, kospm_pkg_file_t *file);
int kospm_db_pkg_file_remove(kospm_pkg_db_t *db, char *file_name);
#endif

44
include/kospm_pkgfile.h Normal file
View File

@@ -0,0 +1,44 @@
/*
* kospm_pkgfile.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#ifndef KOSPM_PKGFILE
#define KOSPM_PKGFILE
#include "kospm_string.h"
#include "kospm_csv.h"
typedef struct {
char pkg_name[NAME_MAX];
char *file_name;
} kospm_pkg_file_t;
kospm_pkg_meta_t* kospm_pkg_file_init();
kospm_pkg_meta_t* kospm_pkg_file_load(ccsv_row *row,
kospm_list_t *header);
char** kospm_pkg_file_store(kospm_pkg_file_t *pkg_file,
kospm_list_t *header);
int kospm_pkg_file_free(kospm_pkg_file_t *pkg_file);
#endif

View File

@@ -1,56 +1,61 @@
/*
* kospm_package.h
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
*
* kospm_pkglist.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*
*
*/
#ifndef KOSPM_PKG
#define KOSPM_PKG
#ifndef KOSPM_PKGLIST
#define KOSPM_PKGLIST
#include <stdint.h>
#include "kospm_list.h"
#define PKGINFO "PKGINFO.CSV"
#define FILES "FILES.CSV"
#define CACHE "/tmp0/1/kospm/cache/"
#define META_TABLE "META.CSV"
#define FILES_TABLE "FILES.CSV"
typedef struct {
char pkg_name[64];
char pkg_name[32];
char *file_name;
} kospm_package_file_t;
} kospm_pkg_file_t;
typedef struct {
char pkg_name[64];
char pkg_name[32];
char pkg_version[16];
char *pkg_description;
} kospm_package_t;
//kospm_list_t *pkg_depends;
//kospm_list_t *pkg_tags;
} kospm_pkg_meta_t;
typedef struct {
kospm_list_t *packages;
kospm_list_t *files;
} kospm_package_list_t;
} kospm_pkg_list_t;
kospm_list_t* kospm_package_metadata_get(FILE* fp);
kospm_pkg_list_t* kospm_pkg_list_init();
kospm_list_t* kospm_package_files_get(FILE* fp);
kospm_pkg_list_t* kospm_pkg_list_open(kospm_pkg_list_t *pkg_list, char* pkg_list_path);
kospm_package_list_t* kospm_package_list_open(char *pkg_file);
int kospm_pkg_list_save(kospm_pkg_list_t *pkg_list, char* pkglist_path);
int kospm_package_list_close(kospm_package_list_t *package_list);
int kospm_pkg_list_close(kospm_pkg_list_t* pkg_list);
kospm_pkg_meta_t* kospm_pkg_list_meta_query(kospm_pkg_list_t *pkg_list, char *pkg_name);
kospm_list_t* kospm_pkg_list_files_query(kospm_pkg_list_t *pkg_list, char *pkg_name);
#endif

50
include/kospm_pkgmeta.h Normal file
View File

@@ -0,0 +1,50 @@
/*
* kospm_pkgmeta.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#ifndef KOSPM_PKGMETA
#define KOSPM_PKGMETA
#include "kospm_string.h"
#include "kospm_csv.h"
typedef struct {
char pkg_name[NAME_MAX];
char pkg_version[VERSION_MAX];
char *pkg_description;
int pkg_size;
kospm_list_t *pkg_depends;
kospm_list_t *pkg_tags;
} kospm_pkg_meta_t;
kospm_pkg_meta_t* kospm_pkg_meta_init();
kospm_pkg_meta_t* kospm_pkg_meta_load(ccsv_row *row,
kospm_list_t *header);
char** kospm_pkg_meta_store(kospm_pkg_meta_t *pkg_meta,
kospm_list_t *header);
int kospm_pkg_meta_cmp(kospm_pkg_meta_t *pkg_meta, char* pkg_name);
int kospm_pkg_meta_free(kospm_pkg_meta_t *pkg_meta);
#endif

44
include/kospm_string.h Normal file
View File

@@ -0,0 +1,44 @@
/*
* kospm_string.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#ifndef KOSPM_STRING
#define KOSPM_STRING
#include <stdlib.h>
#include <string.h>
#define NAME_MAX 32
#define VERSION_MAX 16
#define DESC_MAX 256
#define FILE_MAX 4096
static inline char* strcpynew(const char *src, size_t n) {
char *dst = malloc(n + 1);
if (dst) {
strncpy(dst, src, n);
dst[n] = '\0';
}
return dst;
}
#endif

View File

@@ -1,7 +1,7 @@
/*
* kospm_tar.h
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
* Copyright 2024-2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,8 +24,13 @@
#define KOSPM_TAR
#include "../lib/microtar/src/microtar.h"
#include "kospm_list.h"
int tar_unpack(const char *tar_name,
kospm_list_t* kospm_tar_filelist_get(const char *tar_name);
int kospm_tar_file_exists(kospm_list_t* file_list, const char *file_name);
int kospm_tar_unpack(const char *tar_name,
const char *src_file, const char *dest_file);
#endif

View File

@@ -1,3 +0,0 @@
#SHS
/kolibrios/develop/tcc/tcc -r -o libkospm.o lib/microtar/src/microtar.c lib/ccsv/src/ccsv.c src/kospm_tar.c src/kospm_list.c src/kospm_common.c src/kospm_package.c src/kospm_db.c src/kospm.c

View File

@@ -19,32 +19,59 @@ indent_mode=2
[project]
name=kospm
base_path=/home/kexa/Документы/npoekt/kospm
base_path=./
description=
file_patterns=
[long line marker]
long_line_behaviour=1
long_line_column=72
[files]
current_page=0
FILE_NAME_0=1194;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm.c;0;4
FILE_NAME_1=4136;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_db.c;0;4
FILE_NAME_2=961;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_list.c;0;4
FILE_NAME_3=3586;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_package.c;0;4
FILE_NAME_4=1069;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_tar.c;0;4
FILE_NAME_5=861;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm.h;0;4
FILE_NAME_6=1948;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_db.h;0;4
FILE_NAME_7=1205;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_list.h;0;4
FILE_NAME_8=1498;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_package.h;0;4
FILE_NAME_9=990;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_tar.h;0;4
FILE_NAME_10=198;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fkos_build.sh;0;4
FILE_NAME_11=907;Make;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2FMakefile;0;4
FILE_NAME_12=9813;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fccsv%2Finclude%2Fccsv.h;0;4
FILE_NAME_13=0;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fmicrotar%2Fsrc%2Fmicrotar.h;0;4
FILE_NAME_14=17;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_common.c;0;4
FILE_NAME_15=1269;C++;0;EUTF-8;1;1;1;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_common.h;0;4
FILE_NAME_16=2814;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fccsv%2Fsrc%2Fccsv.c;0;4
current_page=31
FILE_NAME_0=1469;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm.c;0;4
FILE_NAME_1=17;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_csv.c;0;4
FILE_NAME_2=45;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_list.c;0;4
FILE_NAME_3=1787;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_pkgbundle.c;0;4
FILE_NAME_4=2266;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_pkgdb.c;0;4
FILE_NAME_5=19;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_pkgfile.c;0;4
FILE_NAME_6=5457;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_pkglist.c;0;4
FILE_NAME_7=0;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_pkgmeta.c;0;4
FILE_NAME_8=44;C;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fsrc%2Fkospm_tar.c;0;4
FILE_NAME_9=503;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm.h;0;4
FILE_NAME_10=35;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_csv.h;0;4
FILE_NAME_11=80;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_list.h;0;4
FILE_NAME_12=37;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_macros.h;0;4
FILE_NAME_13=40;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_pkgbundle.h;0;4
FILE_NAME_14=810;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_pkgdb.h;0;4
FILE_NAME_15=817;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_pkgfile.h;0;4
FILE_NAME_16=812;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_pkglist.h;0;4
FILE_NAME_17=589;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_pkgmeta.h;0;4
FILE_NAME_18=18;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_string.h;0;4
FILE_NAME_19=43;C++;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Finclude%2Fkospm_tar.h;0;4
FILE_NAME_20=0;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Fkos_build.sh;0;4
FILE_NAME_21=0;C++;1;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fmicrotar%2Fsrc%2Fmicrotar.h;0;4
FILE_NAME_22=0;C;1;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fmicrotar%2Fsrc%2Fmicrotar.c;0;4
FILE_NAME_23=2;C++;1;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fctl%2Fctl%2Flst.h;0;4
FILE_NAME_24=0;C++;1;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fctl%2Fctl%2Fstk.h;0;4
FILE_NAME_25=0;C++;1;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fctl%2Fctl%2Fstr.h;0;4
FILE_NAME_26=0;C++;1;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fctl%2Fctl%2Fvec.h;0;4
FILE_NAME_27=359;C++;1;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2Flib%2Fctl%2Fctl%2Fctl.h;0;4
FILE_NAME_28=859;Make;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2FMakefile;0;4
FILE_NAME_29=0;None;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2F.gitignore;0;4
FILE_NAME_30=85;None;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2F.gitmodules;0;4
FILE_NAME_31=351;Markdown;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2FREADME.md;0;4
FILE_NAME_32=15179;None;0;EUTF-8;1;1;0;%2Fhome%2Fkexa%2FДокументы%2Fnpoekt%2Fkospm%2FLICENSE;0;4
[VTE]
last_dir=/home/kexa
last_dir=/home/kexa/Документы/npoekt/kospm
[prjorg]
expanded_paths=/home/keXa/Documents/проект/kospm/include;/home/keXa/Documents/проект/kospm/src;
source_patterns=*.c;*.C;*.cpp;*.cxx;*.c++;*.cc;*.m;
header_patterns=*.h;*.H;*.hpp;*.hxx;*.h++;*.hh;
ignored_dirs_patterns=.*;CVS;
ignored_file_patterns=*.o;*.obj;*.a;*.lib;*.so;*.dll;*.lo;*.la;*.class;*.jar;*.pyc;*.mo;*.gmo;
generate_tag_prefs=0
show_empty_dirs=true
external_dirs=

548
kospm.tags Normal file
View File

@@ -0,0 +1,548 @@
!_TAG_EXTRA_DESCRIPTION anonymous /Include tags for non-named objects like lambda/
!_TAG_EXTRA_DESCRIPTION fileScope /Include tags of file scope/
!_TAG_EXTRA_DESCRIPTION pseudo /Include pseudo tags/
!_TAG_EXTRA_DESCRIPTION subparser /Include tags generated by subparsers/
!_TAG_FIELD_DESCRIPTION file /File-restricted scoping/
!_TAG_FIELD_DESCRIPTION input /input file/
!_TAG_FIELD_DESCRIPTION name /tag name/
!_TAG_FIELD_DESCRIPTION pattern /pattern/
!_TAG_FIELD_DESCRIPTION signature /Signature of routine (e.g. prototype or parameter list)/
!_TAG_FIELD_DESCRIPTION typeref /Type and name of a variable or typedef/
!_TAG_FIELD_DESCRIPTION!C++ name /aliased names/
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 2 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_KIND_DESCRIPTION!C d,macro /macro definitions/
!_TAG_KIND_DESCRIPTION!C e,enumerator /enumerators (values inside an enumeration)/
!_TAG_KIND_DESCRIPTION!C f,function /function definitions/
!_TAG_KIND_DESCRIPTION!C g,enum /enumeration names/
!_TAG_KIND_DESCRIPTION!C h,header /included header files/
!_TAG_KIND_DESCRIPTION!C m,member /struct, and union members/
!_TAG_KIND_DESCRIPTION!C p,prototype /function prototypes/
!_TAG_KIND_DESCRIPTION!C s,struct /structure names/
!_TAG_KIND_DESCRIPTION!C t,typedef /typedefs/
!_TAG_KIND_DESCRIPTION!C u,union /union names/
!_TAG_KIND_DESCRIPTION!C v,variable /variable definitions/
!_TAG_KIND_DESCRIPTION!C++ c,class /classes/
!_TAG_KIND_DESCRIPTION!C++ d,macro /macro definitions/
!_TAG_KIND_DESCRIPTION!C++ e,enumerator /enumerators (values inside an enumeration)/
!_TAG_KIND_DESCRIPTION!C++ f,function /function definitions/
!_TAG_KIND_DESCRIPTION!C++ g,enum /enumeration names/
!_TAG_KIND_DESCRIPTION!C++ h,header /included header files/
!_TAG_KIND_DESCRIPTION!C++ m,member /class, struct, and union members/
!_TAG_KIND_DESCRIPTION!C++ n,namespace /namespaces/
!_TAG_KIND_DESCRIPTION!C++ p,prototype /function prototypes/
!_TAG_KIND_DESCRIPTION!C++ s,struct /structure names/
!_TAG_KIND_DESCRIPTION!C++ t,typedef /typedefs/
!_TAG_KIND_DESCRIPTION!C++ u,union /union names/
!_TAG_KIND_DESCRIPTION!C++ v,variable /variable definitions/
!_TAG_KIND_DESCRIPTION!Make I,makefile /makefiles/
!_TAG_KIND_DESCRIPTION!Make m,macro /macros/
!_TAG_KIND_DESCRIPTION!Make t,target /targets/
!_TAG_KIND_DESCRIPTION!Markdown c,chapter /chapters/
!_TAG_KIND_DESCRIPTION!Markdown h,hashtag /hashtags/
!_TAG_KIND_DESCRIPTION!Markdown n,footnote /footnotes/
!_TAG_KIND_DESCRIPTION!Markdown s,section /sections/
!_TAG_KIND_DESCRIPTION!Markdown S,subsection /level 2 sections/
!_TAG_KIND_DESCRIPTION!Markdown T,l4subsection /level 4 sections/
!_TAG_KIND_DESCRIPTION!Markdown t,subsubsection /level 3 sections/
!_TAG_KIND_DESCRIPTION!Markdown u,l5subsection /level 5 sections/
!_TAG_KIND_DESCRIPTION!Sh a,alias /aliases/
!_TAG_KIND_DESCRIPTION!Sh f,function /functions/
!_TAG_KIND_DESCRIPTION!Sh h,heredoc /label for here document/
!_TAG_KIND_DESCRIPTION!Sh s,script /script files/
!_TAG_OUTPUT_EXCMD number /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_OUTPUT_VERSION 0.0 /current.age/
!_TAG_PARSER_VERSION!C 1.1 /current.age/
!_TAG_PARSER_VERSION!C++ 1.1 /current.age/
!_TAG_PARSER_VERSION!Make 0.0 /current.age/
!_TAG_PARSER_VERSION!Markdown 1.1 /current.age/
!_TAG_PARSER_VERSION!Sh 0.0 /current.age/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROC_CWD /home/keXa/Documents/проект/kospm/ //
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 6.1.0 /v6.1.0/
!_TAG_ROLE_DESCRIPTION!C!function foreigndecl /declared in foreign languages/
!_TAG_ROLE_DESCRIPTION!C!header local /local header/
!_TAG_ROLE_DESCRIPTION!C!header system /system header/
!_TAG_ROLE_DESCRIPTION!C!macro undef /undefined/
!_TAG_ROLE_DESCRIPTION!C!struct foreigndecl /declared in foreign languages/
!_TAG_ROLE_DESCRIPTION!C++!header local /local header/
!_TAG_ROLE_DESCRIPTION!C++!header system /system header/
!_TAG_ROLE_DESCRIPTION!C++!macro undef /undefined/
!_TAG_ROLE_DESCRIPTION!Make!makefile included /included/
!_TAG_ROLE_DESCRIPTION!Make!makefile optional /optionally included/
!_TAG_ROLE_DESCRIPTION!Sh!heredoc endmarker /end marker/
!_TAG_ROLE_DESCRIPTION!Sh!script loaded /loaded/
% ./lib/ccsv/examples/makefile 4;" target
% ./lib/ccsv/tests/Makefile 4;" target
%.o ./Makefile 36;" target
ADD_FIELD ./lib/ccsv/src/ccsv.c 105;" macro file: signature:(field)
AR ./Makefile 3;" macro
ARRAY_LEN ./lib/ccsv/include/ccsv.h 102;" macro signature:(array)
Basic Usage ./lib/microtar/README.md 5;" section chapter:microtar
BUNDLE_CACHE ./include/kospm_pkgbundle.h 28;" macro
bundle_path ./include/kospm_pkgbundle.h 33;" member struct:kospm_pkg_bundle typeref:typename:char *
CALLOCNEW ./include/kospm_macros.h 5;" macro signature:(var_name,type)
CC ./lib/ccsv/examples/makefile 1;" macro
CC ./lib/ccsv/tests/Makefile 1;" macro
CC ./Makefile 1;" macro
ccsv ./lib/ccsv/README.md 1;" chapter
CCSV_BUFFER_SIZE ./lib/ccsv/include/ccsv.h 58;" macro
ccsv_close ./lib/ccsv/include/ccsv.h 218;" prototype typeref:typename:void signature:(void * obj)
ccsv_close ./lib/ccsv/src/ccsv.c 376;" function typeref:typename:void signature:(void * obj)
CCSV_COMMENT_CHAR ./lib/ccsv/include/ccsv.h 68;" macro
CCSV_CR ./lib/ccsv/include/ccsv.h 64;" macro
CCSV_DELIMITER ./lib/ccsv/include/ccsv.h 62;" macro
CCSV_ERBUFNTALLOC ./lib/ccsv/include/ccsv.h 88;" macro
CCSV_ERINVALID ./lib/ccsv/include/ccsv.h 82;" macro
CCSV_ERINVOBJTYPE ./lib/ccsv/include/ccsv.h 86;" macro
CCSV_ERMODE ./lib/ccsv/include/ccsv.h 84;" macro
CCSV_ERNOMEM ./lib/ccsv/include/ccsv.h 81;" macro
CCSV_ERNULLFP ./lib/ccsv/include/ccsv.h 83;" macro
CCSV_ERNULLROW ./lib/ccsv/include/ccsv.h 87;" macro
CCSV_EROPEN ./lib/ccsv/include/ccsv.h 85;" macro
CCSV_ERROR ./lib/ccsv/include/ccsv.h 80;" macro
ccsv_free_row ./lib/ccsv/include/ccsv.h 288;" prototype typeref:typename:void signature:(ccsv_row * row)
ccsv_free_row ./lib/ccsv/src/ccsv.c 233;" function typeref:typename:void signature:(ccsv_row * row)
ccsv_get_status_message ./lib/ccsv/include/ccsv.h 229;" prototype typeref:typename:const char * signature:(short status)
ccsv_get_status_message ./lib/ccsv/src/ccsv.c 54;" function typeref:typename:const char * signature:(short status)
CCSV_HIGH_BUFFER_SIZE ./lib/ccsv/include/ccsv.h 54;" macro
ccsv_init_reader ./lib/ccsv/include/ccsv.h 255;" prototype typeref:typename:ccsv_reader * signature:(ccsv_reader_options * options,short * status)
ccsv_init_reader ./lib/ccsv/src/ccsv.c 147;" function typeref:typename:ccsv_reader * signature:(ccsv_reader_options * options,short * status)
ccsv_init_writer ./lib/ccsv/include/ccsv.h 303;" prototype typeref:typename:ccsv_writer * signature:(ccsv_writer_options * options,short * status)
ccsv_init_writer ./lib/ccsv/src/ccsv.c 953;" function typeref:typename:ccsv_writer * signature:(ccsv_writer_options * options,short * status)
ccsv_is_error ./lib/ccsv/include/ccsv.h 241;" prototype typeref:typename:int signature:(void * obj,short * status)
ccsv_is_error ./lib/ccsv/src/ccsv.c 78;" function typeref:typename:int signature:(void * obj,short * status)
CCSV_LARGE_FILE_SIZE ./lib/ccsv/include/ccsv.h 50;" macro
CCSV_LF ./lib/ccsv/include/ccsv.h 65;" macro
CCSV_LOW_BUFFER_SIZE ./lib/ccsv/include/ccsv.h 56;" macro
CCSV_MED_BUFFER_SIZE ./lib/ccsv/include/ccsv.h 55;" macro
CCSV_MED_FILE_SIZE ./lib/ccsv/include/ccsv.h 51;" macro
ccsv_next ./lib/ccsv/include/ccsv.h 280;" prototype typeref:typename:ccsv_row * signature:(ccsv_reader * reader)
ccsv_next ./lib/ccsv/src/ccsv.c 399;" function typeref:typename:ccsv_row * signature:(ccsv_reader * reader)
CCSV_NULL_CHAR ./lib/ccsv/include/ccsv.h 69;" macro
ccsv_open ./lib/ccsv/include/ccsv.h 210;" prototype typeref:typename:void * signature:(const char * filename,short object_type,const char * mode,void * options,short * status)
ccsv_open ./lib/ccsv/src/ccsv.c 258;" function typeref:typename:void * signature:(const char * filename,short object_type,const char * mode,void * options,short * status)
CCSV_QUOTE_CHAR ./lib/ccsv/include/ccsv.h 63;" macro
ccsv_reader ./lib/ccsv/include/ccsv.h 157;" struct
ccsv_reader ./lib/ccsv/include/ccsv.h 174;" typedef typeref:struct:ccsv_reader
CCSV_READER ./lib/ccsv/include/ccsv.h 99;" macro
ccsv_reader_options ./lib/ccsv/include/ccsv.h 146;" struct
ccsv_reader_options ./lib/ccsv/include/ccsv.h 155;" typedef typeref:struct:ccsv_reader_options
ccsv_row ./lib/ccsv/include/ccsv.h 176;" struct
ccsv_row ./lib/ccsv/include/ccsv.h 180;" typedef typeref:struct:ccsv_row
CCSV_SOURCE ./Makefile 22;" macro
CCSV_SPACE ./lib/ccsv/include/ccsv.h 66;" macro
CCSV_SUCCESS ./lib/ccsv/include/ccsv.h 79;" macro
CCSV_TAB ./lib/ccsv/include/ccsv.h 67;" macro
CCSV_VERSION ./lib/ccsv/include/ccsv.h 42;" macro
ccsv_write ./lib/ccsv/include/ccsv.h 308;" prototype typeref:typename:int signature:(ccsv_writer * writer,ccsv_row row)
ccsv_write ./lib/ccsv/src/ccsv.c 1005;" function typeref:typename:int signature:(ccsv_writer * writer,ccsv_row row)
CCSV_WRITER ./lib/ccsv/include/ccsv.h 100;" macro
ccsv_writer ./lib/ccsv/include/ccsv.h 189;" struct
ccsv_writer ./lib/ccsv/include/ccsv.h 198;" typedef typeref:struct:ccsv_writer
ccsv_writer_options ./lib/ccsv/include/ccsv.h 182;" struct
ccsv_writer_options ./lib/ccsv/include/ccsv.h 187;" typedef typeref:struct:ccsv_writer_options
CCSV_WRITE_FIELD ./lib/ccsv/include/ccsv.h 109;" macro signature:(fp,writer,string)
ccsv_write_from_array ./lib/ccsv/include/ccsv.h 321;" prototype typeref:typename:int signature:(ccsv_writer * writer,char ** fields,int fields_len)
ccsv_write_from_array ./lib/ccsv/src/ccsv.c 1016;" function typeref:typename:int signature:(ccsv_writer * writer,char ** fields,int fields_len)
CCSV_WRITE_ROW_END ./lib/ccsv/include/ccsv.h 121;" macro signature:(fp,writer,last_field)
CCSV_WRITE_ROW_START ./lib/ccsv/include/ccsv.h 106;" macro signature:(fp,writer)
CFLAGS ./lib/ccsv/examples/makefile 2;" macro
CFLAGS ./lib/ccsv/tests/Makefile 2;" macro
CFLAGS ./Makefile 11;" macro
checksum ./lib/microtar/src/microtar.c 37;" member struct:__anon2ac420210108 typeref:typename:char[8] file:
checksum ./lib/microtar/src/microtar.c 49;" function typeref:typename:unsigned file: signature:(const mtar_raw_header_t * rh)
clean ./lib/ccsv/examples/makefile 7;" target
clean ./lib/ccsv/tests/Makefile 7;" target
clean ./Makefile 39;" target
close ./lib/microtar/src/microtar.h 60;" member struct:mtar_t typeref:typename:int (*)(mtar_t * tar)
col_amount ./include/kospm_csv.h 51;" member struct:__anon1f1fcb200208 typeref:typename:int
col_list ./include/kospm_csv.h 50;" member struct:__anon1f1fcb200208 typeref:typename:kospm_list_t *
col_name ./include/kospm_csv.h 46;" member struct:__anon1f1fcb200108 typeref:typename:char *
col_number ./include/kospm_csv.h 45;" member struct:__anon1f1fcb200108 typeref:typename:int
comment_char ./lib/ccsv/include/ccsv.h 150;" member struct:ccsv_reader_options typeref:typename:char
CONTRIB_DIR ./Makefile 7;" macro
Create a reader object ./lib/ccsv/README.md 7;" subsection section:ccsv""Usage
Create a reader object with custom options ./lib/ccsv/README.md 13;" subsection section:ccsv""Usage
current ./include/kospm_list.h 35;" member struct:kospm_list typeref:typename:kospm_list_node_t *
C_LAYER ./Makefile 9;" macro
data ./include/kospm_list.h 29;" member struct:kospm_list_node typeref:typename:void *
DB_FOLDER ./include/kospm_pkgdb.h 28;" macro
default ./Makefile 31;" target
DEFAULT_COMMENT_CHAR ./lib/ccsv/include/ccsv.h 74;" macro
DEFAULT_DELIMITER ./lib/ccsv/include/ccsv.h 71;" macro
DEFAULT_ESCAPE_CHAR ./lib/ccsv/include/ccsv.h 73;" macro
DEFAULT_QUOTE_CHAR ./lib/ccsv/include/ccsv.h 72;" macro
delim ./lib/ccsv/include/ccsv.h 148;" member struct:ccsv_reader_options typeref:typename:char
delim ./lib/ccsv/include/ccsv.h 184;" member struct:ccsv_writer_options typeref:typename:char
DESC_MAX ./include/kospm_string.h 9;" macro
Error handling ./lib/microtar/README.md 59;" section chapter:microtar
escape_char ./lib/ccsv/include/ccsv.h 151;" member struct:ccsv_reader_options typeref:typename:char
escape_char ./lib/ccsv/include/ccsv.h 186;" member struct:ccsv_writer_options typeref:typename:char
Example ./lib/ccsv/README.md 64;" section chapter:ccsv
Feel free to contribute! ./lib/ccsv/README.md 117;" section chapter:ccsv
fields ./lib/ccsv/include/ccsv.h 178;" member struct:ccsv_row typeref:typename:char **
fields_count ./lib/ccsv/include/ccsv.h 179;" member struct:ccsv_row typeref:typename:int
FIELD_END ./lib/ccsv/include/ccsv.h 132;" enumerator enum:State
FIELD_NOT_STARTED ./lib/ccsv/include/ccsv.h 131;" enumerator enum:State
FIELD_START ./lib/ccsv/include/ccsv.h 130;" enumerator enum:State
FIELD_STARTED ./lib/ccsv/include/ccsv.h 133;" enumerator enum:State
files ./include/kospm_pkglist.h 46;" member struct:__anon88dcd4b20308 typeref:typename:kospm_list_t *
FILES_CACHE ./include/kospm_pkgbundle.h 30;" macro
FILES_TABLE ./include/kospm_pkglist.h 29;" macro
file_close ./lib/microtar/src/microtar.c 171;" function typeref:typename:int file: signature:(mtar_t * tar)
FILE_MAX ./include/kospm_string.h 10;" macro
file_name ./include/kospm_pkgfile.h 9;" member struct:__anon7ad9ca760108 typeref:typename:char *
file_name ./include/kospm_pkglist.h 33;" member struct:__anon88dcd4b20108 typeref:typename:char *
file_read ./lib/microtar/src/microtar.c 161;" function typeref:typename:int file: signature:(mtar_t * tar,void * data,unsigned size)
file_seek ./lib/microtar/src/microtar.c 166;" function typeref:typename:int file: signature:(mtar_t * tar,unsigned offset)
file_write ./lib/microtar/src/microtar.c 156;" function typeref:typename:int file: signature:(mtar_t * tar,const void * data,unsigned size)
first ./include/kospm_list.h 36;" member struct:kospm_list typeref:typename:kospm_list_node_t *
Free the memory allocated to a row with ./lib/ccsv/README.md 50;" subsection section:ccsv""Usage
Free the memory allocated to the reader with ./lib/ccsv/README.md 56;" subsection section:ccsv""Usage
Get a field from a row with ./lib/ccsv/README.md 44;" subsection section:ccsv""Usage
Get the number of fields in a row with ./lib/ccsv/README.md 38;" subsection section:ccsv""Usage
group ./lib/microtar/src/microtar.c 34;" member struct:__anon2ac420210108 typeref:typename:char[8] file:
GROW_FIELD_BUFFER_IF_NEEDED ./lib/ccsv/src/ccsv.c 117;" macro file: signature:(field,field_size,field_pos)
GROW_ROW_BUFFER_IF_NEEDED ./lib/ccsv/src/ccsv.c 130;" macro file: signature:(row_string,row_len,row_pos)
header_to_raw ./lib/microtar/src/microtar.c 118;" function typeref:typename:int file: signature:(mtar_raw_header_t * rh,const mtar_header_t * h)
HOME_DIR ./Makefile 5;" macro
INCLUDES ./Makefile 18;" macro
INSIDE_QUOTED_FIELD ./lib/ccsv/include/ccsv.h 134;" enumerator enum:State
IS_TERMINATOR ./lib/ccsv/src/ccsv.c 692;" macro file: signature:(c)
KOSPM_CSV ./include/kospm_csv.h 24;" macro
kospm_csv_col_get ./include/kospm_csv.h 56;" prototype typeref:typename:int signature:(kospm_csv_header * header,char * col_name)
kospm_csv_col_get ./src/kospm_csv.c 38;" function typeref:typename:int signature:(kospm_csv_header * header,char * col_name)
kospm_csv_field_get ./src/kospm_csv.c 44;" function typeref:typename:char * signature:(ccsv_row * row,kospm_csv_header * header,char * col_name)
kospm_csv_header ./include/kospm_csv.h 52;" typedef typeref:struct:__anon1f1fcb200208
kospm_csv_header_col ./include/kospm_csv.h 47;" typedef typeref:struct:__anon1f1fcb200108
kospm_csv_header_get ./include/kospm_csv.h 54;" prototype typeref:typename:kospm_csv_header * signature:(FILE * file)
kospm_csv_header_get ./src/kospm_csv.c 5;" function typeref:typename:kospm_csv_header * signature:(FILE * file)
kospm_csv_reader_options ./include/kospm_csv.h 31;" variable typeref:typename:ccsv_reader_options
kospm_csv_string_get ./include/kospm_csv.h 58;" prototype typeref:typename:char * signature:(ccsv_row * row,kospm_csv_header * header,char * col_name)
kospm_csv_writer_options ./include/kospm_csv.h 39;" variable typeref:typename:ccsv_reader_options
kospm_db_close ./include/kospm_pkgdb.h 41;" prototype typeref:typename:int signature:(kospm_pkg_db_t * db)
kospm_db_close ./src/kospm_pkgdb.c 57;" function typeref:typename:int signature:(kospm_pkg_db_t * db)
kospm_db_init ./include/kospm_pkgdb.h 35;" prototype typeref:typename:kospm_pkg_db_t * signature:()
kospm_db_init ./src/kospm_pkgdb.c 26;" function typeref:typename:kospm_pkg_db_t * signature:()
kospm_db_open ./include/kospm_pkgdb.h 37;" prototype typeref:typename:kospm_pkg_db_t * signature:(kospm_pkg_db_t * db,char * root_path)
kospm_db_open ./src/kospm_pkgdb.c 34;" function typeref:typename:kospm_pkg_db_t * signature:(kospm_pkg_db_t * db,char * root_path)
kospm_db_pkg_add ./include/kospm_pkgdb.h 43;" prototype typeref:typename:int signature:(kospm_pkg_db_t * db,kospm_pkg_meta_t * package)
kospm_db_pkg_add ./src/kospm_pkgdb.c 68;" function typeref:typename:int signature:(kospm_pkg_db_t * db,kospm_pkg_meta_t * package)
kospm_db_pkg_file_add ./include/kospm_pkgdb.h 47;" prototype typeref:typename:int signature:(kospm_pkg_db_t * db,kospm_pkg_file_t * file)
kospm_db_pkg_file_add ./src/kospm_pkgdb.c 81;" function typeref:typename:int signature:(kospm_pkg_db_t * db,kospm_pkg_file_t * file)
kospm_db_pkg_file_remove ./include/kospm_pkgdb.h 49;" prototype typeref:typename:int signature:(kospm_pkg_db_t * db,char * file_name)
kospm_db_pkg_file_remove ./src/kospm_pkgdb.c 87;" function typeref:typename:int signature:(kospm_pkg_db_t * db,char * file_name)
kospm_db_pkg_remove ./include/kospm_pkgdb.h 45;" prototype typeref:typename:int signature:(kospm_pkg_db_t * db,char * pkg_name)
kospm_db_pkg_remove ./src/kospm_pkgdb.c 74;" function typeref:typename:int signature:(kospm_pkg_db_t * db,char * pkg_name)
kospm_db_save ./include/kospm_pkgdb.h 39;" prototype typeref:typename:int signature:(kospm_pkg_db_t * db)
kospm_db_save ./src/kospm_pkgdb.c 43;" function typeref:typename:int signature:(kospm_pkg_db_t * db)
KOSPM_EXACTNAME ./include/kospm.h 29;" enumerator enum:kospm_query_modes
KOSPM_FILELIST ./include/kospm.h 28;" enumerator enum:kospm_query_modes
kospm_install ./include/kospm.h 42;" prototype typeref:typename:int signature:(kospm_db_t * db,char * pkg_file,char * pkg_name)
kospm_install ./src/kospm.c 25;" function typeref:typename:int signature:(kospm_db_t * db,char * pkg_file,char * pkg_name)
KOSPM_LIST ./include/kospm_list.h 24;" macro
kospm_list ./include/kospm_list.h 34;" struct
kospm_list_add ./include/kospm_list.h 42;" prototype typeref:typename:void signature:(kospm_list_t * dlist,void * data)
kospm_list_add ./src/kospm_list.c 36;" function typeref:typename:void signature:(kospm_list_t * dlist,void * data)
kospm_list_del_by_value ./include/kospm_list.h 50;" prototype typeref:typename:void signature:(kospm_list_t * dlist,void * data,int (* cmp)(void *,void *),void (* free_alt)(void *))
kospm_list_del_by_value ./src/kospm_list.c 75;" function typeref:typename:void signature:(kospm_list_t * dlist,void * data,int (* cmp)(void *,void *),void (* free_alt)(void *))
kospm_list_free ./include/kospm_list.h 52;" prototype typeref:typename:void signature:(kospm_list_t * dlist,void (* free_alt)(void *))
kospm_list_get_by_value ./include/kospm_list.h 48;" prototype typeref:typename:kospm_list_node_t * signature:(kospm_list_t * dlist,void * data,int (* cmp)(void *,void *))
kospm_list_get_by_value ./src/kospm_list.c 59;" function typeref:typename:kospm_list_node_t * signature:(kospm_list_t * dlist,void * data,int (* cmp)(void *,void *))
kospm_list_new ./include/kospm_list.h 40;" prototype typeref:typename:kospm_list_t * signature:()
kospm_list_new ./src/kospm_list.c 26;" function typeref:typename:kospm_list_t * signature:()
kospm_list_next ./include/kospm_list.h 46;" prototype typeref:typename:void signature:(kospm_list_t * dlist)
kospm_list_next ./src/kospm_list.c 54;" function typeref:typename:void * signature:(kospm_list_t * dlist)
kospm_list_node ./include/kospm_list.h 28;" struct
kospm_list_node_t ./include/kospm_list.h 32;" typedef typeref:struct:kospm_list_node
kospm_list_prev ./include/kospm_list.h 44;" prototype typeref:typename:void signature:(kospm_list_t * dlist)
kospm_list_prev ./src/kospm_list.c 49;" function typeref:typename:void * signature:(kospm_list_t * dlist)
kospm_list_t ./include/kospm_list.h 38;" typedef typeref:struct:kospm_list
KOSPM_PKGBUNDLE ./include/kospm_pkgbundle.h 24;" macro
KOSPM_PKGDB ./include/kospm_pkgdb.h 24;" macro
KOSPM_PKGFILE ./include/kospm_pkgfile.h 2;" macro
KOSPM_PKGLIST ./include/kospm_pkglist.h 24;" macro
KOSPM_PKGMETA ./include/kospm_pkgmeta.h 2;" macro
kospm_pkg_bundle ./include/kospm_pkgbundle.h 32;" struct
kospm_pkg_bundle_close ./include/kospm_pkgbundle.h 42;" prototype typeref:typename:int signature:()
kospm_pkg_bundle_close ./src/kospm_pkgbundle.c 68;" function typeref:typename:int signature:(kospm_pkg_bundle_t * pkg_bundle)
kospm_pkg_bundle_open ./include/kospm_pkgbundle.h 37;" prototype typeref:typename:kospm_pkg_bundle_t * signature:(char * bundle_path)
kospm_pkg_bundle_open ./src/kospm_pkgbundle.c 26;" function typeref:typename:kospm_pkg_bundle_t * signature:(char * bundle_path)
kospm_pkg_bundle_t ./include/kospm_pkgbundle.h 35;" typedef typeref:struct:kospm_pkg_bundle
kospm_pkg_bundle_unpack ./include/kospm_pkgbundle.h 39;" prototype typeref:typename:int signature:(char * root_path,kospm_pkg_bundle_t * pkg_bundle,char * pkg_name)
kospm_pkg_bundle_unpack ./src/kospm_pkgbundle.c 46;" function typeref:typename:int signature:(kospm_pkg_bundle_t * pkg_bundle,char * root_path,char * pkg_name)
kospm_pkg_db ./include/kospm_pkgdb.h 30;" struct
kospm_pkg_db_t ./include/kospm_pkgdb.h 33;" typedef typeref:struct:kospm_pkg_db
kospm_pkg_file_check_pkgname ./src/kospm_pkgfile.c 31;" function typeref:typename:int signature:(kospm_pkg_meta_t * pkg_meta,char * pkg_name)
kospm_pkg_file_free ./include/kospm_pkgfile.h 20;" prototype typeref:typename:int signature:(kospm_pkg_file_t * pkg_file)
kospm_pkg_file_free ./src/kospm_pkgfile.c 36;" function typeref:typename:int signature:(kospm_pkg_file_t * pkg_file)
kospm_pkg_file_init ./include/kospm_pkgfile.h 12;" prototype typeref:typename:kospm_pkg_meta_t * signature:()
kospm_pkg_file_init ./src/kospm_pkgfile.c 4;" function typeref:typename:kospm_pkg_file_t * signature:()
kospm_pkg_file_load ./include/kospm_pkgfile.h 14;" prototype typeref:typename:kospm_pkg_meta_t * signature:(ccsv_row * row,kospm_list_t * header)
kospm_pkg_file_load ./src/kospm_pkgfile.c 10;" function typeref:typename:kospm_pkg_file_t * signature:(ccsv_row * row,kospm_csv_header * header)
kospm_pkg_file_store ./include/kospm_pkgfile.h 17;" prototype typeref:typename:char ** signature:(kospm_pkg_file_t * pkg_file,kospm_list_t * header)
kospm_pkg_file_store ./src/kospm_pkgfile.c 20;" function typeref:typename:char ** signature:(kospm_pkg_file_t * pkg_file,kospm_csv_header * header)
kospm_pkg_file_t ./include/kospm_pkgfile.h 10;" typedef typeref:struct:__anon7ad9ca760108
kospm_pkg_file_t ./include/kospm_pkglist.h 34;" typedef typeref:struct:__anon88dcd4b20108
kospm_pkg_list_close ./include/kospm_pkglist.h 55;" prototype typeref:typename:int signature:(kospm_pkg_list_t * pkg_list)
kospm_pkg_list_close ./src/kospm_pkglist.c 177;" function typeref:typename:int signature:(kospm_pkg_list_t * pkg_list)
kospm_pkg_list_files_query ./include/kospm_pkglist.h 59;" prototype typeref:typename:kospm_list_t * signature:(kospm_pkg_list_t * pkg_list,char * pkg_name)
kospm_pkg_list_files_query ./src/kospm_pkglist.c 195;" function typeref:typename:kospm_list_t * signature:(kospm_pkg_list_t * pkg_list,char * pkg_name)
kospm_pkg_list_init ./include/kospm_pkglist.h 49;" prototype typeref:typename:kospm_pkg_list_t * signature:()
kospm_pkg_list_init ./src/kospm_pkglist.c 113;" function typeref:typename:kospm_pkg_list_t * signature:()
kospm_pkg_list_meta_query ./include/kospm_pkglist.h 57;" prototype typeref:typename:kospm_pkg_meta_t * signature:(kospm_pkg_list_t * pkg_list,char * pkg_name)
kospm_pkg_list_meta_query ./src/kospm_pkglist.c 186;" function typeref:typename:kospm_pkg_meta_t * signature:(kospm_pkg_list_t * pkg_list,char * pkg_name)
kospm_pkg_list_open ./include/kospm_pkglist.h 51;" prototype typeref:typename:kospm_pkg_list_t * signature:(kospm_pkg_list_t * pkg_list,char * pkg_list_path)
kospm_pkg_list_open ./src/kospm_pkglist.c 122;" function typeref:typename:kospm_pkg_list_t * signature:(kospm_pkg_list_t * pkg_list,char * pkg_list_path)
kospm_pkg_list_save ./include/kospm_pkglist.h 53;" prototype typeref:typename:int signature:(kospm_pkg_list_t * pkg_list,char * pkglist_path)
kospm_pkg_list_save ./src/kospm_pkglist.c 143;" function typeref:typename:int signature:(kospm_pkg_list_t * pkg_list,char * pkglist_path)
kospm_pkg_list_t ./include/kospm_pkglist.h 47;" typedef typeref:struct:__anon88dcd4b20308
kospm_pkg_meta_check_pkgname ./src/kospm_pkgmeta.c 42;" function typeref:typename:int signature:(kospm_pkg_meta_t * pkg_meta,char * pkg_name)
kospm_pkg_meta_cmp ./include/kospm_pkgmeta.h 24;" prototype typeref:typename:int signature:(kospm_pkg_meta_t * pkg_meta,char * pkg_name)
kospm_pkg_meta_free ./include/kospm_pkgmeta.h 26;" prototype typeref:typename:int signature:(kospm_pkg_meta_t * pkg_meta)
kospm_pkg_meta_free ./src/kospm_pkgmeta.c 47;" function typeref:typename:int signature:(kospm_pkg_meta_t * pkg_meta)
kospm_pkg_meta_init ./include/kospm_pkgmeta.h 16;" prototype typeref:typename:kospm_pkg_meta_t * signature:()
kospm_pkg_meta_init ./src/kospm_pkgmeta.c 5;" function typeref:typename:kospm_pkg_meta_t * signature:()
kospm_pkg_meta_load ./include/kospm_pkgmeta.h 18;" prototype typeref:typename:kospm_pkg_meta_t * signature:(ccsv_row * row,kospm_list_t * header)
kospm_pkg_meta_load ./src/kospm_pkgmeta.c 11;" function typeref:typename:kospm_pkg_meta_t * signature:(ccsv_row * row,kospm_csv_header * header)
kospm_pkg_meta_store ./include/kospm_pkgmeta.h 21;" prototype typeref:typename:char ** signature:(kospm_pkg_meta_t * pkg_meta,kospm_list_t * header)
kospm_pkg_meta_store ./src/kospm_pkgmeta.c 27;" function typeref:typename:char ** signature:(kospm_pkg_meta_t * pkg_meta,kospm_csv_header * header)
kospm_pkg_meta_t ./include/kospm_pkglist.h 42;" typedef typeref:struct:__anon88dcd4b20208
kospm_pkg_meta_t ./include/kospm_pkgmeta.h 14;" typedef typeref:struct:__anon8ae9d6dd0108
kospm_query ./include/kospm.h 46;" prototype typeref:typename:int signature:(kospm_db_t * db,char * pkg_name,int8_t query_mode)
kospm_query_modes ./include/kospm.h 27;" enum
kospm_remove ./include/kospm.h 44;" prototype typeref:typename:int signature:(kospm_db_t * db,char * pkg_name)
KOSPM_STRING ./include/kospm_string.h 2;" macro
KOSPM_TAR ./include/kospm_tar.h 24;" macro
kospm_tar_filelist_get ./include/kospm_tar.h 29;" prototype typeref:typename:kospm_list_t * signature:(const char * tar_name)
kospm_tar_filelist_get ./src/kospm_tar.c 26;" function typeref:typename:kospm_list_t * signature:(const char * tar_name)
kospm_tar_unpack ./include/kospm_tar.h 31;" prototype typeref:typename:int signature:(const char * tar_name,const char * src_file,const char * dest_file)
kospm_tar_unpack ./src/kospm_tar.c 54;" function typeref:typename:int signature:(const char * tar_name,const char * src_file,const char * dest_file)
last ./include/kospm_list.h 37;" member struct:kospm_list typeref:typename:kospm_list_node_t *
last_header ./lib/microtar/src/microtar.h 64;" member struct:mtar_t typeref:typename:unsigned
LD ./Makefile 2;" macro
LDFLAGS ./Makefile 16;" macro
libkospm.a ./Makefile 33;" target
LIBPATH ./Makefile 19;" macro
License ./lib/ccsv/README.md 114;" section chapter:ccsv
License ./lib/microtar/README.md 97;" section chapter:microtar
linkname ./lib/microtar/src/microtar.c 39;" member struct:__anon2ac420210108 typeref:typename:char[100] file:
linkname ./lib/microtar/src/microtar.h 50;" member struct:__anon2ac420260308 typeref:typename:char[100]
main ./lib/ccsv/examples/count_rf.c 7;" function typeref:typename:int signature:(int argc,char * argv[])
main ./lib/ccsv/examples/cpy.c 7;" function typeref:typename:int signature:(int argc,char * argv[])
main ./lib/ccsv/examples/cpy_new.c 6;" function typeref:typename:int signature:(int argc,char ** argv)
main ./lib/ccsv/examples/handling_memory_allocation_failure.c 6;" function typeref:typename:int signature:(void)
main ./lib/ccsv/examples/print_each_row.c 6;" function typeref:typename:int signature:(void)
main ./lib/ccsv/examples/print_each_row_ccsv_v0.5.c 6;" function typeref:typename:int signature:(void)
main ./lib/ccsv/examples/print_headers.c 6;" function typeref:typename:int signature:(void)
main ./lib/ccsv/examples/with_reader_options.c 6;" function typeref:typename:int signature:(void)
main ./lib/ccsv/examples/writer_macros.c 6;" function typeref:typename:int signature:(void)
main ./lib/ccsv/examples/writing_from_array.c 5;" function typeref:typename:int signature:(void)
main ./lib/ccsv/examples/writing_from_CSVRow_struct.c 6;" function typeref:typename:int signature:(void)
main ./lib/ccsv/tests/test_ccsv.c 6;" function typeref:typename:int signature:(void)
MALLOCNEW ./include/kospm_macros.h 2;" macro signature:(var_name,type)
MALLOCNEWARR ./include/kospm_macros.h 8;" macro signature:(var_name,type,amount)
MAX_FIELD_SIZE ./lib/ccsv/include/ccsv.h 59;" macro
MAY_BE_ESCAPED ./lib/ccsv/include/ccsv.h 135;" enumerator enum:State
META_CACHE ./include/kospm_pkgbundle.h 29;" macro
META_TABLE ./include/kospm_pkglist.h 28;" macro
microtar ./lib/microtar/README.md 1;" chapter
MICROTAR_H ./lib/microtar/src/microtar.h 9;" macro
MICROTAR_SOURCES ./Makefile 21;" macro
mode ./lib/microtar/src/microtar.c 32;" member struct:__anon2ac420210108 typeref:typename:char[8] file:
mode ./lib/microtar/src/microtar.h 44;" member struct:__anon2ac420260308 typeref:typename:unsigned
mtar_close ./lib/microtar/src/microtar.c 211;" function typeref:typename:int signature:(mtar_t * tar)
mtar_close ./lib/microtar/src/microtar.h 71;" prototype typeref:typename:int signature:(mtar_t * tar)
MTAR_EBADCHKSUM ./lib/microtar/src/microtar.h 28;" enumerator enum:__anon2ac420260103
MTAR_EFAILURE ./lib/microtar/src/microtar.h 23;" enumerator enum:__anon2ac420260103
MTAR_ENOTFOUND ./lib/microtar/src/microtar.h 30;" enumerator enum:__anon2ac420260103
MTAR_ENULLRECORD ./lib/microtar/src/microtar.h 29;" enumerator enum:__anon2ac420260103
MTAR_EOPENFAIL ./lib/microtar/src/microtar.h 24;" enumerator enum:__anon2ac420260103
MTAR_EREADFAIL ./lib/microtar/src/microtar.h 25;" enumerator enum:__anon2ac420260103
MTAR_ESEEKFAIL ./lib/microtar/src/microtar.h 27;" enumerator enum:__anon2ac420260103
MTAR_ESUCCESS ./lib/microtar/src/microtar.h 22;" enumerator enum:__anon2ac420260103
MTAR_EWRITEFAIL ./lib/microtar/src/microtar.h 26;" enumerator enum:__anon2ac420260103
mtar_finalize ./lib/microtar/src/microtar.c 373;" function typeref:typename:int signature:(mtar_t * tar)
mtar_finalize ./lib/microtar/src/microtar.h 84;" prototype typeref:typename:int signature:(mtar_t * tar)
mtar_find ./lib/microtar/src/microtar.c 244;" function typeref:typename:int signature:(mtar_t * tar,const char * name,mtar_header_t * h)
mtar_find ./lib/microtar/src/microtar.h 76;" prototype typeref:typename:int signature:(mtar_t * tar,const char * name,mtar_header_t * h)
mtar_header_t ./lib/microtar/src/microtar.h 51;" typedef typeref:struct:__anon2ac420260308
mtar_next ./lib/microtar/src/microtar.c 230;" function typeref:typename:int signature:(mtar_t * tar)
mtar_next ./lib/microtar/src/microtar.h 75;" prototype typeref:typename:int signature:(mtar_t * tar)
mtar_open ./lib/microtar/src/microtar.c 177;" function typeref:typename:int signature:(mtar_t * tar,const char * filename,const char * mode)
mtar_open ./lib/microtar/src/microtar.h 70;" prototype typeref:typename:int signature:(mtar_t * tar,const char * filename,const char * mode)
mtar_raw_header_t ./lib/microtar/src/microtar.c 41;" typedef typeref:struct:__anon2ac420210108 file:
mtar_read_data ./lib/microtar/src/microtar.c 290;" function typeref:typename:int signature:(mtar_t * tar,void * ptr,unsigned size)
mtar_read_data ./lib/microtar/src/microtar.h 78;" prototype typeref:typename:int signature:(mtar_t * tar,void * ptr,unsigned size)
mtar_read_header ./lib/microtar/src/microtar.c 270;" function typeref:typename:int signature:(mtar_t * tar,mtar_header_t * h)
mtar_read_header ./lib/microtar/src/microtar.h 77;" prototype typeref:typename:int signature:(mtar_t * tar,mtar_header_t * h)
mtar_rewind ./lib/microtar/src/microtar.c 223;" function typeref:typename:int signature:(mtar_t * tar)
mtar_rewind ./lib/microtar/src/microtar.h 74;" prototype typeref:typename:int signature:(mtar_t * tar)
mtar_seek ./lib/microtar/src/microtar.c 216;" function typeref:typename:int signature:(mtar_t * tar,unsigned pos)
mtar_seek ./lib/microtar/src/microtar.h 73;" prototype typeref:typename:int signature:(mtar_t * tar,unsigned pos)
mtar_strerror ./lib/microtar/src/microtar.c 140;" function typeref:typename:const char * signature:(int err)
mtar_strerror ./lib/microtar/src/microtar.h 68;" prototype typeref:typename:const char * signature:(int err)
mtar_t ./lib/microtar/src/microtar.h 54;" typedef typeref:struct:mtar_t
mtar_t ./lib/microtar/src/microtar.h 56;" struct
MTAR_TBLK ./lib/microtar/src/microtar.h 38;" enumerator enum:__anon2ac420260203
MTAR_TCHR ./lib/microtar/src/microtar.h 37;" enumerator enum:__anon2ac420260203
MTAR_TDIR ./lib/microtar/src/microtar.h 39;" enumerator enum:__anon2ac420260203
MTAR_TFIFO ./lib/microtar/src/microtar.h 40;" enumerator enum:__anon2ac420260203
MTAR_TLNK ./lib/microtar/src/microtar.h 35;" enumerator enum:__anon2ac420260203
MTAR_TREG ./lib/microtar/src/microtar.h 34;" enumerator enum:__anon2ac420260203
MTAR_TSYM ./lib/microtar/src/microtar.h 36;" enumerator enum:__anon2ac420260203
MTAR_VERSION ./lib/microtar/src/microtar.h 19;" macro
mtar_write_data ./lib/microtar/src/microtar.c 357;" function typeref:typename:int signature:(mtar_t * tar,const void * data,unsigned size)
mtar_write_data ./lib/microtar/src/microtar.h 83;" prototype typeref:typename:int signature:(mtar_t * tar,const void * data,unsigned size)
mtar_write_dir_header ./lib/microtar/src/microtar.c 345;" function typeref:typename:int signature:(mtar_t * tar,const char * name)
mtar_write_dir_header ./lib/microtar/src/microtar.h 82;" prototype typeref:typename:int signature:(mtar_t * tar,const char * name)
mtar_write_file_header ./lib/microtar/src/microtar.c 332;" function typeref:typename:int signature:(mtar_t * tar,const char * name,unsigned size)
mtar_write_file_header ./lib/microtar/src/microtar.h 81;" prototype typeref:typename:int signature:(mtar_t * tar,const char * name,unsigned size)
mtar_write_header ./lib/microtar/src/microtar.c 323;" function typeref:typename:int signature:(mtar_t * tar,const mtar_header_t * h)
mtar_write_header ./lib/microtar/src/microtar.h 80;" prototype typeref:typename:int signature:(mtar_t * tar,const mtar_header_t * h)
mtime ./lib/microtar/src/microtar.c 36;" member struct:__anon2ac420210108 typeref:typename:char[12] file:
mtime ./lib/microtar/src/microtar.h 47;" member struct:__anon2ac420260308 typeref:typename:unsigned
name ./lib/microtar/src/microtar.c 31;" member struct:__anon2ac420210108 typeref:typename:char[100] file:
name ./lib/microtar/src/microtar.h 49;" member struct:__anon2ac420260308 typeref:typename:char[100]
NAME_MAX ./include/kospm_string.h 7;" macro
next ./include/kospm_list.h 31;" member struct:kospm_list_node typeref:struct:kospm_list_node *
OBJECTS ./Makefile 29;" macro
object_type ./lib/ccsv/include/ccsv.h 173;" member struct:ccsv_reader typeref:typename:short
object_type ./lib/ccsv/include/ccsv.h 197;" member struct:ccsv_writer typeref:typename:short
owner ./lib/microtar/src/microtar.c 33;" member struct:__anon2ac420210108 typeref:typename:char[8] file:
owner ./lib/microtar/src/microtar.h 45;" member struct:__anon2ac420260308 typeref:typename:unsigned
packages ./include/kospm_pkglist.h 45;" member struct:__anon88dcd4b20308 typeref:typename:kospm_list_t *
package_list ./include/kospm_pkgbundle.h 34;" member struct:kospm_pkg_bundle typeref:typename:kospm_pkg_list_t *
package_list ./include/kospm_pkgdb.h 32;" member struct:kospm_pkg_db typeref:typename:kospm_pkg_list_t *
pkg_depends ./include/kospm_pkgmeta.h 12;" member struct:__anon8ae9d6dd0108 typeref:typename:kospm_list_t *
pkg_description ./include/kospm_pkglist.h 39;" member struct:__anon88dcd4b20208 typeref:typename:char *
pkg_description ./include/kospm_pkgmeta.h 10;" member struct:__anon8ae9d6dd0108 typeref:typename:char *
pkg_name ./include/kospm_pkgfile.h 8;" member struct:__anon7ad9ca760108 typeref:typename:char[]
pkg_name ./include/kospm_pkglist.h 32;" member struct:__anon88dcd4b20108 typeref:typename:char[32]
pkg_name ./include/kospm_pkglist.h 37;" member struct:__anon88dcd4b20208 typeref:typename:char[32]
pkg_name ./include/kospm_pkgmeta.h 8;" member struct:__anon8ae9d6dd0108 typeref:typename:char[]
pkg_size ./include/kospm_pkgmeta.h 11;" member struct:__anon8ae9d6dd0108 typeref:typename:int
pkg_tags ./include/kospm_pkgmeta.h 13;" member struct:__anon8ae9d6dd0108 typeref:typename:kospm_list_t *
pkg_version ./include/kospm_pkglist.h 38;" member struct:__anon88dcd4b20208 typeref:typename:char[16]
pkg_version ./include/kospm_pkgmeta.h 9;" member struct:__anon8ae9d6dd0108 typeref:typename:char[]
pos ./lib/microtar/src/microtar.h 62;" member struct:mtar_t typeref:typename:unsigned
prev ./include/kospm_list.h 30;" member struct:kospm_list_node typeref:struct:kospm_list_node *
quote_char ./lib/ccsv/include/ccsv.h 149;" member struct:ccsv_reader_options typeref:typename:char
quote_char ./lib/ccsv/include/ccsv.h 185;" member struct:ccsv_writer_options typeref:typename:char
raw_to_header ./lib/microtar/src/microtar.c 90;" function typeref:typename:int file: signature:(mtar_header_t * h,const mtar_raw_header_t * rh)
read ./lib/microtar/src/microtar.h 57;" member struct:mtar_t typeref:typename:int (*)(mtar_t * tar,void * data,unsigned size)
Read a row with ./lib/ccsv/README.md 28;" subsection section:ccsv""Usage
Reading ./lib/microtar/README.md 10;" subsubsection section:microtar""Basic Usage
Reading ./lib/microtar/README.md 80;" subsubsection section:microtar""Wrapping a stream
read_row ./lib/ccsv/include/ccsv.h 268;" prototype typeref:typename:ccsv_row * signature:(FILE * fp,ccsv_reader * parser)
read_row ./lib/ccsv/src/ccsv.c 419;" function typeref:typename:ccsv_row * signature:(FILE * fp,ccsv_reader * reader)
remaining_data ./lib/microtar/src/microtar.h 63;" member struct:mtar_t typeref:typename:unsigned
RETURN_IF_WRITE_ERROR ./lib/ccsv/src/ccsv.c 143;" macro file: signature:(writer,desired_status)
root_path ./include/kospm_pkgdb.h 31;" member struct:kospm_pkg_db typeref:typename:char *
round_up ./lib/microtar/src/microtar.c 44;" function typeref:typename:unsigned file: signature:(unsigned n,unsigned incr)
rows_read ./lib/ccsv/include/ccsv.h 159;" member struct:ccsv_reader typeref:typename:int
SDK_DIR ./Makefile 8;" macro
seek ./lib/microtar/src/microtar.h 59;" member struct:mtar_t typeref:typename:int (*)(mtar_t * tar,unsigned pos)
size ./lib/microtar/src/microtar.c 35;" member struct:__anon2ac420210108 typeref:typename:char[12] file:
size ./lib/microtar/src/microtar.h 46;" member struct:__anon2ac420260308 typeref:typename:unsigned
skip_comments ./lib/ccsv/include/ccsv.h 154;" member struct:ccsv_reader_options typeref:typename:int
skip_empty_lines ./lib/ccsv/include/ccsv.h 153;" member struct:ccsv_reader_options typeref:typename:int
skip_initial_space ./lib/ccsv/include/ccsv.h 152;" member struct:ccsv_reader_options typeref:typename:int
SOURCES ./Makefile 24;" macro
State ./lib/ccsv/include/ccsv.h 128;" enum
State ./lib/ccsv/include/ccsv.h 136;" typedef typeref:enum:State
status ./lib/ccsv/include/ccsv.h 172;" member struct:ccsv_reader typeref:typename:short
status_messages ./lib/ccsv/src/ccsv.c 46;" variable typeref:typename:const char * []
strcpynew ./include/kospm_string.h 12;" function typeref:typename:char * signature:(const char * src,size_t n)
stream ./lib/microtar/src/microtar.h 61;" member struct:mtar_t typeref:typename:void *
TOOLCHAIN_DIR ./Makefile 6;" macro
TOTAL_ERROR_MESSAGES ./lib/ccsv/include/ccsv.h 76;" macro
tread ./lib/microtar/src/microtar.c 63;" function typeref:typename:int file: signature:(mtar_t * tar,void * data,unsigned size)
twrite ./lib/microtar/src/microtar.c 70;" function typeref:typename:int file: signature:(mtar_t * tar,const void * data,unsigned size)
type ./lib/microtar/src/microtar.c 38;" member struct:__anon2ac420210108 typeref:typename:char file:
type ./lib/microtar/src/microtar.h 48;" member struct:__anon2ac420260308 typeref:typename:unsigned
Usage ./lib/ccsv/README.md 6;" section chapter:ccsv
VERSION_MAX ./include/kospm_string.h 8;" macro
Wrapping a stream ./lib/microtar/README.md 66;" section chapter:microtar
write ./lib/microtar/src/microtar.h 58;" member struct:mtar_t typeref:typename:int (*)(mtar_t * tar,const void * data,unsigned size)
WriterState ./lib/ccsv/include/ccsv.h 138;" enum
WriterState ./lib/ccsv/include/ccsv.h 144;" typedef typeref:enum:WriterState
WRITER_NOT_STARTED ./lib/ccsv/include/ccsv.h 140;" enumerator enum:WriterState
WRITER_ROW_END ./lib/ccsv/include/ccsv.h 143;" enumerator enum:WriterState
WRITER_ROW_START ./lib/ccsv/include/ccsv.h 141;" enumerator enum:WriterState
WRITER_WRITING_FIELD ./lib/ccsv/include/ccsv.h 142;" enumerator enum:WriterState
WRITE_ENDED ./lib/ccsv/include/ccsv.h 92;" macro
WRITE_ERALWRITING ./lib/ccsv/include/ccsv.h 96;" macro
WRITE_ERINVALID ./lib/ccsv/include/ccsv.h 95;" macro
WRITE_ERNOMEM ./lib/ccsv/include/ccsv.h 94;" macro
WRITE_ERNOTSTARTED ./lib/ccsv/include/ccsv.h 93;" macro
write_null_bytes ./lib/microtar/src/microtar.c 77;" function typeref:typename:int file: signature:(mtar_t * tar,int n)
write_row ./lib/ccsv/include/ccsv.h 331;" prototype typeref:typename:int signature:(FILE * fp,ccsv_writer * writer,ccsv_row row)
write_row ./lib/ccsv/src/ccsv.c 1027;" function typeref:typename:int signature:(FILE * fp,ccsv_writer * writer,ccsv_row row)
write_row_from_array ./lib/ccsv/include/ccsv.h 345;" prototype typeref:typename:int signature:(FILE * fp,ccsv_writer * writer,char ** fields,int row_len)
write_row_from_array ./lib/ccsv/src/ccsv.c 1034;" function typeref:typename:int signature:(FILE * fp,ccsv_writer * writer,char ** fields,int row_len)
WRITE_STARTED ./lib/ccsv/include/ccsv.h 91;" macro
write_status ./lib/ccsv/include/ccsv.h 196;" member struct:ccsv_writer typeref:typename:short
WRITE_SUCCESS ./lib/ccsv/include/ccsv.h 90;" macro
Writing ./lib/microtar/README.md 36;" subsubsection section:microtar""Basic Usage
Writing ./lib/microtar/README.md 89;" subsubsection section:microtar""Wrapping a stream
You can find more examples in the `examples` folder ./lib/ccsv/README.md 107;" subsubsection section:ccsv""Example
_free_multiple ./lib/ccsv/include/ccsv.h 397;" prototype typeref:typename:void signature:(int num,...)
_free_multiple ./lib/ccsv/src/ccsv.c 244;" function typeref:typename:void signature:(int num,...)
_get_object_type ./lib/ccsv/include/ccsv.h 358;" prototype typeref:typename:int signature:(void * obj)
_get_object_type ./lib/ccsv/src/ccsv.c 64;" function typeref:typename:int signature:(void * obj)
_is_buffer_empty ./lib/ccsv/include/ccsv.h 387;" prototype typeref:typename:int signature:(ccsv_reader * reader)
_is_buffer_empty ./lib/ccsv/src/ccsv.c 946;" function typeref:typename:int signature:(ccsv_reader * reader)
_kospm_csv_col_cmp ./src/kospm_csv.c 34;" function typeref:typename:int signature:(kospm_csv_header_col * column,char * name)
_kospm_files_table_read ./src/kospm_pkglist.c 51;" function typeref:typename:kospm_list_t * signature:(char * file_path)
_kospm_files_table_write ./src/kospm_pkglist.c 92;" function typeref:typename:int signature:(kospm_pkg_list_t * pkg_list,char * file_path)
_kospm_meta_table_read ./src/kospm_pkglist.c 31;" function typeref:typename:kospm_list_t * signature:(char * file_path)
_kospm_meta_table_write ./src/kospm_pkglist.c 71;" function typeref:typename:int signature:(kospm_pkg_list_t * pkg_list,char * file_path)
_kospm_pkg_file_free ./src/kospm_pkglist.c 171;" function typeref:typename:void signature:(kospm_pkg_file_t * pkg_file)
_kospm_pkg_meta_free ./src/kospm_pkglist.c 165;" function typeref:typename:void signature:(kospm_pkg_meta_t * pkg_meta)
_next ./lib/ccsv/include/ccsv.h 382;" prototype typeref:typename:ccsv_row * signature:(FILE * fp,ccsv_reader * reader)
_next ./lib/ccsv/src/ccsv.c 694;" function typeref:typename:ccsv_row * signature:(FILE * fp,ccsv_reader * reader)
_padding ./lib/microtar/src/microtar.c 40;" member struct:__anon2ac420210108 typeref:typename:char[255] file:
_read_row ./lib/ccsv/include/ccsv.h 370;" prototype typeref:typename:ccsv_row * signature:(FILE * fp,ccsv_reader * reader)
_read_row ./lib/ccsv/src/ccsv.c 429;" function typeref:typename:ccsv_row * signature:(FILE * fp,ccsv_reader * reader)
_same_pkgname ./src/kospm_pkgdb.c 64;" function typeref:typename:int signature:(void * struc,char * name)
_write_field ./lib/ccsv/include/ccsv.h 412;" prototype typeref:typename:int signature:(FILE * fp,ccsv_writer * writer,const char * string)
_write_field ./lib/ccsv/src/ccsv.c 1127;" function typeref:typename:int signature:(FILE * fp,ccsv_writer * writer,const char * string)
_write_row_end ./lib/ccsv/include/ccsv.h 438;" prototype typeref:typename:int signature:(FILE * fp,ccsv_writer * writer)
_write_row_end ./lib/ccsv/src/ccsv.c 1099;" function typeref:typename:int signature:(FILE * fp,ccsv_writer * writer)
_write_row_start ./lib/ccsv/include/ccsv.h 425;" prototype typeref:typename:int signature:(FILE * fp,ccsv_writer * writer)
_write_row_start ./lib/ccsv/src/ccsv.c 1052;" function typeref:typename:int signature:(FILE * fp,ccsv_writer * writer)
__anon1f1fcb200108 ./include/kospm_csv.h 44;" struct
__anon1f1fcb200208 ./include/kospm_csv.h 49;" struct
__anon2ac420210108 ./lib/microtar/src/microtar.c 30;" struct file:
__anon2ac420260103 ./lib/microtar/src/microtar.h 21;" enum
__anon2ac420260203 ./lib/microtar/src/microtar.h 33;" enum
__anon2ac420260308 ./lib/microtar/src/microtar.h 43;" struct
__anon7ad9ca760108 ./include/kospm_pkgfile.h 7;" struct
__anon88dcd4b20108 ./include/kospm_pkglist.h 31;" struct
__anon88dcd4b20208 ./include/kospm_pkglist.h 36;" struct
__anon88dcd4b20308 ./include/kospm_pkglist.h 44;" struct
__anon8ae9d6dd0108 ./include/kospm_pkgmeta.h 7;" struct
__buffer ./lib/ccsv/include/ccsv.h 167;" member struct:ccsv_reader typeref:typename:char *
__buffer_allocated ./lib/ccsv/include/ccsv.h 170;" member struct:ccsv_reader typeref:typename:bool
__buffer_pos ./lib/ccsv/include/ccsv.h 168;" member struct:ccsv_reader typeref:typename:size_t
__buffer_size ./lib/ccsv/include/ccsv.h 169;" member struct:ccsv_reader typeref:typename:size_t
__comment_char ./lib/ccsv/include/ccsv.h 162;" member struct:ccsv_reader typeref:typename:char
__delim ./lib/ccsv/include/ccsv.h 160;" member struct:ccsv_reader typeref:typename:char
__delim ./lib/ccsv/include/ccsv.h 191;" member struct:ccsv_writer typeref:typename:char
__escape_char ./lib/ccsv/include/ccsv.h 163;" member struct:ccsv_reader typeref:typename:char
__escape_char ./lib/ccsv/include/ccsv.h 193;" member struct:ccsv_writer typeref:typename:char
__fp ./lib/ccsv/include/ccsv.h 171;" member struct:ccsv_reader typeref:typename:FILE *
__fp ./lib/ccsv/include/ccsv.h 195;" member struct:ccsv_writer typeref:typename:FILE *
__quote_char ./lib/ccsv/include/ccsv.h 161;" member struct:ccsv_reader typeref:typename:char
__quote_char ./lib/ccsv/include/ccsv.h 192;" member struct:ccsv_writer typeref:typename:char
__skip_comments ./lib/ccsv/include/ccsv.h 166;" member struct:ccsv_reader typeref:typename:int
__skip_empty_lines ./lib/ccsv/include/ccsv.h 165;" member struct:ccsv_reader typeref:typename:int
__skip_initial_space ./lib/ccsv/include/ccsv.h 164;" member struct:ccsv_reader typeref:typename:int
__state ./lib/ccsv/include/ccsv.h 194;" member struct:ccsv_writer typeref:typename:WriterState

58
lib/ccsv/.gitignore vendored
View File

@@ -1,58 +0,0 @@
/.vscode
/.vs
tests/write_test.c
rough*.c
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf

View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2023 Ayush Tripathy
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,117 +0,0 @@
# ccsv
Fast, flexible, easy-to-use CSV reading, writing library for C
For full documentation, see the [docs](https://github.com/Ayush-Tripathy/ccsv/tree/main/docs)
## Usage
### Create a reader object
```c
ccsv_reader *reader = ccsv_init_reader(NULL); // NULL for default options
```
### Create a reader object with custom options
```c
ccsv_reader_options options = {
.delim = ',',
.quote_char = '"',
.skip_initial_space = 0,
.skip_empty_lines = 1,
.skip_comments = 1};
// Initialize the reader with the options
ccsv_reader *reader = ccsv_init_reader(&options);
```
### Read a row with
```c
CSVRow *row = read_row(fp, reader); // Will return NULL if all rows are read
```
`fp` is a FILE pointer to the CSV file you want to read
`reader` is a ccsv_reader object
### Get the number of fields in a row with
```c
int row_len = row->fields_count;
```
### Get a field from a row with
```c
char *field = row->fields[0]; // 0 for the first field
```
### Free the memory allocated to a row with
```c
free_row(row);
```
### Free the memory allocated to the reader with
```c
free(reader);
```
## Example
```c
#include <stdio.h>
#include <stdlib.h>
#include "ccsv.h"
int main(void)
{
FILE *fp = fopen("../../ign.csv", "r"); // Specify the path to your file
if (fp == NULL)
{
printf("Error opening file\n");
exit(1);
}
// Reader object
ccsv_reader *reader = ccsv_init_reader(NULL); // NULL for default options
CSVRow *row;
// Read each row and print each field
while ((row = read_row(fp, reader)) != NULL)
{
int row_len = row->fields_count; // Get number of fields in the row
for (int i = 0; i < row_len; i++)
{
printf("%d.Field: %s\n", i + 1, row->fields[i]); // Print each field
}
printf("\n");
free_row(row); // Free the memory allocated to the row
}
printf("\n\nRows read: %d\n", reader->rows_read); // Print number of rows read
free(reader); // Free the memory allocated to the reader
fclose(fp);
return 0;
}
```
#### You can find more examples in the `examples` folder
Compile with `make ./example_file_name`
For full documentation, see the [docs](https://github.com/Ayush-Tripathy/ccsv/tree/main/docs)
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE)
## Feel free to contribute!

Binary file not shown.

View File

@@ -1,46 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ccsv.h"
int main(int argc, char *argv[])
{
clock_t start = clock();
if (argc != 2)
{
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
return 1;
}
char *filename = argv[1];
ccsv_reader_options options = {.skip_initial_space = 1, .skip_empty_lines = 0};
ccsv_reader *reader = ccsv_open(filename, CCSV_READER, "r", &options, NULL);
if (reader == NULL || ccsv_is_error(reader, NULL))
{
fprintf(stderr, "Error initializing CSV reader\n");
return 1;
}
ccsv_row *row;
size_t fields_count = 0;
while ((row = ccsv_next(reader)) != NULL)
{
fields_count += row->fields_count;
ccsv_free_row(row);
}
printf("%s: %d rows, %ld fields\n", argv[1], reader->rows_read, fields_count);
ccsv_close(reader);
clock_t end = clock();
double time_spent = (double)(end - start) / CLOCKS_PER_SEC;
printf("Time taken: %lf seconds\n", time_spent);
return 0;
}

View File

@@ -1,68 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ccsv.h"
int main(int argc, char *argv[])
{
clock_t start = clock();
if (argc != 2)
{
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
return 1;
}
char *filename = argv[1];
ccsv_reader *reader = ccsv_init_reader(NULL, NULL);
if (reader == NULL || reader == (void *)CCSV_ERNOMEM)
{
fprintf(stderr, "Error initializing CSV reader\n");
return 1;
}
FILE *file = fopen(filename, "r");
if (file == NULL)
{
fprintf(stderr, "Error opening file\n");
free(reader);
return 1;
}
FILE *output = fopen("output.csv", "w+");
if (output == NULL)
{
fprintf(stderr, "Error opening file\n");
free(reader);
fclose(file);
return 1;
}
ccsv_writer *writer = ccsv_init_writer(NULL, NULL);
ccsv_row *row;
size_t fields_count = 0;
while ((row = read_row(file, reader)) != NULL)
{
fields_count += row->fields_count;
write_row(output, writer, *row);
ccsv_free_row(row);
}
printf("%s - %d rows, %ld fields\n", argv[1], reader->rows_read, fields_count);
printf("Output written to output.csv\n");
fclose(file);
fclose(output);
free(reader);
free(writer);
clock_t end = clock();
double time_spent = (double)(end - start) / CLOCKS_PER_SEC;
printf("Time taken: %lf seconds\n", time_spent);
return 0;
}

View File

@@ -1,52 +0,0 @@
#include <stdio.h>
#include <time.h>
#include "ccsv.h"
int main(int argc, char **argv)
{
clock_t start = clock();
if (argc != 3)
{
fprintf(stderr, "Usage: %s <source> <destination>\n", argv[0]);
return 1;
}
char *source = argv[1];
char *destination = argv[2];
ccsv_reader *reader = ccsv_open(source, CCSV_READER, "r", NULL, NULL);
if (reader == NULL)
{
fprintf(stderr, "Error initializing CSV reader\n");
return 1;
}
ccsv_writer *writer = ccsv_open(destination, CCSV_WRITER, "w+", NULL, NULL);
if (writer == NULL)
{
fprintf(stderr, "Error initializing CSV writer\n");
return 1;
}
ccsv_row *row;
while ((row = ccsv_next(reader)) != NULL)
{
ccsv_write(writer, *row);
ccsv_free_row(row);
}
printf("Rows read: %d\n", reader->rows_read);
printf("CSV file written to %s\n", destination);
ccsv_close(reader);
ccsv_close(writer);
clock_t end = clock();
double time_spent = (double)(end - start) / CLOCKS_PER_SEC;
printf("Time taken: %lf seconds\n", time_spent);
return 0;
}

View File

@@ -1,57 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "../include/ccsv.h"
int main(void)
{
FILE *csv_file = fopen("../../ign.csv", "r");
if (csv_file == NULL)
{
perror("Error opening file");
return 1;
}
ccsv_reader_options options = {
.delim = ',', // Example delimiter, change according to your CSV file
.quote_char = '"',
.skip_initial_space = 0,
// Add other options if necessary
};
ccsv_reader *reader = ccsv_init_reader(&options, NULL);
if (reader == NULL || ccsv_is_error(reader, NULL))
{
fprintf(stderr, "Error initializing CSV reader\n");
fclose(csv_file);
return 1;
}
ccsv_row *row;
short err_status;
while (1)
{
row = read_row(csv_file, reader);
if (row == NULL && ccsv_is_error(reader, &err_status))
{
if (err_status == CCSV_ERNOMEM)
fprintf(stderr, "Memory allocation failure while reading row\n");
break;
}
int fields_count = row->fields_count;
for (int i = 0; i < fields_count; ++i)
{
printf("%s\t", row->fields[i]);
}
printf("\n");
ccsv_free_row(row);
}
printf("\n\nRows read: %d\n", reader->rows_read);
fclose(csv_file);
free(reader);
return 0;
}

View File

@@ -1,8 +0,0 @@
CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -I../include
%: %.c
$(CC) $(CFLAGS) -o $@.out $< ../src/ccsv.c
clean:
rm -f *.out

View File

@@ -1,50 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "../include/ccsv.h"
int main(void)
{
// ** There is new way to read rows in ccsv v0.5.0 **
// ** Check examples/print_each_row_ccsv_v0.5.c **
FILE *fp = fopen("../../ign.csv", "r"); // Specify the path to your file
if (fp == NULL)
{
printf("Error opening file\n");
exit(1);
}
// Reader object
ccsv_reader *reader = ccsv_init_reader(NULL, NULL); // NULL for default options
/*
Default options:
delim = ','
quote_char = '"'
skip_initial_space = 0
skip_empty_lines = 0
skip_comments = 0
*/
ccsv_row *row;
// Read each row and print each field
while ((row = read_row(fp, reader)) != NULL)
{
int row_len = row->fields_count; // Get number of fields in the row
for (int i = 0; i < row_len; i++)
{
printf("%d.Field: %s\n", i + 1, row->fields[i]); // Print each field
}
printf("\n");
ccsv_free_row(row); // Free the memory allocated to the row
}
printf("\n\nRows read: %d\n", reader->rows_read); // Print number of rows read
free(reader); // Free the memory allocated to the reader
fclose(fp);
return 0;
}

View File

@@ -1,41 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "../include/ccsv.h"
int main(void)
{
ccsv_reader_options options = {
.delim = ',',
.quote_char = '"',
.skip_comments = 1,
.skip_initial_space = 0,
.skip_empty_lines = 0,
};
// Reader object
ccsv_reader *reader = ccsv_open("../../comments.csv", CCSV_READER, "r", &options, NULL); // NULL for default options
if (reader == NULL)
{
fprintf(stderr, "Error initializing CSV reader\n");
return 1;
}
ccsv_row *row;
// Read each row and print each field
while ((row = ccsv_next(reader)) != NULL)
{
int row_len = row->fields_count; // Get number of fields in the row
for (int i = 0; i < row_len; i++)
{
printf("%d.Field: %s\n", i + 1, row->fields[i]); // Print each field
}
printf("\n");
ccsv_free_row(row); // Free the memory allocated to the row
}
printf("\n\nRows read: %d\n", reader->rows_read); // Print number of rows read
ccsv_close(reader); // Close the reader
return 0;
}

View File

@@ -1,35 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "../include/ccsv.h"
int main(void)
{
FILE *fp = fopen("../../ign.csv", "r"); // Specify the path to your file
if (fp == NULL)
{
printf("Error opening file\n");
exit(1);
}
// ** There is new way to read rows in ccsv v0.5.0 **
// ** Check examples/print_each_row_ccsv_v0.5.c **
// Reader object
ccsv_reader *reader = ccsv_init_reader(NULL, NULL); // NULL for default options
ccsv_row *row = read_row(fp, reader);
int row_len = row->fields_count; // Get number of fields in the row
for (int i = 0; i < row_len; i++)
{
printf("%d.Field: %s\n", i + 1, row->fields[i]); // Print each field
}
ccsv_free_row(row); // Free the memory allocated to the row
free(reader); // Free the memory allocated to the reader
fclose(fp);
return 0;
}

View File

@@ -1,56 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "../include/ccsv.h"
int main(void)
{
FILE *fp = fopen("../../ign.csv", "r"); // Specify the path to your file
if (fp == NULL)
{
printf("Error opening file\n");
exit(1);
}
/*
------- Way 1 -------
ccsv_reader_options *options = (ccsv_reader_options *)malloc(sizeof(ccsv_reader_options));
options->delim = ',';
options->quote_char = '"';
options->skip_initial_space = 0;
*/
/* OR */
ccsv_reader_options options = {
.delim = ',',
.quote_char = '"',
.skip_initial_space = 0,
.skip_empty_lines = 1,
.skip_comments = 1};
// Reader object
ccsv_reader *reader = ccsv_init_reader(&options, NULL); // NULL for default options
// free(options); /* If you used Way 1 */
ccsv_row *row;
// Read each row and print each field
while ((row = read_row(fp, reader)) != NULL)
{
int row_len = row->fields_count; // Get number of fields in the row
for (int i = 0; i < row_len; i++)
{
printf("%s\t", row->fields[i]); // Print each field
}
printf("\n");
ccsv_free_row(row); // Free the memory allocated to the row
}
printf("\n\nRows read: %d\n", reader->rows_read); // Print number of rows read
free(reader); // Free the memory allocated to the reader
fclose(fp);
return 0;
}

View File

@@ -1,50 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "ccsv.h"
int main(void)
{
// Initialize ccsv_writer_options
ccsv_writer_options options = {
.delim = ',',
.quote_char = '"'
// Add other options if necessary
};
// Initialize the writer
ccsv_writer *writer = ccsv_init_writer(&options, NULL);
if (writer == NULL)
{
fprintf(stderr, "Error initializing CSV writer\n");
return 1;
}
FILE *file = fopen("output.csv", "w+");
if (file == NULL)
{
fprintf(stderr, "Error opening file\n");
free(writer);
return 1;
}
CCSV_WRITE_ROW_START(file, writer); // Write row start
CCSV_WRITE_FIELD(file, writer, "hi"); // Write field
CCSV_WRITE_FIELD(file, writer, "hello, world!"); // Write field
CCSV_WRITE_FIELD(file, writer, "\"escapedword\""); // Write field
CCSV_WRITE_ROW_END(file, writer, NULL); // Write row end
short err_status;
if (ccsv_is_error(writer, &err_status))
{
fprintf(stderr, "Error writing CSV row from string: %s\n", ccsv_get_status_message(err_status));
fclose(file);
free(writer);
return 1;
}
fclose(file);
free(writer);
return 0;
}

View File

@@ -1,64 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "ccsv.h"
int main(void)
{
// Initialize ccsv_writer_options
ccsv_writer_options options = {
.delim = ',',
.quote_char = '"'
// Add other options if necessary
};
// Initialize the writer
ccsv_writer *writer = ccsv_init_writer(&options, NULL);
if (writer == NULL)
{
fprintf(stderr, "Error initializing CSV writer\n");
return 1;
}
ccsv_reader *reader = ccsv_init_reader(NULL, NULL);
FILE *dest_file = fopen("output.csv", "a+");
if (dest_file == NULL)
{
fprintf(stderr, "Error opening file\n");
free(writer);
return 1;
}
FILE *source_file = fopen("../../ign.csv", "r");
if (source_file == NULL)
{
fprintf(stderr, "Error opening file\n");
free(writer);
return 1;
}
ccsv_row *row = read_row(source_file, reader);
write_row(dest_file, writer, *row); // Pass the value of the row pointer
ccsv_free_row(row); // Free the row
row = read_row(source_file, reader); // Read the next row
write_row(dest_file, writer, *row); // Write row to file
ccsv_free_row(row); // Free the row
if (ccsv_is_error(writer, NULL))
{
fprintf(stderr, "Error writing CSV row.\n");
fclose(dest_file);
fclose(source_file);
free(reader);
free(writer);
return 1;
}
fclose(dest_file);
fclose(source_file);
free(reader);
free(writer);
return 0;
}

View File

@@ -1,47 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "../include/ccsv.h"
int main(void)
{
// Initialize ccsv_writer_options
ccsv_writer_options options = {
.delim = ',',
.quote_char = '"'
// Add other options if necessary
};
// Initialize the writer
ccsv_writer *writer = ccsv_init_writer(&options, NULL);
if (writer == NULL)
{
fprintf(stderr, "Error initializing CSV writer\n");
return 1;
}
FILE *file = fopen("output.csv", "a+");
if (file == NULL)
{
fprintf(stderr, "Error opening file\n");
free(writer);
return 1;
}
char *row_string[] = {"hi", "hello", "hello, world!", "\"escapedword\"", "hola", "bonjour"};
write_row_from_array(file, writer, row_string, ARRAY_LEN(row_string)); /* Write row to file */
short err_status;
if (ccsv_is_error(writer, &err_status))
{
fprintf(stderr, "Error writing CSV row from string: %s\n", ccsv_get_status_message(err_status));
fclose(file);
free(writer);
return 1;
}
fclose(file);
free(writer);
return 0;
}

View File

@@ -1,442 +0,0 @@
// File: ccsv.h
// Created: 2023 by Ayush Tripathy
// github.com/Ayush-Tripathy
/*
* CCSV - A CSV parser and writer library for C.
* Version: 0.1
*
* For full documentation, see the README.md file.
*/
/*
MIT License
Copyright (c) 2023 Ayush Tripathy
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
#pragma once
#include <stdio.h>
#include <stdbool.h>
#define CCSV_VERSION 0.1f
#ifdef __cplusplus
extern "C"
{
#endif
// File sizes
#define CCSV_LARGE_FILE_SIZE 524288000ULL /* 500 MiB */
#define CCSV_MED_FILE_SIZE 20971520ULL /* 20 MiB */
// Buffer sizes
#define CCSV_HIGH_BUFFER_SIZE 65536 /* 64 KiB */
#define CCSV_MED_BUFFER_SIZE 16384 /* 16 KiB */
#define CCSV_LOW_BUFFER_SIZE 2048 /* 2 KiB */
#define CCSV_BUFFER_SIZE 8096
#define MAX_FIELD_SIZE 256
// Default values
#define CCSV_DELIMITER 0x2c
#define CCSV_QUOTE_CHAR 0x22
#define CCSV_CR 0x0d
#define CCSV_LF 0x0a
#define CCSV_SPACE 0x20
#define CCSV_TAB 0x09
#define CCSV_COMMENT_CHAR 0x23
#define CCSV_NULL_CHAR 0x00
#define DEFAULT_DELIMITER CCSV_DELIMITER
#define DEFAULT_QUOTE_CHAR CCSV_QUOTE_CHAR
#define DEFAULT_ESCAPE_CHAR CCSV_QUOTE_CHAR
#define DEFAULT_COMMENT_CHAR CCSV_COMMENT_CHAR
#define TOTAL_ERROR_MESSAGES 7
// Return codes
#define CCSV_SUCCESS 0
#define CCSV_ERROR -1
#define CCSV_ERNOMEM -2
#define CCSV_ERINVALID -3
#define CCSV_ERNULLFP -6 /* File pointer is NULL */
#define CCSV_ERMODE -7 /* Invalid mode */
#define CCSV_EROPEN -8 /* Error opening file */
#define CCSV_ERINVOBJTYPE -9 /* Invalid object type */
#define CCSV_ERNULLROW -10 /* Row is NULL */
#define CCSV_ERBUFNTALLOC -11 /* Buffer not allocated */
#define WRITE_SUCCESS CCSV_SUCCESS
#define WRITE_STARTED 1
#define WRITE_ENDED 2
#define WRITE_ERNOTSTARTED -4 /* Writer not started */
#define WRITE_ERNOMEM CCSV_ERNOMEM
#define WRITE_ERINVALID CCSV_ERINVALID
#define WRITE_ERALWRITING -5 /* Already writing field */
// Object types
#define CCSV_READER 21
#define CCSV_WRITER 22
#define ARRAY_LEN(array) sizeof(array) / sizeof(array[0])
// Writer Macros
/* Start new row */
#define CCSV_WRITE_ROW_START(fp, writer) _write_row_start(fp, writer)
/* Write field */
#define CCSV_WRITE_FIELD(fp, writer, string) \
if (writer->__state == WRITER_ROW_START) \
{ \
writer->__state = WRITER_WRITING_FIELD; \
} \
else \
{ \
fputc(writer->__delim, fp); \
} \
_write_field(fp, writer, string);
/* End row, with an additional field */
#define CCSV_WRITE_ROW_END(fp, writer, last_field) \
if (last_field) \
{ \
_write_field(fp, writer, last_field); \
} \
_write_row_end(fp, writer);
typedef enum State
{
FIELD_START, /* Start of field */
FIELD_NOT_STARTED, /* Spaces before field start */
FIELD_END, /* End of field */
FIELD_STARTED, /* Inside field */
INSIDE_QUOTED_FIELD, /* Inside quoted field */
MAY_BE_ESCAPED /* Quote char detected inside quoted field */
} State;
typedef enum WriterState
{
WRITER_NOT_STARTED, /* Writer not started */
WRITER_ROW_START, /* Writer setup done */
WRITER_WRITING_FIELD, /* Field writing started */
WRITER_ROW_END /* Row writing ended */
} WriterState;
typedef struct ccsv_reader_options
{
char delim;
char quote_char;
char comment_char;
char escape_char;
int skip_initial_space;
int skip_empty_lines;
int skip_comments;
} ccsv_reader_options;
typedef struct ccsv_reader
{
int rows_read;
char __delim;
char __quote_char;
char __comment_char;
char __escape_char;
int __skip_initial_space;
int __skip_empty_lines;
int __skip_comments;
char *__buffer;
size_t __buffer_pos;
size_t __buffer_size;
bool __buffer_allocated;
FILE *__fp;
short status;
short object_type;
} ccsv_reader;
typedef struct ccsv_row
{
char **fields;
int fields_count;
} ccsv_row;
typedef struct ccsv_writer_options
{
char delim;
char quote_char;
char escape_char;
} ccsv_writer_options;
typedef struct ccsv_writer
{
char __delim;
char __quote_char;
char __escape_char;
WriterState __state;
FILE *__fp;
short write_status;
short object_type;
} ccsv_writer;
// Public functions ------------------------------------------------------------------------
/* -------- General -------- */
/*
* This function opens a file and attaches it with specified object.
*
* returns:
* void*: pointer to the object
*/
void *ccsv_open(const char *filename, short object_type, const char *mode, void *options, short *status);
/*
* This function closes the ccsv object (reader or writer).
*
* params:
* obj: pointer to the object
*/
void ccsv_close(void *obj);
/*
* This function returns the status message for the given status code.
*
* params:
* status: status code
*
* returns:
* char*: pointer to the status message
*/
const char *ccsv_get_status_message(short status);
/*
* This function returns if error occurred in the object.
*
* params:
* obj: pointer to the object
*
* returns:
* int: 1, if error occurred
* int: 0, if no error occurred
*/
int ccsv_is_error(void *obj, short *status);
/* -------- Reader -------- */
/*
* This function initializes the parser with the given parameters, and
* returns a pointer to the parser.
*
* params:
* options: pointer to the reader options struct
*
* returns:
* ccsv_reader*: pointer to the reader
*/
ccsv_reader *ccsv_init_reader(ccsv_reader_options *options, short *status);
/*
* This function reads a row from the file pointer, and returns a pointer
* to CSVRow struct.
*
* params:
* fp: file pointer
* parser: pointer to the parser
*
* returns:
* CSVRow*: pointer to the CSVRow struct
*/
ccsv_row *read_row(FILE *fp, ccsv_reader *parser);
/*
* This function reads a row from reader, and returns a pointer
* to CSVRow struct.
*
* params:
* reader: pointer to the reader
*
* returns:
* CSVRow*: pointer to the CSVRow struct
*/
ccsv_row *ccsv_next(ccsv_reader *reader);
/*
* This function frees the memory allocated to the CSVRow struct.
*
* params:
* row: pointer to the CSVRow struct
*/
void ccsv_free_row(ccsv_row *row);
/* -------- Writer -------- */
/*
* This function initializes the writer with the given parameters, and
* returns a pointer to the writer.
*
* params:
* options: pointer to the writer options struct
*
* returns:
* ccsv_writer*: pointer to the writer
*
*/
ccsv_writer *ccsv_init_writer(ccsv_writer_options *options, short *status);
/*
* This function writes a row (from CSVRow struct) to the file pointer.
*/
int ccsv_write(ccsv_writer *writer, ccsv_row row);
/*
* This function writes a row (from string array) to the file pointer.
*
* params:
* writer: pointer to the writer
* row_string: pointer to the row string
*
* returns:
* int: 0, if successful
* CSV_ERNOMEM, if memory allocation failed
*/
int ccsv_write_from_array(ccsv_writer *writer, char **fields, int fields_len);
/*
* This function writes a row (from CSVRow struct) to the file pointer.
*
* params:
* fp: file pointer
* writer: pointer to the writer
* row: CSVRow struct
*/
int write_row(FILE *fp, ccsv_writer *writer, ccsv_row row);
/*
*This function writes a row (from string array) to the file pointer.
*
* params:
* fp: file pointer
* writer: pointer to the writer
* row_string: pointer to the row string
*
* returns:
* int: 0, if successful
* CSV_ERNOMEM, if memory allocation failed
*/
int write_row_from_array(FILE *fp, ccsv_writer *writer, char **fields, int row_len);
// Private functions -----------------------------------------------------------------------
/*
* This function returns the object type of the object.
*
* params:
* obj: pointer to the object
*
* returns:
* int: object type
*/
int _get_object_type(void *obj);
/*
* This function reads a row from the file pointer, and returns a pointer to CSVRow struct.
*
* params:
* fp: file pointer
* reader: pointer to the reader
*
* returns:
* CSVRow*: pointer to the CSVRow struct
*/
ccsv_row *_read_row(FILE *fp, ccsv_reader *reader);
/*
* This function reads a row from the file pointer, and returns a pointer to CSVRow struct.
*
* params:
* fp: file pointer
* reader: pointer to the reader
*
* returns:
* CSVRow*: pointer to the CSVRow struct
*/
ccsv_row *_next(FILE *fp, ccsv_reader *reader);
/*
* This functions checks if the reader buffer is empty.
*/
int _is_buffer_empty(ccsv_reader *reader);
/*
*This function frees multiple pointers.
*
* params:
* num: number of pointers to free
* ...: pointers to free
*
*/
void _free_multiple(int num, ...);
/*
* This function writes a field to the file pointer.
*
* params:
* fp: file pointer
* writer: pointer to the writer
* string: pointer to the string
* string_len: length of the string
* string_pos: pointer to the position of the string
*
* returns:
* size_t: number of characters written
*/
int _write_field(FILE *fp, ccsv_writer *writer, const char *string);
/*
*This function writes a row start to the file pointer.
*
* params:
* fp: file pointer
* writer: pointer to the writer
*
* returns:
* int: WRITE_STARTED, if successful
* int: WRITE_ERALWRITING, if already writing field
*/
int _write_row_start(FILE *fp, ccsv_writer *writer);
/*
* This function writes a row end to the file pointer.
*
* params:
* fp: file pointer
* writer: pointer to the writer
*
* returns:
* int: WRITE_ENDED, if successful
* int: WRITE_ERNOTSTARTED, if writer not started
*/
int _write_row_end(FILE *fp, ccsv_writer *writer);
#ifdef __cplusplus
}
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +0,0 @@
CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -I../include
%: %.c
$(CC) $(CFLAGS) -o $@.out $< ../src/ccsv.c
clean:
rm -f *.out

View File

@@ -1,9 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "ccsv.h"
int main(void)
{
return 0;
}

View File

@@ -1,19 +0,0 @@
Copyright (c) 2017 rxi
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,99 +0,0 @@
# microtar
A lightweight tar library written in ANSI C
## Basic Usage
The library consists of `microtar.c` and `microtar.h`. These two files can be
dropped into an existing project and compiled along with it.
#### Reading
```c
mtar_t tar;
mtar_header_t h;
char *p;
/* Open archive for reading */
mtar_open(&tar, "test.tar", "r");
/* Print all file names and sizes */
while ( (mtar_read_header(&tar, &h)) != MTAR_ENULLRECORD ) {
printf("%s (%d bytes)\n", h.name, h.size);
mtar_next(&tar);
}
/* Load and print contents of file "test.txt" */
mtar_find(&tar, "test.txt", &h);
p = calloc(1, h.size + 1);
mtar_read_data(&tar, p, h.size);
printf("%s", p);
free(p);
/* Close archive */
mtar_close(&tar);
```
#### Writing
```c
mtar_t tar;
const char *str1 = "Hello world";
const char *str2 = "Goodbye world";
/* Open archive for writing */
mtar_open(&tar, "test.tar", "w");
/* Write strings to files `test1.txt` and `test2.txt` */
mtar_write_file_header(&tar, "test1.txt", strlen(str1));
mtar_write_data(&tar, str1, strlen(str1));
mtar_write_file_header(&tar, "test2.txt", strlen(str2));
mtar_write_data(&tar, str2, strlen(str2));
/* Finalize -- this needs to be the last thing done before closing */
mtar_finalize(&tar);
/* Close archive */
mtar_close(&tar);
```
## Error handling
All functions which return an `int` will return `MTAR_ESUCCESS` if the operation
is successful. If an error occurs an error value less-than-zero will be
returned; this value can be passed to the function `mtar_strerror()` to get its
corresponding error string.
## Wrapping a stream
If you want to read or write from something other than a file, the `mtar_t`
struct can be manually initialized with your own callback functions and a
`stream` pointer.
All callback functions are passed a pointer to the `mtar_t` struct as their
first argument. They should return `MTAR_ESUCCESS` if the operation succeeds
without an error, or an integer below zero if an error occurs.
After the `stream` field has been set, all required callbacks have been set and
all unused fields have been zeroset the `mtar_t` struct can be safely used with
the microtar functions. `mtar_open` *should not* be called if the `mtar_t`
struct was initialized manually.
#### Reading
The following callbacks should be set for reading an archive from a stream:
Name | Arguments | Description
--------|------------------------------------------|---------------------------
`read` | `mtar_t *tar, void *data, unsigned size` | Read data from the stream
`seek` | `mtar_t *tar, unsigned pos` | Set the position indicator
`close` | `mtar_t *tar` | Close the stream
#### Writing
The following callbacks should be set for writing an archive to a stream:
Name | Arguments | Description
--------|------------------------------------------------|---------------------
`write` | `mtar_t *tar, const void *data, unsigned size` | Write data to the stream
## License
This library is free software; you can redistribute it and/or modify it under
the terms of the MIT license. See [LICENSE](LICENSE) for details.

View File

@@ -1,376 +0,0 @@
/*
* Copyright (c) 2017 rxi
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include "microtar.h"
typedef struct {
char name[100];
char mode[8];
char owner[8];
char group[8];
char size[12];
char mtime[12];
char checksum[8];
char type;
char linkname[100];
char _padding[255];
} mtar_raw_header_t;
static unsigned round_up(unsigned n, unsigned incr) {
return n + (incr - n % incr) % incr;
}
static unsigned checksum(const mtar_raw_header_t* rh) {
unsigned i;
unsigned char *p = (unsigned char*) rh;
unsigned res = 256;
for (i = 0; i < offsetof(mtar_raw_header_t, checksum); i++) {
res += p[i];
}
for (i = offsetof(mtar_raw_header_t, type); i < sizeof(*rh); i++) {
res += p[i];
}
return res;
}
static int tread(mtar_t *tar, void *data, unsigned size) {
int err = tar->read(tar, data, size);
tar->pos += size;
return err;
}
static int twrite(mtar_t *tar, const void *data, unsigned size) {
int err = tar->write(tar, data, size);
tar->pos += size;
return err;
}
static int write_null_bytes(mtar_t *tar, int n) {
int i, err;
char nul = '\0';
for (i = 0; i < n; i++) {
err = twrite(tar, &nul, 1);
if (err) {
return err;
}
}
return MTAR_ESUCCESS;
}
static int raw_to_header(mtar_header_t *h, const mtar_raw_header_t *rh) {
unsigned chksum1, chksum2;
/* If the checksum starts with a null byte we assume the record is NULL */
if (*rh->checksum == '\0') {
return MTAR_ENULLRECORD;
}
/* Build and compare checksum */
chksum1 = checksum(rh);
sscanf(rh->checksum, "%o", &chksum2);
if (chksum1 != chksum2) {
return MTAR_EBADCHKSUM;
}
/* Load raw header into header */
sscanf(rh->mode, "%o", &h->mode);
sscanf(rh->owner, "%o", &h->owner);
sscanf(rh->size, "%o", &h->size);
sscanf(rh->mtime, "%o", &h->mtime);
h->type = rh->type;
strcpy(h->name, rh->name);
strcpy(h->linkname, rh->linkname);
return MTAR_ESUCCESS;
}
static int header_to_raw(mtar_raw_header_t *rh, const mtar_header_t *h) {
unsigned chksum;
/* Load header into raw header */
memset(rh, 0, sizeof(*rh));
sprintf(rh->mode, "%o", h->mode);
sprintf(rh->owner, "%o", h->owner);
sprintf(rh->size, "%o", h->size);
sprintf(rh->mtime, "%o", h->mtime);
rh->type = h->type ? h->type : MTAR_TREG;
strcpy(rh->name, h->name);
strcpy(rh->linkname, h->linkname);
/* Calculate and write checksum */
chksum = checksum(rh);
sprintf(rh->checksum, "%06o", chksum);
rh->checksum[7] = ' ';
return MTAR_ESUCCESS;
}
const char* mtar_strerror(int err) {
switch (err) {
case MTAR_ESUCCESS : return "success";
case MTAR_EFAILURE : return "failure";
case MTAR_EOPENFAIL : return "could not open";
case MTAR_EREADFAIL : return "could not read";
case MTAR_EWRITEFAIL : return "could not write";
case MTAR_ESEEKFAIL : return "could not seek";
case MTAR_EBADCHKSUM : return "bad checksum";
case MTAR_ENULLRECORD : return "null record";
case MTAR_ENOTFOUND : return "file not found";
}
return "unknown error";
}
static int file_write(mtar_t *tar, const void *data, unsigned size) {
unsigned res = fwrite(data, 1, size, tar->stream);
return (res == size) ? MTAR_ESUCCESS : MTAR_EWRITEFAIL;
}
static int file_read(mtar_t *tar, void *data, unsigned size) {
unsigned res = fread(data, 1, size, tar->stream);
return (res == size) ? MTAR_ESUCCESS : MTAR_EREADFAIL;
}
static int file_seek(mtar_t *tar, unsigned offset) {
int res = fseek(tar->stream, offset, SEEK_SET);
return (res == 0) ? MTAR_ESUCCESS : MTAR_ESEEKFAIL;
}
static int file_close(mtar_t *tar) {
fclose(tar->stream);
return MTAR_ESUCCESS;
}
int mtar_open(mtar_t *tar, const char *filename, const char *mode) {
int err;
mtar_header_t h;
/* Init tar struct and functions */
memset(tar, 0, sizeof(*tar));
tar->write = file_write;
tar->read = file_read;
tar->seek = file_seek;
tar->close = file_close;
/* Assure mode is always binary */
if ( strchr(mode, 'r') ) mode = "rb";
if ( strchr(mode, 'w') ) mode = "wb";
if ( strchr(mode, 'a') ) mode = "ab";
/* Open file */
tar->stream = fopen(filename, mode);
if (!tar->stream) {
return MTAR_EOPENFAIL;
}
/* Read first header to check it is valid if mode is `r` */
if (*mode == 'r') {
err = mtar_read_header(tar, &h);
if (err != MTAR_ESUCCESS) {
mtar_close(tar);
return err;
}
}
/* Return ok */
return MTAR_ESUCCESS;
}
int mtar_close(mtar_t *tar) {
return tar->close(tar);
}
int mtar_seek(mtar_t *tar, unsigned pos) {
int err = tar->seek(tar, pos);
tar->pos = pos;
return err;
}
int mtar_rewind(mtar_t *tar) {
tar->remaining_data = 0;
tar->last_header = 0;
return mtar_seek(tar, 0);
}
int mtar_next(mtar_t *tar) {
int err, n;
mtar_header_t h;
/* Load header */
err = mtar_read_header(tar, &h);
if (err) {
return err;
}
/* Seek to next record */
n = round_up(h.size, 512) + sizeof(mtar_raw_header_t);
return mtar_seek(tar, tar->pos + n);
}
int mtar_find(mtar_t *tar, const char *name, mtar_header_t *h) {
int err;
mtar_header_t header;
/* Start at beginning */
err = mtar_rewind(tar);
if (err) {
return err;
}
/* Iterate all files until we hit an error or find the file */
while ( (err = mtar_read_header(tar, &header)) == MTAR_ESUCCESS ) {
if ( !strcmp(header.name, name) ) {
if (h) {
*h = header;
}
return MTAR_ESUCCESS;
}
mtar_next(tar);
}
/* Return error */
if (err == MTAR_ENULLRECORD) {
err = MTAR_ENOTFOUND;
}
return err;
}
int mtar_read_header(mtar_t *tar, mtar_header_t *h) {
int err;
mtar_raw_header_t rh;
/* Save header position */
tar->last_header = tar->pos;
/* Read raw header */
err = tread(tar, &rh, sizeof(rh));
if (err) {
return err;
}
/* Seek back to start of header */
err = mtar_seek(tar, tar->last_header);
if (err) {
return err;
}
/* Load raw header into header struct and return */
return raw_to_header(h, &rh);
}
int mtar_read_data(mtar_t *tar, void *ptr, unsigned size) {
int err;
/* If we have no remaining data then this is the first read, we get the size,
* set the remaining data and seek to the beginning of the data */
if (tar->remaining_data == 0) {
mtar_header_t h;
/* Read header */
err = mtar_read_header(tar, &h);
if (err) {
return err;
}
/* Seek past header and init remaining data */
err = mtar_seek(tar, tar->pos + sizeof(mtar_raw_header_t));
if (err) {
return err;
}
tar->remaining_data = h.size;
}
/* Read data */
err = tread(tar, ptr, size);
if (err) {
return err;
}
tar->remaining_data -= size;
/* If there is no remaining data we've finished reading and seek back to the
* header */
if (tar->remaining_data == 0) {
return mtar_seek(tar, tar->last_header);
}
return MTAR_ESUCCESS;
}
int mtar_write_header(mtar_t *tar, const mtar_header_t *h) {
mtar_raw_header_t rh;
/* Build raw header and write */
header_to_raw(&rh, h);
tar->remaining_data = h->size;
return twrite(tar, &rh, sizeof(rh));
}
int mtar_write_file_header(mtar_t *tar, const char *name, unsigned size) {
mtar_header_t h;
/* Build header */
memset(&h, 0, sizeof(h));
strcpy(h.name, name);
h.size = size;
h.type = MTAR_TREG;
h.mode = 0664;
/* Write header */
return mtar_write_header(tar, &h);
}
int mtar_write_dir_header(mtar_t *tar, const char *name) {
mtar_header_t h;
/* Build header */
memset(&h, 0, sizeof(h));
strcpy(h.name, name);
h.type = MTAR_TDIR;
h.mode = 0775;
/* Write header */
return mtar_write_header(tar, &h);
}
int mtar_write_data(mtar_t *tar, const void *data, unsigned size) {
int err;
/* Write data */
err = twrite(tar, data, size);
if (err) {
return err;
}
tar->remaining_data -= size;
/* Write padding if we've written all the data for this file */
if (tar->remaining_data == 0) {
return write_null_bytes(tar, round_up(tar->pos, 512) - tar->pos);
}
return MTAR_ESUCCESS;
}
int mtar_finalize(mtar_t *tar) {
/* Write two NULL records */
return write_null_bytes(tar, sizeof(mtar_raw_header_t) * 2);
}

View File

@@ -1,90 +0,0 @@
/**
* Copyright (c) 2017 rxi
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the MIT license. See `microtar.c` for details.
*/
#ifndef MICROTAR_H
#define MICROTAR_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#include <stdlib.h>
#define MTAR_VERSION "0.1.0"
enum {
MTAR_ESUCCESS = 0,
MTAR_EFAILURE = -1,
MTAR_EOPENFAIL = -2,
MTAR_EREADFAIL = -3,
MTAR_EWRITEFAIL = -4,
MTAR_ESEEKFAIL = -5,
MTAR_EBADCHKSUM = -6,
MTAR_ENULLRECORD = -7,
MTAR_ENOTFOUND = -8
};
enum {
MTAR_TREG = '0',
MTAR_TLNK = '1',
MTAR_TSYM = '2',
MTAR_TCHR = '3',
MTAR_TBLK = '4',
MTAR_TDIR = '5',
MTAR_TFIFO = '6'
};
typedef struct {
unsigned mode;
unsigned owner;
unsigned size;
unsigned mtime;
unsigned type;
char name[100];
char linkname[100];
} mtar_header_t;
typedef struct mtar_t mtar_t;
struct mtar_t {
int (*read)(mtar_t *tar, void *data, unsigned size);
int (*write)(mtar_t *tar, const void *data, unsigned size);
int (*seek)(mtar_t *tar, unsigned pos);
int (*close)(mtar_t *tar);
void *stream;
unsigned pos;
unsigned remaining_data;
unsigned last_header;
};
const char* mtar_strerror(int err);
int mtar_open(mtar_t *tar, const char *filename, const char *mode);
int mtar_close(mtar_t *tar);
int mtar_seek(mtar_t *tar, unsigned pos);
int mtar_rewind(mtar_t *tar);
int mtar_next(mtar_t *tar);
int mtar_find(mtar_t *tar, const char *name, mtar_header_t *h);
int mtar_read_header(mtar_t *tar, mtar_header_t *h);
int mtar_read_data(mtar_t *tar, void *ptr, unsigned size);
int mtar_write_header(mtar_t *tar, const mtar_header_t *h);
int mtar_write_file_header(mtar_t *tar, const char *name, unsigned size);
int mtar_write_dir_header(mtar_t *tar, const char *name);
int mtar_write_data(mtar_t *tar, const void *data, unsigned size);
int mtar_finalize(mtar_t *tar);
#ifdef __cplusplus
}
#endif
#endif

View File

@@ -1,7 +1,7 @@
/*
* kospm.c
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
* Copyright 2024-2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,18 +20,33 @@
*
*
*/
#include "../include/kospm.h"
#include "kospm.h"
int kospm_install(char *root_dir, char *pkg_file){
kospm_db_t *db = kospm_db_open(root_dir);
kospm_package_list_t *package_list = kospm_package_list_open(pkg_file);
int kospm_install(kospm_pkg_db_t *db, char *pkg_file, char *pkg_name){
kospm_pkg_bundle_t* bundle = kospm_pkg_bundle_open(pkg_file);
kospm_db_packages_add(db, package_list->packages);
kospm_db_files_add(db, package_list->files);
if(pkg_name) {
//if pkg_name isn't null pointer:
//if package pkg_name doesn't exist,
//exit with error;
//install needed package and exit;
if(!kospm_pkg_list_meta_query(bundle->package_list, pkg_name)) {
return KOSPM_NOSUCHPKG;
}
kospm_db_pkg_add(db,
kospm_pkg_list_meta_query(bundle->package_list, pkg_name));
//do {} while(kospm_);
kospm_pkg_bundle_unpack(db->root_path, bundle, pkg_name);
} else {
//install every package in the bundle and exit;
}
kospm_package_list_close(package_list);
kospm_db_save(db);
kospm_db_close(db);
return 0;
return KOSPM_OK;
}

View File

@@ -1,36 +0,0 @@
#include <string.h>
#include "../include/kospm_common.h"
kospm_list_t* _kospm_csv_header_get(FILE *file){
ccsv_reader *reader = ccsv_init_reader(&_kospm_csv_reader_options);
kospm_list_t *header = (kospm_list_t*)malloc(sizeof(kospm_list_t));
ccsv_row *row;
kospm_csv_header_column *head_elem;
fseek(fp, 0, SEEK_SET);
if ((row = read_row(fp, reader)) != NULL){
for (int i = 0; i < row->fields_count; i++){
head_elem->col_number = i;
head_elem->col_name = row->fields[i];
kospm_list_add(header, head_elem);
}
}
ccsv_free_row(row);
free(reader);
return header;
}
int _kospm_csv_col_get(kospm_list_t* col_list, char* col_name){
kospm_list_t *current = col_list;
while(strcmp(current->data->col_name, col_name) || current!=NULL){
current=current->next;
}
if(current==NULL){return -1;}
return current->data->col_num;
}

68
src/kospm_csv.c Normal file
View File

@@ -0,0 +1,68 @@
/*
* kospm_csv.c
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <string.h>
#include "kospm_macros.h"
#include "kospm_csv.h"
kospm_csv_header* kospm_csv_header_get(FILE *file) {
ccsv_reader *reader = ccsv_init_reader(&_kospm_csv_reader_options);
kospm_list_t *col_list = kospm_list_new();
ccsv_row *row;
kospm_csv_header_col *header_elem;
fseek(fp, 0, SEEK_SET);
if ((row = read_row(fp, reader)) == NULL) { return NULL; }
for (int i = 0; i < row->fields_count; i++) {
header_elem =
(kospm_csv_header_col*)malloc(sizeof(kospm_csv_header_col));
header_elem->col_number = i;
header_elem->col_name = row->fields[i];
kospm_list_add(col_list, head_elem);
}
MALLOCNEW(header, kospm_csv_header);
header->col_amount = row->fields_count;
header->col_list = col_list;
ccsv_free_row(row);
free(reader);
return header;
}
int _kospm_csv_col_cmp(kospm_csv_header_col *column, char* name){
return strcmp(current->data->col_name, col_name);
}
int kospm_csv_col_get(kospm_csv_header *header, char* col_name) {
kospm_csv_header_col *current = kospm_list_get_by_value(header->col_list, col_name, _kospm_csv_col_cmp);
return current->data->col_number;
}
char* kospm_csv_field_get(ccsv_row *row, kospm_csv_header *header, char* col_name){
return row->fields[kospm_csv_col_get(header->col_list, col_name)];
}

View File

@@ -1,149 +0,0 @@
/*
* kospm_db.c
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <stddef.h>
#include <string.h>
#include "../include/kospm_db.h"
#include "../include/kospm_common.h"
int _kospm_db_metadata_list_write(FILE* metadata_table, kospm_list_t *metadata_list){
kospm_list_t *metadata_col_list = _kospm_csv_header_get(db->metadata_table);
kospm_list_t *current = metadata_list;
short *write_status;
ccsv_writer *writer = ccsv_init_writer(&_kospm_csv_writer_options, write_status);
char **metadata = malloc(12*sizeof(char*));
while(*current!=NULL){
metadata[_kospm_csv_col_get(metadata_col_list, "name")] = current->data->pkg_name;
metadata[_kospm_csv_col_get(metadata_col_list, "version")] = current->data->pkg_version;
metadata[_kospm_csv_col_get(metadata_col_list, "description")] = current->data->pkg_description;
write_row_from_array(metadata_table, writer, metadata, 12);
}
free(metadata);
return 0;
}
int _kospm_db_files_list_write(FILE* files_table, kospm_list_t *file_list){
kospm_list_t *files_col_list = _kospm_csv_header_get(db->files_table);
kospm_list_t *current = file_list;
short *write_status;
ccsv_writer *writer = ccsv_init_writer(&_kospm_csv_writer_options, write_status);
char **file = malloc(4*sizeof(char*));
while(*current!=NULL){
file[_kospm_csv_col_get(files_col_list, "pkgname")] = current->data->pkg_name;
file[_kospm_csv_col_get(files_col_list, "filename")] = current->data->file_name;
write_row_from_array(metadata_table, writer, metadata, 4);
}
free(metadata);
return 0;
}
kospm_db_t* kospm_db_init(char *root_dir){
kospm_db_t *db = (kospm_db_t*)malloc(sizeof(kospm_db_t));
db->path = strcat(root_dir, DB_FOLDER);
db->metadata_table = fopen(strcat(db->path, METADATA_TABLE), "a+");
db->files_table = fopen(strcat(db->path, FILES_TABLE), "a+");
fprintf(metadata_table, "name, version, description");
fprintf(files_table, "pkgname, filename");
freopen(strcat(db->path, METADATA_TABLE), "r+", db->metadata_table);
freopen(strcat(db->path, FILES_TABLE), "r+", db->files_table);
return db;
}
kospm_db_t* kospm_db_open(char *root_dir){
kospm_db_t *db = (kospm_db_t*)malloc(sizeof(kospm_db_t));
db->path = strcat(root_dir, DB_FOLDER);
db->metadata_table = fopen(strcat(db->path, METADATA_TABLE), "r+");
db->files_table = fopen(strcat(db->path, FILES_TABLE), "r+");
db->packages = kospm_package_metadata_get(metadata_table);
db->files = kospm_package_files_get(files_table);
return db;
}
int kospm_db_save(kospm_db_t *db){
_kospm_db_metadata_list_write(db->metadata_table, db->packages);
_kospm_db_files_list_write(db->files_table, db->files);
return 0;
}
int kospm_db_close(kospm_db_t *db){
kospm_list_free(db->files);
kospm_list_free(db->packages);
fclose(db->files_table);
fclose(db->metadata_table);
free(db);
return 0;
}
int kospm_db_package_add(kospm_db_t *db, kospm_package_t *package){
kospm_list_add(db->packages, package);
return 0;
}
int kospm_db_packages_add(kospm_db_t *db, kospm_list_t *package_list){
kospm_list_t *current = package_list;
while(*current!=NULL){
kospm_list_add(db->packages, current->data);
*current = package_list->next;
}
return 0;
}
int kospm_db_file_add(kospm_db_t *db, char *pkg_name, kospm_package_file_t *file){
kospm_list_add(db->files, file);
return 0;
}
int kospm_db_files_add(kospm_db_t *db, kospm_list_t *file_list){
kospm_list_t *current = file_list;
while(*current!=NULL){
kospm_list_add(db->files, current->data);
*current = package_list->next;
}
return 0;
}

View File

@@ -1,7 +1,7 @@
/*
* kospm_list.c
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
* Copyright 2024-2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,54 +20,94 @@
*
*
*/
#include "../include/kospm_list.h"
#include "kospm_macros.h"
#include "kospm_list.h"
kospm_list_t* kospm_list_new(void *data) {
kospm_list_t *node = (kospm_list_t*)malloc(sizeof(kospm_list_t));
node->data = data;
node->next = NULL;
node->prev = NULL;
return node;
//This will stay here until I'm sure I won't need it.
//Although, I may consider changing it. Nothing's new under the sun.
kospm_list_t* kospm_list_new() {
MALLOCNEW(dlist, kospm_list_t);
dlist->first = NULL;
dlist->current = NULL;
dlist->last = NULL;
return dlist;
}
void kospm_list_add(kospm_list_t **list, void *data) {
kospm_list_t *new_node = kospm_list_new(data);
if (*list == NULL) {
*list = new_node;
void kospm_list_add(kospm_list_t *dlist, void *data) {
MALLOCNEW(dlist, kospm_list_node_t);
if (*dlist->first == NULL) {
*dlist->first = new_node;
} else {
kospm_list_t *current = *list;
while (current->next != NULL) {
current = current->next;
}
kospm_list_node_t *current = *dlist->last;
current->next = new_node;
new_node->prev = current;
}
*dlist->last = new_node;
}
void* kospm_list_prev(kospm_list_t *dlist){
dlist->current=dlist->current->prev;
return dlist->current->data;
}
void kospm_list_del_by_value(kospm_list_t **list, void *data, int (*cmp)(void *, void *)) {
kospm_list_t *current = *list;
while (current != NULL) {
void* kospm_list_next(kospm_list_t *dlist){
dlist->current=dlist->current->next;
return dlist->current->data;
}
kospm_list_node_t* kospm_list_get_by_value(kospm_list_t *dlist,
void *data, int (*cmp)(void *, void *)) {
kospm_list_node_t *current = dlist->current;
while (current != dlist->last) {
if (cmp(current->data, data) == 0) {
dlist->current = current;
return current;
}
current = current->next;
}
dlist->current = dlist->first;
return NULL;
}
void kospm_list_del_by_value(kospm_list_t *dlist, void *data,
int (*cmp)(void *, void *), void (*free_alt)(void *)) {
kospm_list_node_t *current = *dlist->first;
while (current != dlist->first) {
if (cmp(current->data, data) == 0) {
if (current->prev != NULL) {
current->prev->next = current->next;
if(current == dlist->first){
*dlist->first = current->next;
} else {
*list = current->next;
current->prev->next = current->next;
}
if (current->next != NULL) {
if(current == dlist->last){
*dlist->last = current->prev;
} else {
current->next->prev = current->prev;
}
free(current);
(free_alt) ? free_alt(current) : free(current);
}
break;
}
current = current->next;
}
dlist->current = current;
}
void kospm_list_free(kospm_list_t *list) {
while (list != NULL) {
kospm_list_t *temp = list;
list = list->next;
free(temp);
void kospm_list_free(kospm_list_t *dlist, void (*free_alt)(void *)) {
kospm_list_node_t *current = dlist->first;
while (current != dlist->last) {
kospm_list_node_t *temp = current;
current = current->next;
(free_alt) ? free_alt(current) : free(current);
}
free(dlist);
}

View File

@@ -1,116 +0,0 @@
/*
* kospm_package.c
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <stdio.h>
#include <string.h>
#include "../lib/microtar/src/microtar.h"
#include "../include/kospm_tar.h"
#include "../lib/ccsv/include/ccsv.h"
#include "../include/kospm_package.h"
#include "../include/kospm_common.h"
kospm_list_t* kospm_package_files_get(FILE* fp){
kospm_list_t *file_list = (kospm_list_t*)malloc(sizeof(kospm_list_t));
kospm_package_file_t *file;
char *files_path = strcat(CACHE, FILES);
char *files_fields[] = {"pkgname", "filename"};
short *read_status;
ccsv_reader *reader = ccsv_init_reader(&_kospm_csv_reader_options, read_status);
kospm_list_t *files_col_list = _kospm_csv_header_get(fp);
ccsv_row *row;
while ((row = read_row(fp, reader)) != NULL) {
file = (kospm_package_file_t*)malloc(sizeof(kospm_package_file_t));
file->pkg_name = row->fields[_kospm_csv_col_number_get(files_col_list, files_fields[0])];
file->file_name = row->fields[_kospm_csv_col_number_get(files_col_list, files_fields[1])];
kospm_list_add(file_list, file);
}
kospm_list_free(files_col_list);
ccsv_free_row(row);
free(reader);
return file_list;
}
kospm_list_t* kospm_package_metadata_get(FILE* fp){
kospm_list_t *metadata_list = (kospm_list_t*)malloc(sizeof(kospm_list_t));
kospm_package_t *package;
char *pkginfo_path = strcat(CACHE, PKGINFO);
char *metadata_fields[] = {"name", "version", "description"};
short *read_status;
ccsv_reader *reader = ccsv_init_reader(&_kospm_csv_reader_options, read_status);
kospm_list_t *metadata_col_list = _kospm_csv_header_get(fp);
ccsv_row *row;
while ((row = read_row(fp, reader)) != NULL) {
package = (kospm_package_t*)malloc(sizeof(kospm_package_t));
package->pkg_name = row.fields[_kospm_csv_col_get(metadata_col_list, metadata_fields[0])];
package->pkg_version = row.fields[_kospm_csv_col_get(metadata_col_list, metadata_fields[1])];
package->pkg_description = row.fields[_kospm_csv_col_get(metadata_col_list, metadata_fields[2])];
kospm_list_add(metadata_list, package);
}
kospm_list_free(metadata_col_list);
ccsv_free_row(row);
free(reader);
return metadata_list;
}
kospm_package_list_t *kospm_package_list_open(char *pkg_file){
kospm_package_list_t *package_list = (kospm_package_list_t*)malloc(sizeof(kospm_package_list_t));
FILE* metadata_fp;
FILE* files_fp;
char *pkginfo_path = strcat(CACHE, PKGINFO);
char *files_path = strcat(CACHE, FILES);
tar_unpack(pkg_file, PKGINFO, pkginfo_path);
tar_unpack(pkg_file, FILES, files_path);
metadata_fp = fopen(pkginfo_path, "r");
files_fp = fopen(files_path, "r");
package_list->packages = kospm_package_metadata_get(metadata_fp);
package_list->files = kospm_package_files_get(files_fp);
free(reader);
fclose(metadata_fp);
fclose(files_fp);
return package_list;
}
int kospm_package_list_close(kospm_package_list_t *package_list){
kospm_list_free(package_list->packages);
kospm_list_free(package_list->files);
free(package_list);
return 0;
}

94
src/kospm_pkgbundle.c Normal file
View File

@@ -0,0 +1,94 @@
/*
* kospm_pkgbundle.c
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include "kospm_macros.h"
#include "kospm_pkgbundle.h"
kospm_pkg_bundle_t* kospm_pkg_bundle_open(char* bundle_path){
MALLOCNEW(bundle, kospm_pkg_bundle_t);
char* meta_file_path = META_CACHE;
char* files_file_path = FILES_CACHE;
if (tar_unpack(bundle_path, META_TABLE, meta_file_path) ||
tar_unpack(bundle_path, FILES_TABLE, files_file_path)){
free(meta_file_path);
free(files_file_path);
return NULL;
}
bundle->bundle_path=bundle_path;
bundle->package_list=kospm_pkg_list_open(NULL, BUNDLE_CACHE);
return pkg_bundle;
}
int kospm_pkg_bundle_unpack(kospm_pkg_bundle_t* pkg_bundle,
char *root_path, char *pkg_name){
kospm_list_t* pkg_files_list;
kospm_list_t* file_list;
//It's true if there is a needed package which isn't in the bundle.
//Otherwise files of all packages in the bundle are unpacked.
if(pkg_name && !kospm_pkg_list_meta_query(pkg_bundle->package_list,
pkg_name)){
return -1;
}
pkg_files_list = kospm_pkg_list_files_query(pkg_bundle, pkg_name);
file_list = kospm_tar_filelist_get(pkg_bundle->bundle_path);
do {
if(!kospm_tar_file_exists(file_list, pkg_files_list->current) {
kospm_list_free(pkg_files_list, kospm_pkg_file_free);
kospm_list_free(file_list, NULL);
return -1;
}
} while(kospm_list_next(pkg_files_list));
pkg_files_list->current=pkg_files_list->first;
char* file_path = (char*)malloc(FILE_MAX*sizeof(char));
do {
if (snprintf(file_path, FILE_MAX, "%s%s", root_path, DB_FOLDER)
>=FILE_MAX){
free(file_path);
return -1;
}
kospm_tar_unpack(pkg_bundle->bundle_path,
pkg_files_list->current, file_path);
} while(kospm_list_next(pkg_files_list));
return 0;
}
int kospm_pkg_bundle_close(kospm_pkg_bundle_t* pkg_bundle){
free(pkg_bundle->bundle_path);
kospm_pkg_list_close(pkg_bundle->package_list);
free(pkg_bundle);
return 0;
}

92
src/kospm_pkgdb.c Normal file
View File

@@ -0,0 +1,92 @@
/*
* kospm_pkgdb.c
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include "kospm_macros.h"
#include "kospm_pkgdb.h"
kospm_pkg_db_t* kospm_db_init(){
MALLOCNEW(list, kospm_pkg_db_t);
db->package_list = kospm_pkg_list_init();
return db;
}
kospm_pkg_db_t* kospm_db_open(kospm_pkg_db_t *db, char *root_path){
if (!db) db = kospm_db_init();
db->root_path=root_path;
db->package_list=kospm_pkg_list_open(NULL, root_path);
return db;
}
int kospm_db_save(kospm_pkg_db_t *db){
char* db_path = (char*)malloc(FILE_MAX*sizeof(char));
if (snprintf(db_path, FILE_MAX, "%s%s", db->root_path,
DB_FOLDER)>=FILE_MAX){
free(db_path);
return -1;
}
kospm_pkg_list_save(db->package_list, db_path);
return 0;
}
int kospm_db_close(kospm_pkg_db_t *db){
free(db->db_path);
kospm_pkg_list_close(db->package_list);
free(db);
}
int _same_pkgname(void *struc, char *name){
return (strcmp(struc->pkg_name, name)) ? 0 : 1;
}
int kospm_db_pkg_add(kospm_pkg_db_t *db, kospm_pkg_meta_t *package){
kospm_list_add(db->package_list->packages, package);
return 0;
}
int kospm_db_pkg_remove(kospm_pkg_db_t *db, char *pkg_name){
kospm_list_del_by_value(db->package_list->packages, pkg_name,
_same_pkgname, kospm_pkg_meta_free);
return 0;
}
int kospm_db_pkg_file_add(kospm_pkg_db_t *db, kospm_pkg_file_t *file){
kospm_list_add(db->package_list->files, file);
return 0;
}
int kospm_db_pkg_file_remove(kospm_pkg_db_t *db, char *file_name){
kospm_list_del_by_value(db->package_list->files, file_name,
_same_pkgname, kospm_pkg_file_free);
return 0;
}

63
src/kospm_pkgfile.c Normal file
View File

@@ -0,0 +1,63 @@
/*
* kospm_pkgfile.h
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include "kospm_macros.h"
#include "kospm_pkgfile.h"
kospm_pkg_file_t* kospm_pkg_file_init(){
MALLOCNEW(pkg_file, kospm_pkg_file_t);
return pkg_file;
}
kospm_pkg_file_t* kospm_pkg_file_load(ccsv_row *row,
kospm_csv_header *header){
kospm_pkg_file_t *pkg_file = kospm_pkg_file_init();
strncpy(pkg_file->pkg_name, kospm_csv_field_get(row, header, "pkgname"), NAME_MAX);
pkg_file->file_name = strcpynew(kospm_csv_field_get(row, header, "filename"), FILE_MAX);
return pkg_file;
}
char** kospm_pkg_file_store(kospm_pkg_file_t *pkg_file,
kospm_csv_header *header){
char* row[header->col_amount];
row->fields[kospm_csv_field_get(row, header, "pkgname")] =
strcpynew(pkg_file->pkg_name, NAME_MAX-1);
row->fields[kospm_csv_field_get(row, header, "filename")] =
strcpynew(pkg_meta->pkg_description, FILE_MAX-1);
return row;
}
int kospm_pkg_file_check_pkgname(kospm_pkg_meta_t *pkg_meta,
char* pkg_name){
return (pkg_name) ? !strcmp(pkg_file->pkg_name, pkg_name) : 1;
}
int kospm_pkg_file_free(kospm_pkg_file_t *pkg_file){
free(pkg_file->file_name);
free(pkg_file);
return 0;
}

209
src/kospm_pkglist.c Normal file
View File

@@ -0,0 +1,209 @@
/*
* kospm_pkglist.c
*
* Copyright 2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <stdio.h>
#include <string.h>
#include "kospm_macros.h"
#include "kospm_csv.h"
#include "kospm_pkglist.h"
#include "kospm_pkgmeta.h"
kospm_list_t* _kospm_meta_table_read(char* file_path){
kospm_list_t *dlist = kospm_list_new();
FILE* meta_file = fopen(file_path, "r");
kospm_list_t *header = kospm_csv_header_get(meta_file);
kospm_pkg_meta_t *pkg_meta;
ccsv_reader *reader = ccsv_init_reader(kospm_csv_reader_options, NULL);
ccsv_row row;
while(row = read_row(meta_file, reader)){
pkg_meta = kospm_pkg_meta_load(ccsv_row *row, kospm_list_t *header);
kospm_list_add(dlist, pkg_meta);
ccsv_free_row(row);
}
fclose(meta_file);
return dlist;
}
kospm_list_t* _kospm_files_table_read(char* file_path){
kospm_list_t *dlist = kospm_list_new();
FILE* files_file = fopen(file_path, "r");
kospm_list_t *header = kospm_csv_header_get(files_file);
kospm_pkg_file_t *pkg_file;
ccsv_reader *reader = ccsv_init_reader(kospm_csv_reader_options, NULL);
ccsv_row row;
while(row = read_row(files_file, reader)){
pkg_file = kospm_pkg_file_load(ccsv_row *row, kospm_list_t *header);
kospm_list_add(dlist, pkg_file);
ccsv_free_row(row);
}
fclose(files_file);
return dlist;
}
int _kospm_meta_table_write(kospm_pkg_list_t *pkg_list, char* file_path){
FILE* meta_file = fopen(file_path, "w");
kospm_csv_header *header = kospm_csv_header_get(meta_file);
kospm_list_t *meta_list = pkg_list->packages;
ccsv_writer *writer = ccsv_init_writer(kospm_csv_writer_options, NULL);
meta_list->current = meta_list->first;
char **meta_row;
while(meta_list->current){
meta_row = kospm_pkg_meta_store(meta_list->current->data,
header);
write_row_from_array(meta_file, writer, meta_row,
header->col_amount);
}
fclose(meta_file);
return 0;
}
int _kospm_files_table_write(kospm_pkg_list_t *pkg_list, char* file_path){
FILE* files_file = fopen(file_path, "w");
kospm_csv_header *header = kospm_csv_header_get(files_file);
kospm_list_t *files_list = pkg_list->files;
ccsv_writer *writer = ccsv_init_writer(kospm_csv_writer_options, NULL);
files_list->current = files_list->first;
char **file_row;
while(_list->current){
file_row = kospm_pkg_file_store(files_list->current->data,
header);
write_row_from_array(meta_file, writer, file_row,
header->col_amount);
}
fclose(files_file);
return 0;
}
kospm_pkg_list_t* kospm_pkg_list_init(){
kospm_pkg_list_t *pkg_list = (kospm_pkg_list_t*)malloc(sizeof(kospm_pkg_list_t));
pkg_list->packages = kospm_list_new();
pkg_list->files = kospm_list_new();
return pkg_list;
}
kospm_pkg_list_t* kospm_pkg_list_open(kospm_pkg_list_t *pkg_list, char* pkg_list_path){
char* meta_file_path = (char*)malloc(FILE_MAX*sizeof(char));
char* files_file_path = (char*)malloc(FILE_MAX*sizeof(char));
if ((snprintf(meta_list_path, FILE_MAX, "%s%s", pkglist_path,
META_TABLE)>=FILE_MAX)||
(snprintf(files_file_path, FILE_MAX, "%s%s", pkglist_path,
FILES_TABLE)>=FILE_MAX)){
free(meta_file_path);
free(files_file_path);
return -1;
}
if (!pkg_list) pkg_list = kospm_pkg_list_init();
pkg_list->packages = _kospm_meta_table_read(meta_file_path);
pkg_list->files = _kospm_files_table_read(files_filefile_path);
return pkg_list;
}
int kospm_pkg_list_save(kospm_pkg_list_t *pkg_list, char* pkglist_path){
MALLOCNEWARR(meta_file_path, char, FILE_MAX);
MALLOCNEWARR(files_file_path, char, FILE_MAX);
if ((snprintf(meta_list_path, FILE_MAX, "%s%s", pkglist_path,
META_TABLE)>=FILE_MAX) ||
(snprintf(files_file_path, FILE_MAX, "%s%s", pkglist_path,
FILES_TABLE)>=FILE_MAX)){
free(meta_file_path);
free(files_file_path);
return -1;
}
_kospm_meta_table_write(pkg_list, meta_file_path);
_kospm_files_table_write(pkg_list, files_file_path);
free(meta_file_path);
free(files_file_path);
return 0;
}
void _kospm_pkg_meta_free(kospm_pkg_meta_t *pkg_meta){
free(pkg_meta->pkg_description);
free(pkg_meta);
}
void _kospm_pkg_file_free(kospm_pkg_file_t *pkg_file){
free(pkg_file->file_name);
free(pkg_file);
}
int kospm_pkg_list_close(kospm_pkg_list_t* pkg_list){
kospm_list_free(pkg_list->packages, _kospm_pkg_meta_free);
kospm_list_free(pkg_list->files, _kospm_pkg_file_free);
free(pkg_list);
return 0;
}
kospm_pkg_meta_t* kospm_pkg_list_meta_query(kospm_pkg_list_t *pkg_list,
char *pkg_name){
kospm_pkg_meta_t* pkg_meta =
kospm_list_get_by_value(pkg_list->packages, pkg_name,
kospm_pkg_meta_cmp);
pkg_list->packages->current=pkg_list->packages->first;
return pkg_meta;
}
kospm_list_t* kospm_pkg_list_files_query(kospm_pkg_list_t *pkg_list,
char *pkg_name){
kospm_list_t* file_list = kospm_list_init();
pkg_list->files->current = pkg_list->files->first;
while(kospm_list_get_by_value(pkg_list->files, pkg_name,
kospm_pkg_file_check_pkgname)!=NULL){
kospm_list_add(file_list, pkg_list->files->current);
}
return file_list;
}

52
src/kospm_pkgmeta.c Normal file
View File

@@ -0,0 +1,52 @@
#include <stddef.h>
#include "kospm_macros.h"
#include "kospm_pkgmeta.h"
kospm_pkg_meta_t* kospm_pkg_meta_init(){
kospm_pkg_meta_t *pkg_meta = (kospm_pkg_meta_t*)malloc(sizeof(kospm_pkg_meta_t));
return pkg_meta;
}
kospm_pkg_meta_t* kospm_pkg_meta_load(ccsv_row *row,
kospm_csv_header *header){
kospm_pkg_meta_t *pkg_meta = kospm_pkg_meta_init();
strncpy(pkg_meta->pkg_name, kospm_csv_field_get(row, header, "name"), NAME_MAX);
strncpy(pkg_meta->pkg_version, kospm_csv_field_get(row, header, "version"), VERSION_MAX);
pkg_meta->pkg_description =
strcpynew(kospm_csv_field_get(row, header, "description"),
DESCRIPTION_MAX-1);
char* size_lit =
strcpynew(kospm_csv_field_get(row, header, "description"), 10);
pkg_meta->pkg_size=atoi(size_lit);
return pkg_meta;
}
char** kospm_pkg_meta_store(kospm_pkg_meta_t *pkg_meta,
kospm_csv_header *header){
char** row[header->col_amount];
row[kospm_csv_field_get(row, header, "name")] =
strcpynew(pkg_meta->pkg_name, NAME_MAX-1);
row[kospm_csv_field_get(row, header, "version")] =
strcpynew(pkg_meta->pkg_version, VERSION_MAX-1);
row[kospm_csv_field_get(row, header, "description")] =
strcpynew(pkg_meta->pkg_description, DESC_MAX-1);
row[kospm_csv_field_get(row, header, "size")] =
strcpynew((pkg_meta->pkg_size), DESC_MAX-1);
return row;
}
int kospm_pkg_meta_check_pkgname(kospm_pkg_meta_t *pkg_meta,
char* pkg_name){
return !strcmp(pkg_meta->pkg_name, pkg_name);
}
int kospm_pkg_meta_free(kospm_pkg_meta_t *pkg_meta){
free(pkg_meta->pkg_description);
free(pkg_meta);
return 0;
}

View File

@@ -1,7 +1,7 @@
/*
* kospm_tar.c
*
* Copyright 2024 keXa <nikitospikalov2008@gmail.com>
* Copyright 2024-2025 keXa <nikitospikalov2008@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,16 +21,54 @@
*
*/
#include <stdlib.h>
#include "../include/kospm_tar.h"
#include <string.h>
#include "kospm_tar.h"
int tar_unpack(const char *tar_name, const char *src_file,
const char *dest_file){
kospm_list_t* kospm_tar_filelist_get(const char *tar_name){
mtar_t tar;
mtar_header_t* header;
int error = MTAR_ESUCCESS;
if(mtar_open(tar, tar_name, "r") != MTAR_ESUCCESS) {return NULL;}
kospm_list_t* filelist = kospm_list_new();
header = malloc(sizeof(mtar_header_t));
//add code that creates a list of files
while ((error = mtar_read_header(&tar, &header)) && (error != MTAR_ENULLRECORD)) {
if (error == MTAR_EBADCHKSUM){
kospm_list_free(filelist, NULL);
return NULL;
}
kospm_list_add(filelist, header);
mtar_next(&tar);
}
mtar_close(tar);
filelist->current=filelist->first;
return filelist;
}
int _kospm_tar_file_name_cmp(mtar_header_t* header, char* file_name){
return !strcmp(header->name, file_name);
}
int kospm_tar_file_exists(kospm_list_t* file_list, const char *file_name){
return (kospm_list_get_by_value(file_list, file_name, _kospm_tar_file_name_cmp)) ? 1 : 0;
}
int kospm_tar_unpack(const char *tar_name, const char *src_file,
const char *dest_file) {
mtar_t tar;
mtar_header_t header;
if(mtar_open(tar, tar_name, "r") != MTAR_ESUCCESS){return 1;}
if(mtar_open(tar, tar_name, "r") != MTAR_ESUCCESS) {return 1;}
if (mtar_find(&tar, file_to_extract, &header) != MTAR_ESUCCESS) {
if (mtar_find(&tar, src_file, &header) != MTAR_ESUCCESS) {
return 1;
}