|
|
BSD 4.3
#include <stdio.h>
#define BIN IntBin
#define ICONX Iconx
#define MAXARGS 20
#define PATHSIZE 100 /* maximum length of a fully qualified file name */
#ifndef ITRAN
#define ITRAN "%s/itran"
#endif
#ifndef ILINK
#define ILINK "%s/ilink"
#endif
extern char **environ;
char **rfiles;
main(argc,argv)
int argc; char **argv;
{
char **tfiles;
char **lfiles;
char **execlist;
char *tflags[MAXARGS];
char *lflags[MAXARGS];
char **xargs;
int ntf, nlf, nrf, ntflags, nlflags, cflag, quiet;
char **arg;
char *base, *getbase();
char *u1, *u2, *xfile;
char *rindex(), *mkname();
char cmd[PATHSIZE];
ntf = nlf = nrf = ntflags = nlflags = cflag = quiet = 0;
rfiles = (char **)calloc(2*(argc+10), sizeof(char **));
tfiles = (char **)calloc(argc+10, sizeof(char **));
lfiles = (char **)calloc(argc+10, sizeof(char **));
execlist = (char **)calloc(2*(argc+10), sizeof(char **));
tflags[ntflags++] = "itran";
lflags[nlflags++] = "ilink";
lflags[nlflags++] = "-i";
lflags[nlflags++] = ICONX;
rfiles[nrf++] = "rm";
rfiles[nrf++] = "-f";
xfile = "";
for (arg = &argv[1]; arg <= &argv[argc-1]; arg++) {
if ((*arg)[0] == '-') switch ((*arg)[1]) {
case '\0': /* "-" */
tfiles[ntf++] = *arg;
lfiles[nlf++] = rfiles[nrf++]
= "stdin.u1";
rfiles[nrf++] = "stdin.u2";
break;
case 's':
tflags[ntflags++] = "-s";
quiet++;
break;
case 'o':
lfiles[nlf++] = "-o";
xfile = lfiles[nlf++] = *++arg;
break;
case 'x':
xargs = arg++;
goto argsdone;
case 'c':
cflag++;
break;
default:
lflags[nlflags++] = tflags[ntflags++] = *arg;
break;
}
else if (suffix(*arg,".icn")) {
tfiles[ntf++] = *arg;
base = getbase(*arg,".icn");
u1 = mkname(base,".u1");
u2 = mkname(base,".u2");
lfiles[nlf++] = rfiles[nrf++] = u1;
rfiles[nrf++] = u2;
}
else if (suffix(*arg,".u1")) {
lfiles[nlf++] = *arg;
}
else {
fprintf(stderr,"%s: bad argument '%s'\n",argv[0],*arg);
exit(1);
}
}
argsdone:
if (nlf == 0)
usage(argv[0]);
if (!xfile[0])
xfile = getbase(lfiles[0],".u1");
if (ntf != 0) {
lcat(execlist,tflags,tfiles);
sprintf(cmd,ITRAN,BIN);
runit(cmd,execlist,environ);
}
if (cflag) {
exit(0);
}
if (!quiet)
fprintf(stderr,"Linking:\n");
execlist[0] = 0;
lcat(execlist,lflags,lfiles);
sprintf(cmd,ILINK,BIN);
runit(cmd,execlist,environ);
docmd("/bin/rm",rfiles,environ);
chmod(xfile,0755);
if (xargs) {
if (!quiet)
fprintf(stderr,"Executing:\n");
xargs[0] = xfile;
#ifdef DIREX
execv(xfile,xargs);
#else DIREX
execlist[0] = "iconx";
execlist[1] = 0;
lcat(execlist,xargs,0);
execv(ICONX,execlist);
#endif DIREX
}
}
runit(c,a,e)
char *c; char **a, **e;
{
int rc;
if ((rc = docmd(c,a,e)) != 0) {
docmd("/bin/rm",rfiles,e);
exit(1);
}
}
suffix(name,suf)
char *name,*suf;
{
return !strcmp(suf,rindex(name,'.'));
}
char *
mkname(name,suf)
char *name,*suf;
{
char *p, *malloc();
p = malloc(16);
strcpy(p,name);
strcat(p,suf);
return p;
}
char *
getbase(name,suf)
char *name,*suf;
{
char *f,*e, *rindex(), *p, *malloc();
if (!(f = rindex(name,'/')))
f = name;
else
f++;
e = rindex(f,'.');
p = malloc(16);
strncpy(p,f,e-f);
return p;
}
lcat(c,a,b)
int c[],a[],b[];
{
int cp,p;
cp = p = 0;
while (c[cp])
cp++;
while (c[cp] = a[p++])
cp++;
p = 0;
if (b)
while (c[cp++] = b[p++]);
}
usage(p)
char *p;
{
fprintf(stderr,"usage: %s [-c] [-m] [-t] [-u] file ... [-x args]\n",p);
exit(1);
}
docmd(cmd,argv,envp)
char *cmd, **argv, **envp;
{
int rc, stat;
rc = FORK();
if (rc == -1) {
fprintf(stderr,"No more processes\n");
return 255;
}
if (rc == 0) {
execve(cmd,argv,envp);
fprintf(stderr,"exec failed on %s\n",cmd);
_exit(255);
}
while (rc != wait(&stat));
return (stat>>8) & 0xff;
}
plist(title,list)
char *title, **list;
{
char **p;
printf("\n%s\n",title);
for (p = list; *p; p++)
printf("'%s'\n",*p);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.