I've stole that simple idea from Borland JBuilder, and implemented it as a simple C program. Idea is following
This program searches for a file with same name as its name (but with .exe stripped) in current directory, then in 'modules' subdirectory, then in 'perl' subdirectory and calls perl to execute it if found.
If not found, then 'script-resolver.pl' is searched in a same way
This allows us to copy compiled executable as some name, and have convenient way to call that script.
This is similar to 'pl2bat' in spirit, but proved to be more comfortable to use in my practice, because script to be called is always up-to-date, and in 'pl2bat' case one should re-run pl2bat after some modifications are done.
Compilable with at least with BC++ and MSVC++.
// a simple program which executes a perl script at
// one of following locations, whichever comes first:
// modules/[name].pl
// perl/[name].pl
// ./[name].pl
// modules/executor-resolver.pl
// perl/executor-resolver.pl
// ./executor-resolver.pl
//? modules/[name]
//? perl/[name]
//? ./[name]
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include "EXTERN.h"
#include "perl.h"
int main(int argc, char *argv[], char **env)
{
char bufstr[2048];
char fullpath[2048];
char name[2048];
char **xargv = (char**)malloc(sizeof(char*)*(argc+2));
char *script[] = // how to search for script to run
{
"modules\\",
"perl\\",
"",
0
};
char history[2048];
int i=0, j, k, rc;
bufstr[0]=0;
strcpy(history,"tried:\n ");
GetModuleFileName(NULL,fullpath,2048);
j = strlen(fullpath);
while (j && fullpath[j]!='\\')
j--;
j++;
strcpy(name,fullpath+j);
k = strlen(name);
if (stricmp(name+k-4,".exe")==0) {
//okay
name[k-4] = 0;
}
else {
MessageBox(0,name,"bad: not able to parse",0);
return 1;
}
//MessageBox(0,name,"good:",0);
fullpath[j] = 0;
strcpy(bufstr,fullpath);
// try with 'name' first
for (k=0;script[k];k++) {
strcpy(bufstr+j,script[k]);
strcat(bufstr+j,name);
strcat(bufstr+j,".pl");
strcat(history,bufstr);
strcat(history,"\n ");
#undef access
if (!access(bufstr,0)) {
//found it!
goto found;
}
}
// try with "executor-resolver.pl" at second set of tries
for (k=0;script[k];k++) {
strcpy(bufstr+j,script[k]);
strcat(bufstr+j,"executor-resolver.pl");
strcat(history,bufstr);
strcat(history,"\n ");
#undef access
if (!access(bufstr,0)) {
//found it!
//but here script name should be inserted
xargv = (char**)malloc(sizeof(char*)*(argc+4));
for (k=0; k<argc; k++)
xargv[k+2] = argv[k];
xargv[2] = name;
xargv[1] = bufstr;
xargv[0] = "perl";
argc += 2;
goto run;
}
}
MessageBox(0,history,"Did not found.",0);
return -1;
found:;
//MessageBox(0,name,"!found!",0);
xargv = (char**)malloc(sizeof(char*)*(argc+3));
for (k=0; k<argc; k++)
xargv[k+1] = argv[k];
xargv[1] = bufstr;
xargv[0] = "perl";
argc += 1;
run:;
rc = RunPerl(argc, xargv, env);
free(xargv);
return rc;
}