12 #include <CommonCrypto/CommonDigest.h>
13 #include <CoreFoundation/CoreFoundation.h>
26 return wholeString.length() >= beginning.length() && wholeString.substr(0, beginning.length()) == beginning;
34 if (wholeString.length() < ending.length())
37 return wholeString.compare(wholeString.length()-ending.length(), ending.length(), ending) == 0;
49 return wholeString.substr(beginning.length());
61 return wholeString.substr(0, wholeString.length()-ending.length());
70 string outString = wholeString;
72 while ((pos = wholeString.find_first_of(originalChar, pos)) != string::npos)
74 outString[pos] = replacementChar;
87 size_t replacementCount = 0;
89 while ((startPos = wholeString.find(originalSubstring, startPos)) != string::npos)
91 wholeString.replace(startPos, originalSubstring.length(), replacementSubstring);
92 startPos += replacementSubstring.length();
95 return replacementCount;
103 vector<string> tokens;
104 istringstream iss(wholeString);
106 while( getline(iss, token, delimiter) )
107 tokens.push_back(token);
116 string delimiterStr(1, delimiter);
117 return join(partialStrings, delimiterStr);
126 for (vector<string>::iterator i = partialStrings.begin(); i != partialStrings.end(); )
129 if (++i != partialStrings.end())
130 wholeString += delimiter;
141 for (set<string>::iterator i = partialStrings.begin(); i != partialStrings.end(); )
144 if (++i != partialStrings.end())
145 wholeString += delimiter;
159 string whitespace =
" \t\v\n\r\f";
161 string::size_type begin = originalString.find_first_not_of(whitespace);
162 if (begin == std::string::npos)
165 string::size_type end = originalString.find_last_not_of(whitespace);
167 return originalString.substr(begin, end - begin + 1);
178 return parentCompositionIdentifier +
"/" + nodeIdentifier;
187 return nodeIdentifier +
":" + portName;
207 CFMutableStringRef strCF = CFStringCreateMutable(NULL, 0);
208 CFStringAppendCString(strCF, str.c_str(), kCFStringEncodingUTF8);
210 CFStringNormalize(strCF, kCFStringNormalizationFormD);
212 CFIndex strLength = CFStringGetLength(strCF);
213 UniChar *strBuf = (UniChar *)malloc(strLength *
sizeof(UniChar));
219 CFStringGetCharacters(strCF, CFRangeMake(0, strLength), strBuf);
221 CFStringRef empty = CFStringCreateWithCString(NULL,
"", kCFStringEncodingUTF8);
222 CFStringRef underscore = CFStringCreateWithCString(NULL,
"_", kCFStringEncodingUTF8);
223 CFStringRef doubleUnderscore = CFStringCreateWithCString(NULL,
"__", kCFStringEncodingUTF8);
224 if (!empty || !underscore || !doubleUnderscore)
227 for (CFIndex i = strLength-1; i >= 0; --i)
229 UniChar c = strBuf[i];
231 CFStringRef replacement = NULL;
234 else if (c ==
'.' || isspace(c))
235 replacement = underscore;
236 else if (c ==
'/' || c ==
':')
237 replacement = doubleUnderscore;
242 CFStringReplace(strCF, CFRangeMake(i, 1), replacement);
249 CFRelease(underscore);
250 CFRelease(doubleUnderscore);
261 return isalnum(ch) || ch ==
'_';
269 string escapedString = originalString;
270 for (string::size_type i = 0; (i = escapedString.find(
"\\", i)) != std::string::npos; i += 2)
271 escapedString.replace(i, 1,
"\\\\");
272 for (string::size_type i = 0; (i = escapedString.find(
"\"", i)) != std::string::npos; i += 2)
273 escapedString.replace(i, 1,
"\\\"");
274 for (string::size_type i = 0; (i = escapedString.find(
"{", i)) != std::string::npos; i += 2)
275 escapedString.replace(i, 1,
"\\{");
276 for (string::size_type i = 0; (i = escapedString.find(
"}", i)) != std::string::npos; i += 2)
277 escapedString.replace(i, 1,
"\\}");
278 for (string::size_type i = 0; (i = escapedString.find(
"<", i)) != std::string::npos; i += 2)
279 escapedString.replace(i, 1,
"\\<");
280 for (string::size_type i = 0; (i = escapedString.find(
">", i)) != std::string::npos; i += 2)
281 escapedString.replace(i, 1,
"\\>");
282 for (string::size_type i = 0; (i = escapedString.find(
"|", i)) != std::string::npos; i += 2)
283 escapedString.replace(i, 1,
"\\|");
284 for (string::size_type i = 0; (i = escapedString.find(
" ", i)) != std::string::npos; i += 3)
285 escapedString.replace(i, 2,
" \\ ");
286 return escapedString;
294 string unescapedString;
295 bool inEscape =
false;
296 for (string::const_iterator i = graphvizIdentifier.begin(); i != graphvizIdentifier.end(); ++i)
301 unescapedString += *i;
311 unescapedString += *i;
313 return unescapedString;
322 const string &preferredIdentifier,
const string &identifierPrefix)
324 auto isIdentifierAvailable = [&takenIdentifiers] (
const string &identifier)
326 return takenIdentifiers.find(identifier) == takenIdentifiers.end();
329 string uniqueIdentifier =
formUniqueIdentifier(isIdentifierAvailable, preferredIdentifier, identifierPrefix);
330 takenIdentifiers.insert(uniqueIdentifier);
331 return uniqueIdentifier;
340 const string &preferredIdentifier,
const string &identifierPrefix)
342 string unique = preferredIdentifier;
343 string prefix = (! identifierPrefix.empty() ? identifierPrefix : preferredIdentifier);
346 while (! isIdentifierAvailable(unique))
349 oss << prefix << suffix++;
363 MMIOT *doc = mkd_string(markdownString.c_str(), markdownString.length(), MKD_NOPANTS);
366 mkd_document(doc, &html);
367 string htmlString(html);
372 replaceAll(htmlString,
"\n</code></pre>",
"</code></pre>");
384 size_t length = markdownString.length();
389 mkd_line((
char *)markdownString.c_str(), length, &html, MKD_NOPANTS);
390 string htmlString(html);
409 bool forceFirstLetterToUpper,
bool forceFirstLetterToLower,
bool forceInterveningLettersToLower,
410 bool allowSeparatorDots)
412 string camelCaseString;
414 bool uppercaseNext = forceFirstLetterToUpper;
415 bool lowercaseNext = forceFirstLetterToLower;
416 bool previousWasDot =
false;
417 for (string::const_iterator i = originalString.begin(); i != originalString.end(); ++i)
419 if (first && !isalpha(*i))
423 bool isDot = *i ==
'.';
424 if (allowSeparatorDots && isDot)
428 uppercaseNext =
false;
430 else if (!isalnum(*i))
432 uppercaseNext =
true;
437 camelCaseString += toupper(*i);
438 else if (lowercaseNext)
439 camelCaseString += tolower(*i);
441 camelCaseString += *i;
443 uppercaseNext =
false;
444 lowercaseNext = forceInterveningLettersToLower;
445 previousWasDot = isDot;
449 if (allowSeparatorDots)
450 while (
endsWith(camelCaseString,
"."))
453 return camelCaseString;
466 if (camelCaseString ==
"x")
468 else if (camelCaseString ==
"y")
470 else if (camelCaseString ==
"z")
472 else if (camelCaseString ==
"w")
474 else if (camelCaseString ==
"xy")
476 else if (camelCaseString ==
"osc")
480 out += toupper(camelCaseString[0]);
482 size_t length = camelCaseString.length();
483 for (
int i = 1; i < length; ++i)
485 char c = camelCaseString[i];
486 if (isupper(c) || (isdigit(c) && !isdigit(camelCaseString[i-1])))
518 for (
auto lower : allCaps)
520 string upper = lower;
521 std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper);
536 CFStringRef cfString = (CFStringRef)cfs;
539 const char *utf8StringPtr = CFStringGetCStringPtr(cfString, kCFStringEncodingUTF8);
541 return utf8StringPtr;
544 CFIndex maxBytes = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfString), kCFStringEncodingUTF8) + 1;
545 char *t = (
char *)calloc(1, maxBytes);
546 CFStringGetCString(cfString, t, maxBytes, kCFStringEncodingUTF8);
558 static const char alphanum[] =
560 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
561 "abcdefghijklmnopqrstuvwxyz";
563 string hash(length, 0);
564 for (
int i = 0; i < length; ++i)
565 hash[i] = alphanum[arc4random_uniform(
sizeof(alphanum)-1)];
580 unsigned char hash[CC_SHA256_DIGEST_LENGTH];
581 if (!CC_SHA256(s.c_str(), s.length(),
hash))
585 oss << setfill(
'0') << hex;
586 for (
int i = 0; i < CC_SHA256_DIGEST_LENGTH; ++i)
587 oss << setw(2) << (int)
hash[i];