Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Platform/Aperios1.3.2/File.cpp

Go to the documentation of this file.
00001 /**
00002 * @file Platform/Aperios1.3.2/File.cpp
00003 * 
00004 * Implementation of class File for Aperios 1.3.2.
00005 */
00006 
00007 #include "Platform/File.h"
00008 
00009 #include <stdarg.h>
00010 #include <string.h>
00011 #include "Platform/GTAssert.h"
00012 #include "Tools/Debugging/Debugging.h"
00013 
00014 File::File(const char* name,const char* mode)
00015 {
00016   ASSERT(name);
00017   char buf[FILENAME_MAX];
00018   if(name[0] != '/' && name[0] != '\\' && (name[0] == 0 || name[1] != ':'))
00019   {
00020     sprintf(buf,"%s/CONF/",getGTDir());
00021   }
00022   else
00023     buf[0] = 0;
00024   ASSERT(strlen(buf) + strlen(name) < FILENAME_MAX);
00025   strcat(buf,name);
00026   stream = OFS::fopen(buf,mode);
00027   isWrite = (mode[0] == 'w')||(mode[0] == 'a');
00028   bufSize = 0;
00029   index = 0;
00030 }
00031 
00032 File::~File() 
00033 {
00034   if(stream != 0)
00035   {
00036     if(isWrite)
00037       VERIFY(OFS::fwrite(buf,1,index,stream) == index);
00038     OFS::fclose(stream);
00039   }
00040 }
00041 
00042 void File::read(void* p,unsigned size) 
00043 {
00044   ASSERT(!isWrite);
00045   if(!bufSize)
00046     bufSize = OFS::fread(buf, 1, sizeof(buf), stream);
00047   while(sizeof(buf) - index - 1 < size)
00048   {
00049     memcpy(p, buf + index, sizeof(buf) - index - 1);
00050     (char*&) p += sizeof(buf) - index - 1;
00051     size -= sizeof(buf) - index - 1;
00052     buf[0] = buf[sizeof(buf) - 1];
00053     bufSize = OFS::fread(buf + 1, 1, sizeof(buf) - 1, stream) + 1;
00054     index = 0;
00055   }
00056   memcpy(p, buf + index, size);
00057   index += size;
00058 }
00059 
00060 void File::write(const void *p,unsigned size) 
00061 {
00062   while(sizeof(buf) - index < size)
00063   {
00064     memcpy(buf + index,p,sizeof(buf) - index);
00065     (char*&) p += sizeof(buf) - index;
00066     size -= sizeof(buf) - index;
00067     VERIFY(OFS::fwrite(buf,1,sizeof(buf),stream) == sizeof(buf));
00068     index = 0;
00069   }
00070   memcpy(buf + index,p,size);
00071   index += size;
00072 }
00073 
00074 void File::printf(const char* format, ...)
00075 {
00076   ASSERT(!index); // sorry, text streams are unbuffered
00077   va_list args;
00078   va_start(args,format);
00079   OFS::vfprintf(stream,format,args);
00080   va_end(args); 
00081 }
00082 
00083 bool File::eof() const 
00084 {
00085 #ifdef __GNUC__
00086   return ((feof(stream) != 0) && (index >= bufSize));
00087 #else
00088   return ((OFS::feof(stream) != 0) && (index >= bufSize));
00089 #endif    
00090 }
00091 
00092 char* File::getGTDir()
00093 {
00094   return "/MS/open-r/APP";
00095 }

Generated on Mon Mar 20 22:00:00 2006 for GT2005 by doxygen 1.3.6