GRASS Programmer's Manual
6.4.1(2011)
|
00001 /* 00002 **************************************************************************** 00003 * 00004 * MODULE: Vector library 00005 * 00006 * AUTHOR(S): Original author CERL, probably Dave Gerdes. 00007 * Update to GRASS 5.7 Radim Blazek. 00008 * 00009 * PURPOSE: Lower level functions for reading/writing/manipulating vectors. 00010 * 00011 * COPYRIGHT: (C) 2001 by the GRASS Development Team 00012 * 00013 * This program is free software under the GNU General Public 00014 * License (>=v2). Read the file COPYING that comes with GRASS 00015 * for details. 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 /* bytes 1 - 5 */ 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 /* bytes 6 - 9 : header size */ 00043 if (0 >= dig__fwrite_port_L(&length, 1, &(Map->dig_fp))) 00044 return (0); 00045 00046 /* byte 10 : dimension 2D or 3D */ 00047 buf[0] = Map->head.with_z; 00048 if (0 >= dig__fwrite_port_C(buf, 1, &(Map->dig_fp))) 00049 return (0); 00050 00051 /* bytes 11 - 14 : size of coordinate file */ 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 /* bytes 1 - 5 */ 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 /* check version numbers */ 00085 if (Map->head.Version_Major > GV_COOR_VER_MAJOR || 00086 Map->head.Version_Minor > GV_COOR_VER_MINOR) { 00087 /* The file was created by GRASS library with higher version than this one */ 00088 00089 if (Map->head.Back_Major > GV_COOR_VER_MAJOR || 00090 Map->head.Back_Minor > GV_COOR_VER_MINOR) { 00091 /* This version of GRASS lib is lower than the oldest which can read this format */ 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 /* bytes 6 - 9 : header size */ 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 /* byte 10 : dimension 2D or 3D */ 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 /* bytes 11 - 14 : size of coordinate file */ 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 /* Go to end of header, file may be written by new version of GRASS with longer header */ 00125 00126 dig_fseek(&(Map->dig_fp), Map->head.head_size, SEEK_SET); 00127 00128 return (1); 00129 }