/******************************************************************************* * fileutil.cpp * * This module implements misc utility functions. * * --------------------------------------------------------------------------- * Persistence of Vision Ray Tracer ('POV-Ray') version 3.7. * Copyright 1991-2013 Persistence of Vision Raytracer Pty. Ltd. * * POV-Ray is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * POV-Ray is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * --------------------------------------------------------------------------- * POV-Ray is based on the popular DKB raytracer version 2.12. * DKBTrace was originally written by David K. Buck. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins. * --------------------------------------------------------------------------- * $File: //depot/public/povray/3.x/source/backend/support/fileutil.cpp $ * $Revision: #1 $ * $Change: 6069 $ * $DateTime: 2013/11/06 11:59:40 $ * $Author: chrisc $ *******************************************************************************/ // TODO FIXME - fileutil.cpp code is needed by front- abd backend alike, so should be in "base" directory #include #include // frame.h must always be the first POV file included (pulls in platform config) #include "backend/frame.h" #include "backend/support/fileutil.h" #include "backend/parser/parse.h" // TODO FIXME HACK - used for hack below, need to remove [trf] #include "povrayold.h" // TODO // this must be the last file included #include "base/povdebug.h" namespace pov { /* // not used right now typedef struct { bool read_local; bool read_global; bool write_local; bool write_global; } POV_File_Restrictions; POV_File_Restrictions gPOV_File_Restrictions[POV_File_Count] = { { false, false, false, false }, // POV_File_Unknown { true, true, false, false }, // POV_File_Image_Targa { true, true, false, false }, // POV_File_Image_PNG { true, true, false, false }, // POV_File_Image_PPM { true, true, false, false }, // POV_File_Image_PGM { true, true, false, false }, // POV_File_Image_GIF { true, true, false, false }, // POV_File_Image_IFF { true, true, false, false }, // POV_File_Image_JPEG { true, true, false, false }, // POV_File_Image_TIFF { true, true, false, false }, // POV_File_Image_System { true, false, false, false }, // POV_File_Text_POV { true, false, false, false }, // POV_File_Text_INC { true, false, false, false }, // POV_File_Text_INI { true, true, false, false }, // POV_File_Text_CSV { true, false, false, false }, // POV_File_Text_Stream { true, true, false, false }, // POV_File_Text_User { true, true, true, false }, // POV_File_Data_DF3 { true, true, true, true }, // POV_File_Data_RCA { true, true, true, true }, // POV_File_Data_LOG { true, false, true, false } // POV_File_Font_TTF }; */ #ifndef POV_IS1 #define POV_IS1 "" #endif #ifndef POV_IS2 #define POV_IS2 "" #endif #ifndef POV_IS3 #define POV_IS3 "" #endif #ifndef POV_IS4 #define POV_IS4 "" #endif POV_File_Extensions gPOV_File_Extensions[POV_File_Count] = // TODO FIXME - belongs in backend { {{ "", "", "", "" }}, // POV_File_Unknown {{ ".tga", ".TGA", "", "" }}, // POV_File_Image_Targa {{ ".png", ".PNG", "", "" }}, // POV_File_Image_PNG {{ ".ppm", ".PPM", "", "" }}, // POV_File_Image_PPM {{ ".pgm", ".PGM", "", "" }}, // POV_File_Image_PGM {{ ".gif", ".GIF", "", "" }}, // POV_File_Image_GIF {{ ".iff", ".IFF", "", "" }}, // POV_File_Image_IFF {{ ".jpg", ".JPG", ".jpeg", ".JPEG" }}, // POV_File_Image_JPEG {{ ".tif", ".TIF", ".tiff", ".TIFF" }}, // POV_File_Image_TIFF {{ ".bmp", ".BMP", "", "" }}, // POV_File_Image_BMP {{ ".exr", ".EXR", "", "" }}, // POV_File_Image_EXR {{ ".hdr", ".HDR", "", "" }}, // POV_File_Image_HDR {{ POV_IS1, POV_IS2, POV_IS3, POV_IS4 }}, // POV_File_Image_System {{ ".pov", ".POV", "", "" }}, // POV_File_Text_POV {{ ".inc", ".INC", "", "" }}, // POV_File_Text_INC {{ ".ini", ".INI", "", "" }}, // POV_File_Text_INI {{ ".csv", ".CSV", "", "" }}, // POV_File_Text_CSV {{ ".txt", ".TXT", "", "" }}, // POV_File_Text_Stream {{ "", "", "", "" }}, // POV_File_Text_User {{ ".df3", ".DF3", "", "" }}, // POV_File_Data_DF3 {{ ".rca", ".RCA", "", "" }}, // POV_File_Data_RCA {{ ".log", ".LOG", "", "" }}, // POV_File_Data_LOG {{ ".bak", ".BAK", "", "" }}, // POV_File_Data_Backup {{ ".ttf", ".TTF", "", "" }} // POV_File_Font_TTF }; const int gFile_Type_To_Mask [POV_File_Count] = // TODO FIXME - belongs in backend { NO_FILE, // POV_File_Unknown TGA_FILE, // POV_File_Image_Targa PNG_FILE, // POV_File_Image_PNG PPM_FILE, // POV_File_Image_PPM PGM_FILE, // POV_File_Image_PGM GIF_FILE, // POV_File_Image_GIF IFF_FILE, // POV_File_Image_IFF JPEG_FILE, // POV_File_Image_JPEG TIFF_FILE, // POV_File_Image_TIFF BMP_FILE, // POV_File_Image_BMP EXR_FILE, // POV_File_Image_EXR HDR_FILE, // POV_File_Image_HDR SYS_FILE, // POV_File_Image_System NO_FILE, // POV_File_Text_POV NO_FILE, // POV_File_Text_INC NO_FILE, // POV_File_Text_INI NO_FILE, // POV_File_Text_CSV NO_FILE, // POV_File_Text_Stream NO_FILE, // POV_File_Text_User NO_FILE, // POV_File_Data_DF3 NO_FILE, // POV_File_Data_RCA NO_FILE, // POV_File_Data_LOG NO_FILE, // POV_File_Data_Backup NO_FILE // POV_File_Font_TTF }; int InferFileTypeFromExt(const UCS2String& ext) // TODO FIXME - belongs in backend { // TODO FIXME - better compare in the string domain string str = UCS2toASCIIString(ext); for (int i = 0; i < POV_File_Count; i++) { // TODO - checking whether extension matches is required at other places, too for (int j = 0; j < POV_FILE_EXTENSIONS_PER_TYPE; j ++) { if ( (strlen(gPOV_File_Extensions[i].ext[j]) > 0) && (pov_stricmp (gPOV_File_Extensions[i].ext[j], str.c_str()) == 0) ) { return (i); } } } return NO_FILE; } /***************************************************************************** * * FUNCTION * * Locate_File * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * Find a file in the search path. * * CHANGES * * Apr 1996: Don't add trailing FILENAME_SEPARATOR if we are immediately * following DRIVE_SEPARATOR because of Amiga probs. [AED] * ******************************************************************************/ IStream *Locate_File(Parser *p, shared_ptr& sd, const UCS2String& filename, unsigned int stype, UCS2String& buffer, bool err_flag) { UCS2String fn(filename); UCS2String foundfile(sd->FindFile(p->GetPOVMSContext(), fn, stype)); if(foundfile.empty() == true) { if(err_flag == true) p->PossibleError("Cannot find file '%s', even after trying to append file type extension.", UCS2toASCIIString(fn).c_str()); return NULL; } if(fn.find('.') == UCS2String::npos) { // the passed-in filename didn't have an extension, but a file has been found, // which means one of the appended extensions worked. we need to work out which // one and append it to the original filename so we can store it in the cache // (since it's that name that the cache search routine looks for). UCS2String ext = GetFileExtension(Path(foundfile)); if (ext.size() != 0) fn += ext; } // ReadFile will store both fn and foundfile in the cache for next time round IStream *result(sd->ReadFile(p->GetPOVMSContext(), fn, foundfile.c_str(), stype)); if((result == NULL) && (err_flag == true)) p->PossibleError("Cannot open file '%s'.", UCS2toASCIIString(foundfile).c_str()); buffer = foundfile; return result; } /* TODO FIXME - code above should not be there, this is how it should work but this has bugs [trf] IStream *Locate_File(Parser *p, shared_ptr& sd, const UCS2String& filename, unsigned int stype, UCS2String& buffer, bool err_flag) { UCS2String foundfile(sd->FindFile(p->GetPOVMSContext(), filename, stype)); if(foundfile.empty() == true) { if(err_flag == true) p->PossibleError("Cannot find file '%s', even after trying to append file type extension.", UCS2toASCIIString(filename).c_str()); return NULL; } IStream *result(sd->ReadFile(p->GetPOVMSContext(), foundfile.c_str(), stype)); if((result == NULL) && (err_flag == true)) p->PossibleError("Cannot open file '%s'.", UCS2toASCIIString(foundfile).c_str()); buffer = foundfile; return result; } */ /***************************************************************************** * * FUNCTION * * Internal_Font_File * * INPUT * The numeric identifier of a built-in file * * OUTPUT * * RETURNS * An IStream for usage by the TTF analyser * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * Provide a compiled font as a Stream for reading * * CHANGES * * Creation. Oct 2012 [JG] * ******************************************************************************/ IMemStream *Internal_Font_File(const int font_id, UCS2String& buffer) { return new IMemStream(font_id); } }