Canola  0.8.D001
lib/program_card/functor/image/factory.cc
Go to the documentation of this file.
00001 //
00002 // canola - canon canola 1614p emulator
00003 // Copyright (C) 2011 Peter Miller
00004 //
00005 // This program is free software; you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License, version 3, as
00007 // published by the Free Software Foundation.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License along
00015 // with this program. If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 
00018 #include <lib/ac/string.h>
00019 #include <libexplain/output.h>
00020 
00021 #include <lib/program_card/functor/image/pdf.h>
00022 #include <lib/program_card/functor/image/png.h>
00023 #include <lib/program_card/functor/image/ps.h>
00024 #include <lib/program_card/functor/image/svg.h>
00025 #include <lib/sizeof.h>
00026 
00027 
00028 struct table_t
00029 {
00030     const char *name;
00031     program_card_functor_image::pointer (*create)(const std::string &filename);
00032 };
00033 
00034 static const table_t table[] =
00035 {
00036     { "pdf", &program_card_functor_image_pdf::create },
00037     { "png", &program_card_functor_image_png::create },
00038     { "ps", &program_card_functor_image_ps::create },
00039     { "svg", &program_card_functor_image_svg::create },
00040 };
00041 
00042 
00043 program_card_functor_image::pointer
00044 program_card_functor_image::factory(const std::string &filename)
00045 {
00046     const char *ext = strrchr(filename.c_str(), '.');
00047     if (ext)
00048         ++ext;
00049     else
00050         ext = "";
00051     for (const table_t *tp = table; tp < ENDOF(table); ++tp)
00052     {
00053         if (0 == strcasecmp(ext, tp->name))
00054             return (*tp->create)(filename);
00055     }
00056 
00057     explain_output_error_and_die("unknown output file extension \"%s\"", ext);
00058     return pointer();
00059 }