siegel@hc.DSPO.GOV (josh Siegel) (06/01/89)
I am posting this again because there have started to be versions floating around I didn't write. Anyhow, all patches should be sent against this. It still HAS BUGS but it also seems to be safe against code. Also, if it core dumps, pass the code through "fold -1000" first. Lots of mac programs dump out PS files that have 10,000 character long lines and lex doesn't bother to check to see if it is over-running the buffers. --Josh Siegel #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # pspp # This archive created: Tue Feb 14 11:41:08 1989 export PATH; PATH=/bin:$PATH if test ! -d 'pspp' then echo shar: creating directory "'pspp'" mkdir 'pspp' fi echo shar: entering directory "'pspp'" cd 'pspp' echo shar: extracting "'pspp.l'" '(15885 characters)' if test -f 'pspp.l' then echo shar: will not over-write existing file "'pspp.l'" else sed 's/^ X//' << \SHAR_EOF > 'pspp.l' X X%{ X X/* X X Copyright (c) 1989, Josh Siegel X XYou may copy the pspp kit in whole or in part as long as you don't try to Xmake money off it, or pretend that you wrote it. X X Version 0.08 X Fixed another core dump problem with lines that were toooo long. X Fixed another comment problem. X X Version 0.07 X Fixed two more comment bugs. X Fixed a core dump when I get a string over BUFSIZ (stdio.h) long. X X Version 0.06 X Fixed comment lines getting stuck together (bug by Dave Yost). X X Version 0.05 X Removed some code that wasn't needed. X Fixed a "cdef" indentation problem X Added a manual page X Added ptags function X X Version 0.04 X Fixed a fix in 0.03 X Made it callable on files and sets of files. X X Version 0.03 X Fixed run away white space problem... X Fixed (()) matching X Fixed it turning (\(\)) into (\\(\\)) X X Version 0.02 X Added bracstack as well as fixing problems associated with class.ps X X Version 0.01 X initial release X*/ X X#define FLAG_BA 0x1 X#define FLAG_BB 0x2 X#define FLAG_BS 0x4 X#define FLAG_CBA 0x8 X#define FLAG_CBB 0x10 X#define FLAG_CEA 0x20 X#define FLAG_CEB 0x40 X#define FLAG_DA 0x80 X#define FLAG_DB 0x100 X#define FLAG_DBA 0x200 X#define FLAG_DBB 0x400 X#define FLAG_DEA 0x800 X#define FLAG_DEB 0x1000 X#define FLAG_EA 0x2000 X#define FLAG_EB 0x4000 X#define FLAG_LCA 0x8000 X#define FLAG_LCB 0x10000 X#define FLAG_RCA 0x20000 X#define FLAG_RCB 0x40000 X#define FLAG_PN 0x80000 X#define FLAG_IB 0x100000 X#define FLAG_IA 0x200000 X#define FLAG_LBB 0x400000 X#define FLAG_LBA 0x800000 X#define FLAG_RBB 0x1000000 X#define FLAG_RBA 0x2000000 X#define FLAG_GSB 0x4000000 X#define FLAG_GSA 0x8000000 X#define FLAG_GRB 0x10000000 X#define FLAG_GRA 0x20000000 X#define FLAG_GI 0x40000000 X#define FLAG_RA 0x80000000 X X#define DEFAULT_FLAG (FLAG_BA|FLAG_BB|FLAG_BS|FLAG_CBA|FLAG_CBB|\ X FLAG_CEA|FLAG_CEB|FLAG_DA|FLAG_DBA|FLAG_DBB|FLAG_DEA|\ X FLAG_DEB|FLAG_EA|FLAG_EB|FLAG_LCA|FLAG_RCB| \ X FLAG_PN | FLAG_IA | FLAG_GI) X X#define check_flag(x) ((x) & flags) X X#define STACK_LEVELS 32 X Xint neednew,i,level,braclevel,flags,minlevel; Xint bracstack[STACK_LEVELS],bracpnt; Xchar *fname; X%} XW [ \t]+ X%s PTAGS PSPP NEVER X%% X<PSPP>\( { X int pcount; X X pcount=1; X i = 1; X X while(pcount) { X yytext[i]=input(); X switch(yytext[i]) { X case '\\': X i++; X yytext[i]=input(); X break; X case '(': X pcount++; X if(check_flag(FLAG_BS)) { X yytext[i++]='\\'; X yytext[i]='('; X } X break; X case ')': X pcount--; X if(pcount) { X if(check_flag(FLAG_BS)) { X yytext[i++]='\\'; X yytext[i]=')'; X } X } X break; X case '\n': X yytext[i++]='\\'; X yytext[i]='n'; X break; X default: break; X } X i++; X if(i >= BUFSIZ-1) { X yytext[i]= '\0'; X newline(); X fprintf(yyout,"%s",yytext); X i = 0; X } X } X yytext[i]= '\0'; X newline(); X fprintf(yyout,"%s",yytext); X } X X<PSPP>\{[ \t]*\} { /* Yet another special case */ X newline(); X fprintf(yyout,yytext); X } X X<PSPP>"def" { /* Rule 3 */ X if(check_flag(FLAG_DB)) X neednew=1; X newline(); X fprintf(yyout,"%s",yytext); X if(check_flag(FLAG_DA)) X neednew=1; X } X X<PSPP>"{" { /* Rule 4 */ X if(check_flag(FLAG_LCB)) X neednew=1; X newline(); X level++; X pushbraclevel(); X fprintf(yyout,"%s",yytext); X if(check_flag(FLAG_LCA)) X neednew=1; X } X X<PSPP>"}" { /* rule 5 */ X if(check_flag(FLAG_RCB)) X neednew=1; X level--; X popbraclevel(); X newline(); X fprintf(yyout,"%s",yytext); X if(check_flag(FLAG_RCA)) X neednew=1; X } X X<PSPP>"begin"|"dictbegin"|"classbegin"|"["|"gsave" { /* Rule 6 */ X switch(yytext[0]) { X case 'd': X if(check_flag(FLAG_DBB)) X neednew=1; X break; X case 'b': X if(check_flag(FLAG_BB)) X neednew=1; X break; X case 'c': X if(check_flag(FLAG_CBB)) X neednew=1; X break; X case 'g': X if(check_flag(FLAG_GSB)) X neednew=1; X break; X case '[': X if(check_flag(FLAG_LBB)) X neednew=1; X break; X } X newline(); X X fprintf(yyout,"%s",yytext); X braclevel++; X switch(yytext[0]) { X case 'd': X if(check_flag(FLAG_DBA)) X neednew=1; X break; X case 'b': X if(check_flag(FLAG_BA)) X neednew=1; X break; X case 'c': X if(check_flag(FLAG_CBA)) X neednew=1; X break; X case 'g': X if(check_flag(FLAG_GSA)) X neednew=1; X if(!check_flag(FLAG_GI)) X braclevel--; X break; X case '[': X if(check_flag(FLAG_LBA)) X neednew=1; X break; X } X } X X X<PSPP>"end"|"dictend"|"classend"|"]"|"grestore" { /* Rule 7 */ X braclevel--; X switch(yytext[0]) { X case 'd': X if(check_flag(FLAG_DEB)) X neednew=1; X break; X case 'e': X if(check_flag(FLAG_EB)) X neednew=1; X break; X case 'c': X if(check_flag(FLAG_CEB)) X neednew=1; X break; X case 'g': X if(check_flag(FLAG_GRB)) X neednew=1; X if(!check_flag(FLAG_GI)) X braclevel++; X break; X case ']': X if(check_flag(FLAG_RBB)) X neednew=1; X break; X } X X newline(); X fprintf(yyout,"%s",yytext); X switch(yytext[0]) { X case 'd': X if(check_flag(FLAG_DEA)) X neednew=1; X break; X case 'e': X if(check_flag(FLAG_EA)) X neednew=1; X break; X case 'c': X if(check_flag(FLAG_CEA)) X neednew=1; X break; X case 'g': X if(check_flag(FLAG_GRA)) X neednew=1; X break; X case ']': X if(check_flag(FLAG_RBA)) X neednew=1; X break; X } X } X X<PSPP>(if|ifelse) { /* Rule 8 */ X X if(check_flag(FLAG_IB)) X neednew=1; X newline(); X fprintf(yyout,"%s",yytext); X if(check_flag(FLAG_IA)) X neednew=1; X } X<PSPP>^cdef { X level=0; X minlevel=0; X braclevel=0; /* Reset the bracket level */ X bracpnt=0; /* Reset the stack */ X newline(); X fprintf(yyout,"%s",yytext); X level=1; /* Indent one so it looks ncie */ X minlevel=1; X } X<PSPP>^\%\%=.*\n { /* rule 10 */ X if(neednew) X fprintf(yyout,"\n"); X yytext[yyleng-1]='\0'; X fprintf(yyout,"%s",yytext); X parseflag(&yytext[3]); X neednew=1; X } X<PSPP>[ \t]*\%.* { /* 11 */ X /* yytext[yyleng-1]='\0'; */ X fprintf(yyout,"%s",yytext); X neednew=1; X } X<PSPP>^#.*\n | /* 12 */ X<PSPP>^\%.*\n { /* 13 */ X if(neednew) X fprintf(yyout,"\n"); X yytext[yyleng-1]='\0'; X fprintf(yyout,"%s",yytext); X neednew=1; X } X<PSPP>^[ \t]+\%.*\n { X char *p; X X newline(); X yytext[yyleng-1]='\0'; X p = yytext; X while(*p!='%') p++; X fprintf(yyout,"%s",p); X neednew=1; X } X<PSPP>^{W} neednew=1; X<PSPP>{W} fprintf(yyout," "); X<PSPP>^[ \t]*\n { if(check_flag(FLAG_PN)) fprintf(yyout,"\n");} X<PSPP>\n neednew=1; X X<PSPP>[^ \t\n\[\]\{\}\(] {newline(); X fprintf(yyout,"%s",yytext); X ; /* Almost everything falls to this */ } X<PTAGS>^cdef.*$ { X char buff[255],*p; X X sscanf(yytext,"cdef %s(",buff); X p = (char *) index(buff,'('); X if(p) *p = '\0'; X X conv(yytext); X fprintf(yyout,"%s %s /^%s$/\n",buff,fname,yytext); X } X<PTAGS>^.*\%.*\ptag=<.*\>.*$ { X char *p, buff[255]; X X p = (char *) index(yytext,'%'); X p = (char *) index(p,'<'); X strcpy(buff,p+1); X p = (char *) index(buff,'>'); X *p = '\0'; X conv(yytext); X fprintf(yyout,"%s %s /^%s$/\n",buff,fname,yytext); X } X<PTAGS>\n ; X<PTAGS>. ; X%% X Xchar *ptag_file; Xchar *progname; X Xmain(argc, argv) X int argc; X char *argv[]; X{ X FILE *fp, *fopen(), *fpo; X char buff[255], *p, *p2; X int do_stdin; X X extern int opterr; X extern char *optarg; X extern int optind; X int c,i; X X X do_stdin = 1; X bracpnt = 0; X neednew = 0; X level = 0; X braclevel = 0; X minlevel = 0; X flags = DEFAULT_FLAG; X X p = argv[0]; X p2 = p; X X while (*p2) { X if (*p2 == '/') X p = p2 + 1; X p2++; X } X X if (!strcmp(p, "ptags")) { X BEGIN PTAGS; X X ptag_file = "tags.ps"; X X while ((c = getopt(argc, argv, "f:")) != EOF) X switch (c) { X case 'f': X ptag_file = optarg; X break; X case '?': X usage(); X break; X } X X X argc -= optind; X argv += optind; X X i = 0; X X sprintf(buff,"%s.tmp",ptag_file); X X fpo = fopen(buff, "w"); X X yyout = fpo; X X while (i!=argc) { X if(argv[i][0] !='-') { X do_stdin = 0; X fp = fopen(argv[i], "r"); X fname = argv[i]; X yyin = fp; X yylex(); X fclose(fp); X } X i++; X } X X if (do_stdin) { X yylex(); X fprintf(yyout, "\n"); X } X X fclose(fpo); X sprintf(buff,"sort < %s.tmp > %s",ptag_file,ptag_file); X system(buff); X sprintf(buff,"%s.tmp",ptag_file); X unlink(buff); X } else { X BEGIN PSPP; X X sprintf(buff, "%s/.pspp", getenv("HOME")); X X fp = fopen(buff, "r"); X X if (fp != NULL) { X while (fgets(buff, 255, fp) != NULL) X parseflag(buff); X fclose(fp); X } X while (--argc) { X if (argv[argc][0] == '-' || argv[argc][0] == '+') X parseflag(argv[argc]); X else { X do_stdin = 0; X X sprintf(buff, "%s.BAK", argv[argc]); X unlink(buff); X if (rename(argv[argc], buff) != 0) { X perror("rename"); X exit(0); X } X fpo = fopen(argv[argc], "w"); X fp = fopen(buff, "r"); X yyin = fp; X yyout = fpo; X yylex(); X fprintf(fpo, "\n"); X fclose(fp); X fclose(fpo); X } X } X if (do_stdin) { X yylex(); X fprintf(yyout, "\n"); X } X } X X exit(0); X} Xconv(str) Xchar *str; X{ X char buff[255],*p,*p2; X X p = str; X p2 = buff; X while(*p) { X if(*p=='/') X *p2++ = '\\'; X *p2++ = *p++; X } X *p2='\0'; X strcpy(str,buff); X} Xusage() X{ X fprintf(stderr, "Usage: ptags [ -f tagfile ]\n"); X exit(1); X} Xnewline() X{ X int cnt; X X if (!neednew) X return; X X fprintf(yyout, "\n"); X X if (level < minlevel) /* Save ourselves from errors in the X * postscript */ X level = minlevel; X X if (bracpnt > 0) { X if (braclevel < bracstack[bracpnt - 1]) X braclevel = bracstack[bracpnt - 1]; X } else { X if (braclevel < 0) X braclevel = 0; X } X X cnt = level + braclevel; X X while (cnt--) X fprintf(yyout, " "); X X neednew = 0; X} Xparseflag(str) X char *str; X{ X char *p; X int effect, the_flag; X X X p = str; X X X while (*p) { X while (*p == ' ' || *p == '\t') X p++; X X effect = 1; /* Set flag (default) */ X the_flag = 0; X X switch (*p) { X case '+': X p++; X break; X case '-': X effect = 0; X p++; X break; X default: X return; X break; X } X X /* X * I make no defense of the code below... later I will make a X * proper hash table (yes.. yes.. I know there are lots of X * incorrect sets ) X */ X X if (effect < 2) X switch (p[0]) { X case 'b': X switch (p[1]) { X case 'a': X the_flag = FLAG_BA; X break; X case 'b': X the_flag = FLAG_BB; X break; X case 's': X the_flag = FLAG_BS; X break; X default: X break; X } X break; X case 'c': X if (p[1] == 'b') X if (p[2] == 'a') X the_flag = FLAG_CBA; X else X the_flag = FLAG_CBB; X else if (p[2] == 'a') X the_flag = FLAG_CEA; X else X the_flag = FLAG_CEB; X break; X case 'd': X switch (p[1]) { X case 'a': X the_flag = FLAG_DA; X break; X case 'b': X switch (p[2]) { X case 'a': X the_flag = FLAG_DBA; X break; X case 'b': X the_flag = FLAG_DBB; X break; X default: X the_flag = FLAG_DB; X break; X } X break; X case 'e': X if (p[2] == 'a') X the_flag = FLAG_DEA; X else X the_flag = FLAG_DEB; X break; X default: X break; X } X break; X case 'i': X if (p[1] == 'a') X the_flag = FLAG_IA; X else X the_flag = FLAG_IB; X break; X case 'e': X if (p[1] == 'a') X the_flag = FLAG_EA; X else X the_flag = FLAG_EB; X break; X case 'l': X if (p[1] == 'c') X if (p[2] == 'a') X the_flag = FLAG_LCA; X else X the_flag = FLAG_LCB; X else if (p[2] == 'a') X the_flag = FLAG_LBA; X else X the_flag = FLAG_LBB; X break; X case 'g': X switch (p[1]) { X case 'i': X the_flag = FLAG_GI; X break; X case 's': X if (p[2] == 'b') X the_flag = FLAG_GSB; X else X the_flag = FLAG_GSA; X break; X case 'r': X if (p[2] == 'b') X the_flag = FLAG_GRB; X else X the_flag = FLAG_GRA; X break; X } X break; X case 'r': X switch (p[1]) { X case 'c': X if (p[2] == 'a') X the_flag = FLAG_RCA; X else X the_flag = FLAG_RCB; X break; X case 'b': X if (p[2] == 'a') X the_flag = FLAG_RBA; X else X the_flag = FLAG_RBB; X break; X case 'a': X the_flag = FLAG_RA; X break; X default: X break; X } X break; X case 'p': X the_flag = FLAG_PN; X break; X default: X break; X } X X if (the_flag) { X if (effect) X flags |= the_flag; X else X flags &= ~the_flag; X } X p++; X X while (*p >= 'a' && *p <= 'z') X p++; X } X} Xpushbraclevel() X{ X bracstack[bracpnt] = braclevel; X X if (bracpnt < STACK_LEVELS) X bracpnt++; X} Xpopbraclevel() X{ X if (bracpnt > 0) X bracpnt--; X else X return; X X braclevel = bracstack[bracpnt]; X} SHAR_EOF if test 15885 -ne "`wc -c < 'pspp.l'`" then echo shar: error transmitting "'pspp.l'" '(should have been 15885 characters)' fi fi # end of overwriting check echo shar: extracting "'Makefile'" '(1117 characters)' if test -f 'Makefile' then echo shar: will not over-write existing file "'Makefile'" else sed 's/^ X//' << \SHAR_EOF > 'Makefile' XCFLAGS = -g X XLEX = lex -v X XDEST = /usr/local/bin X XEXTHDRS = X XHDRS = X XLDFLAGS = X XLIBS = -ll X XLINKER = cc X XMAKEFILE = Makefile X XOBJS = pspp.o X XPRINT = pr X XPROGRAM = pspp X XSRCS = pspp.l X XDOCS = pspp.1 ptags.1 X Xall: $(PROGRAM) X @/bin/rm -f ptags X @echo linking ptags to pspp X @ln pspp ptags X X${PROGRAM}.shar: $(SRCS) ${MAKEFILE} ${DOCS} README patchlevel.h X shar -a README $(SRCS) ${MAKEFILE} ${DOCS} patchlevel.h> ${PROGRAM}.shar X X$(PROGRAM): $(OBJS) X @echo -n "Loading $(PROGRAM) ... " X @$(LINKER) $(LDFLAGS) $(OBJS) $(LIBS) -o $(PROGRAM) X @echo "done" X Xclean:; @rm -f $(OBJS) X Xdepend:; @mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST) X Xindex:; @ctags -wx $(HDRS) $(SRCS) X Xinstall: $(PROGRAM) X @echo Installing $(PROGRAM) in $(DEST) X @install -s $(PROGRAM) $(DEST) X @echo Installing ptags in $(DEST) X @/bin/rm -f $(DEST)/ptags X @ln -s $(DEST)/$(PROGRAM) $(DEST)/ptags X Xprint:; @$(PRINT) $(HDRS) $(SRCS) X Xprogram: $(PROGRAM) X Xtags: $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS) X Xupdate: $(DEST)/$(PROGRAM) X X### SHAR_EOF if test 1117 -ne "`wc -c < 'Makefile'`" then echo shar: error transmitting "'Makefile'" '(should have been 1117 characters)' fi fi # end of overwriting check echo shar: extracting "'README'" '(1556 characters)' if test -f 'README' then echo shar: will not over-write existing file "'README'" else sed 's/^ X//' << \SHAR_EOF > 'README' X X Copyright (c) 1989, Josh Siegel X XYou may copy the pspp kit in whole or in part as long as you don't try to Xmake money off it, or pretend that you wrote it. X X X----------- X XThis is still a kludge... There is lots of code that can and should Xbe rewritten for speed. Using sort(1) to sort the tags file is Xinexcusable. Using scanf where I could have coded it by hand Xis beyond redemption. The way I parse the arguments for Xpspp is criminal. In general, I need to rewrite large parts Xof this code. X XSend me bugs! I want to have the functionality settle down before XI rewrite it. X XAlso, I am not going to release the pure postscript version (runs inside Xof NeWS) of pspp till after I rewrite the C version. Also a Xemacs lisp version needs to be written of both as well as a Xemacs ptags. X XOnward.... X X --Josh Siegel X siegel@hc.dspo.gov X XTo run: X X% pspp [options files] < file.in > file.out X XOr, run it from vi... X X:%!pspp X XOr, X X% pspp -lba foo.cps +lba foobar.ps X XNote: X pspp is the same program as ptags. Use "make install" to install X them. X XSpecial NeWS related features... X X lines beginning with cdef are assumed to be cdef calls under NeWS. X This causes the rest of the file (till the next cdef) to be indented one. X X Lines beginning with "#" or "%" are passed through unmodified. X XNote to hackers: X You may notice how I stuck lots of the keywords together into X a single lex rule. I am not going to explain this since the reason X doesn't show up in this version (shows up in the postscript version). SHAR_EOF if test 1556 -ne "`wc -c < 'README'`" then echo shar: error transmitting "'README'" '(should have been 1556 characters)' fi fi # end of overwriting check echo shar: extracting "'pspp.1'" '(4963 characters)' if test -f 'pspp.1' then echo shar: will not over-write existing file "'pspp.1'" else sed 's/^ X//' << \SHAR_EOF > 'pspp.1' X.TH PSPP 1 "5 Feb 1989" X.SH NAME Xpspp \- Postscript Pritty Printer X.SH SYNOPSIS X.B pspp X[ X[\ \fB\-ba\fR\ |\ \fB\+ba\fR\ ] X[\ \fB\-bb\fR\ |\ \fB\+bb\fR\ ] X[\ \fB\-bs\fR\ |\ \fB\+bs\fR\ ] X[\ \fB\-cba\fR\ |\ \fB\+cba\fR\ ] X[\ \fB\-cbb\fR\ |\ \fB\+cbb\fR\ ] X[\ \fB\-cea\fR\ |\ \fB\+cea\fR\ ] X[\ \fB\-ceb\fR\ |\ \fB\+ceb\fR\ ] X[\ \fB\-da\fR\ |\ \fB\+da\fR\ ] X[\ \fB\-db\fR\ |\ \fB\+db\fR\ ] X[\ \fB\-dba\fR\ |\ \fB\+dba\fR\ ] X[\ \fB\-dbb\fR\ |\ \fB\+dbb\fR\ ] X[\ \fB\-dea\fR\ |\ \fB\+dea\fR\ ] X[\ \fB\-deb\fR\ |\ \fB\+deb\fR\ ] X[\ \fB\-ea\fR\ |\ \fB\+ea\fR\ ] X[\ \fB\-eb\fR\ |\ \fB\+eb\fR\ ] X[\ \fB\-lca\fR\ |\ \fB\+lca\fR\ ] X[\ \fB\-lcb\fR\ |\ \fB\+lcb\fR\ ] X[\ \fB\-rca\fR\ |\ \fB\+rca\fR\ ] X[\ \fB\-rcb\fR\ |\ \fB\+rcb\fR\ ] X[\ \fB\-pn\fR\ |\ \fB\+pn\fR\ ] X[\ \fB\-ib\fR\ |\ \fB\+ib\fR\ ] X[\ \fB\-ia\fR\ |\ \fB\+ia\fR\ ] X[\ \fB\-lbb\fR\ |\ \fB\+lbb\fR\ ] X[\ \fB\-lba\fR\ |\ \fB\+lba\fR\ ] X[\ \fB\-rbb\fR\ |\ \fB\+rbb\fR\ ] X[\ \fB\-rba\fR\ |\ \fB\+rba\fR\ ] X[\ \fB\-gsb\fR\ |\ \fB\+gsb\fR\ ] X[\ \fB\-gsa\fR\ |\ \fB\+gsa\fR\ ] X[\ \fB\-grb\fR\ |\ \fB\+grb\fR\ ] X[\ \fB\-gra\fR\ |\ \fB\+gra\fR\ ] X[\ \fB\-gi\fR\ |\ \fB\+gi\fR\ ] X[\ \fB\-ra\fR\ |\ \fB\+ra\fR\ ] X] X[ X.I input-files X] X.SH DESCRIPTION X.LP X.B pspp Xis a Postscript formatter that also understands NeWS elements. XIt reformats the Postscript program in the X.I input-files Xor X.I stdin Xaccording the switches. X.SH EXAMPLES XThe X.I pspp Xoptions can be set in several ways. X.LP XOne way is to put options into a file called X.I .pspp Xin your home directory. X.TP XExample: X.ne X.RS X.nf X.ft B X-bs +cea -dba X.ft R X.fi X.RE X.LP X.TP XAnother way is to put comments in your code: X.TP XExample: X.ne X.RS X.nf X.ft B X<beginning of line>%%= -bs +cea -dba X.ft R X.fi X.RE X.LP XA third way is when you call the program: X.TP XExample: X.ne X.RS X.nf X.ft B Xpspp -bs +cea -dba X.ft R X.fi X.RE X.LP X.SH OPTIONS X.LP XThe options listed below control the style produced by X.I pspp. X.TP 15 X.BR \-bs, \+bs XBackslash inner strings X.TP X.BR \-db, \+db XIf X.B db Xis specified, a blank line is forced before every "def". Default: -db X.TP X.BR \-bb, \+bb XIf X.B bb Xis specified, a blank line is forced before every "begin". Default: +bb X X.TP X.BR \-cbb, \+cbb XIf X.B cbb Xis specified, a blank line is forced before every "classbegin". Default: +cbb X X.TP X.BR \-dbb, \+dbb XIf X.B dbb Xis specified, a blank line is forced before every "dictbegin". Default: +dbb X X.TP X.BR \-eb, \+eb XIf X.B eb Xis specified, a blank line is forced before every "end". Default: +eb X X.TP X.BR \-ceb, \+ceb XIf X.B ceb Xis specified, a blank line is forced before every "classend". Default: +ceb X X.TP X.BR \-deb, \+deb XIf X.B deb Xis specified, a blank line is forced before every "dictend". Default: +deb X X.TP X.BR \-grb, \+grb XIf X.B grb Xis specified, a blank line is forced before every "grestore". Default: -grb X X.TP X.BR \-gsb, \+gsb XIf X.B gsb Xis specified, a blank line is forced before every "gsave". Default: -gsb X X.TP X.BR \-ib, \+ib XIf X.B ib Xis specified, a blank line is forced before every "if". Default: -ib X X.TP X.BR \-lcb, \+lcb XIf X.B lcb Xis specified, a blank line is forced before every "{". Default: -lcb X X.TP X.BR \-rcb, \+rcb XIf X.B rcb Xis specified, a blank line is forced before every "}". Default: +rcb X X.TP X.BR \-lbb, \+lbb XIf X.B lbb Xis specified, a blank line is forced before every "[". Default: -lbb X X.TP X.BR \-rbb, \+rbb XIf X.B rbb Xis specified, a blank line is forced before every "]". Default: -rbb X X.TP X.BR \-da, \+da XIf X.B da Xis specified, a blank line is forced after every "def". Default: +da X X.TP X.BR \-ba, \+ba XIf X.B ba Xis specified, a blank line is forced after every "begin". Default: +ba X X.TP X.BR \-cba, \+cba XIf X.B cba Xis specified, a blank line is forced after every "classbegin". Default: +cba X X.TP X.BR \-dba, \+dba XIf X.B dba Xis specified, a blank line is forced after every "dictbegin". Default: +dba X X.TP X.BR \-ea, \+ea XIf X.B ea Xis specified, a blank line is forced after every "end". Default: +ea X X.TP X.BR \-cea, \+cea XIf X.B cea Xis specified, a blank line is forced after every "classend". Default: +cea X X.TP X.BR \-dea, \+dea XIf X.B dea Xis specified, a blank line is forced after every "dictend". Default: +dea X X.TP X.BR \-gra, \+gra XIf X.B gra Xis specified, a blank line is forced after every "grestore". Default: -gra X X.TP X.BR \-gsa, \+gsa XIf X.B gsa Xis specified, a blank line is forced after every "gsave". Default: -gsa X X.TP X.BR \-ia, \+ia XIf X.B ia Xis specified, a blank line is forced after every "if". Default: +ia X X.TP X.BR \-lba, \+lba XIf X.B lba Xis specified, a blank line is forced after every "[". Default: -lba X X.TP X.BR \-rba, \+rba XIf X.B rba Xis specified, a blank line is forced after every "]". Default: -rba X X.TP X.BR \-lca, \+lca XIf X.B lca Xis specified, a blank line is forced after every "{". Default: +lca X X.TP X.BR \-rca, \+rca XIf X.B rca Xis specified, a blank line is forced after every "}". Default: -rca X.SH SEE ALSO Xptags (1) X.SH BUGS XYou can only put pspp related comments at the beginning of the line. X.SH AUTHOR XJosh Siegel (siegel@hc.dspo.gov) SHAR_EOF if test 4963 -ne "`wc -c < 'pspp.1'`" then echo shar: error transmitting "'pspp.1'" '(should have been 4963 characters)' fi fi # end of overwriting check echo shar: extracting "'patchlevel.h'" '(21 characters)' if test -f 'patchlevel.h' then echo shar: will not over-write existing file "'patchlevel.h'" else sed 's/^ X//' << \SHAR_EOF > 'patchlevel.h' X#define PATCHLEVEL 5 SHAR_EOF if test 21 -ne "`wc -c < 'patchlevel.h'`" then echo shar: error transmitting "'patchlevel.h'" '(should have been 21 characters)' fi fi # end of overwriting check echo shar: extracting "'ptags.1'" '(1250 characters)' if test -f 'ptags.1' then echo shar: will not over-write existing file "'ptags.1'" else sed 's/^ X//' << \SHAR_EOF > 'ptags.1' X.TH PTAGS 1 "5 Feb 1989" X.SH NAME Xptags \- create a tags file for use with vi X.SH SYNOPSIS X.B ptags X[ X.B \-f X.I tagsfile X] X[ X.I files X] X.SH DESCRIPTION X.B ptags Xmakes a tags file for X.BR ex (1) Xfrom a postscript or NeWS source. See X.BR ctags (1) Xfor more information. X.LP XThere are two ways that a tag can be generated. The first Xway is by looking for a cdef. X.TP XExample: X.ne X.RS X.nf X.ft B Xcdef foobar(int bat) X.ft R X.fi X.RE X.TP XGenerates a tag foobar. X.TP XAnother way is by putting comments into your Postscript code. X.TP XExample: X.ne X.RS X.nf X.ft B X/golly { % wolly => - ptag=<golly> X.ft R X.fi X.RE X.LP XProduces a tag "golly" for that line. The ptag=<tag> Xcan be anywhere in the comment. Please note that the string Xbetween the <...> is the string that is used as the tag. X.LP XThe default tagfile is X.B tags.ps. XBecause this is not normally in the tag search path, it helps if you Xput: X.TP X.ne X.RS X.nf X.ft B Xset tags=tags tags.ps X.ft R X.fi X.RE X.LP Xin your .exrc file so that X.I vi (1) Xknows what to look for. Depending on the system, you might have Xto backslash the space between X.I tags Xand X.I tags.ps. X.SH SEE ALSO Xpspp (1) X.SH BUGS XWould like it to be able to figure out more tags on its own. X.SH AUTHOR XJosh Siegel (siegel@hc.dspo.gov) SHAR_EOF if test 1250 -ne "`wc -c < 'ptags.1'`" then echo shar: error transmitting "'ptags.1'" '(should have been 1250 characters)' fi fi # end of overwriting check echo shar: done with directory "'pspp'" cd .. # End of shell archive exit 0 -- Josh Siegel (siegel@hc.dspo.gov) "Oh well.. I guess I will just bury my guns... sigh.. " - Standard Gun Owner