185 const char linebreak =
'\n';
187 int bufferLength = 1024;
188 char *line = (
char *)malloc(bufferLength + 1);
190 const char *lineStart = multiLineString.c_str();
193 const char *lineEnd = strchr(lineStart, linebreak);
194 int lineLength = lineEnd ? (lineEnd - lineStart) : strlen(lineStart);
196 if (lineLength > bufferLength)
199 line = (
char *)malloc(lineLength + 1);
200 bufferLength = lineLength;
203 memcpy(line, lineStart, lineLength);
204 line[lineLength] = 0;
208 lineStart = lineEnd ? (lineEnd + 1) :
nullptr;
251 CFMutableStringRef strCF = CFStringCreateMutable(NULL, 0);
252 CFStringAppendCString(strCF, str.c_str(), kCFStringEncodingUTF8);
254 CFStringNormalize(strCF, kCFStringNormalizationFormD);
256 CFIndex strLength = CFStringGetLength(strCF);
257 UniChar *strBuf = (UniChar *)malloc(strLength *
sizeof(UniChar));
263 CFStringGetCharacters(strCF, CFRangeMake(0, strLength), strBuf);
265 CFStringRef empty = CFStringCreateWithCString(NULL,
"", kCFStringEncodingUTF8);
266 CFStringRef underscore = CFStringCreateWithCString(NULL,
"_", kCFStringEncodingUTF8);
267 CFStringRef doubleUnderscore = CFStringCreateWithCString(NULL,
"__", kCFStringEncodingUTF8);
268 if (!empty || !underscore || !doubleUnderscore)
274 CFRelease(underscore);
275 if (doubleUnderscore)
276 CFRelease(doubleUnderscore);
280 for (CFIndex i = strLength-1; i >= 0; --i)
282 UniChar c = strBuf[i];
284 CFStringRef replacement = NULL;
287 else if (c ==
'.' || isspace(c))
288 replacement = underscore;
289 else if (c ==
'/' || c ==
':')
290 replacement = doubleUnderscore;
295 CFStringReplace(strCF, CFRangeMake(i, 1), replacement);
302 CFRelease(underscore);
303 CFRelease(doubleUnderscore);
323 string escapedString = originalString;
324 for (string::size_type i = 0; (i = escapedString.find(
"\\", i)) != std::string::npos; i += 2)
325 escapedString.replace(i, 1,
"\\\\");
326 for (string::size_type i = 0; (i = escapedString.find(
"\"", i)) != std::string::npos; i += 2)
327 escapedString.replace(i, 1,
"\\\"");
328 for (string::size_type i = 0; (i = escapedString.find(
"{", i)) != std::string::npos; i += 2)
329 escapedString.replace(i, 1,
"\\{");
330 for (string::size_type i = 0; (i = escapedString.find(
"}", i)) != std::string::npos; i += 2)
331 escapedString.replace(i, 1,
"\\}");
332 for (string::size_type i = 0; (i = escapedString.find(
"<", i)) != std::string::npos; i += 2)
333 escapedString.replace(i, 1,
"\\<");
334 for (string::size_type i = 0; (i = escapedString.find(
">", i)) != std::string::npos; i += 2)
335 escapedString.replace(i, 1,
"\\>");
336 for (string::size_type i = 0; (i = escapedString.find(
"|", i)) != std::string::npos; i += 2)
337 escapedString.replace(i, 1,
"\\|");
338 for (string::size_type i = 0; (i = escapedString.find(
" ", i)) != std::string::npos; i += 3)
339 escapedString.replace(i, 2,
" \\ ");
340 return escapedString;
376 const string &preferredIdentifier,
const string &identifierPrefix)
378 auto isIdentifierAvailable = [&takenIdentifiers] (
const string &identifier)
380 return takenIdentifiers.find(identifier) == takenIdentifiers.end();
383 string uniqueIdentifier =
formUniqueIdentifier(isIdentifierAvailable, preferredIdentifier, identifierPrefix);
384 takenIdentifiers.insert(uniqueIdentifier);
385 return uniqueIdentifier;
394 const string &preferredIdentifier,
const string &identifierPrefix)
396 string unique = preferredIdentifier;
397 string prefix = (! identifierPrefix.empty() ? identifierPrefix : preferredIdentifier);
400 while (! isIdentifierAvailable(unique))
403 oss << prefix << suffix++;
463 bool forceFirstLetterToUpper,
bool forceFirstLetterToLower,
bool forceInterveningLettersToLower,
464 bool allowSeparatorDots)
466 string camelCaseString;
468 bool uppercaseNext = forceFirstLetterToUpper;
469 bool lowercaseNext = forceFirstLetterToLower;
470 bool previousWasDot =
false;
471 for (string::const_iterator i = originalString.begin(); i != originalString.end(); ++i)
473 if (first && !isalpha(*i))
477 bool isDot = *i ==
'.';
478 if (allowSeparatorDots && isDot)
482 uppercaseNext =
false;
484 else if (!isalnum(*i))
486 uppercaseNext =
true;
491 camelCaseString += toupper(*i);
492 else if (lowercaseNext)
493 camelCaseString += tolower(*i);
495 camelCaseString += *i;
497 uppercaseNext =
false;
498 lowercaseNext = forceInterveningLettersToLower;
499 previousWasDot = isDot;
503 if (allowSeparatorDots)
504 while (
endsWith(camelCaseString,
"."))
507 return camelCaseString;
520 if (camelCaseString ==
"x")
522 else if (camelCaseString ==
"y")
524 else if (camelCaseString ==
"z")
526 else if (camelCaseString ==
"w")
528 else if (camelCaseString ==
"xy")
530 else if (camelCaseString ==
"osc")
534 out += toupper(camelCaseString[0]);
536 size_t length = camelCaseString.length();
537 for (
int i = 1; i < length; ++i)
539 char c = camelCaseString[i];
540 if (isupper(c) || (isdigit(c) && !isdigit(camelCaseString[i-1])))
572 for (
auto lower : allCaps)
574 string upper = lower;
575 std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper);
590 CFStringRef cfString = (CFStringRef)cfs;
593 const char *utf8StringPtr = CFStringGetCStringPtr(cfString, kCFStringEncodingUTF8);
595 return utf8StringPtr;
598 CFIndex maxBytes = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfString), kCFStringEncodingUTF8) + 1;
599 char *t = (
char *)calloc(1, maxBytes);
600 CFStringGetCString(cfString, t, maxBytes, kCFStringEncodingUTF8);