AUSAM/source/S/ass.c

struct
{
	int integer;
};

char macro[]	"/bin/macro";
char link[]	"/bin/link";
char execute[]	"m.out";
char sdump[]	"/bin/sdump";

char stat[2];

char *arg[12]
{
	link+5,
	"-o=m.out",
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
int n	2;		/* first empty space in arg */

main(c,v)
char *v[];
{
	register i;

	if( c < 2 )
	{
		prints(2, "Usage: ass [-options] name1[.mac] ...\n");
		exit(1);
	}
	if( !fork())
	{
		v[c] = 0;
		v[0] = macro+5;
		execv( macro, v);
		efail(macro);
	}
	waitx(stat);
	if( stat->integer)
	{
		prints(2, "Assembly errors - execution cancelled\n");
		exit(1);
	}
	if( !fork())
	{
		register char *p,*q;

		v[c] = 0;
		for(i = 1; v[i]; i++)
		{
			if(v[i][0] != '-')
			{
				arg[n++] = q = v[i];
				p = 0;
				while( *q)
				{
					if( *q++ == '.')
					{
						p = q-1;
					}
				}
				if( p)
					*p = 0;
				break;
			}
			else
			{
				if(v[i][1] == 'l' && v[i][2] == 's')
					arg[n++] = "-ls";
			}
		}
		arg[n++] = "/lib/m.obj";
		arg[n] = 0;
		execv(link, arg);
		efail(link);
	}
	waitx(stat);
	if(stat->integer)
	{
		prints(2, "Linkage failed - execution cancelled\n");
		exit(1);
	}
	if( !fork())
	{
		prints(2, "Execution begins -\n");
		tlimit(15);
		execl(execute, execute, 0);
		efail(execute);
	}
	waitx(stat);
	if(stat[0] & 0200)	/* core? */
	{
		execl( sdump, sdump+9, 0);
		efail(sdump);
	}
}


efail(s)
char *s;
{
	prints(2, s);
	prints(2, ": Exec failed\n");
	exit(1);
}