part: implement mlx3ds_assets_open/read/close()
This commit is contained in:
parent
3f5e13b2f2
commit
8649e86eaa
4 changed files with 133 additions and 7 deletions
|
@ -15,6 +15,9 @@
|
||||||
|
|
||||||
# include <string.h>
|
# include <string.h>
|
||||||
|
|
||||||
|
/// @brief Socket to an asset. Equivalent to a file descriptor.
|
||||||
|
typedef void *t_assetsocket;
|
||||||
|
|
||||||
/// @brief Represents a file embedded with the program.
|
/// @brief Represents a file embedded with the program.
|
||||||
typedef struct s_embeddedasset
|
typedef struct s_embeddedasset
|
||||||
{
|
{
|
||||||
|
@ -32,6 +35,26 @@ typedef struct s_embeddedasset
|
||||||
/// @return A reference to the asset. NULL if the asset doesn't exist.
|
/// @return A reference to the asset. NULL if the asset doesn't exist.
|
||||||
const t_embeddedasset *mlx3ds_assets_get(const char *name);
|
const t_embeddedasset *mlx3ds_assets_get(const char *name);
|
||||||
|
|
||||||
// TODO add mlx3ds_assets_open()
|
/// @brief Create a t_assetsocket from an asset.
|
||||||
|
///
|
||||||
|
/// @param name Name of the asset to open.
|
||||||
|
/// @return A socket to the asset. NULL if error.
|
||||||
|
t_assetsocket mlx3ds_assets_open(const char *name);
|
||||||
|
|
||||||
|
/// @brief Reads up to 'count' bytes of the asset content and write it in 'buf'.
|
||||||
|
///
|
||||||
|
/// @param asset The asset to read.
|
||||||
|
/// @param buf The buffer to write the content to.
|
||||||
|
/// Its size must be at least 'count' bytes.
|
||||||
|
/// @param count The number of bytes to read.
|
||||||
|
/// @return The number of bytes actually read. Can be lower than 'count'.
|
||||||
|
/// 0 if EOF reached.
|
||||||
|
size_t mlx3ds_assets_read(
|
||||||
|
t_assetsocket asset, void *buf, size_t count);
|
||||||
|
|
||||||
|
/// @brief Close the asset socket to avoid leaks.
|
||||||
|
///
|
||||||
|
/// @param asset Asset to close.
|
||||||
|
void mlx3ds_assets_close(t_assetsocket asset);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,10 +5,11 @@ extern "C" {
|
||||||
#include "utilsconsole.h"
|
#include "utilsconsole.h"
|
||||||
}
|
}
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <string.h>
|
|
||||||
#include "firsk.xpm"
|
#include "firsk.xpm"
|
||||||
|
#include <string.h>
|
||||||
#include <sys/dirent.h>
|
#include <sys/dirent.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -495,6 +496,58 @@ assets:
|
||||||
else
|
else
|
||||||
cout << "No asset" << endl;
|
cout << "No asset" << endl;
|
||||||
uc_pause();
|
uc_pause();
|
||||||
|
{
|
||||||
|
char buf[10];
|
||||||
|
cout
|
||||||
|
<< "Read asset \"sous/sous/fichier\"" << endl
|
||||||
|
<< "from mlx3ds_assets_open()..." << endl
|
||||||
|
<< "(buf[10])" << endl;
|
||||||
|
t_assetsocket asset = mlx3ds_assets_open("sous/sous/fichier");
|
||||||
|
if (!asset)
|
||||||
|
cout << "Error" << endl;
|
||||||
|
else {
|
||||||
|
cout << "Content: \"";
|
||||||
|
int n;
|
||||||
|
do {
|
||||||
|
n = mlx3ds_assets_read(asset, buf, 10);
|
||||||
|
if (n < 0) {
|
||||||
|
cout << "read error :/" << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (n > 0)
|
||||||
|
write(1, buf, n);
|
||||||
|
} while (n);
|
||||||
|
cout << "\"" << endl;
|
||||||
|
mlx3ds_assets_close(asset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uc_pause();
|
||||||
|
{
|
||||||
|
char buf[100];
|
||||||
|
cout
|
||||||
|
<< "Read asset \"sous/sous/fichier\"" << endl
|
||||||
|
<< "from mlx3ds_assets_open()..." << endl
|
||||||
|
<< "(buf[100])" << endl;
|
||||||
|
t_assetsocket asset = mlx3ds_assets_open("sous/sous/fichier");
|
||||||
|
if (!asset)
|
||||||
|
cout << "Error" << endl;
|
||||||
|
else {
|
||||||
|
cout << "Content: \"";
|
||||||
|
int n;
|
||||||
|
do {
|
||||||
|
n = mlx3ds_assets_read(asset, buf, 100);
|
||||||
|
if (n < 0) {
|
||||||
|
cout << "read error :/" << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (n > 0)
|
||||||
|
write(1, buf, n);
|
||||||
|
} while (n);
|
||||||
|
cout << "\"" << endl;
|
||||||
|
mlx3ds_assets_close(asset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uc_pause();
|
||||||
}
|
}
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
|
|
52
source/mlx3ds_embeddedassets.c
Normal file
52
source/mlx3ds_embeddedassets.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/**
|
||||||
|
* mlx3ds_embeddedassets.c
|
||||||
|
* for the project "MinilibX for 3DS"
|
||||||
|
* by Zy
|
||||||
|
* at https://github.com/frzysk/mlx3ds
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mlx3ds_embeddedassets.h"
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/// @brief Internal of a t_assetsocket.
|
||||||
|
typedef struct s_in_assetsocket
|
||||||
|
{
|
||||||
|
/// @brief Asset used.
|
||||||
|
const t_embeddedasset *asset;
|
||||||
|
/// @brief Index of the cursor.
|
||||||
|
size_t i;
|
||||||
|
} t_in_assetsocket;
|
||||||
|
|
||||||
|
// This function is implemented in embedassets.sh
|
||||||
|
const t_embeddedasset *mlx3ds_assets_get(const char *name);
|
||||||
|
|
||||||
|
t_assetsocket mlx3ds_assets_open(const char *name) {
|
||||||
|
const t_embeddedasset *asset;
|
||||||
|
t_in_assetsocket *r;
|
||||||
|
|
||||||
|
asset = mlx3ds_assets_get(name);
|
||||||
|
if (!asset)
|
||||||
|
return NULL;
|
||||||
|
r = malloc(sizeof(t_in_assetsocket));
|
||||||
|
if (!r)
|
||||||
|
return NULL;
|
||||||
|
r->asset = asset;
|
||||||
|
r->i = 0;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t mlx3ds_assets_read(t_assetsocket asset, void *buf, size_t count) {
|
||||||
|
t_in_assetsocket *asset_ = asset;
|
||||||
|
|
||||||
|
if (count > asset_->asset->size - asset_->i)
|
||||||
|
count = asset_->asset->size - asset_->i;
|
||||||
|
|
||||||
|
memcpy(buf, asset_->asset->data + asset_->i, count);
|
||||||
|
asset_->i += count;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mlx3ds_assets_close(t_assetsocket asset) {
|
||||||
|
free(asset);
|
||||||
|
}
|
|
@ -1,17 +1,16 @@
|
||||||
/**
|
/**
|
||||||
* mlx_internal.cpp
|
* mlx_internal.c
|
||||||
* for the project "MinilibX for 3DS"
|
* for the project "MinilibX for 3DS"
|
||||||
* by Zy
|
* by Zy
|
||||||
* at https://github.com/frzysk/mlx3ds
|
* at https://github.com/frzysk/mlx3ds
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO mlx_internal.cpp: embed uc_pause() and change to .c file
|
// TODO mlx_internal.c: embed uc_pause()
|
||||||
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include "utilsconsole.h"
|
#include "utilsconsole.h"
|
||||||
#include "mlx_internal.h"
|
#include "mlx_internal.h"
|
||||||
#include "3ds.h"
|
#include "3ds.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
void mlx3ds_internal_fatalerror(const char *msg)
|
void mlx3ds_internal_fatalerror(const char *msg)
|
||||||
{
|
{
|
||||||
|
@ -34,4 +33,3 @@ void mlx3ds_internal_drawend(
|
||||||
gfxFlushBuffers();
|
gfxFlushBuffers();
|
||||||
gfxSwapBuffers();
|
gfxSwapBuffers();
|
||||||
}
|
}
|
||||||
}
|
|
Loading…
Add table
Reference in a new issue