|
|
1.1 root 1: /*
2: * asa - interpret asa carriage control characters
3: *
4: * This program is designed to make sense out of the output
5: * of fortran programs whose authors have used asa carriage
6: * control characters. It processes either the files
7: * whose names are given as arguments or the standard input
8: * if no file names are given. The first character of each
9: * line is assumed to be a control character: the meanings
10: * of the control characters are:
11: *
12: * ' ' single-space before printing
13: * '0' double-space before printing
14: * '-' triple-space before printing
15: * '1' new page before printing
16: * '+' do not space at all before printing
17: *
18: * A line beginning with '+' will overprint the previous line.
19: *
20: * Lines beginning with other than the above characters are
21: * treated as if they began with ' '; if any such lines appear,
22: * an appropriate diagnostic will appear on the standard error
23: * file before termination. The return code will be zero unless
24: * one or more input files could not be opened.
25: *
26: * The program forces the first line of each input file to
27: * start on a new page.
28: */
29:
30: #include <stdio.h>
31: typedef char bool;
32: #define true 1
33: #define false 0
34:
35: /* program name, for diagnostics */
36: char *pgmname;
37:
38: /* count of lines with bad control characters */
39: long badlines = 0;
40:
41: /* buffer for the standard output */
42: char stdbuf[BUFSIZ];
43:
44: /* number of errors detected */
45: int retcode = 0;
46:
47: main (c, v)
48: int c;
49: char **v;
50: {
51: setbuf (stdout, stdbuf);
52: pgmname = v[0];
53:
54: /* were any files given, or do we process stdin? */
55: if (c <= 1)
56:
57: /* process standard input */
58: dofile ("standard input");
59: else {
60: register int i;
61:
62: /* one iteration per input file */
63: for (i = 1; i < c; i++) {
64: if (freopen (v[i], "r", stdin) == NULL) {
65: fprintf (stderr, "%s: cannot open %s\n",
66: pgmname, v[i]);
67: retcode++;
68: } else
69: dofile (v[i]);
70: }
71: }
72:
73: /* report invalid input lines -- dofile increments badlines */
74: if (badlines)
75: fprintf (stderr, "%s: %ld invalid input line%s\n",
76: pgmname, badlines, badlines>1? "s": "");
77:
78: if (ferror (stdout)) {
79: fprintf (stderr, "%s: output error\n", pgmname);
80: retcode++;
81: }
82:
83: return retcode;
84: }
85:
86: /*
87: * dofile - process the standard input.
88: *
89: * This program is called once for each input file, with stdin
90: * redirected to the file. The "fname" argument is used
91: * for writing diagnostic messages only.
92: */
93:
94: /* true only when the first output character has not been written */
95: bool firstout = true;
96:
97: dofile (fname)
98: char *fname;
99: {
100: register int c;
101:
102: /* true if we are about to read the first character in a line */
103: bool firstchar = true;
104:
105: /* true if we are about to write the first line for the file */
106: bool firstline = true;
107:
108: while ((c = getchar()) != EOF) {
109:
110: /* separate input files by formfeeds */
111: if (firstline && !firstout)
112: putchar ('\f');
113:
114: if (firstchar) {
115: switch (c) {
116:
117: /* new page */
118: case '1':
119: if (!firstline)
120: putchar ('\f');
121: break;
122:
123: /* triple space */
124: case '-':
125: if (!firstline)
126: putchar ('\n');
127: putchar ('\n');
128: putchar ('\n');
129: break;
130:
131: /* double space */
132: case '0':
133: if (!firstline)
134: putchar ('\n');
135: putchar ('\n');
136: break;
137:
138: /* single space and invalid characters */
139: default:
140: badlines++;
141: /* no break */
142: case '\n':
143: case ' ':
144: if (!firstline)
145: putchar ('\n');
146: break;
147:
148: /* no space at all */
149: case '+':
150: if (!firstline)
151: putchar ('\r');
152: break;
153: }
154: firstline = false;
155: firstout = false;
156: if (c != '\n')
157: firstchar = false;
158: } else {
159: /* not the first character of an input line */
160: if (c == '\n')
161: firstchar = true;
162: else
163: putchar (c);
164: }
165: }
166:
167: /* end the file with a newline if any output appeared */
168: if (!firstline)
169: putchar ('\n');
170:
171: if (ferror (stdin)) {
172: fprintf (stderr, "%s: input error on %s\n", pgmname, fname);
173: retcode++;
174: }
175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.