SMART@ditmelb.OZ.AU (Robert Smart) (06/07/88)
The thing I like about the world electronic network is the chance
it gives you to be stupid on a really large stage. My previous
diff for bakwrd had a bug. This seems to work, doubtless has other
bugs. Anyway it has an extra feature: BAKWRD FILE/-n will only
print the last n lines (scrolled backwards on a vt100). The new
bakwrd.c follows (not a diff). Don't forget the rmsio.c patch from
previous posting.
/*
Program BAKWRD
Programmed by C.J. BOL, Agricultural University Wageningen.
bitnet: BOL@HWALHW50
surf: LUWRVD::BOL
phone: (+31) 08370-84715
This program reads a file, starting at the fileend, n records
at the time. So BAKWRD file/10 gives you groups of 10 records in
correct order, starting with the last 10 records in the file.
Not supported are relative, indexed and hashed files.
$ BAKWRD == "$DEV:[USER]BAKWRD "
$ BAKWRD [file[/n]]
*/
#define MAIN
#include stdio
#include "bakwrd.h"
int line = 0;
main(argc,argv)char *argv[];{
int *rmsopen(),i,j,n,blk;
char *pc,fnam[100];
*fnam = 0;
if(argc>2) {
printf("\007Only one argument permitted\n");
exit();
}
if(argc==2)
strcpy(fnam,argv[1]);
do{
jrec = MAXREC;
pergroep = groep = 1;
inrec = nline = 0;
if(argc!=2){
printf("\nfile[/n] >");
if(!gets(fnam))
exit();
}
for(i=j=0; fnam[i] ; i++)
if(fnam[i]>' ')
fnam[j++] = toupper(fnam[i]);
fnam[j] = 0;
if(*fnam == 0)
exit();
if(pc = strchr(fnam,'/')){
*pc++ = 0;
pergroep = atoi(pc);
}
if(!(fh = rms_open(fnam))){
printf("?Cannot open [%s]\n",fnam);
continue;
}
rms_info(fh,"fop org rat rfm mrs alq ebk ffb fsz",
&fop,&org,&rat,&rfm,&mrs,&alq,&ebk,&ffb,&fsz);
switch(org){
case 0: break;
case 16: printf("\n\007Relative files not supported!\n");
continue;
case 32: printf("\n\007Indexed files not supported!\n");
continue;
case 48: printf("\n\007Hashed files not supported!\n");
continue;
default: printf("\n\007Only sequential files are supported!\n");
continue;
}
filesize = (ebk-1)*512 + ffb; /* filesize in char */
if (pergroep>1){
if(mrs<=0)
mrs = 255;
if(pergroep*mrs > MAXREC-pergroep) {
pergroep = MAXREC/(mrs+1);
if(pergroep==0){
printf("\n? Max. recordsize=%d is too big!\n",mrs);
rms_close(fh);
continue;
}
printf("\n\007Groupsize modified, now %d\n",pergroep);
}
}
blk = ebk - (ffb ? 0:1);
blok1 = blok2 = delim = 0;
switch(rfm){
case 1 : typrfm1(blk); break; /* FIXED LENGTH */
case 2 : typrfm2(); break; /* VAR */
case 3 : typrfm3(blk); break; /* VAR+FIXEDLENGTHCONTROL*/
case 5 : /* STREAM (LF) */
case 6 : typrfm5(blk); break; /* .. (CR) */
default:
printf("\nNot supported record format rfm=%d",rfm);
}
if(pergroep<=0){
if(line>23) printf("\033[H\033M");
printf("\033[1;24r\033[24H\n");
}
}while(argc!=2);
}
addc(c)char c;{
if(inrec==0 &&(c==' ' || c== '\t')) return; /* skip trailing blanks */
rec[--jrec] = (c==delim? '\n' : c);
inrec++;
if(c == delim){
if(++nline >= pergroep){
register extra = (inrec-2)/80; if( extra<0) extra = 0;
if(pergroep > 1) printf("\n\033[7m group %6d \033[0m",groep++);
if(pergroep <=0){
register ii;
if ( pergroep!=0 && line >= -pergroep) goto nxt;
/* be clever. If nline<=24 then set scroll lines 1 to
24-nline+1 and scroll that up, then write on line 24-nline+1.
Otherwise leave scroll lines 1 to 24, scroll that down, and
write on line 1. */
if( line+1+extra<24){
printf("\033[1;%dr\033[%dH\n", 24-line, 24-line);
for( ii = 0; ii<extra; ii++) printf("\n");
for( ii = 0; ii<extra; ii++) printf("\033M");
} else {
if( line<24) printf("\033[1;24r\033[%dH\033[K", 24-line-1);
else printf("\033[H\033M\033[K");
for( ii = 0; ii<extra; ii++) printf("\033M\033[K");
}
}
fwrite(rec+jrec+(pergroep==0?1:0),inrec-(pergroep==0?1:0),1,stdout);
nxt:
line += 1+extra; /* lines printed so far */
inrec = nline = 0;
jrec = MAXREC;
}
}
}