Skip to content

Commit 4ee92f3

Browse files
committed
embed: Implement ftello/fseeko variants to allow to deal with large files.
1 parent 1b985ef commit 4ee92f3

File tree

2 files changed

+55
-8
lines changed

2 files changed

+55
-8
lines changed

Embedded/np_embed.c

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define NUITKAPYTHON_EMBED_BUILD
2-
2+
#define _FILE_OFFSET_BITS=64
33
#include "np_embed.h"
44
#include <ctype.h>
55
#include <stdarg.h>
@@ -522,25 +522,42 @@ NP_DECL(int) np_getc_unlocked(void* e) {
522522
}
523523
#endif
524524

525-
NP_DECL(long int) np_ftell(void* e) {
525+
526+
int64_t np_ftell_priv(void* e) {
526527
if (NP_FOREIGN_PTR) {
527-
return ftell((FILE*)e);
528+
#ifdef _WIN32
529+
return _ftelli64((FILE*)e);
530+
#else
531+
return ftello((FILE*)e);
532+
#endif
528533
}
529534

530535
if (((EFILE*)e)->handle_type != EHANDLE_VIRTUAL) {
531-
return ftell(((EFILE*)e)->f);
536+
#ifdef _WIN32
537+
return _ftelli64(((EFILE*)e)->f);
538+
#else
539+
return ftello(((EFILE*)e)->f);
540+
#endif
532541
}
533542

534543
return (((EFILE*)e)->end - ((EFILE*)e)->pos) - ((EFILE*)e)->size;
535544
}
536545

537-
NP_DECL(int) np_fseek(void* e, long int offset, int origin) {
546+
int np_fseek_priv(void* e, int64_t offset, int origin) {
538547
if (NP_FOREIGN_PTR) {
539-
return fseek((FILE*)e, offset, origin);
548+
#ifdef _WIN32
549+
return _fseeki64((FILE*)e, offset, origin);
550+
#else
551+
return fseeko((FILE*)e, offset, origin);
552+
#endif
540553
}
541554

542555
if (((EFILE*)e)->handle_type != EHANDLE_VIRTUAL) {
543-
return fseek(((EFILE*)e)->f, offset, origin);
556+
#ifdef _WIN32
557+
return _fseeki64(((EFILE*)e)->f, offset, origin);
558+
#else
559+
return fseeko(((EFILE*)e)->f, offset, origin);
560+
#endif
544561
}
545562

546563
if(origin == SEEK_SET)
@@ -552,12 +569,28 @@ NP_DECL(int) np_fseek(void* e, long int offset, int origin) {
552569

553570
if(((EFILE*)e)->end < ((EFILE*)e)->pos || np_ftell(e) < 0) {
554571
errno = EINVAL;
555-
return true;
572+
return -1;
556573
}
557574

558575
return 0;
559576
}
560577

578+
NP_DECL(long int) np_ftell(void* e) {
579+
return np_ftell_priv(e);
580+
}
581+
582+
NP_DECL(int) np_fseek(void* e, long int offset, int origin) {
583+
return np_fseek_priv(e, offset, origin);
584+
}
585+
586+
NP_DECL(int64_t) np_ftello64(void *e) {
587+
return np_ftell_priv(e);
588+
}
589+
590+
NP_DECL(int) np_fseeko64(void *e, int64_t offset, int origin) {
591+
return np_fseek_priv(e, offset, origin);
592+
}
593+
561594
NP_DECL(int) np_fscanf(void *e, const char *format, ...) {
562595
if (NP_FOREIGN_PTR) {
563596
va_list args;

Include/np_embed.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ NP_DECL(int) np_setvbuf(void *stream, char *buffer, int mode, size_t size);
112112
/* File Positioning */
113113
NP_DECL(int) np_fseek(void *stream, long int offset, int origin);
114114
NP_DECL(long int) np_ftell(void *stream);
115+
NP_DECL(int) np_fseeko64(void *stream, int64_t offset, int origin);
116+
NP_DECL(int64_t) np_ftello64(void *stream);
115117
NP_DECL(void) np_rewind(void *stream);
116118
NP_DECL(int) np_fsetpos(void *stream, const fpos_t *pos);
117119
NP_DECL(int) np_ungetc(int character, void *stream);
@@ -194,6 +196,18 @@ NP_DECL(int) np_ftrylockfile(void *e);
194196
#define _fseek np_fseek
195197
#define ftell np_ftell
196198
#define _ftell np_ftell
199+
#ifdef _WIN32
200+
#define _fseeki64 np_fseeko64
201+
#define _ftelli64 np_ftello64
202+
#else
203+
#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
204+
#define fseeko np_fseeko64
205+
#define ftello np_ftello64
206+
#else
207+
#define fseeko np_fseek
208+
#define ftello np_ftell
209+
#endif
210+
#endif
197211
#define rewind np_rewind
198212
#define _rewind np_rewind
199213
#define fgetpos np_fgetpos

0 commit comments

Comments
 (0)