4
4
#include " THDiskFile.h"
5
5
#include " THFilePrivate.h"
6
6
7
- extern " C "
7
+ namespace TH
8
8
{
9
9
10
10
typedef struct THDiskFile__
@@ -36,7 +36,7 @@ static size_t fread__(void *ptr, size_t size, size_t nitems, FILE *stream)
36
36
{
37
37
size_t nread = 0 ;
38
38
while (!feof (stream) && !ferror (stream) && (nread < nitems))
39
- nread += fread ((char *)ptr+nread*size, size, THMin (2147483648UL /size, nitems-nread), stream);
39
+ nread += fread ((char *)ptr+nread*size, size, std::min< size_t > (2147483648UL /size, nitems-nread), stream);
40
40
return nread;
41
41
}
42
42
#else
@@ -81,57 +81,7 @@ static size_t fread__(void *ptr, size_t size, size_t nitems, FILE *stream)
81
81
} \
82
82
\
83
83
return nread; \
84
- } \
85
- \
86
- static long THDiskFile_write##TYPEC(THFile *self, TYPE *data, long n) \
87
- { \
88
- THDiskFile *dfself = (THDiskFile*)(self); \
89
- long nwrite = 0L ; \
90
- \
91
- THArgCheck (dfself->handle != NULL , 1 , " attempt to use a closed file" ); \
92
- THArgCheck (dfself->file .isWritable , 1 , " attempt to write in a read-only file" ); \
93
- \
94
- if (dfself->file .isBinary ) \
95
- { \
96
- if (dfself->isNativeEncoding ) \
97
- { \
98
- nwrite = fwrite (data, sizeof (TYPE), n, dfself->handle ); \
99
- } \
100
- else \
101
- { \
102
- if (sizeof (TYPE) > 1 ) \
103
- { \
104
- char *buffer = (char *)THAlloc (sizeof (TYPE)*n); \
105
- THDiskFile_reverseMemory (buffer, data, sizeof (TYPE), n); \
106
- nwrite = fwrite (buffer, sizeof (TYPE), n, dfself->handle ); \
107
- THFree (buffer); \
108
- } \
109
- else \
110
- nwrite = fwrite (data, sizeof (TYPE), n, dfself->handle ); \
111
- } \
112
- } \
113
- else \
114
- { \
115
- long i; \
116
- for (i = 0 ; i < n; i++) \
117
- { \
118
- ASCII_WRITE_ELEM; \
119
- if ( dfself->file .isAutoSpacing && (i < n-1 ) ) \
120
- fprintf (dfself->handle , " " ); \
121
- } \
122
- if (dfself->file .isAutoSpacing && (n > 0 )) \
123
- fprintf (dfself->handle , " \n " ); \
124
- } \
125
- \
126
- if (nwrite != n) \
127
- { \
128
- dfself->file .hasError = 1 ; \
129
- if (!dfself->file .isQuiet ) \
130
- THError (" write error: wrote %d blocks instead of %d" , nwrite, n); \
131
- } \
132
- \
133
- return nwrite; \
134
- }
84
+ }
135
85
136
86
static int THDiskFile_mode (const char *mode, int *isReadable, int *isWritable)
137
87
{
@@ -162,13 +112,6 @@ static int THDiskFile_mode(const char *mode, int *isReadable, int *isWritable)
162
112
return 0 ;
163
113
}
164
114
165
- static void THDiskFile_synchronize (THFile *self)
166
- {
167
- THDiskFile *dfself = (THDiskFile*)(self);
168
- THArgCheck (dfself->handle != NULL , 1 , " attempt to use a closed file" );
169
- fflush (dfself->handle );
170
- }
171
-
172
115
static void THDiskFile_seek (THFile *self, long position)
173
116
{
174
117
THDiskFile *dfself = (THDiskFile*)(self);
@@ -326,11 +269,6 @@ static void THDiskFile_free(THFile *self)
326
269
THFree (dfself);
327
270
}
328
271
329
- /* READ_WRITE_METHODS(int, Bool, */
330
- /* int value = 0; int ret = fscanf(file->handle, "%d", &value); array[i] = (value ? 1 : 0); if(ret <= 0) break; else result++, */
331
- /* int value = (array[i] ? 1 : 0); nElemWritten = fprintf(file->handle, "%d", value), */
332
- /* true) */
333
-
334
272
/* Note that we do a trick */
335
273
READ_WRITE_METHODS (unsigned char , Byte,
336
274
nread = fread(data, 1 , n, dfself->handle); break ,
@@ -426,79 +364,6 @@ static long THDiskFile_readLong(THFile *self, int64 *data, long n)
426
364
return nread;
427
365
}
428
366
429
- static long THDiskFile_writeLong (THFile *self, int64 *data, long n)
430
- {
431
- THDiskFile *dfself = (THDiskFile*)(self);
432
- long nwrite = 0L ;
433
-
434
- THArgCheck (dfself->handle != NULL , 1 , " attempt to use a closed file" );
435
- THArgCheck (dfself->file .isWritable , 1 , " attempt to write in a read-only file" );
436
-
437
- if (dfself->file .isBinary )
438
- {
439
- if (dfself->longSize == 0 || dfself->longSize == sizeof (long ))
440
- {
441
- if (dfself->isNativeEncoding )
442
- {
443
- nwrite = fwrite (data, sizeof (long ), n, dfself->handle );
444
- }
445
- else
446
- {
447
- char *buffer = (char *)THAlloc (sizeof (long )*n);
448
- THDiskFile_reverseMemory (buffer, data, sizeof (long ), n);
449
- nwrite = fwrite (buffer, sizeof (long ), n, dfself->handle );
450
- THFree (buffer);
451
- }
452
- } else if (dfself->longSize == 4 )
453
- {
454
- int32_t *buffer = (int32_t *)THAlloc (4 *n);
455
- long i;
456
- for (i = 0 ; i < n; i++)
457
- buffer[i] = data[i];
458
- if (!dfself->isNativeEncoding )
459
- THDiskFile_reverseMemory (buffer, buffer, 4 , n);
460
- nwrite = fwrite (buffer, 4 , n, dfself->handle );
461
- THFree (buffer);
462
- }
463
- else /* if(dfself->longSize == 8) */
464
- {
465
- int big_endian = !THDiskFile_isLittleEndianCPU ();
466
- int32_t *buffer = (int32_t *)THAlloc (8 *n);
467
- long i;
468
- for (i = 0 ; i < n; i++)
469
- {
470
- buffer[2 *i + !big_endian] = 0 ;
471
- buffer[2 *i + big_endian] = data[i];
472
- }
473
- if (!dfself->isNativeEncoding )
474
- THDiskFile_reverseMemory (buffer, buffer, 8 , n);
475
- nwrite = fwrite (buffer, 8 , n, dfself->handle );
476
- THFree (buffer);
477
- }
478
- }
479
- else
480
- {
481
- long i;
482
- for (i = 0 ; i < n; i++)
483
- {
484
- long res = 0 ;
485
- int ret = fprintf (dfself->handle , " %ld" , res); data[i] = res; if (ret <= 0 ) break ; else nwrite++;
486
- if ( dfself->file .isAutoSpacing && (i < n-1 ) )
487
- fprintf (dfself->handle , " " );
488
- }
489
- if (dfself->file .isAutoSpacing && (n > 0 ))
490
- fprintf (dfself->handle , " \n " );
491
- }
492
-
493
- if (nwrite != n)
494
- {
495
- dfself->file .hasError = 1 ;
496
- if (!dfself->file .isQuiet )
497
- THError (" write error: wrote %d blocks instead of %d" , nwrite, n);
498
- }
499
-
500
- return nwrite;
501
- }
502
367
503
368
static long THDiskFile_readString (THFile *self, const char *format, char **str_)
504
369
{
@@ -592,25 +457,6 @@ static long THDiskFile_readString(THFile *self, const char *format, char **str_)
592
457
}
593
458
594
459
595
- static long THDiskFile_writeString (THFile *self, const char *str, long size)
596
- {
597
- THDiskFile *dfself = (THDiskFile*)(self);
598
- long nwrite;
599
-
600
- THArgCheck (dfself->handle != NULL , 1 , " attempt to use a closed file" );
601
- THArgCheck (dfself->file .isWritable , 1 , " attempt to write in a read-only file" );
602
-
603
- nwrite = fwrite (str, 1 , size, dfself->handle );
604
- if (nwrite != size)
605
- {
606
- dfself->file .hasError = 1 ;
607
- if (!dfself->file .isQuiet )
608
- THError (" write error: wrote %ld blocks instead of %ld" , nwrite, size);
609
- }
610
-
611
- return nwrite;
612
- }
613
-
614
460
THFile *THDiskFile_new (const char *name, const char *mode, int isQuiet)
615
461
{
616
462
static struct THFileVTable vtable = {
@@ -625,16 +471,6 @@ THFile *THDiskFile_new(const char *name, const char *mode, int isQuiet)
625
471
THDiskFile_readDouble,
626
472
THDiskFile_readString,
627
473
628
- THDiskFile_writeByte,
629
- THDiskFile_writeChar,
630
- THDiskFile_writeShort,
631
- THDiskFile_writeInt,
632
- THDiskFile_writeLong,
633
- THDiskFile_writeFloat,
634
- THDiskFile_writeDouble,
635
- THDiskFile_writeString,
636
-
637
- THDiskFile_synchronize,
638
474
THDiskFile_seek,
639
475
THDiskFile_seekEnd,
640
476
THDiskFile_position,
@@ -649,122 +485,12 @@ THFile *THDiskFile_new(const char *name, const char *mode, int isQuiet)
649
485
650
486
THArgCheck (THDiskFile_mode (mode, &isReadable, &isWritable), 2 , " file mode should be 'r','w' or 'rw'" );
651
487
652
- if ( isReadable && isWritable )
653
- {
654
- handle = fopen (name, " r+b" );
655
- if (!handle)
656
- {
657
- handle = fopen (name, " wb" );
658
- if (handle)
659
- {
660
- fclose (handle);
661
- handle = fopen (name, " r+b" );
662
- }
663
- }
664
- }
665
- else
666
- handle = fopen (name, (isReadable ? " rb" : " wb" ));
667
-
668
- if (!handle)
669
- {
670
- if (isQuiet)
671
- return 0 ;
672
- else
673
- THError (" cannot open <%s> in mode %c%c" , name, (isReadable ? ' r' : ' ' ), (isWritable ? ' w' : ' ' ));
674
- }
675
-
676
- self = (THDiskFile*)THAlloc (sizeof (THDiskFile));
677
-
678
- self->handle = handle;
679
- self->name = (char *)THAlloc (strlen (name)+1 );
680
- strcpy (self->name , name);
681
- self->isNativeEncoding = 1 ;
682
- self->longSize = 0 ;
683
-
684
- self->file .vtable = &vtable;
685
- self->file .isQuiet = isQuiet;
686
- self->file .isReadable = isReadable;
687
- self->file .isWritable = isWritable;
688
- self->file .isBinary = 0 ;
689
- self->file .isAutoSpacing = 1 ;
690
- self->file .hasError = 0 ;
691
-
692
- return (THFile*)self;
693
- }
694
-
695
- /* PipeFile */
696
-
697
- static int THPipeFile_mode (const char *mode, int *isReadable, int *isWritable)
698
- {
699
- *isReadable = 0 ;
700
- *isWritable = 0 ;
701
- if (strlen (mode) == 1 )
702
- {
703
- if (*mode == ' r' )
704
- {
705
- *isReadable = 1 ;
706
- return 1 ;
707
- }
708
- else if (*mode == ' w' )
709
- {
710
- *isWritable = 1 ;
711
- return 1 ;
712
- }
713
- }
714
- return 0 ;
715
- }
716
-
717
- static void THPipeFile_free (THFile *self)
718
- {
719
- THDiskFile *dfself = (THDiskFile*)(self);
720
- if (dfself->handle )
721
- pclose (dfself->handle );
722
- THFree (dfself->name );
723
- THFree (dfself);
724
- }
725
-
726
- THFile *THPipeFile_new (const char *name, const char *mode, int isQuiet)
727
- {
728
- static struct THFileVTable vtable = {
729
- THDiskFile_isOpened,
730
-
731
- THDiskFile_readByte,
732
- THDiskFile_readChar,
733
- THDiskFile_readShort,
734
- THDiskFile_readInt,
735
- THDiskFile_readLong,
736
- THDiskFile_readFloat,
737
- THDiskFile_readDouble,
738
- THDiskFile_readString,
739
-
740
- THDiskFile_writeByte,
741
- THDiskFile_writeChar,
742
- THDiskFile_writeShort,
743
- THDiskFile_writeInt,
744
- THDiskFile_writeLong,
745
- THDiskFile_writeFloat,
746
- THDiskFile_writeDouble,
747
- THDiskFile_writeString,
748
-
749
- THDiskFile_synchronize,
750
- THDiskFile_seek,
751
- THDiskFile_seekEnd,
752
- THDiskFile_position,
753
- THDiskFile_close,
754
- THPipeFile_free
755
- };
756
-
757
- int isReadable;
758
- int isWritable;
759
- FILE *handle;
760
- THDiskFile *self;
761
-
762
- THArgCheck (THPipeFile_mode (mode, &isReadable, &isWritable), 2 , " file mode should be 'r','w'" );
763
-
764
- #ifdef _WIN32
765
- handle = popen (name, (isReadable ? " rb" : " wb" ));
488
+ CV_Assert (isReadable && !isWritable);
489
+ #ifdef _MSC_VER
490
+ if (fopen_s (&handle, name, " rb" ) != 0 )
491
+ handle = NULL ;
766
492
#else
767
- handle = popen (name, (isReadable ? " r " : " w " ) );
493
+ handle = fopen (name," rb " );
768
494
#endif
769
495
770
496
if (!handle)
0 commit comments