GPS4Palm

Source Code Documentation


file_io.c

Go to the documentation of this file.
00001 /*****************************************************************************
00002  *
00003  * $RCSfile: file__io_8c-source.html,v $
00004  *
00005  * File Stream API / VFS API Wrapper Functions
00006  *
00007  *
00008  * This program is Copyright (C) 03/2005 Matthias Prinke
00009  * <matthias.prinke@surfeu.de> and covered by GNU's GPL.
00010  * In particular, this program is free software and comes WITHOUT
00011  * ANY WARRANTY.
00012  *
00013  * $Author: mp $
00014  *
00015  * $Date: 2007-10-08 20:40:32 $
00016  *
00017  * $Revision: 1.1.2.1 $
00018  *
00019  * $Log: file__io_8c-source.html,v $
00019  * Revision 1.1.2.1  2007-10-08 20:40:32  mp
00019  * updated for gps4palm V0.9.5 beta
00019  *
00020  * Revision 1.3  2005-05-15 10:42:58  mp
00021  * modified fread() documentation
00022  *
00023  * Revision 1.2  2005/05/14 12:25:34  mp
00024  * added parameter fd to fread(), fclose(), feof(), rewind(), and fseek()
00025  * added return value to fopen()
00026  *
00027  * Revision 1.1  2005/05/13 18:36:12  mp
00028  * moved functions from MapForm, added fseek()
00029  *
00030  *
00031  ****************************************************************************/ 
00032 #include <PalmOS.h>
00033 #include <Extensions/ExpansionMgr/VFSMgr.h>
00034 #include "file_io.h"
00035 #include "getdir.h"
00036 
00037 
00038 /****************************************************************************/
00039 /**
00040  * \brief       File Stream API / VFS API wrapper function.
00041  *
00042  * \param       fd      file descriptor (FS File Handle/VFS File Reference)
00043  * \param       buf     storage location for read data
00044  * \param       size    number of bytes to read
00045  *
00046  * \return      number of items successfully read
00047  ****************************************************************************/ 
00048 unsigned long fread(FileDescrType fd, void *buf, unsigned long size)
00049 {
00050   unsigned long x;
00051   if (fd.fr)
00052     VFSFileRead(fd.fr, size, buf, &x);
00053   else
00054     x = FileRead(fd.fh, buf, 1, size, NULL);
00055   return x;
00056 }
00057 
00058 
00059 /****************************************************************************/
00060 /**
00061  * \brief       File Stream API / VFS API wrapper function.
00062  ****************************************************************************/ 
00063 FileDescrType fopen(UInt32 filecard, const char *filename, const char *dir, Err *err)
00064 {
00065   MemPtr        pathName;
00066   UInt32        vfs_vol = filecard & ~VFS_FLAG;
00067   FileDescrType fd;
00068   
00069   if (!(filecard & VFS_FLAG)) {
00070     fd.fh = FileOpen(     filecard, /* card nr */
00071                           filename,
00072                           'DATA',  /* type */
00073                           'BOXR',  /* creator */
00074                           fileModeReadOnly | fileModeAnyTypeCreator, /* mode */
00075                           err);   /* err */
00076     fd.fr = 0;
00077   } else {
00078     /* generate absolute file path */
00079     pathName = MemPtrNew(StrLen(dir) + StrLen(filename) + 2);
00080     StrCopy(pathName, dir);
00081     StrCat(pathName, "/");
00082     StrCat(pathName, filename);
00083 
00084     *err = VFSFileOpen(vfs_vol, pathName, vfsModeRead, &fd.fr);
00085     fd.fh = 0;
00086     MemPtrFree(pathName);
00087 
00088   }
00089   return fd;
00090 }
00091 
00092 
00093 /****************************************************************************/
00094 /**
00095  * \brief       File Stream API / VFS API wrapper function.
00096  ****************************************************************************/ 
00097 void fclose(FileDescrType fd)
00098 {
00099   if (fd.fr) {
00100     VFSFileClose(fd.fr);
00101     fd.fr = 0;
00102   } else {
00103     FileClose(fd.fh);
00104     fd.fh = 0;
00105   }
00106 }
00107 
00108 
00109 /****************************************************************************/
00110 /**
00111  * \brief       File Stream API / VFS API wrapper function.
00112  *
00113  * \return      non-zero if end-of-file is set
00114  ****************************************************************************/ 
00115 int feof(FileDescrType fd)
00116 {
00117   if (fd.fr)
00118     return VFSFileEOF(fd.fr);
00119   else
00120     return FileEOF(fd.fh);
00121 }
00122 
00123 
00124 /****************************************************************************/
00125 /**
00126  * \brief       File Stream API / VFS API wrapper function.
00127  ****************************************************************************/ 
00128 void rewind(FileDescrType fd)
00129 {
00130   if (fd.fr)
00131     VFSFileSeek(fd.fr, vfsOriginBeginning, 0);
00132   else
00133     FileSeek(fd.fh, 0, fileOriginBeginning);
00134 }
00135 
00136 
00137 /****************************************************************************/
00138 /**
00139  * \brief       File Stream API / VFS API wrapper function.
00140  ****************************************************************************/ 
00141 int fseek(FileDescrType fd, long offset, int whence)
00142 {
00143   Err err;
00144   
00145   if (fd.fr) {
00146     switch (whence) {
00147       case SEEK_SET:
00148         err = VFSFileSeek(fd.fr, vfsOriginBeginning, offset);
00149         break;
00150       
00151       case SEEK_CUR:
00152         err = VFSFileSeek(fd.fr, vfsOriginCurrent, offset);
00153         break;
00154       
00155       case SEEK_END:
00156         err = VFSFileSeek(fd.fr, vfsOriginEnd, offset);
00157         break;
00158       
00159       default:
00160         return -1;
00161     }
00162     
00163     return (err == errNone) ? 0 : -1;
00164     
00165   } else {
00166     switch (whence) {
00167       case SEEK_SET:
00168         err = FileSeek(fd.fh, offset, fileOriginBeginning);
00169         break;
00170       
00171       case SEEK_CUR:
00172         err = FileSeek(fd.fh, offset, fileOriginCurrent);
00173         break;
00174       
00175       case SEEK_END:
00176         err = FileSeek(fd.fh, offset, fileOriginEnd);
00177         break;
00178       
00179       default:
00180         return -1;
00181     }
00182     
00183     return (err == 0) ? 0 : -1;
00184     
00185   }
00186 
00187 }

Created: Mon, 08 Oct 2007 22:33:16 +0200
Copyright ©2004 M. Prinke