Path: utzoo!mnetor!uunet!husc6!necntc!ncoast!allbery From: nelson@MCNC.ORG (jim nelson) Newsgroups: comp.sources.misc Subject: v02i006: Side-by-side file paginator Message-ID: <7080@ncoast.UUCP> Date: 15 Jan 88 00:42:01 GMT Sender: root@ncoast.UUCP Lines: 285 Approved: allbery@ncoast.UUCP X-Archive: comp.sources.misc/8801/6 Comp.Sources.Misc: Volume 2, Issue 6 Submitted-By: jim nelson Archive-Name: sbs Comp.Sources.Misc: Volume 2, Issue 6 Submitted-By: jim nelson Archive-Name: sbs [Whatever happened to "pr -m -w80 file1 file2 | more"? ++bsa] This is a little thingie I (thought) I had to write myself, because it warnt available. Presumably I re-invented some wheel; but I like it. Pub Dom. Take it. If it belongs in comp.sources.misc, I'll send it over there... it's short. # --- cut here --- #/bin/sh #This is a shar file. To use: # 1. Remove everything before the /bin/sh line # 2. Execute with /bin/sh (not csh) to extract the files: # Makefile # sbs.c file="${0}" echo extracting Makefile 1>&2 sed -e 's/^X//' >Makefile << 'EnD of Makefile' XCFLAGS= XLDFLAGS=-lcurses #-ltermlib Xsbs: sbs.o X cc sbs.o -o sbs $(LDFLAGS) EnD of Makefile echo extracting sbs.c 1>&2 sed -e 's/^X//' >sbs.c << 'EnD of sbs.c' X/*puts two files side-by-side on terminal */ X/*for poor folks who don't have windows and suns and all that Xother stuff*/ X/*no man page: it's not worth it; but i did make a Makefile Xof sorts*/ X/*this compiles and works perfectly with no alterations on both XSysVr2(3b2/300) and BSD4.1-derived-GENIX on a nsc16032(lmc)*/ X/*other systems at own risk ...*/ X/*'taint so hot at 1200 baud, but presumably i'm the only Xperson on earth who still has to put up with measly 1200 baud*/ X/*no copyright, public domain, not worth the effort*/ X/*author: jim nelson, unc-wilmington, wilmington nc 28403; X919-395-3300*/ X#include X#define UNIX X#include X#define MAXLINE 82 X#ifdef UNIX X#include X#endif X/*global variables: */ Xchar left[20][MAXLINE],rite[20][MAXLINE],lft[MAXLINE],rte[MAXLINE]; Xint efl,efr; Xchar leader[MAXLINE]; Xchar *fnl,*fnr; X/*end of global variables */ X Xmain(argc,argv) Xint argc; Xchar *argv[]; X X{ X FILE *fp1,*fp2; X int jhn,prefix,zork,c,i,k,lp,rp; X efl=efr=0; X fnl=argv[1]; X fnr=argv[2]; X X if(argc!=3){ X printf("usage: sbs file1 file2\n"); X exit (1); X } X X X if( (fp2=fopen(argv[2],"r")) == NULL) X { X printf("not found:%s\n",argv[2]); X exit (1); X } X X if( (fp1=fopen(argv[1],"r")) == NULL) X { X printf("not found:%s\n",argv[1]); X exit (1); X } X X initscr(); X clear(); X nocrmode(); X noecho(); X raw(); X lp = rp = (-1); X for (k=0;fnl[k];){ X leader[k]=fnl[k]; X k++; X } X while(k<39)leader[k++]='-'; X leader[k++]=' '; X leader[k++]='|'; X leader[k++]=' '; X for(i=0;fnr[i];)leader[k++]=fnr[i++]; X while(k<75)leader[k++]='-'; X leader[k]='\0'; X for(i=0;i<20;i++){ X X if(!efl){ X lp = (lp+1)%20; X if(!efl)if(fgets(left[lp],MAXLINE,fp1)==NULL)efl=1; X if(efl)strcpy(left[lp],"[EOF]\n"); X } X X if(!efr){ X rp = (rp+1)%20; X if(!efr)if(fgets(rite[rp],MAXLINE,fp2)==NULL)efr=1; X if(efr)strcpy(rite[rp],"[EOF]\n"); X } X } X display(lp,rp,' '); /* display is supposed to be fixed up so that X the lpth line from left and the rpth line from rite X will be the last ones displayed */ X while(1) X { X X prefix=0; X lbl: c=getch()&0177; X if(c>='0' && c<='9'){prefix=prefix*10+c-'0';goto lbl;} X if(prefix==0)prefix=1; X X if(c==('c'&037)||c==('y'&037)){ X endwin(); X exit(); X } X if(isupper(c))c=tolower(c); X if(c=='t')c='y'; X if(c=='j')c='f'; X X if(c==';'||c=='f') X for(jhn=0;jhncnt) X strcpy(lft,&(left[p][cnt]),38); X else X strcpy(lft,"\n",2); X if(strlen(rite[q])>cnt) X strcpy(rte,&(rite[q][cnt]),38); X else X strcpy(rte,"\n",2); X }/*endelse*/ X X fixline(lft); X fixline(rte); X printw("%c %s | %s\n",zork?'+':' ',lft,rte); X X } X X X printw("%s\n",leader); X printw( X "a:upl, ;:upr, q:pgl, p:pgr, t|y:pgboth, f|j:upboth, d:gotodif, -|=:horiz\n"); X printw( X "---------------------------------------------------------------------------\n" X ); X refresh(); X X X} X#define white(c) ((c)==' ' || (c)=='\t') Xjstrcmp(s1,s2) Xchar *s1,*s2; X{ X while(*s1&&*s2) X { X if(white(*s1)&&white(*s2)){ X while(white(*s1))s1++; X while(white(*s2))s2++; X continue; X } X if(*s1==*s2){s1++;s2++;continue;} X return(*s1 - *s2); X } X if(*s1=='\0' && *s2!='\0')return(-1); X if(*s1!='\0' && *s2=='\0')return(1); X if(*s1=='\0' && *s2=='\0')return(0); X exit(1);/*disaster*/ X} EnD of sbs.c