mirror of
https://github.com/ksherlock/mpw.git
synced 2025-02-19 17:30:32 +00:00
Use the $Commands environment variable as a list of directories where commands may be located.
Conflicts: bin/loader.cpp
This commit is contained in:
parent
a3925747ce
commit
b255937e6c
@ -646,10 +646,8 @@ bool file_exists(const std::string & name)
|
|||||||
return ::stat(name.c_str(), &st) == 0 && S_ISREG(st.st_mode);
|
return ::stat(name.c_str(), &st) == 0 && S_ISREG(st.st_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string find_exe(const std::string &name)
|
std::string old_find_exe(const std::string &name)
|
||||||
{
|
{
|
||||||
// TODO -- use the environment variable for directories.
|
|
||||||
|
|
||||||
if (file_exists(name)) return name;
|
if (file_exists(name)) return name;
|
||||||
|
|
||||||
// if name is a path, then it doesn't exist.
|
// if name is a path, then it doesn't exist.
|
||||||
@ -670,6 +668,65 @@ std::string find_exe(const std::string &name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// this needs to run *after* the MPW environment variables are loaded.
|
||||||
|
std::string find_exe(const std::string &name)
|
||||||
|
{
|
||||||
|
|
||||||
|
// if this is an absolute or relative name, return as-is.
|
||||||
|
|
||||||
|
if (name.find(':') != name.npos) {
|
||||||
|
std::string path = ToolBox::MacToUnix(name);
|
||||||
|
if (file_exists(path)) return path;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name.find('/') != name.npos) {
|
||||||
|
if (file_exists(name)) return name;
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// otherwise, check the Commands variable for locations.
|
||||||
|
std::string command = MPW::GetEnv("Commands");
|
||||||
|
if (command.empty()) return old_find_exe(name);
|
||||||
|
|
||||||
|
|
||||||
|
// string is , separated, possibly in MacOS format.
|
||||||
|
std::string::size_type begin = 0;
|
||||||
|
std::string::size_type end = 0;
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
std::string path;
|
||||||
|
end = command.find(',', begin);
|
||||||
|
|
||||||
|
if (end == std::string::npos) {
|
||||||
|
|
||||||
|
if (begin >= command.length()) return "";
|
||||||
|
|
||||||
|
path = command.substr(begin);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t count = end - begin - 1;
|
||||||
|
path = command.substr(begin, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!path.empty())
|
||||||
|
{
|
||||||
|
// convert to unix.
|
||||||
|
path = ToolBox::MacToUnix(path);
|
||||||
|
// should always have a length...
|
||||||
|
if (path.length() && path.back() != '/') path.push_back('/');
|
||||||
|
path.append(name);
|
||||||
|
if (file_exists(path)) return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end == std::string::npos) return "";
|
||||||
|
begin = end + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MainLoop()
|
void MainLoop()
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
@ -868,14 +925,17 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string command(argv[0]); // InitMPW updates argv...
|
|
||||||
|
|
||||||
|
MPW::InitEnvironment(defines);
|
||||||
|
|
||||||
|
std::string command(argv[0]); // InitMPW updates argv...
|
||||||
command = find_exe(command);
|
command = find_exe(command);
|
||||||
if (command.empty())
|
if (command.empty())
|
||||||
{
|
{
|
||||||
std::string mpw = MPW::RootDir();
|
std::string mpw = MPW::RootDir();
|
||||||
fprintf(stderr, "Unable to find command %s\n", argv[0]);
|
fprintf(stderr, "Unable to find command %s\n", argv[0]);
|
||||||
fprintf(stderr, "$MPW = %s\n", mpw.c_str());
|
fprintf(stderr, "$MPW = %s\n", mpw.c_str());
|
||||||
|
fprintf(stderr, "$Commands = %s\n", MPW::GetEnv("Commands").c_str());
|
||||||
exit(EX_USAGE);
|
exit(EX_USAGE);
|
||||||
}
|
}
|
||||||
argv[0] = ::strdup(command.c_str()); // hmm.. could setenv(mpw_command) instead.
|
argv[0] = ::strdup(command.c_str()); // hmm.. could setenv(mpw_command) instead.
|
||||||
@ -894,7 +954,7 @@ int main(int argc, char **argv)
|
|||||||
MM::Init(Memory, MemorySize, kGlobalSize, Flags.stackSize);
|
MM::Init(Memory, MemorySize, kGlobalSize, Flags.stackSize);
|
||||||
OS::Init();
|
OS::Init();
|
||||||
ToolBox::Init();
|
ToolBox::Init();
|
||||||
MPW::Init(argc, argv, defines);
|
MPW::Init(argc, argv);
|
||||||
|
|
||||||
|
|
||||||
cpuStartup();
|
cpuStartup();
|
||||||
|
53
mpw/mpw.cpp
53
mpw/mpw.cpp
@ -176,7 +176,33 @@ namespace MPW
|
|||||||
return path; // unknown.
|
return path; // unknown.
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t Init(int argc, char **argv, const std::vector<std::string> &defines)
|
uint16_t InitEnvironment(const std::vector<std::string> &defines)
|
||||||
|
{
|
||||||
|
void EnvLoadFile(const std::string &envfile);
|
||||||
|
void EnvLoadArray(const std::vector<std::string> &data);
|
||||||
|
|
||||||
|
std::string m(RootDir());
|
||||||
|
if (!m.empty())
|
||||||
|
{
|
||||||
|
std::string mm = ToolBox::UnixToMac(m);
|
||||||
|
if (mm.back() != ':') mm.push_back(':');
|
||||||
|
|
||||||
|
Environment.emplace(std::string("MPW"), mm);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (defines.size())
|
||||||
|
EnvLoadArray(defines);
|
||||||
|
|
||||||
|
if (!m.empty())
|
||||||
|
{
|
||||||
|
std::string path(RootDirPathForFile("Environment.text"));
|
||||||
|
EnvLoadFile(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Init(int argc, char **argv)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
FDTable.resize(16);
|
FDTable.resize(16);
|
||||||
@ -274,33 +300,10 @@ namespace MPW
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// environment,
|
// environment
|
||||||
// just use $MPW and synthesize the other ones.
|
|
||||||
{
|
{
|
||||||
void EnvLoadFile(const std::string &envfile);
|
|
||||||
void EnvLoadArray(const std::vector<std::string> &data);
|
|
||||||
|
|
||||||
std::string m(RootDir());
|
|
||||||
if (!m.empty())
|
|
||||||
{
|
|
||||||
std::string mm = ToolBox::UnixToMac(m);
|
|
||||||
if (mm.back() != ':') mm.push_back(':');
|
|
||||||
|
|
||||||
Environment.emplace(std::string("MPW"), mm);
|
|
||||||
}
|
|
||||||
Environment.emplace(std::string("Command"), command);
|
Environment.emplace(std::string("Command"), command);
|
||||||
|
|
||||||
|
|
||||||
if (defines.size())
|
|
||||||
EnvLoadArray(defines);
|
|
||||||
|
|
||||||
if (!m.empty())
|
|
||||||
{
|
|
||||||
|
|
||||||
std::string path(RootDirPathForFile("Environment.text"));
|
|
||||||
EnvLoadFile(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::deque<std::string> e;
|
std::deque<std::string> e;
|
||||||
|
|
||||||
for (const auto &iter : Environment)
|
for (const auto &iter : Environment)
|
||||||
|
@ -101,7 +101,8 @@ namespace MPW {
|
|||||||
|
|
||||||
|
|
||||||
// should add argc/argv/envp...
|
// should add argc/argv/envp...
|
||||||
uint16_t Init(int argc, char **argv, const std::vector<std::string> &defines);
|
uint16_t InitEnvironment(const std::vector<std::string> &defines);
|
||||||
|
uint16_t Init(int argc, char **argv);
|
||||||
|
|
||||||
uint32_t ExitStatus();
|
uint32_t ExitStatus();
|
||||||
|
|
||||||
|
@ -16,6 +16,10 @@ ShellDirectory=$MPW
|
|||||||
SysTempFolder=/tmp/
|
SysTempFolder=/tmp/
|
||||||
TempFolder=/tmp/
|
TempFolder=/tmp/
|
||||||
|
|
||||||
|
# comma-separated list of directories, like $PATH
|
||||||
|
# add . to include the current directory.
|
||||||
|
Commands=${MPW}Tools:
|
||||||
|
|
||||||
# MPW IIgs 1.1
|
# MPW IIgs 1.1
|
||||||
AIIGSIncludes=${MPW}Interfaces:AIIGSIncludes:
|
AIIGSIncludes=${MPW}Interfaces:AIIGSIncludes:
|
||||||
RIIGSIncludes=${MPW}Interfaces:RIIGSIncludes:
|
RIIGSIncludes=${MPW}Interfaces:RIIGSIncludes:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user