head.c

Go to the documentation of this file.
00001 /*
00002 * $Id: head.c,v 1.8 2006/02/09 03:08:58 glynn Exp $
00003 *
00004 ****************************************************************************
00005 *
00006 * MODULE:       Vector library 
00007 *               
00008 * AUTHOR(S):    Original author CERL, probably Dave Gerdes.
00009 *               Update to GRASS 5.7 Radim Blazek.
00010 *
00011 * PURPOSE:      Lower level functions for reading/writing/manipulating vectors.
00012 *
00013 * COPYRIGHT:    (C) 2001 by the GRASS Development Team
00014 *
00015 *               This program is free software under the GNU General Public
00016 *               License (>=v2). Read the file COPYING that comes with GRASS
00017 *               for details.
00018 *
00019 *****************************************************************************/
00020 #include <string.h>
00021 #include <grass/gis.h>
00022 #include <grass/Vect.h>
00023 
00024 int
00025 dig__write_head ( struct Map_info *Map )
00026 {
00027     unsigned char buf[10];      
00028     long length = GV_COOR_HEAD_SIZE;
00029 
00030     G_debug ( 1, "dig__write_head()");
00031     
00032     dig_set_cur_port (&(Map->head.port));
00033     dig_fseek ( &(Map->dig_fp), 0L, 0);
00034     
00035     /* bytes 1 - 5 */
00036     buf[0] = Map->head.Version_Major;
00037     buf[1] = Map->head.Version_Minor;
00038     buf[2] = Map->head.Back_Major;
00039     buf[3] = Map->head.Back_Minor;
00040     
00041     buf[4] = Map->head.port.byte_order;
00042     if (0 >= dig__fwrite_port_C ( buf, 5, &(Map->dig_fp) )) return (0);
00043     
00044     /* bytes 6 - 9 : header size */
00045     if (0 >= dig__fwrite_port_L ( &length, 1, &(Map->dig_fp) )) return (0);
00046     
00047     /* byte 10 : dimension 2D or 3D */
00048     buf[0] = Map->head.with_z;           
00049     if (0 >= dig__fwrite_port_C ( buf, 1, &(Map->dig_fp) )) 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) )) return (0);
00054 
00055     G_debug (2, "coor body offset %d", dig_ftell( &(Map->dig_fp) ));
00056     return (1);    
00057 }
00058 
00059 
00060 int
00061 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) )) return (0);
00070     Map->head.Version_Major = buf[0];
00071     Map->head.Version_Minor = buf[1];
00072     Map->head.Back_Major    = buf[2];
00073     Map->head.Back_Minor    = buf[3];
00074     Map->head.port.byte_order    = buf[4];
00075 
00076     G_debug (2, "Coor header: file version %d.%d , supported from GRASS version %d.%d",
00077                  Map->head.Version_Major, Map->head.Version_Minor, 
00078                  Map->head.Back_Major, Map->head.Back_Minor );
00079 
00080     G_debug (2, "  byte order %d", Map->head.port.byte_order );
00081     
00082     /* check version numbers */
00083     if ( Map->head.Version_Major > GV_COOR_VER_MAJOR || Map->head.Version_Minor > GV_COOR_VER_MINOR ) {
00084       /* The file was created by GRASS library with higher version than this one */
00085         
00086       if ( Map->head.Back_Major > GV_COOR_VER_MAJOR || Map->head.Back_Minor > GV_COOR_VER_MINOR ) {
00087           /* This version of GRASS lib is lower than the oldest which can read this format */
00088           G_fatal_error ( "Vector 'coor' format version %d.%d is not supported by this version of GRASS. "
00089                           "Update your GRASS.", Map->head.Version_Major, Map->head.Version_Minor);
00090           return (-1);
00091       }
00092 
00093       G_warning ( "Your GRASS version does not fully support vector format %d.%d."
00094                   " Consider to upgrade GRASS.",
00095                       Map->head.Version_Major, Map->head.Version_Minor );
00096     }
00097 
00098     dig_init_portable ( &port, Map->head.port.byte_order);
00099     dig_set_cur_port (&port);
00100 
00101     /* bytes 6 - 9 : header size */
00102     if (0 >= dig__fread_port_L ( &(Map->head.head_size), 1, &(Map->dig_fp) )) return (0);
00103     G_debug (2, "  header size %d", Map->head.head_size );
00104 
00105     /* byte 10 : dimension 2D or 3D */
00106     if (0 >= dig__fread_port_C ( buf, 1, &(Map->dig_fp) )) return (0);
00107     Map->head.with_z  = buf[0];
00108     G_debug (2, "  with_z %d", Map->head.with_z );
00109 
00110     /* bytes 11 - 14 : size of coordinate file */
00111     if (0 >= dig__fread_port_L ( &(Map->head.size), 1, &(Map->dig_fp) )) return (0);
00112     G_debug (2, "  coor size %d", Map->head.size );
00113     
00114     /* Go to end of header, file may be written by new version of GRASS with longer header */
00115 
00116     dig_fseek ( &(Map->dig_fp), Map->head.head_size, SEEK_SET );
00117     
00118     return (1);
00119 }
00120 
00121 
00122 

Generated on Sun Apr 6 17:32:44 2008 for GRASS by  doxygen 1.5.5