|
|
@@ -67,10 +67,13 @@ static void ansi_parse_grcm(cucul_canvas_t *, struct ansi_grcm *, |
|
|
|
* |
|
|
|
* Valid values for \c format are: |
|
|
|
* - \c "": attempt to autodetect the file format. |
|
|
|
* - \c "caca": import native libcaca files. |
|
|
|
* - \c "text": import ASCII text files. |
|
|
|
* - \c "ansi": import ANSI files. |
|
|
|
* - \c "utf8": import UTF-8 files with ANSI colour codes. |
|
|
|
* - \c "caca": import native libcaca files. |
|
|
|
* |
|
|
|
* The number of bytes read is returned. If the file format is valid, but |
|
|
|
* not enough data was available, 0 is returned. |
|
|
|
* |
|
|
|
* If an error occurs, -1 is returned and \b errno is set accordingly: |
|
|
|
* - \c ENOMEM Not enough memory to allocate canvas. |
|
|
@@ -80,7 +83,8 @@ static void ansi_parse_grcm(cucul_canvas_t *, struct ansi_grcm *, |
|
|
|
* \param data A memory area containing the data to be loaded into the canvas. |
|
|
|
* \param len The size in bytes of the memory area. |
|
|
|
* \param format A string describing the input format. |
|
|
|
* \return The number of bytes read, or -1 if an error occurred. |
|
|
|
* \return The number of bytes read, or 0 if there was not enough data, |
|
|
|
* or -1 if an error occurred. |
|
|
|
*/ |
|
|
|
long int cucul_import_memory(cucul_canvas_t *cv, void const *data, |
|
|
|
unsigned long int len, char const *format) |
|
|
@@ -128,10 +132,13 @@ long int cucul_import_memory(cucul_canvas_t *cv, void const *data, |
|
|
|
* |
|
|
|
* Valid values for \c format are: |
|
|
|
* - \c "": attempt to autodetect the file format. |
|
|
|
* - \c "caca": import native libcaca files. |
|
|
|
* - \c "text": import ASCII text files. |
|
|
|
* - \c "ansi": import ANSI files. |
|
|
|
* - \c "utf8": import UTF-8 files with ANSI colour codes. |
|
|
|
* - \c "caca": import native libcaca files. |
|
|
|
* |
|
|
|
* The number of bytes read is returned. If the file format is valid, but |
|
|
|
* not enough data was available, 0 is returned. |
|
|
|
* |
|
|
|
* If an error occurs, -1 is returned and \b errno is set accordingly: |
|
|
|
* - \c ENOSYS File access is not implemented on this system. |
|
|
@@ -143,7 +150,8 @@ long int cucul_import_memory(cucul_canvas_t *cv, void const *data, |
|
|
|
* \param cv A libcucul canvas in which to import the file. |
|
|
|
* \param filename The name of the file to load. |
|
|
|
* \param format A string describing the input format. |
|
|
|
* \return The number of bytes read, or -1 if an error occurred. |
|
|
|
* \return The number of bytes read, or 0 if there was not enough data, |
|
|
|
* or -1 if an error occurred. |
|
|
|
*/ |
|
|
|
long int cucul_import_file(cucul_canvas_t *cv, char const *filename, |
|
|
|
char const *format) |
|
|
@@ -201,13 +209,14 @@ long int cucul_import_file(cucul_canvas_t *cv, char const *filename, |
|
|
|
char const * const * cucul_get_import_list(void) |
|
|
|
{ |
|
|
|
static char const * const list[] = |
|
|
|
{ |
|
|
|
"", "autodetect", |
|
|
|
"text", "plain text", |
|
|
|
"caca", "native libcaca format", |
|
|
|
"ansi", "ANSI coloured text", |
|
|
|
NULL, NULL |
|
|
|
}; |
|
|
|
{ |
|
|
|
"", "autodetect", |
|
|
|
"caca", "native libcaca format", |
|
|
|
"text", "plain text", |
|
|
|
"ansi", "ANSI coloured text", |
|
|
|
"utf8", "UTF-8 files with ANSI colour codes", |
|
|
|
NULL, NULL |
|
|
|
}; |
|
|
|
|
|
|
|
return list; |
|
|
|
} |
|
|
@@ -220,13 +229,11 @@ static long int import_caca(cucul_canvas_t *cv, |
|
|
|
void const *data, unsigned int size) |
|
|
|
{ |
|
|
|
uint8_t const *buf = (uint8_t const *)data; |
|
|
|
unsigned int control_size, data_size, full_size, frames, f, n; |
|
|
|
unsigned int control_size, data_size, expected_size, frames, f, n; |
|
|
|
uint16_t version, flags; |
|
|
|
|
|
|
|
cucul_set_canvas_size(cv, 0, 0); |
|
|
|
|
|
|
|
if(size < 20) |
|
|
|
goto invalid_caca; |
|
|
|
return 0; |
|
|
|
|
|
|
|
if(buf[0] != 0xca || buf[1] != 0xca || buf[2] != 'C' || buf[3] != 'V') |
|
|
|
goto invalid_caca; |
|
|
@@ -237,13 +244,13 @@ static long int import_caca(cucul_canvas_t *cv, |
|
|
|
frames = sscanu32(buf + 14); |
|
|
|
flags = sscanu16(buf + 18); |
|
|
|
|
|
|
|
if(size != 4 + control_size + data_size) |
|
|
|
goto invalid_caca; |
|
|
|
if(size < 4 + control_size + data_size) |
|
|
|
return 0; |
|
|
|
|
|
|
|
if(control_size < 16 + frames * 24) |
|
|
|
goto invalid_caca; |
|
|
|
|
|
|
|
for(full_size = 0, f = 0; f < frames; f++) |
|
|
|
for(expected_size = 0, f = 0; f < frames; f++) |
|
|
|
{ |
|
|
|
unsigned int width, height, duration; |
|
|
|
uint32_t attr; |
|
|
@@ -256,13 +263,14 @@ static long int import_caca(cucul_canvas_t *cv, |
|
|
|
x = (int32_t)sscanu32(buf + 4 + 16 + f * 24 + 16); |
|
|
|
y = (int32_t)sscanu32(buf + 4 + 16 + f * 24 + 20); |
|
|
|
|
|
|
|
full_size += width * height * 8; |
|
|
|
expected_size += width * height * 8; |
|
|
|
} |
|
|
|
|
|
|
|
if(full_size != data_size) |
|
|
|
if(expected_size != data_size) |
|
|
|
goto invalid_caca; |
|
|
|
|
|
|
|
/* FIXME: read all frames, not only the first one */ |
|
|
|
cucul_set_canvas_size(cv, 0, 0); |
|
|
|
cucul_set_canvas_size(cv, sscanu32(buf + 4 + 16), |
|
|
|
sscanu32(buf + 4 + 16 + 4)); |
|
|
|
|
|
|
@@ -276,7 +284,7 @@ static long int import_caca(cucul_canvas_t *cv, |
|
|
|
|
|
|
|
cv->curattr = sscanu32(buf + 4 + 16 + 12); |
|
|
|
|
|
|
|
return size; |
|
|
|
return 4 + control_size + data_size; |
|
|
|
|
|
|
|
invalid_caca: |
|
|
|
#if defined HAVE_ERRNO_H |
|
|
|