00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <map>
00027 #include <iostream>
00028 #include <cstdlib>
00029 #include "config.h"
00030 #include "avrfactory.h"
00031 #include "avrerror.h"
00032
00033 using namespace std;
00034
00035 typedef map<std::string, AvrFactory::AvrDeviceCreator> AVRDeviceMap;
00036
00037 void AvrFactory::reg(const std::string name,
00038 AvrDeviceCreator create) {
00039 string devname(name);
00040 for(unsigned int i = 0; i < devname.size(); i++)
00041 devname[i] = tolower(devname[i]);
00042 AVRDeviceMap & devmap = instance().devmap;
00043 AVRDeviceMap::iterator i = devmap.find(devname);
00044 if(i == devmap.end())
00045 devmap[devname] = create;
00046 else
00047 avr_error("Duplicate device specification: %s", devname.c_str());
00048 }
00049
00050 AvrDevice* AvrFactory::makeDevice(const char *in) {
00051 string devname(in);
00052 for(unsigned int i = 0; i < devname.size(); i++)
00053 devname[i] = tolower(devname[i]);
00054 if(devname == "unknown")
00055 avr_error("Device type not specified, use --device TYPE", in);
00056 AVRDeviceMap::iterator i = devmap.find(devname);
00057 if(i == devmap.end())
00058 avr_error("Invalid device specification: %s", in);
00059
00060 return devmap[devname]();
00061 }
00062
00063 std::string AvrFactory::supportedDevices() {
00064 std::string ret;
00065 AVRDeviceMap & devmap = instance().devmap;
00066
00067 for(AVRDeviceMap::iterator i = devmap.begin(); i != devmap.end(); i++)
00068 ret += i->first + "\n";
00069 return ret;
00070 }
00071
00072 AvrFactory& AvrFactory::instance() {
00073 static AvrFactory f;
00074 return f;
00075 }
00076