GRASS 8 Programmer's Manual 8.5.0RC1(2026)-3334b87d9c
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
34static SAFile SADFOpen(const char *pszFilename, const char *pszAccess,
35 void *pvUserData)
36{
37 (void)pvUserData;
38 return (SAFile)fopen(pszFilename, pszAccess);
39}
40
41static 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
46static SAOffset SADFWrite(const void *p, SAOffset size, SAOffset nmemb,
48{
49 return (SAOffset)fwrite(p, (size_t)size, (size_t)nmemb, (FILE *)file);
50}
51
52static 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
61static 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
70static int SADFFlush(SAFile file)
71{
72 return fflush((FILE *)file);
73}
74
75static int SADFClose(SAFile file)
76{
77 return fclose((FILE *)file);
78}
79
80static int SADRemove(const char *filename, void *pvUserData)
81{
82 (void)pvUserData;
83 return remove(filename);
84}
85
86static void SADError(const char *message)
87{
88 fprintf(stderr, "%s\n", message);
89}
90
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
109static 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
133static 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
148static 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
167void 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
#define NULL
Definition ccmath.h:32
#define file
void SASetupDefaultHooks(SAHooks *psHooks)
Definition safileio.c:91
int * SAFile
Definition shapefil.h:125
unsigned long SAOffset
Definition shapefil.h:131
#define SHPLIB_NULLPTR
void(* Error)(const char *message)
Definition shapefil.h:146
SAOffset(* FTell)(SAFile file)
Definition shapefil.h:141
int(* FFlush)(SAFile file)
Definition shapefil.h:142
SAFile(* FOpen)(const char *filename, const char *access, void *pvUserData)
Definition shapefil.h:136
double(* Atof)(const char *str)
Definition shapefil.h:147
void * pvUserData
Definition shapefil.h:148
SAOffset(* FWrite)(const void *p, SAOffset size, SAOffset nmemb, SAFile file)
Definition shapefil.h:138
int(* FClose)(SAFile file)
Definition shapefil.h:143
int(* Remove)(const char *filename, void *pvUserData)
Definition shapefil.h:144
SAOffset(* FRead)(void *p, SAOffset size, SAOffset nmemb, SAFile file)
Definition shapefil.h:137
SAOffset(* FSeek)(SAFile file, SAOffset offset, int whence)
Definition shapefil.h:140