Skip to content

Commit

Permalink
Use _fseeki64 instead of fseek on Windows (#10739)
Browse files Browse the repository at this point in the history
* Use _fseeki64 instead of fseek on Windows

Allows loading files greater than 2GB

* Move the omc_fseek define to omc_file.h
  • Loading branch information
adeas31 committed May 26, 2023
1 parent f209551 commit 96fe37f
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 9 deletions.
7 changes: 5 additions & 2 deletions OMCompiler/SimulationRuntime/c/util/omc_file.h
Expand Up @@ -74,9 +74,12 @@ size_t omc_fwrite(void * buffer, size_t size, size_t count, FILE * stream);

#if defined(__MINGW32__) || defined(_MSC_VER)
typedef struct _stat omc_stat_t;
#define omc_fseek _fseeki64
#else
typedef struct stat omc_stat_t;
#endif
#define omc_fseek fseek
#endif // defined(__MINGW32__) || defined(_MSC_VER)

int omc_stat(const char *filename, omc_stat_t *statbuf);
int omc_lstat(const char *filename, omc_stat_t *statbuf);

Expand All @@ -94,7 +97,7 @@ int omc_rename(const char *source, const char *dest);

#if defined(__MINGW32__) || defined(_MSC_VER)
wchar_t* longabspath(wchar_t* unicodePath);
#endif
#endif // defined(__MINGW32__) || defined(_MSC_VER)

#ifdef __cplusplus
}
Expand Down
14 changes: 7 additions & 7 deletions OMCompiler/SimulationRuntime/c/util/read_matlab4.c
Expand Up @@ -442,7 +442,7 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
reader->nvar = hdr.mrows;
reader->var_offset = ftell(reader->file);
reader->vars = (double**) calloc(reader->nvar*2,sizeof(double*));
if(-1==fseek(reader->file,matrix_length,SEEK_CUR)) return "Corrupt header: data_2 matrix";
if(-1==omc_fseek(reader->file,matrix_length,SEEK_CUR)) return "Corrupt header: data_2 matrix";
}
if(binTrans==0) {
unsigned int k,j;
Expand Down Expand Up @@ -473,7 +473,7 @@ const char* omc_new_matlab4_reader(const char *filename, ModelicaMatReader *read
}
free(tmp);

if(-1==fseek(reader->file,matrix_length,SEEK_CUR)) return "Corrupt header: data_2 matrix";
if(-1==omc_fseek(reader->file,matrix_length,SEEK_CUR)) return "Corrupt header: data_2 matrix";
}
break;
}
Expand Down Expand Up @@ -577,7 +577,7 @@ double* omc_matlab4_read_vals(ModelicaMatReader *reader, int varIndex)
if(reader->doublePrecision==1)
{
for(i=0; i<reader->nrows; i++) {
fseek(reader->file,reader->var_offset + sizeof(double)*(i*reader->nvar + absVarIndex-1), SEEK_SET);
omc_fseek(reader->file,reader->var_offset + sizeof(double)*(i*reader->nvar + absVarIndex-1), SEEK_SET);
if(1 != omc_fread(&tmp[i], sizeof(double), 1, reader->file, 0)) {
/* fprintf(stderr, "Corrupt file at %d of %d? nvar %d\n", i, reader->nrows, reader->nvar); */
free(tmp);
Expand All @@ -592,7 +592,7 @@ double* omc_matlab4_read_vals(ModelicaMatReader *reader, int varIndex)
{
float *buffer = (float*) malloc(reader->nrows*sizeof(float));
for(i=0; i<reader->nrows; i++) {
fseek(reader->file,reader->var_offset + sizeof(float)*(i*reader->nvar + absVarIndex-1), SEEK_SET);
omc_fseek(reader->file,reader->var_offset + sizeof(float)*(i*reader->nvar + absVarIndex-1), SEEK_SET);
if(1 != omc_fread(&buffer[i], sizeof(float), 1, reader->file, 0)) {
/* fprintf(stderr, "Corrupt file at %d of %d? nvar %d\n", i, reader->nrows, reader->nvar); */
free(buffer);
Expand Down Expand Up @@ -685,7 +685,7 @@ int omc_matlab4_read_all_vals(ModelicaMatReader *reader)
if (!tmp) {
return 1;
}
fseek(reader->file, reader->var_offset, SEEK_SET);
omc_fseek(reader->file, reader->var_offset, SEEK_SET);
if (nvar*reader->nrows != omc_fread(tmp, reader->doublePrecision==1 ? sizeof(double) : sizeof(float), nvar*nrows, reader->file, 0)) {
free(tmp);
return 1;
Expand Down Expand Up @@ -722,14 +722,14 @@ double omc_matlab4_read_single_val(double *res, ModelicaMatReader *reader, int v
return 0;
}
if(reader->doublePrecision==1) {
fseek(reader->file,reader->var_offset + sizeof(double)*(timeIndex*reader->nvar + absVarIndex-1), SEEK_SET);
omc_fseek(reader->file,reader->var_offset + sizeof(double)*(timeIndex*reader->nvar + absVarIndex-1), SEEK_SET);
if(1 != omc_fread(res, sizeof(double), 1, reader->file, 0)) {
*res = 0;
return 1;
}
} else {
float tmpres;
fseek(reader->file,reader->var_offset + sizeof(float)*(timeIndex*reader->nvar + absVarIndex-1), SEEK_SET);
omc_fseek(reader->file,reader->var_offset + sizeof(float)*(timeIndex*reader->nvar + absVarIndex-1), SEEK_SET);
if(1 != omc_fread(&tmpres, sizeof(float), 1, reader->file, 0)) {
*res = 0;
return 1;
Expand Down

0 comments on commit 96fe37f

Please sign in to comment.