Annotation of OpenXM_contrib/gnuplot/docs/doc2rnh.c, Revision 1.1.1.1
1.1 maekawa 1: #ifndef lint
2: static char *RCSid = "$Id: doc2rno.c,v 0.01 1997/03/09 21:00:00 lph Exp $";
3: #endif
4:
5: /* GNUPLOT - doc2rnh.c */
6:
7: /*[
8: * Copyright 1986 - 1993, 1998 Thomas Williams, Colin Kelley
9: *
10: * Permission to use, copy, and distribute this software and its
11: * documentation for any purpose with or without fee is hereby granted,
12: * provided that the above copyright notice appear in all copies and
13: * that both that copyright notice and this permission notice appear
14: * in supporting documentation.
15: *
16: * Permission to modify the software is granted, but not the right to
17: * distribute the complete modified source code. Modifications are to
18: * be distributed as patches to the released version. Permission to
19: * distribute binaries produced by compiling modified sources is granted,
20: * provided you
21: * 1. distribute the corresponding source modifications from the
22: * released version in the form of a patch file along with the binaries,
23: * 2. add special version identification to distinguish your version
24: * in addition to the base release version number,
25: * 3. provide your name and address as the primary contact for the
26: * support of your modified version, and
27: * 4. retain our contact information in regard to use of the base
28: * software.
29: * Permission to distribute the released version of the source code along
30: * with corresponding source modifications in the form of a patch file is
31: * granted with same provisions 2 through 4 for binary distributions.
32: *
33: * This software is provided "as is" without express or implied warranty
34: * to the extent permitted by applicable law.
35: ]*/
36:
37: /*
38: * doc2rnh.c -- program to convert Gnuplot .DOC format to
39: * Digital Standard Runoff for VMS HELP files
40: * (gnuplot.doc, including the terminal documentation
41: * is no longer formated for VMS HELP by default)
42: *
43: * From hlp2ms by Thomas Williams
44: *
45: * Modified by Russell Lang, 2nd October 1989
46: * to make vms help level 1 and 2 create the same ms section level.
47: *
48: * Modified to become doc2ms by David Kotz (David.Kotz@Dartmouth.edu) 12/89
49: * Added table and backquote support.
50: *
51: * Adapted from doc2ms.c (the unix 'runoff' text-processor)
52: * by Lucas Hart 3/97
53: *
54: * right margin is adjusted two spaces for each level to compensate
55: * for the indentation by VMS HELP
56: *
57: * the page width can be adjusted by changing the value of DSR_RM
58: * usage: $ MCR []doc2rnh gnuplot.doc gnuplot.rnh
59: * $ RUNOFF gnuplot.rnh
60: *
61: *
62: */
63:
64: #ifdef HAVE_CONFIG_H
65: # include "config.h"
66: #endif
67:
68: #include "ansichek.h"
69: #include "stdfn.h"
70: #include "doc2x.h"
71:
72: extern boolean single_top_level;
73:
74: #define LINE_SKIP 3
75: #define DSR_RM 70
76:
77: void init __PROTO((FILE *));
78: void convert __PROTO((FILE *, FILE *));
79: void process_line __PROTO((char *, FILE *));
80: void section __PROTO((char *, FILE *));
81: void putrnh __PROTO((char *, FILE *));
82: void putrnh_ __PROTO((char *, FILE *));
83: void finish __PROTO((FILE *));
84:
85: static boolean intable = FALSE;
86: static boolean rnh_table = FALSE;
87: static boolean initial_entry = FALSE;
88:
89: int main(argc, argv)
90: int argc;
91: char **argv;
92: {
93: FILE *infile;
94: FILE *outfile;
95: infile = stdin;
96: outfile = stdout;
97:
98: single_top_level = TRUE;
99:
100: if (argc > 3) {
101: fprintf(stderr, "Usage: %s [infile [outfile]]\n", argv[0]);
102: exit(EXIT_FAILURE);
103: }
104: if (argc >= 2) {
105: if ((infile = fopen(argv[1], "r")) == (FILE *) NULL) {
106: fprintf(stderr, "%s: Can't open %s for reading\n",
107: argv[0], argv[1]);
108: exit(EXIT_SUCCESS);
109: }
110: }
111: if (argc == 3) {
112: if ((outfile = fopen(argv[2], "w")) == (FILE *) NULL) {
113: fprintf(stderr, "%s: Can't open %s for writing\n",
114: argv[0], argv[2]);
115: exit(EXIT_FAILURE);
116: }
117: }
118: init(outfile);
119: convert(infile, outfile);
120: finish(outfile);
121: exit(EXIT_SUCCESS);
122: }
123:
124:
125: void init(b)
126: FILE *b;
127: {
128: /* */
129: (void) fputs(".no paging\n\
130: .no flags all\n\
131: .left margin 1\n\
132: .right margin 70\n\
133: .no justify\n", b);
134: }
135:
136:
137: void convert(a, b)
138: FILE *a, *b;
139: {
140: static char line[MAX_LINE_LEN+1];
141:
142: while (get_line(line, sizeof(line), a)) {
143: process_line(line, b);
144: }
145: }
146:
147: void process_line(line, b)
148: char *line;
149: FILE *b;
150: {
151: switch (line[0]) { /* control character */
152: case '?':{ /* interactive help entry */
153: break; /* ignore */
154: }
155: case '@':{ /* start/end table */
156: if (rnh_table) {
157: (void) fputs(".end literal\n", b);
158: rnh_table = FALSE;
159: intable = FALSE;
160: } else {
161: /* (void) fputs(".literal\n",b); */
162: intable = TRUE;
163: rnh_table = FALSE;
164: initial_entry = TRUE;
165: }
166: /* ignore rest of line */
167: break;
168: }
169: case '^':{ /* html table entry */
170: break; /* ignore */
171: }
172: case '#':{ /* latex table entry */
173: break; /* ignore */
174: }
175: case '%':{ /* troff table entry */
176: break; /* ignore */
177: }
178: #if 0
179: /* 'C' is taken care of by termdoc.c */
180: case 'C':{ /* new Comment designator */
181: break; /* ignore */
182: }
183: #endif
184: case '\n': /* empty text line */
185: case ' ':{ /* normal text line */
186:
187: /* most tables are simple; no flags means no protected characters
188: * other than period (command indicator) in first column
189: *
190: * However, for ease of maintainence, two tables have sublevels
191: * and descriptions, corresponding to the printed table entries,
192: * encapsulated by the table markers. Therefore we need to
193: * do some more work.
194: *
195: * Doc2hlp just ignores the table headings and treats
196: * lower levels irrespectively, but we need to break
197: * the level designators out of the table format.
198: *
199: * The first entry in a table will have either
200: * - a level number in the first column => remainder of text in
201: * table is help text
202: * - spaces in the first two columns => rest of text is literal
203: * to be placed in table format
204: *
205: */
206:
207: /* use the "cleartext" table or other text in tables */
208:
209: /* if (intable) { /* its already literal */
210: if (rnh_table) { /* its a literal */
211: putrnh(line + 1, b);
212: break;
213: }
214: switch (line[1]) {
215: case ' ':{
216: if ((intable) && (initial_entry)) {
217: rnh_table = TRUE;
218: initial_entry = FALSE;
219: fputs(".literal\n", b);
220: putrnh(line + 1, b);
221: break;
222: }
223: /* verbatim mode */
224: fputs(".literal\n", b);
225: putrnh(line + 1, b);
226: fputs(".end literal\n", b);
227: break;
228: }
229:
230: /*
231: * "." in first column is the DSR command character;
232: * therefore, include the preceeding " "
233: */
234: case '.':{
235: putrnh(line, b);
236: break;
237: }
238: default:{
239: if (line[0] == '\n')
240: fputs(".skip\n", b); /* totally blank line */
241: else
242: putrnh(line + 1, b);
243: break;
244: }
245: break;
246: }
247: break;
248: }
249: default:{
250: if (isdigit((int) line[0])) { /* start of section */
251:
252: /* some HELP text is surrounded by table flags */
253: /* doc2rnh will ignore the flags */
254:
255: if (intable) {
256: if (initial_entry) {
257: initial_entry = FALSE;
258: rnh_table = FALSE;
259: }
260: }
261: section(line, b);
262: } else
263: fprintf(stderr, "unknown control code '%c' in column 1\n",
264: line[0]);
265: break;
266: }
267: }
268: }
269:
270:
271: /* process a line with a digit control char */
272: /* starts a new [sub]section */
273: /* We want to retain section number, so its simpler than w/ TeX or roff */
274:
275: void section(line, b)
276: char *line;
277: FILE *b;
278: {
279: int sh_i;
280: static int old = 1;
281: /*
282: (void) sscanf(line,"%d",&sh_i);
283: *
284: * check to make sure this works with terminals also
285: */
286: sh_i = atoi(line);
287:
288: if (sh_i > old) {
289: do
290: if (old != 1) /* this line added by rjl */
291: (void) fputs(".rm-2\n", b);
292: while (++old < sh_i);
293: } else if (sh_i < old) {
294: do
295: if (sh_i != 1) /* this line added by rjl */
296: (void) fputs(".rm+2\n", b);
297: while (--old > sh_i);
298: }
299: /* added by dfk to capitalize section headers */
300: /* Header name starts at [2] */
301: /* omit for online documentation
302: * if (islower(line[2]))
303: * line[2] = toupper(line[2]);
304: */
305: old = sh_i;
306:
307: (void) fputs(".indent -1;\n", b);
308: (void) putrnh_(line, b);
309: (void) fputs(".br;\n", b);
310: }
311:
312: /*
313: * dummy function in case we need to convert some characters in
314: * output string ala doc2tex and doc2ms
315: */
316:
317: void putrnh(s, file)
318: char *s;
319: FILE *file;
320: {
321: (void) fputs(s, file);
322: }
323:
324: /*
325: * LBR$OUTPUT_HELP treats spaces and "/"s as list separators for topics,
326: * but they are used in gnuplot.doc for the printed docs; convert to
327: * "_" and "|" Modeled after section heading conversions in doc2tex
328: * and doc2ms.
329: *
330: */
331:
332: void putrnh_(s, file)
333: char *s;
334: FILE *file;
335: {
336: int i, s_len, last_chr;
337:
338: s_len = strlen(s);
339:
340: for (i = s_len - 1; i > 2; i--) { /* any trailing spaces to drop? */
341: if (s[i] != ' ') {
342: last_chr = i;
343: break;
344: }
345: }
346:
347: for (i = 0; i <= last_chr; i++) {
348: if (i > 2) {
349: switch (s[i]) {
350: case ' ':
351: (void) fputc('_', file);
352: break;
353: case '/':
354: (void) fputc('|', file);
355: break;
356: default:
357: (void) fputc(s[i], file);
358: }
359: } else {
360: (void) fputc(s[i], file);
361: }
362: }
363: }
364:
365: void finish(b) /* not used */
366: FILE *b;
367: {
368: return;
369: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>