GRASS 8 Programmer's Manual 8.6.0dev(2026)-4bb960b182
Loading...
Searching...
No Matches
head.c
Go to the documentation of this file.
1/*****************************************************************************
2 *
3 * MODULE: Vector library
4 *
5 * AUTHOR(S): Original author CERL, probably Dave Gerdes.
6 * Update to GRASS 5.7 Radim Blazek.
7 *
8 * PURPOSE: Lower level functions for reading/writing/manipulating vectors.
9 *
10 * SPDX-FileCopyrightText: 2001 GRASS Development Team
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 *
13 *****************************************************************************/
14
15#include <inttypes.h>
16#include <sys/types.h>
17#include <string.h>
18#include <grass/vector.h>
19
21{
22 unsigned char buf[10];
23 long length = GV_COOR_HEAD_SIZE;
24
25 G_debug(1, "dig__write_head()");
26
27 dig_set_cur_port(&(Map->head.port));
28 dig_fseek(&(Map->dig_fp), 0L, 0);
29
30 /* bytes 1 - 5 */
31 buf[0] = Map->head.coor_version.major;
32 buf[1] = Map->head.coor_version.minor;
33 buf[2] = Map->head.coor_version.back_major;
34 buf[3] = Map->head.coor_version.back_minor;
35
36 buf[4] = Map->head.port.byte_order;
37 if (0 >= dig__fwrite_port_C((char *)buf, 5, &(Map->dig_fp)))
38 return (0);
39
40 /* increase header size for new vectors, already set in V1_open_new_nat() */
41 length = Map->head.head_size;
42
43 /* bytes 6 - 9 : header size */
44 if (0 >= dig__fwrite_port_L(&length, 1, &(Map->dig_fp)))
45 return (0);
46
47 /* byte 10 : dimension 2D or 3D */
48 buf[0] = Map->head.with_z;
49 if (0 >= dig__fwrite_port_C((char *)buf, 1, &(Map->dig_fp)))
50 return (0);
51
52 /* bytes 11 - 18 : size of coordinate file */
53 G_debug(1, "write coor size (%" PRId64 ") to head", Map->head.size);
54 if (Map->head.head_size >= GV_COOR_HEAD_SIZE + 4) {
55 if (Map->head.size > PORT_LONG_MAX) {
56 /* can only happen when sizeof(off_t) == 8 */
57 if (0 >= dig__fwrite_port_O(&(Map->head.size), 1, &(Map->dig_fp),
58 sizeof(off_t)))
59 return (0);
60 }
61 else {
62 /* write twice to fill the space and set offset (account for
63 * sizeof(off_t) == 4) */
64 if (0 >=
65 dig__fwrite_port_O(&(Map->head.size), 1, &(Map->dig_fp), 4))
66 return (0);
67 if (0 >=
68 dig__fwrite_port_O(&(Map->head.size), 1, &(Map->dig_fp), 4))
69 return (0);
70 }
71 }
72 else {
73 /* old vector with shorter coor head size got modified */
74 /* bytes 11 - 14 : size of coordinate file */
75 if (0 >= dig__fwrite_port_O(&(Map->head.size), 1, &(Map->dig_fp), 4))
76 return (0);
77 }
78
79 G_debug(2, "coor body offset %" PRId64, dig_ftell(&(Map->dig_fp)));
80
81 return 1;
82}
83
85{
86 unsigned char buf[10];
87 struct Port_info port;
88
89 G_debug(2, "dig__read_head(): name = '%s'", Map->name);
90 dig_fseek(&(Map->dig_fp), 0L, 0);
91
92 /* bytes 1 - 5 */
93 if (0 >= dig__fread_port_C((char *)buf, 5, &(Map->dig_fp)))
94 return (0);
95 Map->head.coor_version.major = buf[0];
96 Map->head.coor_version.minor = buf[1];
97 Map->head.coor_version.back_major = buf[2];
98 Map->head.coor_version.back_minor = buf[3];
99 Map->head.port.byte_order = buf[4];
100
101 G_debug(
102 2,
103 "Coor header: file version %d.%d , supported from GRASS version %d.%d",
104 Map->head.coor_version.major, Map->head.coor_version.minor,
105 Map->head.coor_version.back_major, Map->head.coor_version.back_minor);
106
107 G_debug(2, " byte order %d", Map->head.port.byte_order);
108
109 /* check version numbers */
110 if (Map->head.coor_version.major > GV_COOR_VER_MAJOR ||
111 Map->head.coor_version.minor > GV_COOR_VER_MINOR) {
112 /* The file was created by GRASS library with higher version than this
113 * one */
114
115 if (Map->head.coor_version.back_major > GV_COOR_VER_MAJOR ||
116 Map->head.coor_version.back_minor > GV_COOR_VER_MINOR) {
117 /* This version of GRASS lib is lower than the oldest which can read
118 * this format */
119 G_fatal_error("Vector 'coor' format version %d.%d is not supported "
120 "by this version of GRASS. "
121 "Update your GRASS.",
122 Map->head.coor_version.major,
123 Map->head.coor_version.minor);
124 return (-1);
125 }
126
127 G_warning(
128 "Your GRASS version does not fully support vector format %d.%d."
129 " Consider to upgrade GRASS.",
130 Map->head.coor_version.major, Map->head.coor_version.minor);
131 }
132
133 dig_init_portable(&port, Map->head.port.byte_order);
134 dig_set_cur_port(&port);
135
136 /* bytes 6 - 9 : header size */
137 if (0 >= dig__fread_port_L(&(Map->head.head_size), 1, &(Map->dig_fp)))
138 return (0);
139 G_debug(2, " header size %ld", Map->head.head_size);
140
141 /* byte 10 : dimension 2D or 3D */
142 if (0 >= dig__fread_port_C((char *)buf, 1, &(Map->dig_fp)))
143 return (0);
144 Map->head.with_z = buf[0];
145 G_debug(2, " with_z %d", Map->head.with_z);
146
147 /* Map->head.size holds stats value */
148 if (Map->head.size > PORT_LONG_MAX &&
149 Map->head.head_size >= GV_COOR_HEAD_SIZE + 4) {
150 /* bytes 11 - 18 : size of coordinate file */
151 if (0 >= dig__fread_port_O(&(Map->head.size), 1, &(Map->dig_fp),
152 sizeof(off_t)))
153 return (0);
154 }
155 else {
156 /* bytes 11 - 14 : size of coordinate file */
157 if (0 >= dig__fread_port_O(&(Map->head.size), 1, &(Map->dig_fp), 4))
158 return (0);
159 }
160 G_debug(2, " coor size %" PRId64, Map->head.size);
161
162 /* Go to end of header, file may be written by new version of GRASS with
163 * longer header */
164
165 dig_fseek(&(Map->dig_fp), Map->head.head_size, SEEK_SET);
166
167 return (1);
168}
AMI_err name(char **stream_name)
Definition ami_stream.h:426
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
void G_warning(const char *,...) __attribute__((format(printf
int G_debug(int, const char *,...) __attribute__((format(printf
#define PORT_LONG_MAX
Definition dig_defines.h:70
#define GV_COOR_VER_MAJOR
The latest versions of files known by current version of the library. Used for new files.
#define GV_COOR_HEAD_SIZE
Coordinates file head size.
#define GV_COOR_VER_MINOR
int dig__fread_port_O(off_t *, size_t, struct gvfile *, size_t)
Read off_ts from the Portable Vector Format.
Definition portable.c:165
int dig__fwrite_port_C(const char *, size_t, struct gvfile *)
Write chars to the Portable Vector Format.
Definition portable.c:884
void dig_init_portable(struct Port_info *, int)
Set Port_info structure to byte order of file.
Definition portable.c:898
int dig__fread_port_L(long *, size_t, struct gvfile *)
Read longs from the Portable Vector Format.
Definition portable.c:260
int dig__fwrite_port_L(const long *, size_t, struct gvfile *)
Write longs to the Portable Vector Format.
Definition portable.c:701
off_t dig_ftell(struct gvfile *file)
Get struct gvfile position.
Definition file.c:34
int dig_set_cur_port(struct Port_info *)
Set current Port_info structure.
Definition portable.c:994
int dig__fread_port_C(char *, size_t, struct gvfile *)
Read chars from the Portable Vector Format.
Definition portable.c:509
int dig_fseek(struct gvfile *file, off_t offset, int whence)
Set struct gvfile position.
Definition file.c:58
int dig__fwrite_port_O(const off_t *, size_t, struct gvfile *, size_t)
Write off_ts to the Portable Vector Format.
Definition portable.c:634
int dig__read_head(struct Map_info *Map)
Definition head.c:84
int dig__write_head(struct Map_info *Map)
Definition head.c:20
Vector map info.
Portability info.