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:
3
.gitignore
vendored
Executable file
3
.gitignore
vendored
Executable file
@@ -0,0 +1,3 @@
|
||||
*.o
|
||||
*.a
|
||||
lib/*/*
|
||||
11
.gitmodules
vendored
Normal file
11
.gitmodules
vendored
Normal 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
280
LICENSE
Normal 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
|
||||
41
Makefile
41
Makefile
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
31
include/kospm_macros.h
Normal 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
44
include/kospm_pkgbundle.h
Normal 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
51
include/kospm_pkgdb.h
Normal 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
44
include/kospm_pkgfile.h
Normal 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
|
||||
@@ -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
50
include/kospm_pkgmeta.h
Normal 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
44
include/kospm_string.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
67
kospm.geany
67
kospm.geany
@@ -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
548
kospm.tags
Normal 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
58
lib/ccsv/.gitignore
vendored
@@ -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
|
||||
@@ -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.
|
||||
@@ -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.
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
1179
lib/ccsv/src/ccsv.c
1179
lib/ccsv/src/ccsv.c
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
@@ -1,9 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "ccsv.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
35
src/kospm.c
35
src/kospm.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
68
src/kospm_csv.c
Normal 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)];
|
||||
}
|
||||
149
src/kospm_db.c
149
src/kospm_db.c
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
94
src/kospm_pkgbundle.c
Normal 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
92
src/kospm_pkgdb.c
Normal 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
63
src/kospm_pkgfile.c
Normal 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
209
src/kospm_pkglist.c
Normal 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
52
src/kospm_pkgmeta.c
Normal 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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user