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)
230 CFRelease(underscore);
231 if (doubleUnderscore)
232 CFRelease(doubleUnderscore);
236 for (CFIndex i = strLength-1; i >= 0; --i)
238 UniChar c = strBuf[i];
240 CFStringRef replacement = NULL;
243 else if (c ==
'.' || isspace(c))
244 replacement = underscore;
245 else if (c ==
'/' || c ==
':')
246 replacement = doubleUnderscore;
251 CFStringReplace(strCF, CFRangeMake(i, 1), replacement);
258 CFRelease(underscore);
259 CFRelease(doubleUnderscore);
271 return isalnum(ch) || ch ==
'_';
279 string escapedString = originalString;
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 += 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 += 3)
295 escapedString.replace(i, 2,
" \\ ");
296 return escapedString;
304 string unescapedString;
305 bool inEscape =
false;
306 for (string::const_iterator i = graphvizIdentifier.begin(); i != graphvizIdentifier.end(); ++i)
311 unescapedString += *i;
321 unescapedString += *i;
323 return unescapedString;
332 const string &preferredIdentifier,
const string &identifierPrefix)
334 auto isIdentifierAvailable = [&takenIdentifiers] (
const string &identifier)
336 return takenIdentifiers.find(identifier) == takenIdentifiers.end();
339 string uniqueIdentifier =
formUniqueIdentifier(isIdentifierAvailable, preferredIdentifier, identifierPrefix);
340 takenIdentifiers.insert(uniqueIdentifier);
341 return uniqueIdentifier;
350 const string &preferredIdentifier,
const string &identifierPrefix)
352 string unique = preferredIdentifier;
353 string prefix = (! identifierPrefix.empty() ? identifierPrefix : preferredIdentifier);
356 while (! isIdentifierAvailable(unique))
359 oss << prefix << suffix++;
373 MMIOT *doc = mkd_string(markdownString.c_str(), markdownString.length(), MKD_NOPANTS);
376 mkd_document(doc, &html);
377 string htmlString(html);
382 replaceAll(htmlString,
"\n</code></pre>",
"</code></pre>");
394 size_t length = markdownString.length();
399 mkd_line((
char *)markdownString.c_str(), length, &html, MKD_NOPANTS);
400 string htmlString(html);
419 bool forceFirstLetterToUpper,
bool forceFirstLetterToLower,
bool forceInterveningLettersToLower,
420 bool allowSeparatorDots)
422 string camelCaseString;
424 bool uppercaseNext = forceFirstLetterToUpper;
425 bool lowercaseNext = forceFirstLetterToLower;
426 bool previousWasDot =
false;
427 for (string::const_iterator i = originalString.begin(); i != originalString.end(); ++i)
429 if (first && !isalpha(*i))
433 bool isDot = *i ==
'.';
434 if (allowSeparatorDots && isDot)
438 uppercaseNext =
false;
440 else if (!isalnum(*i))
442 uppercaseNext =
true;
447 camelCaseString += toupper(*i);
448 else if (lowercaseNext)
449 camelCaseString += tolower(*i);
451 camelCaseString += *i;
453 uppercaseNext =
false;
454 lowercaseNext = forceInterveningLettersToLower;
455 previousWasDot = isDot;
459 if (allowSeparatorDots)
460 while (
endsWith(camelCaseString,
"."))
463 return camelCaseString;
476 if (camelCaseString ==
"x")
478 else if (camelCaseString ==
"y")
480 else if (camelCaseString ==
"z")
482 else if (camelCaseString ==
"w")
484 else if (camelCaseString ==
"xy")
486 else if (camelCaseString ==
"osc")
490 out += toupper(camelCaseString[0]);
492 size_t length = camelCaseString.length();
493 for (
int i = 1; i < length; ++i)
495 char c = camelCaseString[i];
496 if (isupper(c) || (isdigit(c) && !isdigit(camelCaseString[i-1])))
528 for (
auto lower : allCaps)
530 string upper = lower;
531 std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper);
546 CFStringRef cfString = (CFStringRef)cfs;
549 const char *utf8StringPtr = CFStringGetCStringPtr(cfString, kCFStringEncodingUTF8);
551 return utf8StringPtr;
554 CFIndex maxBytes = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfString), kCFStringEncodingUTF8) + 1;
555 char *t = (
char *)calloc(1, maxBytes);
556 CFStringGetCString(cfString, t, maxBytes, kCFStringEncodingUTF8);
568 static const char alphanum[] =
570 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
571 "abcdefghijklmnopqrstuvwxyz";
573 string hash(length, 0);
574 for (
int i = 0; i < length; ++i)
575 hash[i] = alphanum[arc4random_uniform(
sizeof(alphanum)-1)];
590 unsigned char hash[CC_SHA256_DIGEST_LENGTH];
591 if (!CC_SHA256(s.c_str(), s.length(),
hash))
595 oss << setfill(
'0') << hex;
596 for (
int i = 0; i < CC_SHA256_DIGEST_LENGTH; ++i)
597 oss << setw(2) << (int)
hash[i];