From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/pr.c | 301 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/pr.c (limited to 'reference/C/CONTRIB/SNIP/pr.c') diff --git a/reference/C/CONTRIB/SNIP/pr.c b/reference/C/CONTRIB/SNIP/pr.c new file mode 100755 index 0000000..328a8de --- /dev/null +++ b/reference/C/CONTRIB/SNIP/pr.c @@ -0,0 +1,301 @@ +/* + This program is similar to a program of the same name found on UNIX. + It prints the files named in the command tail with headings + except as modified below. + + usage: pr [-i -ln -on -pname -tn -wn] file1[ file2 ... filen] + where: -i = accept files from stdin + -ln = set lines per page to n + -on = set page offset to n + -pname = output to file + -tn = set tabs to n cols + -wn = set page width to n + + note: the expr 'PAGE(mesg)' found in col 1 will cause a formfeed + and the 'mesg' to be included in the title line on this and + each subsequent page until EOF or another PAGE. +*/ + +#include + +#define TAB_DEFAULT 4 +#define PAGE_LENGTH 60 +#define PAGE_OFFSET 0 +#define PAGE_WIDTH 80 +#define MAX_ARGS 70 +#define MAX_FILES 64 +#define PATH_LENGTH 63 +#define PAGE(head) + +#ifndef TRUE + +#define TRUE 1 +#define FALSE 0 + +#endif + + +int page_length = PAGE_LENGTH; +int page_offset = PAGE_OFFSET; +int page_width = PAGE_WIDTH; + +int tab_width = TAB_DEFAULT; + +char *xargv[ MAX_ARGS ]; +unsigned xargc; + +char filenames [MAX_FILES] [PATH_LENGTH + 1]; + +char *print_name = "PRN:"; + +extern long atoi(); + +char title [80]; +char date [20]; +char time [20]; +int ln, pn; + +PAGE (MAIN) +main(argc, argv) /* copy file to printer */ +int argc; +char *argv []; +{ + FILE *file, *lp; + int fi = 0; + int read_stdin = FALSE; + int pn; + char *cp; + + if (argc < 2) /* No args so tell 'em how it works */ + { + fprintf(stderr, + "usage:\n\npr %s %s\n\n", + "[-i] [-lnn] [-onn] [-p] [-tn] [-wnn]", + "[file1[ file2 ... filen]]"); + fprintf(stderr, + "where: i = read 'stdin' for filenames to print\n"); + fprintf(stderr, + " l = lines-per-page and nn <= 120\n"); + fprintf(stderr, + " o = page offset and nn <= 120\n"); + fprintf(stderr, + " p = print redirection and\n"); + fprintf(stderr, + " = pathname or devicename\n"); + fprintf(stderr, + " t = spaces-per-tab and n <= 8\n"); + fprintf(stderr, + " w = page width and nn <= 160\n\n"); + fprintf(stderr, + "Notes: PAGE() in col 1 of text file\n"); + fprintf(stderr, + " and <title text...> the title you want.\n\n"); + fprintf(stderr, + " C pgms should include the following macro:\n\n"); + fprintf(stderr, + " #define PAGE(title)\n\n"); + fprintf(stderr, + " < and > not required and should not be used\n\n"); + exit(0); + } + + xargc = xargs("pr", argc, argv, xargv, MAX_ARGS); + + for (pn = 0; pn < xargc; pn++) + { + if (*xargv[pn] == '-') + { + cp = xargv[pn] + 1; + switch (tolower(*cp)) + { + case 'i':/* wants help */ + read_stdin = TRUE; + break; + case 'l':/* page length change */ + page_length = (int) atoi(cp + 1); + if ((page_length <= 0) || (page_length > 120)) + page_length = PAGE_LENGTH; + break; + + case 'p':/* direct output to file */ + print_name = cp + 1; + break; + + case 't':/* tab width change */ + tab_width = (int) atoi(cp + 1); + if ((tab_width <= 0) || (tab_width > 8)) + tab_width = TAB_DEFAULT; + break; + + case 'o':/* page offset change */ + page_offset = (int) atoi(cp + 1); + if ((page_offset < 0) || (page_offset > 120)) + page_offset = PAGE_OFFSET; + break; + + case 'w':/* page width change */ + page_width = (int) atoi(cp + 1); + if ((page_width <= 0) || (page_width > 160)) + page_width = PAGE_WIDTH; + break; + + default: + fprintf(stderr, "pr: Invalid option = %s\n", + xargv[pn]); + } + } + else /* must be a path name */ + { + if (fi < MAX_FILES) + strcpy(filenames[fi++], xargv[pn]); + else + { + fprintf(stderr, "pr: " + "Exceeded maximum file capacity\n"); + break; + } + } + } + + if ((lp = fopen(print_name, "w")) == 0) + { + fprintf(stderr, "pr: Unable to open %s as output\n", print_name); + exit(1); + } + + if (read_stdin) + { + for(;;) + { + if (fi == MAX_FILES) + { + fputs("pr: Exceeded maximum file capacity\n", + stderr); + break; + } + cp = gets(filenames [fi], PATH_LENGTH); + if (!cp) + break; + else fi++; + } + } + /* now print each file */ + + for (pn = 0; pn < fi; pn++) + prt(filenames [pn], lp); /* print the file */ +} +PAGE (NEW PAGE) + +new_page (fnp, lp) +char *fnp; +FILE *lp; +{ + if (ln < 3) + return; + ++pn; + if (pn > 1) + fputc('\f', lp); + fprintf(lp, "%s %s %s PAGE %d: %s\n\n", + fnp, date, time, pn, title); + ln = 2; +} + +PAGE (PRINT FILE) +prt (fnp, lp) +char fnp[]; +FILE *lp; +{ + FILE *inp_file; + int i, j, col; + char line [256], *st, *et, *sp; + + inp_file = fopen(fnp, "r"); + if (!inp_file) + { + fprintf(stderr, "pr: unable to open %s\n", fnp); + return; + } + else + fprintf(stderr, "pr: printing %s\n", fnp); + + pn = 0; + ln = 999; + gdates(date); /* get date */ + gtimes(time); /* and time */ + *title = '\0'; + + while (fgets(line, 256, inp_file)) + { + if (strncmp(line, "PAGE", 4) == 0) + { + if (st = index(line, '(')) + { + et = index(line, ')'); + strncpy(title, st + 1, (et) ? et - st - 1 : 160); + } + ln = 999; + } + + if (ln > page_length) + new_page(fnp, lp); + + if (page_offset) + indent(lp); + + for (col = (page_offset) ? page_offset : 1, sp = &line[0]; + *sp; sp++) + { + switch (*sp) + { + case '\t': /* tab character */ + do + { + fputc(' ', lp); + col++; + if (col > page_width) + { + fputc('\n', lp); + col = (page_offset) ? page_offset : 1; + ln++; + if (ln > page_length) + new_page(fnp, lp); + if (page_offset) + indent(lp); + break; + } + } while ((col - 1) % tab_width); + break; + + case '\f': /* form feed character */ + new_page(fnp, lp); + break; + + default: + fputc(*sp, lp); + ++col; + if (col > page_width) + { + fputc('\n', lp); + col = (page_offset) ? page_offset - 1 : 0; + ln++; + if (ln > page_length) + new_page(fnp, lp); + if (page_offset) + indent(lp); + } + } + } /* of line print (for) */ + ++ln; + } /* of while not eof */ + fclose(inp_file); + fputc(014, lp); +} /* of print */ + +indent(lp) +FILE *lp; +{ + int i; + + for(i = 1; i < page_offset; i++) + fputc(' ', lp); +} -- cgit v1.2.3-54-g00ecf