11 #include <CoreFoundation/CoreFoundation.h>
23 return wholeString.length() >= beginning.length() && wholeString.substr(0, beginning.length()) == beginning;
31 if (wholeString.length() < ending.length())
34 return wholeString.compare(wholeString.length()-ending.length(), ending.length(), ending) == 0;
46 return wholeString.substr(beginning.length());
58 return wholeString.substr(0, wholeString.length()-ending.length());
67 string outString = wholeString;
69 while ((pos = wholeString.find_first_of(originalChar, pos)) != string::npos)
71 outString[pos] = replacementChar;
84 size_t replacementCount = 0;
86 while ((startPos = wholeString.find(originalSubstring, startPos)) != string::npos)
88 wholeString.replace(startPos, originalSubstring.length(), replacementSubstring);
89 startPos += replacementSubstring.length();
92 return replacementCount;
100 vector<string> tokens;
101 istringstream iss(wholeString);
103 while( getline(iss, token, delimiter) )
104 tokens.push_back(token);
113 string delimiterStr(1, delimiter);
114 return join(partialStrings, delimiterStr);
123 for (vector<string>::iterator i = partialStrings.begin(); i != partialStrings.end(); )
126 if (++i != partialStrings.end())
127 wholeString += delimiter;
138 for (set<string>::iterator i = partialStrings.begin(); i != partialStrings.end(); )
141 if (++i != partialStrings.end())
142 wholeString += delimiter;
156 string whitespace =
" \t\v\n\r\f";
158 string::size_type begin = originalString.find_first_not_of(whitespace);
159 if (begin == std::string::npos)
162 string::size_type end = originalString.find_last_not_of(whitespace);
164 return originalString.substr(begin, end - begin + 1);
175 return parentCompositionIdentifier +
"/" + nodeIdentifier;
184 return nodeIdentifier +
":" + portName;
204 CFMutableStringRef strCF = CFStringCreateMutable(NULL, 0);
205 CFStringAppendCString(strCF, str.c_str(), kCFStringEncodingUTF8);
207 CFStringNormalize(strCF, kCFStringNormalizationFormD);
209 CFIndex strLength = CFStringGetLength(strCF);
210 UniChar *strBuf = (UniChar *)malloc(strLength *
sizeof(UniChar));
216 CFStringGetCharacters(strCF, CFRangeMake(0, strLength), strBuf);
218 CFStringRef empty = CFStringCreateWithCString(NULL,
"", kCFStringEncodingUTF8);
219 CFStringRef underscore = CFStringCreateWithCString(NULL,
"_", kCFStringEncodingUTF8);
220 CFStringRef doubleUnderscore = CFStringCreateWithCString(NULL,
"__", kCFStringEncodingUTF8);
221 if (!empty || !underscore || !doubleUnderscore)
224 for (CFIndex i = strLength-1; i >= 0; --i)
226 UniChar c = strBuf[i];
228 CFStringRef replacement = NULL;
231 else if (c ==
'.' || isspace(c))
232 replacement = underscore;
233 else if (c ==
'/' || c ==
':')
234 replacement = doubleUnderscore;
239 CFStringReplace(strCF, CFRangeMake(i, 1), replacement);
244 const char *useUTF8StringPtr = NULL;
245 char *freeUTF8StringPtr = NULL;
247 if ((useUTF8StringPtr = CFStringGetCStringPtr(strCF, kCFStringEncodingUTF8)) == NULL)
249 CFIndex maxBytes = 4 * strLength + 1;
250 freeUTF8StringPtr = (
char *)malloc(maxBytes);
251 CFStringGetCString(strCF, freeUTF8StringPtr, maxBytes, kCFStringEncodingUTF8);
252 useUTF8StringPtr = freeUTF8StringPtr;
255 string ret = useUTF8StringPtr;
257 if (freeUTF8StringPtr != NULL)
258 free(freeUTF8StringPtr);
262 CFRelease(underscore);
263 CFRelease(doubleUnderscore);
275 return isalnum(ch) || ch ==
'_';
283 string escapedString = originalString;
284 for (string::size_type i = 0; (i = escapedString.find(
"\\", i)) != std::string::npos; i += 2)
285 escapedString.replace(i, 1,
"\\\\");
286 for (string::size_type i = 0; (i = escapedString.find(
"\"", i)) != std::string::npos; i += 2)
287 escapedString.replace(i, 1,
"\\\"");
288 for (string::size_type i = 0; (i = escapedString.find(
"{", i)) != std::string::npos; i += 2)
289 escapedString.replace(i, 1,
"\\{");
290 for (string::size_type i = 0; (i = escapedString.find(
"}", i)) != std::string::npos; i += 2)
291 escapedString.replace(i, 1,
"\\}");
292 for (string::size_type i = 0; (i = escapedString.find(
"<", i)) != std::string::npos; i += 2)
293 escapedString.replace(i, 1,
"\\<");
294 for (string::size_type i = 0; (i = escapedString.find(
">", i)) != std::string::npos; i += 2)
295 escapedString.replace(i, 1,
"\\>");
296 for (string::size_type i = 0; (i = escapedString.find(
"|", i)) != std::string::npos; i += 2)
297 escapedString.replace(i, 1,
"\\|");
298 for (string::size_type i = 0; (i = escapedString.find(
" ", i)) != std::string::npos; i += 3)
299 escapedString.replace(i, 2,
" \\ ");
300 return escapedString;
308 string unescapedString;
309 bool inEscape =
false;
310 for (string::const_iterator i = graphvizIdentifier.begin(); i != graphvizIdentifier.end(); ++i)
315 unescapedString += *i;
325 unescapedString += *i;
327 return unescapedString;
336 const string &preferredIdentifier,
const string &identifierPrefix)
338 auto isIdentifierAvailable = [&takenIdentifiers] (
const string &identifier)
340 return takenIdentifiers.find(identifier) == takenIdentifiers.end();
343 string uniqueIdentifier =
formUniqueIdentifier(isIdentifierAvailable, preferredIdentifier, identifierPrefix);
344 takenIdentifiers.insert(uniqueIdentifier);
345 return uniqueIdentifier;
354 const string &preferredIdentifier,
const string &identifierPrefix)
356 string unique = preferredIdentifier;
357 string prefix = (! identifierPrefix.empty() ? identifierPrefix : preferredIdentifier);
360 while (! isIdentifierAvailable(unique))
363 oss << prefix << suffix++;
377 MMIOT *doc = mkd_string(markdownString.c_str(), markdownString.length(), MKD_NOPANTS);
380 mkd_document(doc, &html);
381 string htmlString(html);
386 replaceAll(htmlString,
"\n</code></pre>",
"</code></pre>");
398 size_t length = markdownString.length();
403 mkd_line((
char *)markdownString.c_str(), length, &html, MKD_NOPANTS);
404 string htmlString(html);
423 bool forceFirstLetterToUpper,
bool forceFirstLetterToLower,
bool forceInterveningLettersToLower,
424 bool allowSeparatorDots)
426 string camelCaseString;
428 bool uppercaseNext = forceFirstLetterToUpper;
429 bool lowercaseNext = forceFirstLetterToLower;
430 bool previousWasDot =
false;
431 for (string::const_iterator i = originalString.begin(); i != originalString.end(); ++i)
433 if (first && !isalpha(*i))
437 bool isDot = *i ==
'.';
438 if (allowSeparatorDots && isDot)
442 uppercaseNext =
false;
444 else if (!isalnum(*i))
446 uppercaseNext =
true;
451 camelCaseString += toupper(*i);
452 else if (lowercaseNext)
453 camelCaseString += tolower(*i);
455 camelCaseString += *i;
457 uppercaseNext =
false;
458 lowercaseNext = forceInterveningLettersToLower;
459 previousWasDot = isDot;
463 if (allowSeparatorDots)
464 while (
endsWith(camelCaseString,
"."))
467 return camelCaseString;
480 if (camelCaseString ==
"x")
482 else if (camelCaseString ==
"y")
484 else if (camelCaseString ==
"z")
486 else if (camelCaseString ==
"w")
488 else if (camelCaseString ==
"xy")
490 else if (camelCaseString ==
"osc")
494 out += toupper(camelCaseString[0]);
496 size_t length = camelCaseString.length();
497 for (
int i = 1; i < length; ++i)
499 char c = camelCaseString[i];
500 if (isupper(c) || (isdigit(c) && !isdigit(camelCaseString[i-1])))
532 for (
auto lower : allCaps)
534 string upper = lower;
535 std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper);
547 static const char alphanum[] =
549 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
550 "abcdefghijklmnopqrstuvwxyz";
552 string hash(length, 0);
553 for (
int i = 0; i < length; ++i)
554 hash[i] = alphanum[arc4random_uniform(
sizeof(alphanum)-1)];