open.c

Go to the documentation of this file.
00001 /*
00002  *****************************************************************
00003  * open routines
00004  *
00005  * G__open (element, name, mapset, mode)
00006  *      char *element         database element name
00007  *      char *name            map file name
00008  *      char *mapset          mapset containing map "name"
00009  *      int mode              0=read, 1=write, 2=read/write
00010  * 
00011  *      this is the lowest level open routine.
00012  *      opens the file 'name' in 'element' ("cell", etc)
00013  *      in mapset 'mapset' according to the i/o 'mode'
00014  *
00015  *      mode = 0 (read) will look for 'name' in 'mapset'
00016  *               and open the file for read only
00017  *               the file must exist
00018  *
00019  *      mode = 1 (write) will create an empty file 'name' in the
00020  *               current mapset and open the file for write only
00021  *               'mapset' ignored
00022  *
00023  *      mode = 2 (read and write) will open a file in the
00024  *               current mapset for reading and writing
00025  *               creating a new file if necessary
00026  *               'mapset' ignored
00027  *
00028  *      returns: open file descriptor (int)
00029  *               or -1 could not open
00030  *
00031  *******************************************************************
00032  * G_open_new (element, name)
00033  *      char *element         database element name
00034  *      char *name            map file name
00035  *
00036  *      creates 'name' in the current mapset and opens it
00037  *      for write only.
00038  *
00039  *      returns: open file descriptor (int)
00040  *               or -1 could not open
00041  *
00042  *******************************************************************
00043  * G_open_old (element, name, mapset)
00044  *      char *element         database element name
00045  *      char *name            map file name
00046  *      char *mapset          mapset containing map "name"
00047  *
00048  *      opens 'name' in 'mapset' for read only.
00049  *
00050  *      returns: open file descriptor (int)
00051  *               or -1 could not open
00052  *
00053  *******************************************************************
00054  * G_fopen_new (element, name)
00055  *      char *element         database element name
00056  *      char *name            map file name
00057  *
00058  *      creates 'name' in the current mapset and opens it
00059  *      for write only.
00060  *
00061  *      returns: open file descriptor (FILE *)
00062  *               or NULL could not open
00063  *
00064  *******************************************************************
00065  * G_fopen_old (element, name, mapset)
00066  *      char *element         database element name
00067  *      char *name            map file name
00068  *
00069  *      opens 'name' in 'mapset' for read only.
00070  *
00071  *      returns: open file descriptor (FILE *)
00072  *               or NULL could not open
00073  *******************************************************************/
00074 
00075 #include <grass/config.h>
00076 #include <string.h>
00077 
00078 #ifdef HAVE_UNISTD_H
00079 #include <unistd.h>
00080 #endif
00081 
00082 #include <grass/gis.h>
00083 #include <unistd.h>
00084 #include <fcntl.h>
00085 
00086 #ifdef __MINGW32__ 
00087 #include <stdlib.h> /*  _fmode */
00088 #include <fcntl.h> /*  _O_BINARY */
00089 #undef _fmode
00090 int _fmode = _O_BINARY;
00091 #endif 
00092 
00093 int G__open (
00094     char *element,
00095     char *name,
00096     char *mapset,
00097     int mode)
00098 {
00099     char path[1024];
00100     char xname[512], xmapset[512], *dummy;
00101 
00102 
00103     G__check_gisinit();
00104 
00105 /* READ */
00106     if (mode == 0)
00107     {
00108         if (G__name_is_fully_qualified (name, xname, xmapset))
00109         {
00110             if (strcmp (xmapset, mapset) != 0) {
00111                 fprintf(stderr, "G__open(r): mapset (%s) doesn't match xmapset (%s)\n",
00112                         mapset,xmapset);
00113                     return -1;
00114             }
00115             name = xname;
00116         }
00117         if ((dummy = G_find_file (element, name, mapset)) == NULL)
00118             return -1;
00119         G_free (dummy);
00120         G__file_name (path, element, name, mapset);
00121 
00122         return open (path, 0);
00123     }
00124 /* WRITE */
00125     if (mode == 1 || mode == 2)
00126     {
00127         if (G__name_is_fully_qualified (name, xname, xmapset))
00128         {
00129             if (strcmp (xmapset, G_mapset()) != 0) {
00130                 fprintf(stderr, "G__open(w): xmapset (%s) != G_mapset() (%s)\n",
00131                         xmapset,G_mapset());
00132                 return -1;
00133             }
00134             name = xname;
00135         }
00136 
00137         if (G_legal_filename(name) == -1)
00138             return -1;
00139 
00140         G__file_name (path, element, name, G_mapset());
00141         if(mode == 1 || access(path,0) != 0)
00142         {
00143             G__make_mapset_element (element);
00144             close (creat (path, 0666));
00145         }
00146 
00147         return open (path, mode);
00148     }
00149     return -1;
00150 }
00151 
00152 
00167 int G_open_new (char *element,char *name)
00168 {
00169     return G__open (element, name, G_mapset(), 1);
00170 }
00171 
00172 
00188 int G_open_old (char *element,char *name,char *mapset)
00189 {
00190     return G__open (element, name, mapset, 0);
00191 }
00192 
00193 
00208 int G_open_update (char *element,char *name)
00209 {
00210     int fd;
00211     fd = G__open (element, name, G_mapset(), 2);
00212     if (fd >= 0) lseek (fd, 0L, SEEK_END);
00213 
00214     return fd;
00215 }
00216 
00217 
00233 FILE *G_fopen_new (char *element,char *name)
00234 {
00235     int fd;
00236 
00237     fd = G__open (element, name, G_mapset(), 1);
00238     if (fd < 0)
00239         return (FILE *) 0;
00240 
00241     return fdopen (fd, "w");
00242 }
00243 
00244 
00261 FILE *
00262 G_fopen_old (char *element,char *name,char *mapset)
00263 {
00264     int fd;
00265 
00266     fd = G__open (element, name, mapset, 0);
00267     if (fd < 0)
00268         return (FILE *) 0;
00269 
00270     return fdopen (fd, "r");
00271 }
00272 
00273 FILE *
00274 G_fopen_append (char *element,char *name)
00275 {
00276     int fd;
00277 
00278     fd = G__open (element, name, G_mapset(), 2);
00279     if (fd < 0)
00280         return (FILE *) 0;
00281     lseek (fd, 0L, SEEK_END);
00282 
00283     return fdopen (fd, "a");
00284 }
00285 
00286 FILE *G_fopen_modify (char *element,char *name)
00287 {
00288     int fd;
00289 
00290     fd = G__open (element, name, G_mapset(), 2);
00291     if (fd < 0)
00292         return (FILE *) 0;
00293     lseek (fd, 0L, SEEK_END);
00294 
00295     return fdopen (fd, "r+");
00296 }

Generated on Wed Dec 19 14:59:06 2007 for GRASS by  doxygen 1.5.4