00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <string.h>
00019 #include <grass/gis.h>
00020 #include <grass/Vect.h>
00021
00022 int dig__write_head(struct Map_info *Map)
00023 {
00024 unsigned char buf[10];
00025 long length = GV_COOR_HEAD_SIZE;
00026
00027 G_debug(1, "dig__write_head()");
00028
00029 dig_set_cur_port(&(Map->head.port));
00030 dig_fseek(&(Map->dig_fp), 0L, 0);
00031
00032
00033 buf[0] = Map->head.Version_Major;
00034 buf[1] = Map->head.Version_Minor;
00035 buf[2] = Map->head.Back_Major;
00036 buf[3] = Map->head.Back_Minor;
00037
00038 buf[4] = Map->head.port.byte_order;
00039 if (0 >= dig__fwrite_port_C(buf, 5, &(Map->dig_fp)))
00040 return (0);
00041
00042
00043 if (0 >= dig__fwrite_port_L(&length, 1, &(Map->dig_fp)))
00044 return (0);
00045
00046
00047 buf[0] = Map->head.with_z;
00048 if (0 >= dig__fwrite_port_C(buf, 1, &(Map->dig_fp)))
00049 return (0);
00050
00051
00052 G_debug(1, "write coor size (%ld) to head", Map->head.size);
00053 if (0 >= dig__fwrite_port_L(&(Map->head.size), 1, &(Map->dig_fp)))
00054 return (0);
00055
00056 G_debug(2, "coor body offset %ld", dig_ftell(&(Map->dig_fp)));
00057 return (1);
00058 }
00059
00060
00061 int dig__read_head(struct Map_info *Map)
00062 {
00063 unsigned char buf[10];
00064 struct Port_info port;
00065
00066 dig_fseek(&(Map->dig_fp), 0L, 0);
00067
00068
00069 if (0 >= dig__fread_port_C(buf, 5, &(Map->dig_fp)))
00070 return (0);
00071 Map->head.Version_Major = buf[0];
00072 Map->head.Version_Minor = buf[1];
00073 Map->head.Back_Major = buf[2];
00074 Map->head.Back_Minor = buf[3];
00075 Map->head.port.byte_order = buf[4];
00076
00077 G_debug(2,
00078 "Coor header: file version %d.%d , supported from GRASS version %d.%d",
00079 Map->head.Version_Major, Map->head.Version_Minor,
00080 Map->head.Back_Major, Map->head.Back_Minor);
00081
00082 G_debug(2, " byte order %d", Map->head.port.byte_order);
00083
00084
00085 if (Map->head.Version_Major > GV_COOR_VER_MAJOR ||
00086 Map->head.Version_Minor > GV_COOR_VER_MINOR) {
00087
00088
00089 if (Map->head.Back_Major > GV_COOR_VER_MAJOR ||
00090 Map->head.Back_Minor > GV_COOR_VER_MINOR) {
00091
00092 G_fatal_error
00093 ("Vector 'coor' format version %d.%d is not supported by this version of GRASS. "
00094 "Update your GRASS.", Map->head.Version_Major,
00095 Map->head.Version_Minor);
00096 return (-1);
00097 }
00098
00099 G_warning
00100 ("Your GRASS version does not fully support vector format %d.%d."
00101 " Consider to upgrade GRASS.", Map->head.Version_Major,
00102 Map->head.Version_Minor);
00103 }
00104
00105 dig_init_portable(&port, Map->head.port.byte_order);
00106 dig_set_cur_port(&port);
00107
00108
00109 if (0 >= dig__fread_port_L(&(Map->head.head_size), 1, &(Map->dig_fp)))
00110 return (0);
00111 G_debug(2, " header size %ld", Map->head.head_size);
00112
00113
00114 if (0 >= dig__fread_port_C(buf, 1, &(Map->dig_fp)))
00115 return (0);
00116 Map->head.with_z = buf[0];
00117 G_debug(2, " with_z %d", Map->head.with_z);
00118
00119
00120 if (0 >= dig__fread_port_L(&(Map->head.size), 1, &(Map->dig_fp)))
00121 return (0);
00122 G_debug(2, " coor size %ld", Map->head.size);
00123
00124
00125
00126 dig_fseek(&(Map->dig_fp), Map->head.head_size, SEEK_SET);
00127
00128 return (1);
00129 }