|
|
researchv10 Norman
/* lablist and labmake commands */
#include <stdio.h>
#include <pwd.h>
char direct[] = "/usr/spool/dpd";
FILE *fin, *fout;
#define NO 0
#define YES 1
#define FIRST 12
int dbgflag = NO;
int mailflag = 0;
int lablist ;
char df[30];
char tf[30];
struct passwd *pwp, *getpwuid();
struct par
{
char *name;
char *value;
} pars[20];
main(argc,argv)
int argc;
char **argv;
{
int i, j, pid, unit;
char c, *p, *q, *val();
for(p=q=argv[0] ; *p!= '\0' ; ++p)
if(*p == '/') q = p+1;
lablist = ! strcmp(q, "lablist");
pid = getpid();
sprintf(df, "%s/df%dxx", direct, pid);
sprintf(tf, "%s/tf%dxx", direct, pid);
pwp = getpwuid( getuid() );
if(pwp == NULL)
{
fprintf(stderr, "bad getpwuid!\n");
exit(3);
}
if(pwp->pw_gecos && pwp->pw_gecos[0]!='\0')
setval("job", pwp->pw_gecos);
setval("copies", "1");
setval("lines", "6");
setval("forms", "avery");
setval("each", "1");
setval("sel", "");
for(i=1; i<argc; ++i)
if(argv[i][0]=='-' && argv[i][1]!='\0')
{
for(j=1; (c=argv[i][j])!='\0' ; ++j)
switch(c)
{
case 't':
dbgflag = YES;
break;
case 'l':
lablist = YES;
break;
case 'm':
mailflag = YES;
break;
default:
fprintf(stderr,"Bad flag %c\n", c);
exit(1);
}
argv[i] = 0;
}
else {
for(p = argv[i] ; *p!='\0' ; ++p)
if(*p == '=')
{
*p = '\0';
setval(argv[i], p+1);
argv[i] = 0;
break;
}
}
if(dbgflag)
fout = stdout;
else if( (fout = fopen(tf,"w")) == NULL)
err("Cannot open temporary file");
if(mailflag)
fprintf(fout, "M%s\n", pwp->pw_name);
if(!val("job"))
{
setval("job", "m5192,m044");
fprintf(stderr, "Output will be put in box M044\n");
}
fprintf(fout, "S\nL$\tSGRADE\t2\nL$\tIDENT\t%s,LABELS\n", val("job") );
fprintf(fout, "L$\tREMOTE\t**,ONL\n");
fprintf(fout, "L$\tOPTION\tFORTRAN\nL$\tSELECT\t./LAB.OBJ\n");
if(lablist)
fprintf(fout, "L$\tEXECUTE\tON1\n");
else fprintf(fout, "L$\tEXECUTE\n");
fprintf(fout, "L$\tLIMITS\t10,12K\nL$\tFILE\tP*,NULL\nL$\tSYSOUT\t06\n");
if(lablist)
fprintf(fout, "L$\tSYSOUT\t42\n");
else fprintf(fout, "L$\tMASS\t42,X20S,10L\nL$\tFFILE\t42,NOSLEW\n");
fprintf(fout, "$L\tDATA\t05\n");
fprintf(fout, "L%s-lines\nL%s\n", val("lines"), val("sel") );
unit = FIRST;
for(i=1 ; i<argc ; ++i)
if(argv[i] != 0)
fprintf(fout, "L*%d %s\n", unit++ , argv[i]);
if(unit == FIRST)
fprintf(fout, "L*%d standard input\n", FIRST);
unit = FIRST;
for(i=1 ; i<argc; ++i)
if(argv[i] != 0)
{
fprintf(fout, "L$\tDATA\t%d\n", unit++);
if(argv[i][0]=='-' && argv[i][1]=='\0')
fin = stdin;
else if( (fin = fopen(argv[i],"r")) == NULL)
{
fprintf(stderr,"Cannot open file %s", argv[i]);
err("");
}
copyfile();
fclose(fin);
}
if(unit == FIRST)
{
fprintf(fout, "L$\tDATA\t%d\n", FIRST);
copyfile();
}
if(!lablist)
{
if( (p = val("nc")) || (p = val("copy")) )
setval("copies", p);
if(p = val("neach"))
setval("each", p);
fprintf(fout, "L$\tSELECT\tCC/LABEL1\n");
fprintf(fout, "L%s-each %s %s-lines %s-copies\n",
val("each"), val("forms"),
val("lines"), val("copies") );
fprintf(fout, "L$\tMASS\tIN,X20D\nL$\tSELECT\tCC/LABEL2\n");
}
fprintf(fout, "L$\tENDJOB\n");
if(!dbgflag)
{
fclose(fout);
if( link(tf,df) )
err("Cannot make df file");
unlink(tf);
execl("/etc/dpd", "/etc/dpd", 0);
err("Couldn't invoke /etc/dpd");
}
exit(0);
}
char *val(s)
register char *s;
{
register struct par *p;
for(p=pars; p->name!=0 ; ++p)
if(! strcmp(p->name, s))
return(p->value);
return(0);
}
setval(n,v)
char *n, *v;
{
register struct par *p;
for(p=pars ; p->name!=0 && strcmp(p->name,n) ; ++p)
;
p->name = n;
p->value = v;
}
err(s)
char *s;
{
fprintf(stderr, "%s\n", s);
unlink(tf);
exit(1);
}
copyfile() /* precede every line with a letter L */
{
char line[200];
line[0] = 'L';
while( fgets(line+1,199, fin) )
fputs(line, fout);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.