root/usr/src/cmd/lp/include/filters.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/*        All Rights Reserved   */


/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

/* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */

/**
 ** The disk copy of the filter table:
 **/

/*
 * There are 9 fields in the filter table (the first one is ignored).
 */
#define FL_MAX  9
# define FL_IGN         0
# define FL_PTYPS       1
# define FL_PRTRS       2
# define FL_ITYPS       3
# define FL_NAME        4
# define FL_OTYPS       5
# define FL_TYPE        6
# define FL_CMD         7
# define FL_TMPS        8

/*
 * Various strings.
 */
#define FL_SEP          ":"
#define FL_END          "\n"
#define FL_FAST         "fast"
#define FL_SLOW         "slow"

/**
 ** The internal copy of a filter as seen by the rest of the world:
 **/

typedef enum FILTERTYPE {
        fl_none,
        fl_fast,
        fl_slow,
        fl_both
}                       FILTERTYPE;

/*
 * A (char **) list is an array of string pointers (char *) with
 * a null pointer after the last item.
 */
typedef struct FILTER {
        char *          name;           /* name of filter (redundant) */
        char *          command;        /* shell command (full path) */
        FILTERTYPE      type;           /* type of filter (fast/slow) */
        char **         printer_types;  /* list of valid printer types */
        char **         printers;       /* list of valid printers */
        char **         input_types;    /* list of valid input types */
        char **         output_types;   /* list of valid output types */
        char **         templates;      /* list of option templates */
}                       FILTER;

/**
 ** The internal copy of a filter as seen by the filter routines:
 **/

/*
 * To speed up processing the filter table, FL_MAX_GUESS slots
 * will be preallocated for the internal copy. If filter tables
 * are expected to be substantially larger than this, bump it up.
 */
#define FL_MAX_GUESS    10

typedef struct TYPE {
        char *                  name;
        unsigned short          info;   /* 1 iff "name" is in Terminfo */
}                       TYPE;

#define PATT_STAR       "*"

typedef struct TEMPLATE {
        char *                  keyword;
        char *                  pattern;
        char *                  re;
        char *                  result;
        int                     nbra;
}                       TEMPLATE;

/*
 * A (TYPE *) list is an array of content-types (TYPE) with a null
 * "name" element. A (TEMPLATE *) list is an array of templates (TEMPLATE)
 * with a null "keyword" element.
 */
typedef struct _FILTER {
        struct _FILTER *        next;           /* for linking several */
        char *                  name;
        char *                  command;
        char **                 printers;
        TYPE *                  printer_types;
        TYPE *                  input_types;    /* all possible choices */
        TYPE *                  output_types;   /* all possible choices */
        TYPE *                  inputp;         /* the one to be used */
        TYPE *                  outputp;        /* the one to be used */
        TEMPLATE *              templates;
        FILTERTYPE              type;
        unsigned char           mark,
                                level;
}                       _FILTER;

#define FL_CLEAR        0x00
#define FL_SKIP         0x01
#define FL_LEFT         0x02
#define FL_RIGHT        0x04

#define PARM_INPUT      "INPUT"
#define PARM_OUTPUT     "OUTPUT"
#define PARM_TERM       "TERM"
#define PARM_PRINTER    "PRINTER"

#define NPARM_SPEC      8
# define PARM_CPI       "CPI"
# define PARM_LPI       "LPI"
# define PARM_LENGTH    "LENGTH"
# define PARM_WIDTH     "WIDTH"
# define PARM_PAGES     "PAGES"
# define PARM_CHARSET   "CHARSET"
# define PARM_FORM      "FORM"
# define PARM_COPIES    "COPIES"

#define PARM_MODES      "MODES"

#define FPARM_CPI       0x0001
#define FPARM_LPI       0x0002
#define FPARM_LENGTH    0x0004
#define FPARM_WIDTH     0x0008
#define FPARM_PAGES     0x0010
#define FPARM_CHARSET   0x0020
#define FPARM_FORM      0x0040
#define FPARM_COPIES    0x0080
#define FPARM_MODES     0x0100

/**
 ** Various routines.
 **/

/*
 * Null terminated list (filters[i].name == NULL).
 */
extern _FILTER          *filters;

extern size_t           nfilters;

#if     defined(__STDC__)

FILTER *        getfilter ( char * );

_FILTER *       search_filter ( char * );

FILTERTYPE      insfilter ( char ** , char * , char * , char * , char * , char ** , unsigned short * );
FILTERTYPE      s_to_filtertype ( char * );

TEMPLATE        s_to_template ( char * );

TEMPLATE *      sl_to_templatel ( char ** );

TYPE            s_to_type ( char * );

TYPE *          sl_to_typel ( char ** );

char *          template_to_s ( TEMPLATE );
char *          type_to_s ( TYPE );

char **         templatel_to_sl ( TEMPLATE * );
char **         typel_to_sl ( TYPE * );

int             open_filtertable ( char * , char * );

int             get_and_load ( void );
int             putfilter ( char * , FILTER * );
int             delfilter ( char * );
int             loadfilters ( char * );
int             dumpfilters( char * );

void            freetempl ( TEMPLATE * );
void            freefilter ( FILTER * );
void            free_filter ( _FILTER * );
void            trash_filters ( void );
void            close_filtertable ( FILE * );

#else

extern FILTER           *getfilter();

extern _FILTER          *search_filter();

extern FILTERTYPE       insfilter(),
                        s_to_filtertype();

extern TYPE             s_to_type(),
                        *sl_to_typel();

extern TEMPLATE         s_to_template(),
                        *sl_to_templatel();

#if     defined(BUFSIZ)
extern FILE             *open_filtertable();
#endif

extern char             **typel_to_sl(),
                        **templatel_to_sl(),
                        *getfilterfile();

extern int              putfilter(),
                        delfilter(),
                        loadfilters(),
                        get_and_load();

extern void             freefilter(),
                        free_filter(),
                        freetempl(),
                        trash_filters(),
                        close_filtertable();

#endif