Refactor, separate docs from headers, add ru docs

Doxygen kind'a sucks and I need multilanguage documentation, so I did
that. Also, separated massive Math.h file into smaller files.
This commit is contained in:
2025-06-21 20:12:15 +03:00
parent 7ee69fc397
commit fc774fd0ff
116 changed files with 10693 additions and 3521 deletions

510
doc/Manual/en/BH_IO.pod Normal file
View File

@@ -0,0 +1,510 @@
=encoding UTF-8
=head1 NAME
BH_IO - I/O subsystem
=head1 SYNOPSIS
#include <BH/io.h>
BH_IO *io = BH_FileNew("input.txt", BH_FILE_WRITE | BH_FILE_TRUNCATE, NULL);
BH_IOWrite(io, "Hello, world!", 13, NULL);
BH_IOFree(io);
cc prog.c -o prog -lbh
=head1 DESCRIPTION
BH_IO provides a subsystem that allows you to work with various objects (files,
sockets, memory) via a single I/O interface. This allows you to write code that
is not tied to a specific input/output system.
It is guaranteed that any BH_IO object supports the following operations:
L</BH_IORead>, L</BH_IOWrite>, L</BH_IOCtl> и L</BH_IOCap>.
Depending on the implementation of a particular BH_IO object, additional
operations may be available: L</BH_IOFlags>, L</BH_IOClear>, L</BH_IOFlush>,
L</BH_IOSize>, L</BH_IOTell>, L</BH_IOSeek>, L</BH_IOPeek> and others.
By default, the I/O subsystem allows you to work with files (L</BH_FileNew>) or
RAM (L</BH_BytesNew>), as well as buffer I/O (L</BH_BufferNew>).
=head1 EXTENSIONS
BH_IO provides the developer with the ability to create custom implementations
of I/O devices. Example:
typedef struct BH_MyIO
{
BH_IO parent;
int flags;
};
static int ioDestroy(BH_MyIO *io)
{
/* Ommitted for the example */
}
static int ioRead(BH_MyIO *io,
BH_IOReadInfo *info)
{
/* Ommitted for the example */
}
static int ioWrite(BH_MyIO *io,
BH_IOWriteInfo *info)
{
/* Ommited for the example */
}
static int ioFlags(BH_MyIO *io,
int *flags)
{
*flags = io->flags;
return BH_OK;
}
static int ioCap(BH_MyIO *io,
int *op)
{
BH_UNUSED(io);
switch (*op)
{
case BH_IO_CTL_FLAGS:
return BH_OK;
default:
return BH_NOIMPL;
}
}
static int ioCtl(BH_MyIO *io,
BH_IOCtlInfo *info)
{
switch (info->op)
{
case BH_IO_CTL_FLAGS:
return ioFlags(io, (int *)info->arg);
default:
return BH_NOIMPL;
}
}
static int ioCallback(BH_MyIO *io,
int type,
void *arg)
{
switch (type)
{
case BH_IO_OP_DESTROY: return ioDestroy(io);
case BH_IO_OP_READ: return ioRead(io, (BH_IOReadInfo *)arg);
case BH_IO_OP_WRITE: return ioWrite(io, (BH_IOWriteInfo *)arg);
case BH_IO_OP_CTL: return ioCtl(io, (BH_IOCtlInfo *)arg);
case BH_IO_OP_CAP: return ioCap(io, (int*)arg);
default: return BH_NOIMPL;
}
}
BH_IO *BH_MyIONew(int *result)
{
BH_MyIO *io;
int code;
code = BH_OOM;
if ((io = malloc(sizeof(*io))))
{
io->parent.callback = (BH_IOCallback)ioCallback;
io->flags = 0;
}
if (result)
*result = code;
return (BH_IO*)io;
}
=head1 API CALLS
=head2 BH_FileNew
BH_IO *BH_FileNew(const char *path,
int mode,
int *result);
Creates an I/O device for working with the file using the I<path>.
The I<mode> parameter can take a combination of the following values:
=over
=item B<BH_FILE_READ>
Opens the file for reading
=item B<BH_FILE_WRTIE>
Opens the file for writing
=item B<BH_FILE_APPEND>
Opens the file in append mode
=item B<BH_FILE_TRUNCATE>
Truncates the file
=item B<BH_FILE_CREATE>
The file must be created
=item B<BH_FILE_EXIST>
The file must exist
=back
The optional parameter I<result> returns 0 or an error code.
This function returns a pointer to a new BH_IO object or NULL.
=head2 BH_BufferNew
BH_IO *BH_BufferNew(BH_IO *device,
size_t size,
int *result);
Creates an I/O device to buffer data to another I<device>.
The I<size> parameter is responsible for the size of the read and write buffers.
The optional parameter I<result> returns 0 or an error code.
If successful, this function returns a pointer to the new BH_IO object or
NULL in case of an error.
=head2 BH_BytesNew
BH_IO *BH_BytesNew(char *data,
size_t size,
int *result);
Creates an I/O device for the memory region I<data> with the size I<size>.
The optional parameter I<result> returns 0 or an error code.
If successful, this function returns a pointer to the new BH_IO object or
NULL in case of an error.
=head2 BH_IOFree
void BH_IOFree(BH_IO *device);
Destroys the I/O device.
=head2 BH_IORead
int BH_IORead(BH_IO *device,
char *buffer,
size_t size,
size_t *actual);
Reads up to I<size> bytes from the I/O device and writes data to
I<buffer>.
The optional parameter I<actual> returns the number of bytes that was read.
If successful, this function returns 0 or an error code.
=head2 BH_IOWrite
int BH_IOWrite(BH_IO *io,
const char *buffer,
size_t size,
size_t *actual);
Writes up to I<size> bytes to the I/O device from I<buffer>.
The optional parameter I<actual> returns the number of bytes that was written.
If successful, this function returns 0 or an error code.
=head2 BH_IOCtl
int BH_IOCtl(BH_IO *device,
int op,
void *arg);
Manipulates the parameters of the I/O device using the I<op> command and
the I<arg> argument.
Possible values of I<op>:
=over
=item B<BH_IO_CTL_FLAGS>
Argument: int *
Return the I/O device flags.
=item B<BH_IO_CTL_CLEAR>
Reset the I/O device errors.
=item B<BH_IO_CTL_PEEK>
Argument: L<BH_IOReadInfo *|/BH_IOReadInfo>
Reads data from an I/O device without extracting it.
=item B<BH_IO_CTL_FLUSH>
Write buffered data to the I/O device.
=item B<BH_IO_CTL_SIZE>
Argument: int64_t *
Get the size of the I/O device.
=item B<BH_IO_CTL_TELL>
Argument: int64_t *
Reads the current offset of the I/O device reader pointer.
=item B<BH_IO_CTL_SEEK>
Argument: L<BH_IOSeekInfo *|/BH_IOSeekInfo>
Changes the current position of the I/O reader pointer.
=item B<BH_IO_CTL_GET_IO>
Argument: L<BH_IO **|/BH_IO>|void *
Gets the device I/O object used in the implementation.
=item B<BH_IO_CTL_SET_IO>
Argument: L<BH_IO *|/BH_IO>|void *
Sets the device I/O object to be used in the implementation.
=back
If successful, this function returns 0 or an error code.
=head2 BH_IOCap
int BH_IOCap(BH_IO *device,
int op);
Checks whether the I<op> command can be executed on the I/O device.
If successful, this function returns 0 or an error code.
=head2 BH_IOFlags
int BH_IOFlags(BH_IO *device,
int *flags);
Returns the current I<flags> flags of the I/O device.
Possible flags (and their combinations):
=over
=item B<BH_IO_FLAG_ERROR>
An error occurred during the execution.
=item B<BH_IO_FLAG_EOF>
The device has reached the end of the file.
=back
If successful, this function returns 0 or an error code.
=head2 BH_IOClear
int BH_IOClear(BH_IO *device);
Cleans the I/O device from errors.
If successful, this function returns 0 or an error code.
=head2 BH_IOPeek
int BH_IOPeek(BH_IO *device,
char *buffer,
size_t size,
size_t *actual);
Reads up to I<size> bytes from the I/O device without extraction and writes
the data to I<buffer>.
The optional parameter I<actual> returns the number of bytes that was actually
read.
If successful, this function returns 0 or an error code.
=head2 BH_IOFlush
int BH_IOFlush(BH_IO *device);
Writes buffered values to the I/O device.
If successful, this function returns 0 or an error code.
=head2 BH_IOSize
int BH_IOSize(BH_IO *device,
int64_t *size);
Reads the current size of the I/O device in bytes and writes the value to
I<size>.
For different types of I/O devices, this value can mean different things (for
example: the current file size, the size of the memory allocated for I/O, etc.).
If successful, this function returns 0 or an error code.
=head2 BH_IOTell
int BH_IOTell(BH_IO *device,
int64_t *offset);
Reads the current offset of the I/O reader pointer relative
to the start and writes the value to I<offset>.
If successful, this function returns 0 or an error code.
=head2 BH_IOSeek
int BH_IOSeek(BH_IO *device,
int64_t offset,
int whence);
Changes the current position of the I/O reader pointer, taking into account
the offset I<offset> and the initial position I<whence>.
Possible values of the initial position I<whence>:
=over
=item B<BH_IO_SEEK_SET>
Offset relative to the beginning of the device.
=item B<BH_IO_SEEK_CUR>
Offset relative to the current position of the device.
=item B<BH_IO_SEEK_END>
Offset relative to the end of the device.
=back
If successful, this function returns 0 or an error code.
=head2 BH_IOError
int BH_IOError(BH_IO *device);
Checks whether the I/O device is in an error state.
This function is equivalent to the following code:
(BH_IOFlags(device) & BH_IO_FLAG_ERROR)
=head2 BH_IOEndOfFile
int BH_IOEndOfFile(BH_IO *device);
Checks whether the I/O device has reached the end.
This function is equivalent to the following code:
(BH_IOFlags(device) & BH_IO_FLAG_EOF)
=head1 STRUCTURES
=head2 BH_IO
typedef struct BH_IO
{
BH_IOCallback callback;
} BH_IO;
=head2 BH_IOReadInfo
typedef struct BH_IOReadInfo
{
char *data;
size_t size;
size_t *actual;
} BH_IOReadInfo;
=head2 BH_IOWriteInfo
typedef struct BH_IOWriteInfo
{
const char *data;
size_t size;
size_t *actual;
} BH_IOWriteInfo;
=head2 BH_IOCtlInfo
typedef struct BH_IOCtlInfo
{
int op;
void *arg;
} BH_IOCtlInfo;
=head2 BH_IOSeekInfo
typedef struct BH_IOSeekInfo
{
int64_t offset;
int whence;
} BH_IOSeekInfo;
=head1 SEE ALSO
L<BH>