doc@pucc-j.UUCP (09/11/86)
# This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # ReadMe # dateStamp.c # pp.c # pp.h # This archive created: Mon Sep 8 14:19:16 1986 # By: Craig Norborg (Purdue University Computing Center) cat << \SHAR_EOF > ReadMe /**** **** pp Amiga PagePrint Program **** Version 1.0 ****/ /*** *** (C) Copyright 1986 Phil Mercurio (Quicksilver Software) *** All Rights Reserved *** *** This software is released as a shareware product. It may *** be copied providing that no charge is made to the recipient *** and that this copyright notice remains intact. *** *** If you use and find value in this software, please send $10 *** to the author at this address: *** *** Phil Mercurio *** Quicksilver Software *** 2515 #9 Camino Del Mar *** Del Mar, CA 92014 *** *** PeopleLink: MERCURIO *** *** Be sure to include your name and address, as this will place *** you on the Quicksilver Software mailing list. Your support *** of shareware products will encourage the further production *** of low-cost software. ***/ /** ** pp.c ** ** PagePrint program. Prints text files with a date/time header, ** page breaks, and line numbers. Options include turning off or ** varying the line numbers & adding a copyright notice as a footer. ** This program is intended to be run from the CLI. ** ** Basic usage: ** ** pp {flags} files ** ** ** Flags: ** ** -c Insert copyright notice ** -d Debugging turned on (not useful for the end-user) ** -n Set increment for numbered lines; if followed by 0, ** a non-numeric argument, or no argument at all, causes ** line numbers to be inhibited. ** -q Suppress messages of current file being printed ** ** Flags may appear anywhere on the command line. ** ** ** Examples: ** ** pp pp.c || prints this source code file with line numbers ** || every 5th line ** pp -qc pp.c pp.h || prints two source code files, with line ** || numbers & copyright footer, with no status ** || messages to screen ** pp -n 1 pp.c || prints pp.c with every line numbered ** pp -n pp.c || prints pp.c with no line numbers ** ** Configuring This Program For Your Needs ** ** PP gets most of the information it needs from your printer preferences, ** specifically the left and right margin and number of lines. However, ** there are several constants and strings which you may change to ** configure the output to your taste. All of these constants are grouped ** together at the beginning of the header file "pp.h". By modifying ** these constants and recompiling, you can adjust the spacing around ** the header and footer, the highlighting used to accentuate the line ** numbers, and several other features. One constant you'll definitely ** want to change is "OwnerName", which contains the name to be inserted ** in the copyright notice. The comments in "pp.h" should help. ** **/ SHAR_EOF cat << \SHAR_EOF > dateStamp.c /**** **** pp Amiga PagePrint Program **** Version 1.0 ****/ /*** *** (C) Copyright 1986 Phil Mercurio (Quicksilver Software) *** All Rights Reserved *** *** This software is released as a shareware product. It may *** be copied providing that no charge is made to the recipient *** and that this copyright notice remains intact. *** *** If you use and find value in this software, please send $10 *** to the author at this address: *** *** Phil Mercurio *** Quicksilver Software *** 2515 #9 Camino Del Mar *** Del Mar, CA 92014 *** *** *** Be sure to include your name and address, as this will place *** you on the Quicksilver Software mailing list. Your support *** of shareware products will encourage the further production *** of low-cost software. ***/ /** ** Routines to parse a DateStamp structure into useful bits. ** ** Quicksilver Software **/ #include <exec/types.h> #include <libraries/dos.h> #define DayOffset (0) #define Leap(yr) ((yr-1976) % 4 == 0) char *Weekday[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; char *Month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; int DaysPerMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int LeapDaysPerMonth[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* * Parse the date from the DateStamp *ds into the current year, * month, day, and weekday. The ranges will be as follows: * * Year: [1978..?] * Month: [1..12] == [Jan..Dec] * Day: [1..31] * Weekday: [0..6] == [Sun..Sat] * */ parseDate(ds,pY,pM,pD,pWD) struct DateStamp *ds; int *pY, *pM, *pD, *pWD; { register int year, month, day, weekday; #ifdef Trace printf("parseDate(%lx,%lx,%lx,%lx,%lx)\n",ds, pY, pM, pD, pWD); #endif Trace day = ds->ds_Days; weekday = day % 7 + DayOffset; for(year=1978; ; year++) { if(Leap(year)) { if(day < 366) break; else day -= 366; } else { if(day < 365) break; else day -= 365; } } if(Leap(year)) { for(month=0; day > LeapDaysPerMonth[month]; month++) day -= LeapDaysPerMonth[month]; } else { for(month=0; day > DaysPerMonth[month]; month++) day -= DaysPerMonth[month]; } month++; day++; *pY = year; *pM = month; *pD = day; *pWD = weekday; } /* * Form a string containing the date from the DateStamp *ds. */ dateStr(s,ds) char *s; struct DateStamp *ds; { int year, month, day, weekday; #ifdef Trace printf("dateStr(%s,%lx)\n",s,ds); #endif Trace parseDate(ds,&year,&month,&day,&weekday); sprintf(s,"%s %s %d, %d",Weekday[weekday],Month[month-1],day,year); } /* * Parse the DateStamp *ds into hours, minutes and seconds */ parseTime(ds,pH,pM,pS) struct DateStamp *ds; int *pH, *pM, *pS; { register int hours, minutes, seconds; #ifdef Trace printf("parseTime(%lx,%lx,%lx,%lx)\n",ds,pH,pM,pS); #endif Trace seconds = ds->ds_Tick / 50; seconds %= 60; minutes = ds->ds_Minute; hours = minutes / 60; minutes %= 60; *pH = hours; *pM = minutes; *pS = seconds; } /* * Get the time from the DateStamp *ds and write it into * the string s. */ timeStr(s,ds) char *s; struct DateStamp *ds; { int hours, minutes, seconds; #ifdef Trace printf("timeStr(%s,%lx)\n",s,ds); #endif Trace parseTime(ds,&hours,&minutes,&seconds); sprintf(s,"%02d:%02d:%02d",hours,minutes,seconds); } /* * Get the FileInfoBlock *fib of the file *fileName. */ getFIB(fileName,fib) char *fileName; struct FileInfoBlock *fib; { BPTR fileLock; #ifdef Trace printf("getFIB(%s,%lx)\n",fileName,fib); #endif Trace fileLock = Lock(fileName,ACCESS_READ); if(fileLock == NULL || !Examine(fileLock,fib)) return(0); UnLock(fileLock); return(1); } SHAR_EOF cat << \SHAR_EOF > pp.c /**** **** pp Amiga PagePrint Program **** Version 1.0 ****/ /*** *** (C) Copyright 1986 Phil Mercurio (Quicksilver Software) *** All Rights Reserved *** *** This software is released as a shareware product. It may *** be copied providing that no charge is made to the recipient *** and that this copyright notice remains intact. *** *** If you use and find value in this software, please send $10 *** to the author at this address: *** *** Phil Mercurio *** Quicksilver Software *** 2515 #9 Camino Del Mar *** Del Mar, CA 92014 *** *** Be sure to include your name and address, as this will place *** you on the Quicksilver Software mailing list. Your support *** of shareware products will encourage the further production *** of low-cost software. ***/ /** ** pp.c ** ** PagePrint program. Prints text files with a date/time header, ** page breaks, and line numbers. Options include turning off or ** varying the line numbers & adding a copyright notice as a footer. ** This program is intended to be run from the CLI. ** ** Basic usage: ** ** pp {flags} files ** ** ** Flags: ** ** -c Insert copyright notice ** -d Debugging turned on (not useful for the end-user) ** -n Set increment for numbered lines; if followed by 0, ** a non-numeric argument, or no argument at all, causes ** line numbers to be inhibited. ** -q Suppress messages of current file being printed ** -? Prints Help Message ** ** Flags may appear anywhere on the command line. ** ** ** Examples: ** ** pp pp.c || prints this source code file with line numbers ** || every 5th line ** pp -qc pp.c pp.h || prints two source code files, with line ** || numbers & copyright footer, with no status ** || messages to screen ** pp -n 1 pp.c || prints pp.c with every line numbered ** pp -n pp.c || prints pp.c with no line numbers ** ** Configuring This Program For Your Needs ** ** PP gets most of the information it needs from your printer preferences, ** specifically the left and right margin and number of lines. However, ** there are several constants and strings which you may change to ** configure the output to your taste. All of these constants are grouped ** together at the beginning of the header file "pp.h". By modifying ** these constants and recompiling, you can adjust the spacing around ** the header and footer, the highlighting used to accentuate the line ** numbers, and several other features. One constant you'll definitely ** want to change is "OwnerName", which contains the name to be inserted ** in the copyright notice. The comments in "pp.h" should help. ** ** ** Quicksilver Software ** PJM 860212 Created ** PJM 860213 -n & -c working ** PJM 860216 -l working ** PJM 860307 Removed wildcard expansion (installed "shell" instead) ** PJM 860504 Made copyright notice legal ** PJM 860808 Removed dependency on "arrange" text formatter; ** renamed "-l" as "-n" and added "-d" and "-q". ** PJM 860811 Version 1.0 released as a shareware product. **/ #include "pp.h" main(ac,av) int ac; char **av; { register int i; #ifdef Trace printf("main(%d,%lx)\n",ac,av); #endif Trace initialize(); parseArgs(ac,av); configure(); for(i=0; i < NFiles; i++) { if(!Quiet) fprintf(stderr,"Printing file \"%s\" ... ",FileName[i]); pp(FileName[i]); if(!Quiet) fprintf(stderr,"done.\n"); } finalize(); } /* * Initialize the internal state variables */ initialize() { #ifdef Trace printf("initialize()\n"); #endif Trace Enable_Abort = 1; IntuitionBase = xOpenLibrary("intuition.library",0); CopyRight = No; Debug = No; Quiet = No; NFiles = 0; LineCount = 5; GetPrefs(&Prefs,sizeof(Prefs)); LeftMargin = Prefs.PrintLeftMargin; LineWidth = Prefs.PrintRightMargin - Prefs.PrintLeftMargin - Indent; LinesPerPage = Prefs.PaperLength - NonBody; } /* * Parse the argument list. File names are added to the * FileName array and NFiles is incremented. */ parseArgs(ac,av) int ac; char **av; { register char *p; #ifdef Trace printf("parseArgs(%d,%lx)\n",ac,av); #endif Trace strcpy(MyName,av[0]); for(ac--, av++; ac > 0; ac--, av++) { if(av[0][0] == '?' && av[0][1] == 0) helpArgs(); if(av[0][0] == '-') { for(p=&av[0][1]; *p; p++) switch(*p) { case '?': helpArgs(); break; case 'c': case 'C': CopyRight = Yes; break; case 'd': case 'D': Debug = Yes; break; case 'n': case 'N': if(ac > 1 && IsDigit(av[1][0])) { ac--; av++; LineCount = atoi(av[0]); } else LineCount = 0; break; case 'q': case 'Q': Quiet = Yes; break; default: fprintf(stderr,"%s: unknown flag '%c'\n",MyName,*p); exit(0); } } else { strcpy(FileName[NFiles],av[0]); NFiles++; } } } /* * Print out a help message and exit. */ helpArgs() { int c; #ifdef Trace printf("helpArgs()\n"); #endif Trace puts(" PagePrint program. Prints text files with a date/time header,"); puts(" page breaks, and line numbers. Options include turning off or"); puts(" varying the line numbers & adding a copyright notice as a footer."); puts(" This program is intended to be run from the CLI."); puts(""); puts(" Basic usage:"); puts(""); puts(" pp {flags} files"); puts(""); puts(" Flags:"); puts(""); puts(" -c Insert copyright notice (Note: Change owner name in pp.h)"); puts(" -n Set increment for numbered lines; if followed by 0,"); puts(" a non-numeric argument, or no argument at all, causes"); puts(" line numbers to be inhibited."); puts(" -q Suppress messages of current file being printed"); puts(" -? This Help Message"); puts(""); puts(" Flags may appear anywhere on the command line."); pauseHelp(); puts(""); puts(" Examples:"); puts(""); puts(" pp pp.c || prints this source code file with line numbers"); puts(" || every 5th line"); puts(" pp -qc pp.c pp.h || prints two source code files, with line "); puts(" || numbers & copyright footer, with no status"); puts(" || messages to screen"); puts(" pp -n 1 pp.c || prints pp.c with every line numbered"); puts(" pp -n pp.c || prints pp.c with no line numbers"); pauseHelp(); printf("%c0;32;40m",CSI); /* Fore: 2 Back: 0 */ puts(" PP (PagePrint)"); puts(" ) Copyright 1986 Phil Mercurio (Quicksilver Software)"); puts(" All Rights Reserved"); printf("%c0;31;40m",CSI); /* Fore: 1 Back:0 (Normal) */ pauseHelp(); puts(" This software is released as a shareware product. It may"); puts(" be copied providing that no charge is made to the recipient"); puts(" and that this copyright notice remains intact."); puts(""); puts(" If you use and find value in this software, please send $10"); puts(" to the author at this address:"); puts(""); puts(" Phil Mercurio"); puts(" Quicksilver Software"); puts(" 2515 #9 Camino Del Mar"); puts(" Del Mar, CA 92014"); puts(""); puts(" Be sure to include your name and address, as this will place"); puts(" you on the Quicksilver Software mailing list. Your support"); puts(" of shareware products will encourage the further production"); puts(" of low-cost software."); exit(0); } /* * Pause the help print out, exit if RETURN not pressed. */ pauseHelp() { printf("%c0;33;40m",CSI); /* Fore: 3 Back: 0 */ puts(" Press RETURN to continue\n"); printf("%c0;31;40m",CSI); /* Fore: 2 Back:0 (Normal) */ if(getchar() != 0xA) exit(0); } /* * Configure global variables based on the parsed arguements. */ configure() { #ifdef Trace printf("configure()\n"); #endif Trace if(Debug) Prt = stdout; else Prt = xopen("prt:","a"); if(Debug) { fprintf(stderr,"Debugging ON\n"); fprintf(stderr,"LeftMargin = %d\n",LeftMargin); fprintf(stderr,"LineWidth = %d, LinesPerPage = %d\n", LineWidth, LinesPerPage); } buildFooter(); } /* * Build the copyright footer. */ buildFooter() { register int i; char buf[StrSiz]; int y,m,d,wd; for(i=0; i < LineWidth; i++) Footer[i] = ' '; Footer[i] = 0; DateStamp(&Now); parseDate(&Now,&y,&m,&d,&wd); sprintf(buf,"(C) Copyright %d",y); insStr(Footer,buf); insStr(&Footer[(LineWidth - strlen(OwnerName))/2],OwnerName); insStr(&Footer[LineWidth - strlen(AllRights)],AllRights); } /* * Pretty-print the file file. */ pp(file) char *file; { FILE *fp; #ifdef Trace printf("pp(%s)\n",file); #endif Trace getFIB(file, &FIB); dateStr(Date,&(FIB.fib_Date)); timeStr(Time,&(FIB.fib_Date)); fp = xopen(file,"r"); buildHeader(file,Date,Time); ppFile(fp); fclose(fp); } /* * Build the header for the file "file". The date and time of the file * are used in the header. */ buildHeader(file,date,time) char *file, *date, *time; { register int i; static char buf[StrSiz]; for(i=0; i < LineWidth; i++) Header[i] = ' '; Header[i] = 0; buf[0] = 0; strcat(buf,date); strcat(buf," "); strcat(buf,time); insStr(Header,buf); insStr(&Header[(LineWidth - strlen(file))/2],file); insStr(&Header[LineWidth - strlen(PageTemplate)],PageTemplate); } /* * Copy the file into Prt from in. Lines longer than LineWidth chars * are split up, with the continuation lines preceeded by Arrow. * Line numbers are inserted every LineCount lines, if LineCount > 0. */ ppFile(in) FILE *in; { Line = 1; Page = 1; RealLine = 0; beginPage(); while(fillBuf(in)) { writeLine(); while(emptyBuf()) /* null body */ ; Line++; } putLines(LinesPerPage - RealLine); endPage(); } /* * Fill the input buffer from the file in. Returns Yes if successful, * No otherwise. */ fillBuf(in) FILE *in; { #ifdef Trace printf("fillBuf()\n"); #endif Trace if(fgets(Buf1,BufSiz,in) == NULL) return(No); else { expandTabs(Buf1,Buf2); BufPtr = Buf2; return(Yes); } } /* * Expand the tabs in in, copying the string to out. Also removes * the terminating newline and checks for buffer overflow. Overflowing * lines are truncated. */ expandTabs(in,out) char *in, *out; { register int i; #ifdef Trace printf("expandTabs(%s,%s)\n",in,out); #endif Trace i = 0; while(!IsEndOfBuffer(*in) && i < BufSiz-1) { if(*in == '\t') { in++; do { *out++ = ' '; i++; } while(i % TabStop != 0); } else { *out++ = *in++; i++; } } *out = 0; } /* * Begin a new page by outputting the PreHeader lines, the Header, * and the PreBody lines. */ beginPage(fp) FILE *fp; { register int i; #ifdef Trace printf("beginPage()\n"); #endif Trace putLines(PreHeader); putSpaces(Indent); sprintf(&Header[LineWidth - NPageChars],PageNumFmt,Page); fprintf(Prt,"%s\n",Header); putLines(PreBody); } /* * End a page by outputting the PreFooter and PostFooter lines, * and the Footer, if CopyRight is Yes, else the appropriate number * of blank lines. */ endPage() { register int i; #ifdef Trace printf("endPage()\n"); #endif Trace putLines(PreFooter); if(CopyRight) { putSpaces(Indent); fprintf(Prt,"%s\n",Footer); } else { putLines(NLFooter); } putLines(PostFooter); } /* * Write out the first physical line from Buf2, checking for * the need to put out the line number and/or start a new page. */ writeLine() { register int i; char lineNum[Indent+1]; #ifdef Trace printf("writeLine()\n"); #endif Trace if(RealLine == LinesPerPage) { endPage(); Page++; beginPage(); RealLine = 0; } if(LineCount != 0 && Line % LineCount == 0) { sprintf(lineNum,LineNumFmt,Line); putPrefix(lineNum); } else { putSpaces(Indent); } for(i=0; !IsEndOfBuffer(*BufPtr) && i < LineWidth; i++, BufPtr++) putc(*BufPtr,Prt); putLines(1); RealLine++; } /* * Write out the next LineWidth characters from BufPtr, preceeding it * with an Arrow. We have to check for the need to page break before * outputting. No is returned when BufPtr is exhausted, Yes otherwise. */ emptyBuf() { register int i; #ifdef Trace printf("emptyBuf()\n"); #endif Trace if(IsEndOfBuffer(*BufPtr)) return(No); if(RealLine == LinesPerPage) { endPage(); Page++; beginPage(); RealLine = 0; } putPrefix(Arrow); for(i=0; i < LineWidth && !IsEndOfBuffer(*BufPtr); i++, BufPtr++) putc(*BufPtr,Prt); putLines(1); RealLine++; return(Yes); } /* * Output the prefix to Prt, using the highlighting commands * as defined in pp.h. If the highlighting commands are NULL, * they are not output, otherwise they're preceeded by an ESCAPE. */ putPrefix(p) char *p; { #ifdef Trace printf("putPrefix(%s)\n",p); #endif Trace if(!IsEndOfBuffer(*HiLiteOn)) fprintf(Prt,"%c%s",ESC,HiLiteOn); fprintf(Prt,"%s",p); if(!IsEndOfBuffer(*HiLiteOff)) fprintf(Prt,"%c%s",ESC,HiLiteOff); } /* * Put n spaces to Prt. */ putSpaces(n) int n; { #ifdef Trace printf("putSpaces(%d)\n",n); #endif Trace while(n--) putc(' ',Prt); } /* * Put n blank lines to Prt. */ putLines(n) int n; { #ifdef Trace printf("putLines(%d)\n",n); #endif Trace while(n--) putc('\n',Prt); } /* * Open a file with mode mode, printing an error message if unsuccessful. */ FILE * xopen(file,mode) char *file, *mode; { FILE *fp; fp = fopen(file,mode); if(fp == NULL) { fprintf(stderr,"%s: unable to open file \"%s\"\n",MyName,file); exit(0); } return(fp); } /* * Open a library, printing an error message if unsuccessful. */ LONG xOpenLibrary(lib,version) char *lib; int version; { LONG libPtr, OpenLibrary(); libPtr = OpenLibrary(lib,0); if(libPtr == NULL) { fprintf(stderr,"Unable to open library \"%s\"\n",lib); exit(0); } return(libPtr); } /* * Print out the argument list. */ dbArgs(ac,av) int ac; char **av; { register int i; for(i=0; i < ac; i++) printf("%s ",av[i]); printf("\n"); } /* * Finalize the program by closing printer. */ finalize() { #ifdef Trace printf("finalize()\n"); #endif Trace if(!Debug) fclose(Prt); } /* * Insert the string from in the string to, but do not terminate * with 0. */ insStr(to,from) char *to, *from; { while(!IsEndOfBuffer(*from)) *to++ = *from++; } SHAR_EOF cat << \SHAR_EOF > pp.h /**** **** pp Amiga PagePrint Program **** Version 1.0 ****/ /*** *** (C) Copyright 1986 Phil Mercurio (Quicksilver Software) *** All Rights Reserved *** *** This software is released as a shareware product. It may *** be copied providing that no charge is made to the recipient *** and that this copyright notice remains intact. *** *** If you use and find value in this software, please send $10 *** to the author at this address: *** *** Phil Mercurio *** Quicksilver Software *** 2515 #9 Camino Del Mar *** Del Mar, CA 92014 *** *** Be sure to include your name and address, as this will place *** you on the Quicksilver Software mailing list. Your support *** of shareware products will encourage the further production *** of low-cost software. ***/ #include <stdio.h> #include <libraries/dos.h> #include <libraries/dosextens.h> #include <intuition/intuition.h> /** ** User-Configurable Constants; change to taste **/ /* * These definitions control the header and footer contents. You probably * won't want to change the definitions controlling the page number, * unless you're going to be printing files with more than 9999 pages. * You'll definitely want to change "OwnerName". */ #define OwnerName "Quicksilver Software" /* used in the copyright footer */ #define AllRights "All Rights Reserved" /* used in the copyright footer */ #define PageTemplate "Page ####" /* page number template */ #define NPageChars (4) /* # chars alloted for page number */ #define PageNumFmt "%4d" /* printf format matching above */ /* * These definitions configure the left margin and the things printed * in it. Both LineNumFmt and Arrow must consume Indent characters. */ #define Indent (6) /* left margin indentation */ #define LineNumFmt "%5d " /* printf format for line numbers in margin */ #define Arrow "==> " /* continuation arrow */ /* * The following two definitions specify the codes to highlight * the line numbers and continuation arrow. If you don't want * these highlighted, set both of these definitions to "". Otherwise, * the putPrefix() function will insert the ESCAPE for you. These * are ANSI printer codes, but if you change configure() to open * "PAR:" or "SER:" instead of "PRT:" (i.e., if you by-pass the printer * driver), you should use your own printer-specific codes instead. */ #define HiLiteOn "[2v" /* ANSI for superscript on */ #define HiLiteOff "[1v" /* ANSI for superscript off */ #define ESC (033) /* ASCII escape character */ #define TabStop (8) /* number of chars in a tab */ /* * These definitions determine the format of each page. */ #define PreHeader (3) /* number of lines to preceed header */ #define NLHeader (1) /* number of lines in the header */ #define PreBody (3) /* number of lines between header and body */ #define PreFooter (3) /* number of lines between body and footer */ #define NLFooter (1) /* number of lines in the footer */ #define PostFooter (1) /* number of lines after the footer */ #define NonBody (PreHeader+NLHeader+PreBody+PreFooter+NLFooter+\ PostFooter) /* sum of non-body lines on page */ /** ** Internal Buffer Sizes; may be changed if necessary **/ #define MaxFiles (128) /* maximum number of files */ #define BufSiz (256) /* input line buffer */ #define StrSiz (128) /* string size */ /** ** Sacred Constants & Macros; don't touch **/ #ifndef Yes #define Yes (1) #define No (0) #endif #define IsDigit(c) (c >= '0' && c <= '9') #define IsWhite(c) (c == ' ' || c == '\t') #define IsEndOfBuffer(c) (c == '\n' || c == 0) #define CSI (0x9B) /* CLI Control Sequence Introducer */ /** ** Global Variables **/ int CopyRight; /* if Yes, print copyright footer */ int Debug; /* if Yes, do debugging */ int LeftMargin; /* location of left margin */ int LineWidth; /* number of chars in a line */ int LinesPerPage; /* number of text lines per page */ int Quiet; /* if Yes, don't write anything to the screen */ struct Preferences Prefs; /* user's preferences */ struct FileInfoBlock FIB; /* used to file information */ extern int Enable_Abort; /* when Yes, enables ^C termination */ struct DateStamp DateBuf; /* stores file date */ struct DateStamp Now; /* stores current date */ char Date[StrSiz]; /* string representation of file date */ char Time[StrSiz]; /* string representation of file time */ char MyName[StrSiz]; /* name of this program */ char Header[StrSiz]; /* string containing the header */ char Footer[StrSiz]; /* string containing the footer */ FILE *Prt; /* the printer file pointer */ FILE *xopen(); /* eXpress open function */ FILE *fopen(); /* file open function */ int LineCount; /* if non-zero, increment for line numbers */ int Line; /* current line number */ int RealLine; /* current physical line number on page */ int Page; /* current page number */ char FileName[MaxFiles][StrSiz]; /* names of files to print */ int NFiles; /* number of files */ char Buf1[BufSiz]; /* input line buffer */ char Buf2[BufSiz]; /* input buffer with tabs expanded */ char *BufPtr; /* pointer to above */ /** ** Libraries used by pp **/ LONG IntuitionBase; /* Intuition */ LONG xOpenLibrary(); /* the eXpress open library function */ SHAR_EOF # End of shell archive exit 0