V10/cmd/docgen/cov.cpio
0707070035330205021006640000510000040000010144070423770206100001100000001163Makefile # docgen defaults to coversheet script mcsdata
# timestamp is used by tmac.cs to compute timestamp for itds
# cstrans is used by tmac.cs to package & ship coversheet
# to itds database
all: cstrans timestamp docgen
docgen: docgen.c
cstrans: header.h trans.l getstamp.o
lex trans.l
cc lex.yy.c getstamp.o -ll -o cstrans
timestamp: timestamp.o getstamp.o
cc timestamp.o getstamp.o -o timestamp
install: cstrans timestamp docgen
cp docgen /usr/bin
cp mcsdata /usr/lib/docgen
cp cstrans /usr/lib/tmac
cp timestamp /usr/lib/tmac
cp name.sed /usr/lib/tmac
cp sendcover.sh /usr/lib/tmac/sendcover
clean:
rm cstrans lex.yy.c
0707070035330025251006640000510000040000010073170412351073100001100000043541docgen.c /**********
docgen.c
(091984 version: from llc 080284; minor changes by vbt)
modify *mmfile, *msfile, and *mcfile strings as needed to supply
full pathnames for mmdata, msdata, and mcsdata files;
**********/
#include <stdio.h>
#include <signal.h>
char *mmfile="/usr/lib/docgen/mmdata";
char *msfile="/usr/lib/docgen/msdata";
char *mcfile="/usr/lib/docgen/mcsdata";
char *wr = "/usr/lib/docgen/wr";
#define eatblanks(a) while((c=getc(a)) == ' '|| c == '\t')
#define MAX 100
#define CMAX 7500
#define LMAX 200
#define QMAX 100
#define NPATH 10
#define NENT 200
#define BUFS 512
#define LABMAX 20
#define STACK 10
#define NEST 10
int inap;
int debug = 0;
int sdebug = 0;
int verbose = 0;
#define ARGS 1
#define ONELINE 2
#define MANY 4
#define OUT 8
#define PRINT 16
#define SKIP 32
#define BLOOP 128
#define PATH 256
#define QUEST 512
#define STUFF 1024
#define NAME 2048
#define SUM 4096
#define PAR 8192
#define FLOOP 16384
#define SEVERAL 32768
#define QSTUFF 65536
struct q_a {
char *qtext;
char *text;
char *macro;
unsigned long type;
struct qa *argq;
} s[MAX];
struct q_a *p = s;
unsigned long gettype();
int sig_in_ed();
char buf[CMAX];
char *ptr = buf;
char obuf[BUFS];
char *optr = obuf;
FILE *outp;
char *ofile;
char line[LMAX];
char sline[LMAX];
char *first;
int lineno = 1;
struct qa {
char *text;
struct qa *nexta;
} ques[QMAX];
struct qa *qp = ques;
struct pa {
char *name;
struct list *root;
} paths[NPATH];
struct pa *pp = paths;
struct list {
struct q_a *entry;
struct list *next;
struct list *loop;
char *quest;
struct list *floop;
} list[NENT];
struct list *lp = list;
struct list *stack[STACK];
struct list **st = stack;
struct pa *findpath();
struct lab {
struct list *path;
struct list *place;
} save[LABMAX], *sav=save;
struct lab *savp;
struct lab *savc[10];
unsigned stype[10];
int curly = 0;
char *onepath;
char *qfile;
char *namesf="tagfile";
char nname[50];
FILE *popen(), *edp;
main(argc,argv)
int argc;
char *argv[];
{
qfile = mcfile;
while(argc > 1 && *argv[1] == '-'){
switch(argv[1][1]){
case 'f':
if(argc > 2)qfile=argv[2];
argc--;
argv++;
break;
case 'm':
if(argv[1][2] == 's')qfile=msfile;
else if(argv[1][2] == 'c')qfile=mcfile;
else if(argv[1][2] == 'm')qfile=mmfile;
else {
fprintf("unknown macro package %s\n",argv);
exit(0);
}
break;
case 'w':
qfile = wr;
break;
case 'd':
sdebug=1;
break;
case 'p':
debug=1;
break;
case 'v':
verbose=1;
break;
default:
fprintf(stderr,"unknown flag %c\n",argv[1][1]);
exit(0);
}
argc--; argv++;
}
if(argc > 1)ofile=argv[1];
init(qfile);
if(onepath != 0){
pp=findpath(onepath);
lp=pp->root;
process(1);
}
else process(0);
done();
}
init(file)
char *file;
{
FILE *inp;
int c;
int i;
int printall=0;
char command[50];
FILE *dumb;
if(ofile == 0){
if(file == wr){
printf("Tags going to file tagfile\n");
ofile = namesf;
}
else if(file == mcfile){
printf("Output going to file temp.cover\n");
ofile = "temp.cover";
}
else {
printf("Output going to file temp\n");
ofile = "temp";
}
}
if((inp=fopen(file,"r"))==NULL){
fprintf(stderr,"can't open script file %s\n",file);
exit(0);
}
pp->name = onepath = ptr;
i=0;
while((c=getc(inp)) != '\n'){
if(c == ','){
*ptr++ = '\0';
(++pp)->name = ptr;
i++;
if(pp > &paths[NPATH-1])
error("more than 10 paths-NPATH");
}
else if(c != ' ' && c != '\t')
*ptr++ = c;
}
*ptr++ = '\0';
if(i > 0)onepath=0;
lineno++;
first = ptr;
if(getstr(inp)== 0)
if(onepath == 0)
error("text string expected");
while(getentry(inp) != 0){
if(p++ >= &s[MAX-1])
error("number of instructions exceeded-MAX");
}
if(debug)printf("\n");
if((dumb = fopen(ofile,"r")) != NULL){
if(file == wr){
printf("File %s already exists; Tags will be appended\n",ofile);
printall++;
}
else {
printf("File %s already exists; Text will be appended\n",ofile);
}
fclose(dumb);
}
if((dumb = fopen(ofile,"a")) == NULL){
fprintf(stderr,"can't open %s\n",ofile);
exit(1);
}
fclose(dumb);
sprintf(command,"ed - %s\n",ofile);
signal(SIGINT,sig_in_ed);
if((edp = popen(command,"w")) == NULL){
printf("can't involk ed\n");
exit(0);
}
setbuf(edp,NULL);
if(printall){
printf("The following tags are already defined:\n");
fputs("1,$p\n",edp);
fflush(edp);
sleep(8);
printf("\n");
}
fputs("a\n",edp);
inap = 1;
}
getentry(inp)
FILE *inp;
{
char *l;
int c;
int comment = 0;
if(debug)printf("\n place %o ",p);
savp = sav;
l = line;
while((*l = c = getc(inp)) != ':'){
if(c == EOF)return(0);
if(c == '*'){
if(comment){
comment=0;
continue;
}
else {
comment=1;
continue;
}
}
if(comment){
if(c == '\n')lineno++;
continue;
}
if(c == '\\'){
*l = getc(inp);
if(++l >= &line[LMAX-1])
error("line length exceeded-LMAX");
continue;
}
if(c == '}'){
if(debug)printf("found }\n");
l=ptr;
getstr(inp);
addloop(--curly,l);
eatline(inp);
sav = savc[curly];
p->type = BLOOP;
return(1);
}
if(c == ','){
*l = '\0';
addentry(line,p);
l=line;
}
else if(c == '\n'){
l=line;
lineno++;
}
else if(c != ' ' && c != '\t'){
if(l++ >= &line[LMAX-1])
error("line length exceeded-LMAX");
}
}
*l = '\0';
addentry(line,p);
p->macro = ptr;
while((*ptr = c = getc(inp))!= ':'){
if(c == '\\'){
*ptr = getc(inp);
if(++ptr >= &buf[CMAX-1])
error("string buffer exceeded-CMAX");
}
else if(c == ' ' && ptr == p->macro);
else if(c == '{' && ptr == p->macro){
if(debug)printf("in { savp %o\n",savp);
(sav++)->path = 0;
stype[curly] = BLOOP;
savc[curly++] = savp;
if(curly >= NEST)
error("nesting depth exceeded-NEST");
if((c = getc(inp)) == ' '|| c == '\t')
eatblanks(inp);
if(c == '\n'){
lineno++;
if((c = getc(inp)) == ' '|| c == '\t')
eatblanks(inp);
}
if(c == '"'){
p->type = FLOOP;
ungetc(c,inp);
l=ptr;
getstr(inp);
p->qtext = l;
stype[curly-1] = FLOOP;
}
else {
ungetc(c,inp);
p->type = BLOOP;
}
return(1);
}
else if(ptr++ >= &buf[CMAX-1])
error("string buffer exceeded-CMAX");
}
if(p->macro == ptr)p->macro=0;
else *ptr++ = '\0';
p->type = gettype(inp);
if(p->type&QUEST){
p->qtext = ptr;
if(getstr(inp) == 0)
error("text string expected");
}
else p->qtext = 0;
p->text = ptr;
if(p->type&(ONELINE|SEVERAL|PRINT|MANY|PATH))
if(getstr(inp)== 0)
error("text string expected");
if(p->text == ptr)p->text = 0;
if(debug)printf(" macro %s type %d text %s ",p->macro,p->type,p->text);
if(sdebug)db(p);
if(p->type & (ARGS |SKIP)){
p->argq = qp;
qp->text = ptr;
while(getstr(inp) != 0){
qp->nexta = (qp+1);
if(debug||sdebug)printf("\n arg question= %s",qp->text);
if(debug)printf(" next %o",qp->nexta);
if(qp++ >= &ques[QMAX-1])
error("number of questions exceeded-QMAX");
qp->text = ptr;
}
(qp-1)->nexta = 0;
if(debug)printf("\n last %s next %o",(qp-1)->text,(qp-1)->nexta);
if(sdebug)printf("\n");
}
sav = savp;
return(1);
}
getstr(inp)
FILE *inp;
{
int c;
while((c=getc(inp)) == ' ' || c == '\t' || c == '\n')if(c == '\n')lineno++;
if(c != '\"'){
ungetc(c,inp);
return(0);
}
while((*ptr=c=getc(inp)) != '\"'){
if(ptr++ >= &buf[CMAX])
error("string buffer exceeded-CMAX");
if(c == '\n')lineno++;
}
*ptr++ = '\0';
return(1);
}
addentry(ch,p)
char *ch;
struct q_a *p;
{
struct list *ll;
if(debug || sdebug)printf("path= %s, ",ch);
for(pp=paths;pp->name != 0 && pp < &paths[NPATH];pp++){
if(match(ch,pp->name)){
if(pp->root == 0){
pp->root = lp;
}
else {
ll=pp->root;
while(ll->next != 0)ll=ll->next;
ll->next = lp;
}
if(debug)printf("entry %o path %o\n",lp,pp);
sav->path = (struct list *)pp;
sav->place = lp;
lp->entry = p;
if(lp++ >= &list[NENT-1])
error("tree exceeded-NENT");
if(sav++ >= &save[LABMAX-1])
error("saved paths exceeded-LABMAX");
return;
}
}
printf("no path to %s\n",ch);
exit(0);
}
addloop(in,cp)
char *cp;
{
struct lab *sp;
struct list *ll;
sp = savc[in];
while((ll = sp->path) != 0){
if(debug)printf("addloop sp %o path %o",sp,sp->path);
while(ll->next != 0){
ll=ll->next;
}
if(debug)printf("ll %o place %o\n",ll,sp->place);
if(ll->loop != 0){
ll->next = lp;
lp->loop = sp->place;
lp->quest = cp;
lp->entry = p;
if(lp++ >= &list[NENT-1])
error("tree exceeded - NENT");
}
else {
ll->loop = sp->place;
ll->quest = cp;
}
if(stype[in] == FLOOP){
sp->place->floop = lp;
lp->entry = p;
if(lp++ >= &list[NENT-1])
error("tree exceeded - NENT");
}
sp++;
}
}
unsigned long
gettype(inp)
FILE *inp;
{
int c;
unsigned long i;
i=0;
another:
while((c=getc(inp)) == ' ' || c == '\t');
switch(c){
case 'A':
i |= ARGS;
break;
case 'M':
i |= MANY;
break;
case 'O':
if((c=getc(inp)) == 'U')
i |= OUT;
else if(c == 'N')
i|= ONELINE;
else error("unknown action");
break;
case 'P':
if((c=getc(inp)) == 'R')
i |= PRINT;
else if(c == 'A'){
if((c=getc(inp)) == 'T')
i |= PATH;
else if(c == 'R')
i |= PAR|MANY;
else error("unknown action");
}
else error("unknown action");
break;
case 'S':
if((c=getc(inp)) == 'T')
i |= STUFF|ARGS;
else if(c == 'K')
i |= SKIP;
else if(c == 'U')
i |= SUM|MANY;
else if(c == 'E')
i |= SEVERAL;
else error("unknown action");
break;
case 'Q':
if((c=getc(inp)) == 'U')
i |= QUEST;
else if(c == 'S')
i |= QSTUFF|ARGS;
else error("unknown action");
break;
case 'N':
i |= NAME|ONELINE;
break;
default:
error("unknown action");
}
while((c=getc(inp))!= '\n')
if(c == '&')goto another;
lineno++;
if(i&OUT)
if(i & ~OUT){
if(i & ~(OUT|QUEST))
error("action error - OUT not alone");
}
if(i & PRINT)
if(i & ~PRINT){
if(i & ~(PRINT|QUEST))
error("action error - PRINT not alone");
}
if(i & PATH)
if(i & ~PATH)error("action error - PATH not alone");
if((i&(MANY|ONELINE))==(MANY|ONELINE))
error("contridictory actions - MANY & ONELINE");
return(i);
}
process(start)
int start;
{
if(start == 0){
printf("%s\n",first);
getl(stdin,line);
pp=findpath(line);
lp = pp->root;
}
more:
while(lp){
if(question(lp->entry)== 1)
continue;
if(lp->loop != 0){
printf("%s\n",lp->quest);
getl(stdin,line);
if(line[0] == 'y'|| line[0] == 'Y')
lp=lp->loop;
else{
if(lp->loop->entry->type & 1){
lp->loop->entry->type &= 0177776;
}
if(line[0] == 'q')done();
else lp=lp->next;
}
}
else
lp = lp->next;
}
if(*st != 0){
lp = *st--;
if(lp->loop != 0){
printf("%s\n",lp->quest);
getl(stdin,line);
if(line[0] == 'y' || line[0] == 'Y')
lp=lp->loop;
else{
if(lp->loop->entry->type & 1)
lp->loop->entry->type &= 0177776;
if(line[0] == 'q')done();
else lp=lp->next;
}
}
else lp=lp->next;
goto more;
}
}
question(rp)
struct q_a *rp;
{
int blanks;
char *ch, *sv;
rest:
if(debug)printf("in question %o\n",rp);
if(rp->type & BLOOP)
return(0);
if(rp->type & FLOOP){
if(rp->type & 1)return(0);
printf("%s\n",rp->qtext);
getl(stdin,line);
if(line[0] == 'y' || line[0] == 'Y'){
lp = lp->next;
rp->type |= 1;
}
else if(line[0] == 'q')done();
else lp= lp->floop;
return(1);
}
if(rp->type & PATH){
*(++st) = lp;
if(st >= &stack[STACK-1])
error("stack depth exceeded-STACK");
printf("%s\n",rp->text);
getl(stdin,line);
if(line[0] == '\0'){
st--;
return(0);
}
pp=findpath(line);
lp = pp->root;
return(1);
}
if(rp->type&QUEST){
printf("%s\n",rp->qtext);
getl(stdin,line);
if(line[0] != 'Y' && line[0] != 'y')return(0);
}
if(rp->text != 0)
if((rp->type&MANY) == 0)printf("%s\n",rp->text);
if(rp->type&(ONELINE|SEVERAL))
getl(stdin,sline);
if(rp->type&NAME){
return(newname(sline));
}
if(rp->type&SUM){
summary();
}
if(rp->type&PAR){
par();
}
if(rp->type&(STUFF|QSTUFF)){
sv = ch = rp->macro;
qp = rp->argq;
do{
while(*ch != '$'){
if(*ch == '\\')ch++;
if(*ch == '\0')break;
ch++;
}
if(*ch == '$'){
*ch = '\0';
out(sv);
*ch++ = '$';
sv = ch;
}
printf("%s\n",qp->text);
getl(stdin,line);
if(rp->type&QSTUFF)
if(line[0] == '\0')break;
if(*(ch-1) == '$')
out(line);
qp = qp->nexta;
} while(qp != 0);
if(rp->type&STUFF)
out(sv);
else if(*sv == '"')out("\"");
out("\n");
}
else if(rp->type&(ARGS | SKIP)){
if((rp->type&SKIP) == 0 && rp->macro != 0)
out(rp->macro);
qp = rp->argq;
do{
printf("%s\n",qp->text);
blanks = getl(stdin,line);
if(rp->type&SKIP){
if(line[0] == '\0')
return(0);
else out(rp->macro);
}
out(" ");
if(line[0] == '\0')blanks++;
if(blanks)out("\"");
out(line);
if(blanks)out("\"");
qp=qp->nexta;
} while(qp != 0);
out("\n");
}
else if((rp->type&(OUT|ONELINE|MANY))&& rp->macro != 0){
out(rp->macro);
out("\n");
}
if(rp->type&SEVERAL){
out(rp->macro);
out(" ");
out(sline);
out("\n");
}
if(rp->type&ONELINE){
out(sline);
out("\n");
}
if(rp->type&MANY){
if(rp->type&(SUM))
printf("%s named %s.sum\n",rp->text,nname);
else if(rp->type&PAR)
printf("%s named %s.par\n",rp->text,nname);
else printf("%s\n",rp->text);
printf(" end with : alone on a line (or read a file with :r filename)\n");
getl(stdin,line);
if(line[0] == ':' && line[1] == 'r'){
ch = &line[2];
more:
readfiles(ch);
printf("Type other file names or return\n");
getl(stdin,line);
if(line[0] == '\0')return(0);
ch = line;
goto more;
}
toed();
}
return(0);
}
sig_in_ed(){
inap = 0;
printf("type q to quit ");
getl(stdin,line);
if(line[0] == 'q')done();
fputs("a\n",edp);
optr = obuf;
inap=1;
signal(SIGINT,sig_in_ed);
process(1);
done();
}
getl(inp,l)
char *l;
FILE *inp;
{
int c;
int blanks;
blanks=0;
while((*l = c = getc(inp)) != '\n'){
l++;
if(c == ' ' || c == '\t')blanks++;
}
*l++ = 0;
return(blanks);
}
out(ch)
char *ch;
{
char c;
while(*ch != '\0'){
if(*ch == '\n'){
*optr++ = *ch++;
*optr = '\0';
fputs(obuf,edp);
optr=obuf;
if(verbose)printf("%s",obuf);
}
else *optr++ = *ch++;
if(optr >= &obuf[BUFS-1]){
*optr = '\0';
fputs(obuf,edp);
optr = obuf;
}
}
}
ofl()
{
if(optr != obuf){
*optr='\0';
fputs(obuf,edp);
optr=obuf;
}
if(inap)
fputs(".\nw\na\n",edp);
else {
fputs("w\na\n",edp);
inap=1;
}
}
done(){
ofl();
fputs(".\nq\n",edp);
exit(0);
}
match(ch,hh)
char *ch, *hh;
{
while(*ch == *hh){
if(*ch == '\0')return(1);
ch++;
hh++;
}
return(0);
}
struct pa *
findpath(ch)
char *ch;
{
for(pp=paths;pp->name != 0;pp++){
if(match(ch,pp->name))
return(pp);
}
printf("can't find path for %s\n",ch);
exit(0);
}
eatline(inp)
FILE *inp;
{
while(getc(inp) != '\n');
lineno++;
}
readfiles(ptr)
char *ptr;
{
FILE *io;
int nomore;
char *bp;
char fname[50];
ofl();
fputs(".\n",edp);
nomore = 0;
while(1){
while(*ptr == ' ')ptr++;
bp = ptr;
while(*ptr != ' ' && *ptr != '\0')ptr++;
if(*ptr == '\0')nomore++;
else *ptr++ = '\0';
sprintf(fname,"$r %s\n",bp);
fputs(fname,edp);
if(nomore != 0)break;
}
fputs("a\n",edp);
}
error(sp)
char *sp;
{
fprintf(stderr,"%s at line %d file %s\n",sp,lineno,qfile);
exit(1);
}
db(dbp)
struct q_a *dbp;
{
printf(" macro= %s type=",dbp->macro);
if(dbp->type&ARGS)printf(" ARGS");
if(dbp->type&SKIP)printf(" SKIP");
if(dbp->type&OUT)printf(" OUT");
if(dbp->type&PRINT)printf(" PRINT");
if(dbp->type&ONELINE)printf(" ONELINE");
if(dbp->type&SEVERAL)printf(" SEVERAL");
if(dbp->type&MANY)printf(" MANY");
if(dbp->type&PATH)printf(" PATH");
if(dbp->text != 0)printf("\nmain text= %s\n",dbp->text);
else printf("\n");
}
newname(s)
char *s;
{
int i;
char *name1, *name2;
int pid, rpid, retcode;
char *sp,spac[10];
restart:
sp = spac;
*sp = '\0';
if(*s == ' ' || *s == '\t')
while(*s== ' ' || *s == '\t')*sp++ = *s++;
*sp = '\0';
for(i=0;*s != '\0';i++)
nname[i] = *s++;
if(nname[0] == ':'){
switch(nname[1]){
case 'p':
sprintf(line,".\nw\ne %s\n1,$p\na\n",ofile);
fputs(line,edp);
sleep(8);
return(1);
case 'r':
sprintf(line,".\nw\ne %s\na\n",&nname[3]);
printf("Type text to append to file %s\n",&nname[3]);
fputs(line,edp);
getl(stdin,line);
toed();
return(1);
case 'j':
name1=0;
name2 = nname;
nextn:
for(; *name2 != ' ';name2++)
if(*name2 == '\0'){
printf("error in command line: %s\nplease retype\n",nname);
getl(stdin,sline);
s=sline;
goto restart;
}
*name2++ = '\0';
while(*name2 == ' ')name2++;
if(name1 == 0){
name1 = name2;
goto nextn;
}
sprintf(line,".\nw\ne %s.sum\n$r %s.sum\nw\n",name1,name2);
fputs(line,edp);
sprintf(line,"e %s.par\n$r %s.par\nw\n",name1,name2);
fputs(line,edp);
sprintf(line,"e %s\n/%s/d\nw\na\n",ofile);
fputs(line,edp);
return(1);
default:
printf("unknown command %s\n",nname);
printf("please retype\n");
goto restart;
}
}
if(nname[0] == '!'){
if((pid = fork()) == 0){
execl("/bin/sh","sh","-c",&nname[1],0);
exit(0);
}
while((rpid=wait(&retcode))!=pid&& rpid != -1);
printf("!\n");
return(1);
}
if(i > 10){
printf("tag too long - please type new tag ");
getl(stdin,sline);
s=sline;
goto restart;
}
nname[i] = '\0';
sprintf(line, ".\nw\ne %s\na\n%s%s\n",ofile,spac,nname);
fputs(line,edp);
return(0);
}
summary(){
FILE *ff;
sprintf(line,"%s.sum",nname);
if((ff = fopen(line,"a")) == NULL){
printf("can't open %s\n",line);
}
sprintf(line,".\nw\ne %s.sum\na\n",nname);
fputs(line,edp);
fclose(ff);
}
par(){
FILE *ff;
sprintf(line,"%s.par",nname);
if((ff=fopen(line,"a")) == NULL){
printf("can't open %s\n",line);
exit(1);
}
sprintf(line,".\nw\ne %s.par\na\n",nname);
fputs(line,edp);
fclose(ff);
}
toed(){
while(1){
if(line[1] == '\0'){
switch(line[0]){
case 'i':
case 'a':
case 'c':
inap++;
break;
case '.':
inap = 0;
break;
case 'q':
if(inap != 0)break;
case ':':
if(inap == 0){fputs("a\n",edp);
inap++;
}
return(0);
}
}
fputs(line,edp);
fputs("\n",edp);
getl(stdin,line);
}
}
0707070035330205151006640000510000040000010235620412351407300001300000000414getstamp.c #include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
long
getstamp(filename)
char *filename;
{
long mtime;
struct stat fbuf, *fp = &fbuf;
struct tm t, *tp = &t;
stat(filename, fp);
t = *localtime(&fp->st_mtime);
mtime = fp->st_mtime;
return(mtime);
}
0707070035330205051006640000510000040000010235640412351413100001100000001552header.h /********** docsend.h - 092884 **********/
#define HEADSIZE 160
#define UJN 0 /* unique job name - 14 bytes */
#define ULOG 15 /* user login - 8 bytes */
#define CO 24 /* company code - 2 bytes */
#define DOCNUM 28 /* first document number (cover sheet only) - 18 bytes */
#define TIMESTAMP 53 /* docsend timestamp - 9 bytes */
#define DEVICE 64 /* device: aps (APS-5), i10 (imagen), X97 (troff xerox), X (nroff xerox), 450 (nroff terminal), a.i (imagen with APS-5 simulation) - 3 bytes */
#define NETWORK 68 /* network - nusend (1), usend (2), others (0) - 1 byte */
#define TODSEND 70 /* TOD of docsend - 10 bytes */
#define DEST 81 /* JES remote station - 5 bytes */
#define BIN 87 /* bin or mail info - 34 bytes */
#define PAGES 90 /* TP%d total pages */
#define DUMMY 122 /* position for next field */
#define VERSION 152 /* docsend version (vbt) - 6 bytes */
0707070035330155531007750000510000040000010311640423770172700001500000000155sendcover.sh trap 'rm -f /tmp/cs$$; trap 0; exit' 0 1 2 3 15
L=/usr/lib/tmac
T=/tmp/cs$$
$L/cstrans $T $1 $2
sh $T
rm $T
0707070035330205071006640000510000040000010235610412351405300001400000000261timestamp.c #include <stdio.h>
main(argc, argv)
char *argv[];
{
long mtime, getstamp();
char *filename;
filename = argv[1];
mtime = getstamp(filename);
printf(".ds s) %ld\n",mtime);
}
0707070035330165711006640021230000040000010214560421531217500001000000012541trans.l %{
#include <sys/types.h>
#include <pwd.h>
#include <sys/stat.h>
#include <time.h>
#include <libc.h>
#include "header.h"
#define DATE DOCNUM+6
#define SEQNUM DOCNUM+13
#define TYPE DOCNUM+15
#define SOFT DOCNUM+17
struct passwd *getpwuid(), *ps;
int soft;
char *p, *s1, *s2;
int type, ci=0, pm=0, rl=0;
char buf[HEADSIZE];
char *co = &buf[CO];
char *dept = &buf[DOCNUM], *date = &buf[DATE], *seqnum = &buf[SEQNUM];
char *stype = &buf[TYPE], *ssoft = &buf[SOFT];
char *machine = buf;
char *login = &buf[ULOG], *timestamp = &buf[TIMESTAMP];
char *version = &buf[VERSION];
char *pages = &buf[PAGES];
int more = 1;
%}
%%
^".so".* ;
^".TI" {
printf(".TL\n");
}
^".DT".* ;
^".AH".* {
yytext[yyleng] = '\0';
p = strtok(&yytext[3], " \n");
printf(".AU %s", p);
if (*p == '"') {
p = strtok((char *)0, "\"");
printf(" %s", p);
}
p = strtok((char *)0, "\n");
printf(" \"\"%s\n", p);
}
^".AP".* {
yytext[yyleng] = '\0';
printf(".rP %s\n",&yytext[3]);
}
^".SA" {
printf(".AS\n");
}
^".SE" {
printf(".AE\n");
}
^".KW".* {
printf(".OK %s\n",&yytext[3]);
}
^".TY".* {
for(p = &yytext[3]; *p == ' ';p++);
if(*p == 'I')type=2;
else if(*(p+1) == 'M')type=1;
else type=3;
*stype = *p;
*(stype+1) = *(p+1);
while(*p != ' '){
if(*p == '\n'){
soft=0;
break;
}
p++;
}
if(*p == ' ')
if(*++p == 'y')
soft=1;
printf(".MT %d\n",type);
if(soft){
*ssoft = 'S';
printf(".sF\n");
}
}
^".MT".* {
for(p = &yytext[3]; *p == ' ';p++);
if(*p == '1') {
type=1;
*stype = 'T';
*(stype+1) = 'M';
} else if(*p == '2') {
type=2;
*stype = 'I';
*(stype+1) = 'M';
} else type=3;
printf(".MT %d\n",type);
}
^".sF".* {
soft = 1;
*ssoft = 'S';
printf(".sF\n");
}
^(".NU"|".dN").* {
p = strtok(&yytext[3], "- \n\"");
if(p != 0){
sprintf(dept,"%s-",p);
printf(".dN %s-",p);
type = 1;
}
p = strtok((char *)0, "- \n\"");
if(p != 0){
sprintf(date,"%s-",p);
printf("%s-",p);
}
p = strtok((char *)0, "- \n\"");
if(p != 0){
*seqnum = *p;
*(seqnum+1) = *(p+1);
printf("%s\n",p);
}
else if(type) printf("\n");
p = strtok((char *)0, " \n\"");
if(p != 0)
printf(".fC %s\n",p);
p = strtok((char *)0, " \n\"");
if(p != 0)
printf(".wP %s\n",p);
}
^".MY".* {
printf(".mE %s\n",&yytext[3]);
}
^".ED".* {
printf(".eD %s'n",&yytext[3]);
}
^".PR".* {
pm=1;
printf(".PM %s\n",&yytext[3]);
}
^".RL".* {
rl=1;
if(yyleng>3){
p=&yytext[3];
while(*p == ' ')p++;
if(*p == '\"')p++;
if(*p == 'n')printf(".fA n\n");
else printf(".fA y\n");
}
else printf(".fA y\n");
}
^".GS" {
printf(".gS\n");
}
^".CI".* {
/* ci = 1; gone away
if(yyleng == 3)
printf(".cI n\n");
else {
p = &yytext[3];
while(*p == ' ')p++;
if(*p == '\n' || *p == 'n')
printf(".cI n\n");
else if(*p == '\"')p++;
if(*p == 'y')
printf(".cI y\n");
else if(*p == '\"' || *p == 'n')
printf(".cI n\n");
else fprintf(stderr,".CI unknown argument %c\n",*p);
}*/
}
^".CO".* {
/* if(!ci){
printf(".cI n\n");
ci = 1;
}*/
if(!rl){
printf(".fA y\n");
rl = 1;
}
printf(".cC\n");
}
^".CE" {
printf(".cE\n");
}
^".CV".* {
/* if(!ci){
printf(".cI n\n");
ci = 1;
}*/
if(!rl){
printf(".fA y\n");
rl = 1;
}
printf(".cS\n");
}
^".CS".* {
ECHO;
printf("\n");
return(0);
}
^".SC".* {
/* if(!ci){
printf(".cI n\n");
ci = 1;
}*/
if(!rl){
printf(".fA y\n");
rl = 1;
}
p = s1 = &yytext[3];
while(*s1 == ' ')s1++;
while(*s1 != ' ')s1++;
while(*s1 == ' ')s1++;
while(*s1 != ' ')s1++;
*s1 = '\0';
s1++;
printf(".CS %s \"\" %s\n", p, s1);
return(0);
}
.* {
ECHO;
printf("\n");
}
\n ;
%%
char *header="/tmp/ ";
char *dest = "mhuxd!/usr/spool/uucppublic/doc.mcs";
char *dco = "BL";
main(argc, argv)
char *argv[];
{
FILE *inp;
char *filename, *name, *cover, *pid;
int nuchars, npid, uid, days;
long mtime;
if(argc < 3){
fprintf(stderr,"file name must be supplied to sendcover\n");
exit(1);
}
if((inp=fopen("/etc/whoami","r")) == NULL){
fprintf(stderr,"can't open /etc/whoami\n");
exit(1);
}
nuchars = fread(machine, sizeof(char), 10, inp);
nuchars -= 1;
if(nuchars < 5)pid = machine + nuchars +1;
else pid = machine + 6;
cover = pid + 5;
fclose(inp);
*(pid-1) = '.';
npid = getpid();
sprintf(pid,"%05d",npid);
*cover = 'c';
sprintf(&header[5],"%s",machine);
uid = getuid();
if ((ps = getpwuid(uid)) == NULL){
fprintf(stderr, "login not found");
exit(1);
}
strcpy (login,ps->pw_name);
sprintf(version,"030388L"); /*version*/
strcpy(co, dco); /*company name=BL*/
name = argv[1];
argc--; argv++;
if(freopen(argv[1],"r",stdin)==NULL) {
fprintf(stderr,"%s: cannot open\n", argv[1]);
exit(1);
}
if(freopen(header,"w",stdout)== NULL){
fprintf(stderr,"%s: cannot open\n",header);
exit(1);
}
if((nuchars = fwrite(buf,sizeof(char),HEADSIZE,stdout)) != HEADSIZE){
fprintf(stderr,"wrong number of characters written %d\n",nuchars);
exit(1);
}
filename = argv[1];
mtime = getstamp(filename);
sprintf(timestamp,"%ld",mtime);
argv++;
sprintf(pages,"TP%s",argv[1]);
yylex();
rewind(stdout);
for(p=buf; p < &buf[HEADSIZE-1]; p++)
if(*p == '\0')*p = ' ';
*p = '\n';
if((nuchars = fwrite(buf,sizeof(char),HEADSIZE,stdout)) != HEADSIZE){
fprintf(stderr,"wrong number of characters written %d\n",nuchars);
exit(1);
}
*(cover+1) = '\0';
if((inp=fopen(name,"a")) == NULL){
fprintf(stderr,"can't open tmp file %s\n",name);
exit(1);
}
fprintf(inp,"cd /tmp; uucp -m -C %s %s; rm %s\n",machine,dest,machine);
fclose(inp);
}
0707070035330165711006640021230000040000010214560421531217500001300000000000TRAILER!!! printf(stderr,"wrong number of characters written %d\n",nuchars);
exit(1);
}
*(cover+1) = '\0';
if((inp=fopen(name,"a")) == NUL