Program that renames all SIds that also have names specified. The new identifiers will be derived from the name, with all invalid characters removed.
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
class NameIdTransformer : public IdentifierTransformer
{
public:
NameIdTransformer(const vector<string> &ids)
: IdentifierTransformer()
, existingIds(ids)
{
}
int transform(
SBase* element)
{
string newId = getValidIdForName(element->
getName());
existingIds.push_back(newId);
}
private:
std::string nameToSbmlId(const std::string & name)
{
std::ostringstream IdStream;
std::string::const_iterator it = name.begin();
std::string::const_iterator end = name.end();
if ('0' <= *it && *it <= '9')
{
IdStream << '_';
}
for (; it != end; ++it)
{
if (0x80 == (*it & 0xc0))
{
continue;
}
if (('0' <= *it && *it <= '9') ||
('a' <= *it && *it <= 'z') ||
('A' <= *it && *it <= 'Z'))
{
IdStream << *it;
}
else
{
IdStream << '_';
}
}
std::string Id = IdStream.str();
if (Id[Id.length() - 1] != '_')
{
return Id;
}
return Id.substr(0, Id.length() - 1);
}
string getValidIdForName(const string& name)
{
string base = nameToSbmlId(name);
string id(base);
int count = 1;
while (containsId(id))
{
std::ostringstream idStream;
idStream << base << "_" << count;
id = idStream.str();
++count;
}
return id;
}
bool containsId(string &id)
{
vector<string>::const_iterator it = existingIds.begin();
while(it != existingIds.end())
{
if ((*it) == id) return true;
++it;
}
return false;
}
vector<string> existingIds;
};
vector<string> getAllIds(
List* allElements)
{
vector<string> result;
if (allElements == NULL || allElements->
getSize() == 0)
return result;
for (
unsigned long int i = 0; i < allElements->
getSize(); ++i)
{
const SBase* current =
static_cast<const SBase*
>(allElements->
get(i));
{
result.push_back(current->
getId());
}
}
return result;
}
int
main (int argc, char* argv[])
{
if (argc != 3)
{
cout << endl << "Usage: setIdFromNames filename output" << endl << endl;
return 1;
}
const char* filename = argv[1];
const char* output = argv[2];
#ifdef __BORLANDC__
unsigned long start, stop;
#else
unsigned long long start, stop;
#endif
start = getCurrentMillis();
stop = getCurrentMillis();
cout << endl;
cout << " filename: " << filename << endl;
cout << " read time (ms): " << stop - start << endl;
if (errors > 0)
{
cout << " error(s): " << errors << endl;
delete document;
return errors;
}
start = stop;
const vector<string>& allIds = getAllIds(allElements);
NameIdTransformer trans(allIds);
document->
getModel()->renameIDs(allElements, &trans);
stop = getCurrentMillis();
cout << " rename time (ms): " << stop - start << endl;
start = stop;
stop = getCurrentMillis();
cout << " write time (ms): " << stop - start << endl;
cout << endl;
delete document;
return errors;
}