1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23/*	  All Rights Reserved  	*/
24
25
26/*
27 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
28 * Use is subject to license terms.
29 */
30
31#pragma ident	"%Z%%M%	%I%	%E% SMI"
32
33/* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */
34
35/**
36 ** The disk copy of the filter table:
37 **/
38
39/*
40 * There are 9 fields in the filter table (the first one is ignored).
41 */
42#define	FL_MAX	9
43# define FL_IGN		0
44# define FL_PTYPS	1
45# define FL_PRTRS	2
46# define FL_ITYPS	3
47# define FL_NAME	4
48# define FL_OTYPS	5
49# define FL_TYPE	6
50# define FL_CMD		7
51# define FL_TMPS	8
52
53/*
54 * Various strings.
55 */
56#define FL_SEP		":"
57#define FL_END		"\n"
58#define	FL_FAST		"fast"
59#define	FL_SLOW		"slow"
60
61/**
62 ** The internal copy of a filter as seen by the rest of the world:
63 **/
64
65typedef enum FILTERTYPE {
66	fl_none,
67	fl_fast,
68	fl_slow,
69	fl_both
70}			FILTERTYPE;
71
72/*
73 * A (char **) list is an array of string pointers (char *) with
74 * a null pointer after the last item.
75 */
76typedef struct FILTER {
77	char *		name;		/* name of filter (redundant) */
78	char *		command;	/* shell command (full path) */
79	FILTERTYPE	type;		/* type of filter (fast/slow) */
80	char **		printer_types;	/* list of valid printer types */
81	char **		printers;	/* list of valid printers */
82	char **		input_types;	/* list of valid input types */
83	char **		output_types;	/* list of valid output types */
84	char **		templates;	/* list of option templates */
85}			FILTER;
86
87/**
88 ** The internal copy of a filter as seen by the filter routines:
89 **/
90
91/*
92 * To speed up processing the filter table, FL_MAX_GUESS slots
93 * will be preallocated for the internal copy. If filter tables
94 * are expected to be substantially larger than this, bump it up.
95 */
96#define FL_MAX_GUESS	10
97
98typedef struct TYPE {
99	char *			name;
100	unsigned short		info;	/* 1 iff "name" is in Terminfo */
101}			TYPE;
102
103#define	PATT_STAR	"*"
104
105typedef struct TEMPLATE {
106	char *			keyword;
107	char *			pattern;
108	char *			re;
109	char *			result;
110	int			nbra;
111}			TEMPLATE;
112
113/*
114 * A (TYPE *) list is an array of content-types (TYPE) with a null
115 * "name" element. A (TEMPLATE *) list is an array of templates (TEMPLATE)
116 * with a null "keyword" element.
117 */
118typedef struct _FILTER {
119	struct _FILTER *	next;		/* for linking several */
120	char *			name;
121	char *			command;
122	char **			printers;
123	TYPE *			printer_types;
124	TYPE *			input_types;	/* all possible choices */
125	TYPE *			output_types;	/* all possible choices */
126	TYPE *			inputp;		/* the one to be used */
127	TYPE *			outputp;	/* the one to be used */
128	TEMPLATE *		templates;
129	FILTERTYPE		type;
130	unsigned char		mark,
131				level;
132}			_FILTER;
133
134#define	FL_CLEAR	0x00
135#define	FL_SKIP		0x01
136#define	FL_LEFT		0x02
137#define	FL_RIGHT	0x04
138
139#define PARM_INPUT	"INPUT"
140#define PARM_OUTPUT	"OUTPUT"
141#define PARM_TERM	"TERM"
142#define PARM_PRINTER	"PRINTER"
143
144#define NPARM_SPEC	8
145# define PARM_CPI	"CPI"
146# define PARM_LPI	"LPI"
147# define PARM_LENGTH	"LENGTH"
148# define PARM_WIDTH	"WIDTH"
149# define PARM_PAGES	"PAGES"
150# define PARM_CHARSET	"CHARSET"
151# define PARM_FORM	"FORM"
152# define PARM_COPIES	"COPIES"
153
154#define PARM_MODES	"MODES"
155
156#define FPARM_CPI	0x0001
157#define FPARM_LPI	0x0002
158#define FPARM_LENGTH	0x0004
159#define FPARM_WIDTH	0x0008
160#define FPARM_PAGES	0x0010
161#define FPARM_CHARSET	0x0020
162#define FPARM_FORM	0x0040
163#define FPARM_COPIES	0x0080
164#define FPARM_MODES	0x0100
165
166/**
167 ** Various routines.
168 **/
169
170/*
171 * Null terminated list (filters[i].name == NULL).
172 */
173extern _FILTER		*filters;
174
175extern size_t		nfilters;
176
177#if	defined(__STDC__)
178
179FILTER *	getfilter ( char * );
180
181_FILTER *	search_filter ( char * );
182
183FILTERTYPE	insfilter ( char ** , char * , char * , char * , char * , char ** , unsigned short * );
184FILTERTYPE	s_to_filtertype ( char * );
185
186TEMPLATE	s_to_template ( char * );
187
188TEMPLATE *	sl_to_templatel ( char ** );
189
190TYPE		s_to_type ( char * );
191
192TYPE *		sl_to_typel ( char ** );
193
194char *		template_to_s ( TEMPLATE );
195char *		type_to_s ( TYPE );
196
197char **		templatel_to_sl ( TEMPLATE * );
198char **		typel_to_sl ( TYPE * );
199
200int		open_filtertable ( char * , char * );
201
202int		get_and_load ( void );
203int		putfilter ( char * , FILTER * );
204int		delfilter ( char * );
205int		loadfilters ( char * );
206int		dumpfilters( char * );
207
208void		freetempl ( TEMPLATE * );
209void		freefilter ( FILTER * );
210void		free_filter ( _FILTER * );
211void		trash_filters ( void );
212void		close_filtertable ( FILE * );
213
214#else
215
216extern FILTER		*getfilter();
217
218extern _FILTER		*search_filter();
219
220extern FILTERTYPE	insfilter(),
221			s_to_filtertype();
222
223extern TYPE		s_to_type(),
224			*sl_to_typel();
225
226extern TEMPLATE		s_to_template(),
227			*sl_to_templatel();
228
229#if	defined(BUFSIZ)
230extern FILE		*open_filtertable();
231#endif
232
233extern char		**typel_to_sl(),
234			**templatel_to_sl(),
235			*getfilterfile();
236
237extern int		putfilter(),
238			delfilter(),
239			loadfilters(),
240			get_and_load();
241
242extern void		freefilter(),
243			free_filter(),
244			freetempl(),
245			trash_filters(),
246			close_filtertable();
247
248#endif
249