GRASS 8 Programmer's Manual
8.6.0dev(2026)-f6f2c534ea
Loading...
Searching...
No Matches
safileio.c
Go to the documentation of this file.
1
/******************************************************************************
2
*
3
* Project: Shapelib
4
* Purpose: Default implementation of file io based on stdio.
5
* Author: Frank Warmerdam, warmerdam@pobox.com
6
*
7
******************************************************************************
8
* Copyright (c) 2007, Frank Warmerdam
9
* Copyright (c) 2016-2024, Even Rouault <even dot rouault at spatialys.com>
10
*
11
* SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
12
******************************************************************************
13
*
14
*/
15
16
#include "
shapefil_private.h
"
17
18
#include <assert.h>
19
#include <math.h>
20
#include <limits.h>
21
#include <
stdio.h
>
22
#include <
stdlib.h
>
23
#include <
string.h
>
24
25
#ifdef SHPAPI_UTF8_HOOKS
26
#ifdef SHPAPI_WINDOWS
27
#define WIN32_LEAN_AND_MEAN
28
#define NOMINMAX
29
#include <windows.h>
30
#pragma comment(lib, "kernel32.lib")
31
#endif
32
#endif
33
34
static
SAFile
SADFOpen(
const
char
*
pszFilename
,
const
char
*
pszAccess
,
35
void
*pvUserData)
36
{
37
(
void
)pvUserData;
38
return
(
SAFile
)
fopen
(
pszFilename
,
pszAccess
);
39
}
40
41
static
SAOffset
SADFRead(
void
*p,
SAOffset
size,
SAOffset
nmemb
,
SAFile
file
)
42
{
43
return
(
SAOffset
)
fread
(p, (
size_t
)size, (
size_t
)
nmemb
, (
FILE
*)
file
);
44
}
45
46
static
SAOffset
SADFWrite(
const
void
*p,
SAOffset
size,
SAOffset
nmemb
,
47
SAFile
file
)
48
{
49
return
(
SAOffset
)
fwrite
(p, (
size_t
)size, (
size_t
)
nmemb
, (
FILE
*)
file
);
50
}
51
52
static
SAOffset
SADFSeek(
SAFile
file
,
SAOffset
offset,
int
whence
)
53
{
54
#if defined(_MSC_VER) && _MSC_VER >= 1400
55
return
(
SAOffset
)
_fseeki64
((
FILE
*)
file
, (
__int64
)offset,
whence
);
56
#else
57
return
(
SAOffset
)
fseek
((
FILE
*)
file
, (
long
)offset,
whence
);
58
#endif
59
}
60
61
static
SAOffset
SADFTell(
SAFile
file
)
62
{
63
#if defined(_MSC_VER) && _MSC_VER >= 1400
64
return
(
SAOffset
)
_ftelli64
((
FILE
*)
file
);
65
#else
66
return
(
SAOffset
)
ftell
((
FILE
*)
file
);
67
#endif
68
}
69
70
static
int
SADFFlush(
SAFile
file
)
71
{
72
return
fflush
((
FILE
*)
file
);
73
}
74
75
static
int
SADFClose(
SAFile
file
)
76
{
77
return
fclose
((
FILE
*)
file
);
78
}
79
80
static
int
SADRemove(
const
char
*filename,
void
*pvUserData)
81
{
82
(
void
)pvUserData;
83
return
remove
(filename);
84
}
85
86
static
void
SADError(
const
char
*
message
)
87
{
88
fprintf
(
stderr
,
"%s\n"
,
message
);
89
}
90
91
void
SASetupDefaultHooks
(
SAHooks
*
psHooks
)
92
{
93
psHooks
->FOpen = SADFOpen;
94
psHooks
->FRead = SADFRead;
95
psHooks
->FWrite = SADFWrite;
96
psHooks
->FSeek = SADFSeek;
97
psHooks
->FTell = SADFTell;
98
psHooks
->FFlush = SADFFlush;
99
psHooks
->FClose = SADFClose;
100
psHooks
->Remove = SADRemove;
101
102
psHooks
->Error = SADError;
103
psHooks
->Atof =
atof
;
104
psHooks
->pvUserData =
SHPLIB_NULLPTR
;
105
}
106
107
#ifdef SHPAPI_WINDOWS
108
109
static
wchar_t
*
Utf8ToWideChar
(
const
char
*
pszFilename
)
110
{
111
const
int
nMulti
= (
int
)
strlen
(
pszFilename
) + 1;
112
const
int
nWide
=
113
MultiByteToWideChar
(
CP_UTF8
, 0,
pszFilename
,
nMulti
, 0, 0);
114
if
(
nWide
== 0) {
115
return
NULL
;
116
}
117
wchar_t
*
pwszFileName
= (
wchar_t
*)
malloc
(
nWide
*
sizeof
(
wchar_t
));
118
if
(
pwszFileName
==
NULL
) {
119
return
NULL
;
120
}
121
if
(
MultiByteToWideChar
(
CP_UTF8
, 0,
pszFilename
,
nMulti
,
pwszFileName
,
122
nWide
) == 0) {
123
free
(
pwszFileName
);
124
return
NULL
;
125
}
126
return
pwszFileName
;
127
}
128
129
/************************************************************************/
130
/* SAUtf8WFOpen */
131
/************************************************************************/
132
133
static
SAFile
SAUtf8WFOpen
(
const
char
*
pszFilename
,
const
char
*
pszAccess
,
134
void
*pvUserData)
135
{
136
(
void
)pvUserData;
137
SAFile
file
=
NULL
;
138
wchar_t
*
pwszFileName
=
Utf8ToWideChar
(
pszFilename
);
139
wchar_t
*
pwszAccess
=
Utf8ToWideChar
(
pszAccess
);
140
if
(
pwszFileName
!=
NULL
&&
pwszAccess
!=
NULL
) {
141
file
= (
SAFile
)
_wfopen
(
pwszFileName
,
pwszAccess
);
142
}
143
free
(
pwszFileName
);
144
free
(
pwszAccess
);
145
return
file
;
146
}
147
148
static
int
SAUtf8WRemove
(
const
char
*
pszFilename
,
void
*pvUserData)
149
{
150
(
void
)pvUserData;
151
wchar_t
*
pwszFileName
=
Utf8ToWideChar
(
pszFilename
);
152
int
rc
= -1;
153
if
(
pwszFileName
!=
NULL
) {
154
rc
=
_wremove
(
pwszFileName
);
155
}
156
free
(
pwszFileName
);
157
return
rc
;
158
}
159
160
#endif
161
162
#ifdef SHPAPI_UTF8_HOOKS
163
#ifndef SHPAPI_WINDOWS
164
#error "no implementations of UTF-8 hooks available for this platform"
165
#endif
166
167
void
SASetupUtf8Hooks
(
SAHooks
*
psHooks
)
168
{
169
psHooks
->FOpen =
SAUtf8WFOpen
;
170
psHooks
->Remove =
SAUtf8WRemove
;
171
psHooks
->FRead = SADFRead;
172
psHooks
->FWrite = SADFWrite;
173
psHooks
->FSeek = SADFSeek;
174
psHooks
->FTell = SADFTell;
175
psHooks
->FFlush = SADFFlush;
176
psHooks
->FClose = SADFClose;
177
178
psHooks
->Error = SADError;
179
psHooks
->Atof =
atof
;
180
psHooks
->pvUserData =
SHPLIB_NULLPTR
;
181
}
182
#endif
NULL
#define NULL
Definition
ccmath.h:32
AMI_STREAM
Definition
ami_stream.h:153
file
#define file
SASetupDefaultHooks
void SASetupDefaultHooks(SAHooks *psHooks)
Definition
safileio.c:91
SAFile
int * SAFile
Definition
shapefil.h:125
shapefil_private.h
SHPLIB_NULLPTR
#define SHPLIB_NULLPTR
Definition
shapefil_private.h:28
malloc
void * malloc(unsigned)
free
void free(void *)
stdio.h
stdlib.h
string.h
SAHooks
Definition
shapefil.h:135
lib
external
shapelib
safileio.c
Generated on Sun Apr 12 2026 06:59:14 for GRASS 8 Programmer's Manual by
1.9.8