OpenSTA/parasitics/SpefNamespace.cc

111 lines
2.9 KiB
C++
Raw Normal View History

2018-09-28 17:54:21 +02:00
// OpenSTA, Static Timing Analyzer
2020-03-07 03:50:37 +01:00
// Copyright (c) 2020, Parallax Software, Inc.
2018-09-28 17:54:21 +02:00
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
2020-04-05 23:53:44 +02:00
#include "SpefNamespace.hh"
2020-04-05 20:35:51 +02:00
2018-09-28 17:54:21 +02:00
#include <ctype.h>
#include <string.h>
namespace sta {
char *
spefToSta(const char *token, char spef_divider,
char path_divider, char path_escape)
{
const char spef_escape = '\\';
char *trans_token = new char[strlen(token) + 1];
char *t = trans_token;
for (const char *s = token; *s ; s++) {
char ch = *s;
if (ch == spef_escape) {
char next_ch = s[1];
if (next_ch == spef_divider) {
// Translate spef escape to network escape.
*t++ = path_escape;
// Translate spef divider to network divider.
*t++ = path_divider;
}
else if (next_ch == '['
|| next_ch == ']'
|| next_ch == spef_escape) {
// Translate spef escape to network escape.
*t++ = path_escape;
*t++ = next_ch;
}
else
// No need to escape other characters.
*t++ = next_ch;
s++;
}
else if (ch == spef_divider)
// Translate spef divider to network divider.
*t++ = path_divider;
else
// Just the normal noises.
*t++ = ch;
}
*t++ = '\0';
return trans_token;
}
char *
staToSpef(const char *token, char spef_divider,
char path_divider, char path_escape)
{
const char spef_escape = '\\';
char *trans_token = new char[strlen(token) + 1];
char *t = trans_token;
for (const char *s = token; *s ; s++) {
char ch = *s;
if (ch == path_escape) {
char next_ch = s[1];
if (next_ch == path_divider) {
// Translate network escape to spef escape.
*t++ = spef_escape;
// Translate network divider to spef divider.
*t++ = spef_divider;
}
else if (next_ch == '['
|| next_ch == ']') {
// Translate network escape to spef escape.
*t++ = spef_escape;
*t++ = next_ch;
}
else
// No need to escape other characters.
*t++ = next_ch;
s++;
}
else if (ch == path_divider)
// Translate network divider to spef divider.
*t++ = spef_divider;
else if (!(isdigit(ch) || isalpha(ch) || ch == '_')) {
// Escape non-alphanum characters.
*t++ = spef_escape;
*t++ = ch;
}
else
// Just the normal noises.
*t++ = ch;
}
*t++ = '\0';
return trans_token;
}
} // namespace