+#if defined (USE_MACOSX_PACKAGING)
+namespace {
+ // Unexposed--extract an environment variable name from its NAME=VALUE
+ // representation
+ std::string varname(const char* line)
+ {
+ size_t nameLen = strcspn(line, "=");
+ if (nameLen == strlen(line)) {
+ return std::string();
+ } else {
+ return std::string(line, nameLen);
+ }
+ }
+} // namespace
+
+void cleanDuplicateEnvVars()
+{
+ std::set<std::string> seen;
+ std::set<std::string> dupes;
+
+ // Create a list of the environment variables that appear more than once
+ for (char **read = *_NSGetEnviron(); *read; read++) {
+ std::string name = varname(*read);
+ if (name.size() == 0) {
+ continue;
+ }
+ if (seen.find(name) != seen.end()) {
+ dupes.insert(name);
+ } else {
+ seen.insert(name);
+ }
+ }
+
+ // Loop over the list of duplicated variables
+ std::set<std::string>::iterator dupe = dupes.begin();
+ std::set<std::string>::iterator const dend = dupes.end();
+ for (; dupe != dend; ++dupe) {
+ const char *name = (*dupe).c_str();
+ char *val = getenv(name);
+ if (val != NULL) {
+ LYXERR(Debug::INIT, "Duplicate environment variable: " << name);
+ // unsetenv removes *all* instances of the variable from the environment
+ unsetenv(name);
+
+ // replace with the value from getenv (in practice appears to be the
+ // first value in the list)
+ setenv(name, val, 0);
+ }
+ }
+}
+#endif
+
+
+static void initTemplatePath()
+{
+ FileName const package_template_path =
+ FileName(addName(package().system_support().absFileName(), "templates"));
+
+ if (lyxrc.template_path.empty()) {
+ lyxrc.template_path = package_template_path.absFileName();
+ }
+#if defined (USE_MACOSX_PACKAGING)
+ FileName const user_template_path =
+ FileName(addName(package().user_support().absFileName(), "templates"));
+
+ if (package_template_path != FileName(lyxrc.template_path) &&
+ user_template_path != FileName(lyxrc.template_path))
+ {
+ return;
+ }
+ FileName const user_template_link =
+ FileName(addName(user_template_path.absFileName(),"SystemTemplates"));
+ if (user_template_link.isSymLink() && !equivalent(user_template_link, package_template_path)) {
+ user_template_link.removeFile();
+ }
+ if (!user_template_link.exists()) {
+ if (!package_template_path.link(user_template_link)) {
+ FileName const user_support = package().user_support();
+ if (user_support.exists() && user_support.isDirectory()) {
+ LYXERR(Debug::INIT, "Cannot create symlink " + user_template_link.absFileName());
+ lyxrc.template_path = package_template_path.absFileName();
+ }
+ return;
+ }
+ LYXERR(Debug::INIT, "Symlink \"" << user_template_link.absFileName() << "\" created.");
+ }
+ lyxrc.template_path = user_template_path.absFileName();
+#endif
+}
+