head.c

Go to the documentation of this file.
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 }

Generated on Thu Jul 16 13:21:17 2009 for GRASS Programmer's Manual by  doxygen 1.5.6